本文介绍的是基于单片机89S52控制的自动往返电动小汽车控制系统的硬件和软件设计。该设计采用89S52单片机为控制核心,对送入的脉冲信号进行检测分析,利用超声波传感器检测道路上的障碍,通过脉宽调制使电机转速能自动调节,从而实现电动小汽车的自动避障,快慢速行驶,以及自动停车的控制要求。由4位数码管进行对里程、时间的显示。整个系统的电路结构简单,可靠性能高。
采用的技术主要有:通过编程来控制小车的速度;传感器的有效应用;新型显示芯片的采用。
关键词:自动往返电动小汽车;AT89S52单片机;脉宽调制;光电检测器
Abstract
This paper is based on89S52 single-chip microcomputer controlled electric car from the automatic control system hardware and software design. The design using 89S52MCU as the control core, is sent into a pulse signal detection and analysis, the use of ultrasonic sensors detect obstacles on the road, by a pulse width modulated so that the motor speed can be adjusted automatically, so as to realize the electric cars automatic obstacle avoidance, low speed, as well as the automatic parking control requirements. By 4digital tube on the mileage, time display. The system has the advantages of simple circuit structure, reliable performance and high.
Using the technology are: programmed to control the car speed;the effective application of the sensor;the adoption of the new display chip.
Key words: automatic motor-driven car; AT89S52 MCU; pulse width modulation; photoelectric detector
目录
第1章 绪论......................................................... 2
1.1设计背景和研究意义....................................................................................... 2 1.2 工作原理和技术要求...................................................................................... 2 第2章 方案设计与论证............................................... 3
2.1单片机的选择................................................................................................... 3 2.2电动小车........................................................................................................... 4
2.2.1 转向和动力分开的电动小车................................................................ 4 2.2.2 转向和动力结合的电动小车................................................................ 4 2.3控制系统方案设计........................................................................................... 4
2.3.1 数字电路控制...................................................................................... 4 2.3.2 89S52系统控制 .................................................................................. 4 2.4调速系统方案设计........................................................................................... 5
2.4.1 电压调速.............................................................................................. 5 2.4.2 脉宽调速................................................................................................ 5 2.5制动方案........................................................................................................... 6
2.5.1 机械刹车................................................................................................ 6 2.5.2 电机反电压刹车.................................................................................... 6 2.6电机驱动模块................................................................................................... 6
2.6.1 L298N驱动步进电机 ............................................................................ 6 2.6.2 功率管缓冲电路驱动电机.................................................................... 6 2.7信号检测模块................................................................................................... 7
2.7.1 光敏探测器............................................................................................ 7 2.7.2 光电传感器............................................................................................ 7 2.8行程计算........................................................................................................... 8 2.9系统原理........................................................................................................... 8 第3章 硬件设计..................................................... 9
Ⅰ
3.1电动驱动模块................................................................................................... 9 3.2信号检测模块................................................................................................... 9 3.3单片机控制处理模块....................................................................................... 9 3.4显示模块......................................................................................................... 10 3.5最小应用系统设计......................................................................................... 10
3.5.1 时钟电路.............................................................................................. 10 3.5.2 复位电路.............................................................................................. 11
第4章 软件设计.................................................... 12
4.1 主程序设计.................................................................................................... 12 4.2 显示子程序设计............................................................................................ 13 4.3 避障子程序设计............................................................................................ 13 4.4可编程逻辑器件............................................................................................. 13 附录............................................................... 16 参考文献........................................................... 23 致谢............................................................... 24
Ⅱ
第1章 绪 论
1.1设计背景和研究意义
智能电动小车是一种无人操纵的自动寻迹往返小车。随着全球经济的飞速发展,现代化生产观念日益受到企业的重视,这也为智能小车产业的发展提供了契机。本设计就是在这样的背景下提出的。设计一款智能电动小车,智能电动小车应该具有自动寻找轨迹的功能。
AT89S52是一款八位单片机,它的易用性和多功能性受到了广大使用者的好评。它是第三代单片机的代表,其最主要的技术特点是向外部接口电路扩展,以完善控制功能。外部可接其他功能单元如A/D﹑PWM﹑PCA﹑WDT﹑计数器的捕获/比较逻辑等。在总线方面最重要的进展是为单片机配置了芯片间的串行总线,为单片机应用系统设计提供了更加灵活的方式[1]。新一代单片机为外部提供了相当完善的总线结构,为系统的扩展与配置打下了良好的基础。
本设计采用的AT89S52是一种低功耗、高性能 CMOS8 位微控制器,可用于很多小型设备中。该设计具有实际意义,稍作修改就可以应用于考古、机器人、医疗器械等许多方面。尤其是在足球机器人研究方面具有很好的发展前景;在考古方面可用超声波传感器进行检测。所以本设计与实际相结合,现实意义很强。
1.2 工作原理和技术要求
本设计以AT89S52为控制核心,利用超声波传感器进行信号和障碍物的实时检测;信号经过外围电路处理送至单片机,经过单片机的运算和处理来控制电机的转速,进而实现小车的自动加速、限速、减速、前进、后退、左右转,显示行驶速度、路程、时间等功能,实现对电动小车的运动状态进行实时控制。
Ⅱ
第2章 方案设计与论证
根据题目的要求,最终确定了如下的方案:以AT89S52单片机为控制核心,附以外围电路,利用超声波传感器进行信号和障碍物的检测,从而实现对路面特殊轨迹的实时测量,然后将测量数据传送至主控制器进行处理,随后由主控制器根据所接收到的数据对电动车进行控制,实现按照路径自动行驶。
这种方案如图1-1能实现对电动车的运动状态进行实时控制,控制灵活、可靠,精度高,可满足对系统的各项要求。
电动小车 控制信号 控制器 路面数据 传感器 图1-1 自动寻迹小车原理图
2.1单片机的选择
20世纪80年代以来,单片机的发展非常迅速,就通用单片机而言,世界上一些著名的计算机厂家已投放市场的产品就有50多个系列,数百个品种。尽管单片机的品种很多,但是在我国使用比较广泛的还是Intel公司的MCS—51系列单片机和美国Atmel公司的单片机。
CS—51系列单片机包括三个基本型8031、8051、8751。8031片内无程序存储器,需外扩EPROM芯片,比较麻烦,不予采用;8051适合与应用在程序已定,且批量大的单片机产品中。也不予采用;8751是在8031基础上,增加了4K字节的EPROM,它构成了一个程序小于4KB的小系统。用户可以将程序固化在EPROM中,可以反复修改程序。但其价格相对8031较贵。8031外扩一片4KB EPROM的就相当与8751,它的最大优点是价格低。随着大规模集成电路技术的不断发
Ⅱ
展,能装入片内的外围接口电路也可以是大规模的,也不予采用[1]。
AT89S52 Atmel公司生产的一种低功耗、高性能 CMOS8 位微控制器,具有8K 在系统可编程 Flash 存储器。使用 Atmel 公司高密度非易失性存储器技术制,与工业 80C51 产品指令和引脚完全兼容。片上 Flash 允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的 8 位 CPU 和在系统可编程 Flash,使得 AT89S52 为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。因此采用AT89S52单片机[13]。
2.2电动小车
2.2.1 转向和动力分开的电动小车
转向和动力分开的电动小车是将轮胎分为两组,一组与电动机相连输出动力控制小车的行驶;另外一组控制小车的方向。此种方案只需一个电动机,一个转向器。由主控制器分别进行控制,控制程序较多。 2.2.2 转向和动力结合的电动小车
转向和动力结合的电动小车是使用两个独立的电动机各自带动一个轮胎位于两侧,通过两个轮胎速度的改变实现小车的转向。控制所用程序较少,控制器控制起来简单(这种转向方式类似于坦克的转向方式)。为了小车的平衡再装上万向轮。
综合以上两种方案的比较,选择转向和动力结合的电动小车。
2.3 控制系统方案设计
2.3.1 数字电路控制
此种方案采用数字电路的构成计数器、分频器和信号振荡器,并采用硬件译码显示,可以实现控制方案。 2.3.2 89S52系统控制
以AT89S52系统为控制核心,完成对电动机驱动、转速和前进或后退的控
Ⅱ
制,以及往返时间和行驶距离的显示。此系统的硬件和软件都比较容易实现,且满足精度要求,性价比较高。AT89S52具有以下特点:AT98S52是一款低功耗,高性能的8位单片机,片内含有8KB的Flash片内程序存储器,256 Bytes的RAM,32个外部双向输入/输出(I/O)口,8个中断源,一个6向量2级中断结构等
[16]
。
比较以上两种控制方案,方案一程序实现简单,控制性能较差。方案二是以AT89S52单片机为核心的系统可以实现显示,控制速度,向前或向后,保持与计算机通讯功能大大提高了智能化控制速度,精度和系统的控制精度结果都能很好的满足基本要求,而且该系统还可以扩展。综合分析,选择第二种方案。
2.4调速系统方案设计
2.4.1 电压调速
由单片机发出调速数码指令,利用数/模转换电路将指令转换成电压值,以此达到控制速度的目的。这种方案需专门的数模转换电路,且控制不精确,在电压比较低的时候,启动困难,容易停车(此时通过电动机的电流很大,容易烧毁)。 2.4.2 脉宽调速
20世纪70年代以前,以晶闸管为基础组成的相控整流装置是运动控制系统直流传动中主要使用的变流装置,但由于晶闸管属于半控型器件,使其构成的V-M系统的性能受到一定的限制;20世纪70年代以后,随着电力电子技术的发展,出现了全控型器件--门极可关断晶闸管(GTO)、电力场效应晶体管(Power-MOSFET)、绝缘栅极双极晶体管(IGBT);直流电机控制领域向高精度方向发展;PWM驱动装置在中小功率场合,有着晶闸管驱动装置无法比拟的优点,例如:调速范围宽、快速性好、电流波形系数好、功率因数好等。
比较以上两种调速方案,本系统采用方案二,脉宽调速方案。由单片机直接产生脉冲信号,通过桥式双电路驱动电动机,实现调速。此方案电路简单明了,控制精确,改变程序即可改变速度。
[17]
Ⅱ
2.5 制动方案
2.5.1 机械刹车
机械刹车—没有任何的助力装置,主要靠施加再踏板上的力量的大小来取决于制动力的大小,制动效果相当的差,一般用于简单车辆且负载不大的情况下使用。
2.5.2 电机反电压刹车
此种刹车方案是在需要刹车的时候给电机加一个一定宽度的反向电压,迫使电动机快速停止,这种方法称为“软刹车”。
比较以上两种制动方案,方案一虽然可行,但机械结构制作困难,且易出故障。方案二,不需要特别加机构,制作容易,可靠性好,缺点是需多次调试,控制反电压的宽度。综合比较,本系统采用方案二,软刹车。
2.6电机驱动模块
2.6.1 L298N驱动步进电机
L298N是一个恒压恒流桥式2A驱动芯片,内部包含4通道逻辑驱动电路,可以方便的驱动两个直流电机,或一个两相步进电机,相应频率较高,稳定性较好。单本系统两个电机时序不同,会出现两个不同延时程序的情况,系统处理负荷大,影响电机工作,同时价格相对较高[18]。 2.6.2 功率管缓冲电路驱动电机
用功率管(如TP132,8A,70W)构成驱动电路来驱动电机。采用功率管缓冲电路来驱动电机降低了电路的热损耗,提高了电机的功率和可靠性。而且结构简单,价格低廉,可以完成控制功能[18]。
综合以上两种驱动方案分析,选择方案二。
Ⅱ
2.7信号检测模块
2.7.1 光敏探测器
光敏电阻探测器在光照下改变自身的电阻率,光照愈强,其自身的电阻愈小,这种方案原理简单,使用方便,价格低廉,但受光照强度影响很大,可靠性不高。 2.7.2 光电传感器
作为光电检测系统中实现光电转换关键元件的光电传感器,是把光信号转变成为电信号的器件。光电式传感器是以光电器件作为转换元件的传感器。它可用于检测直接引起光量变化的非电量,如光强、光照度等;也可用来检测能转换成光量变化的其他非电量,如位移、振动、速度等。光电式传感器具有非接触、响应快、性能可靠等特点,因此在工业自动化装置和机器人中获得广泛应用[2]。
光电传感器的优点: 检测距离长;对检测物体的限制少;响应时间短;分辨率高;可实现非接触的检测;可实现颜色判别;便于调整等[11]。
综上分析,选择光电传感器方案。红外光线照射到路面并反射,由于黑带和白纸的系数不一样,可根据接收到的红外线的强弱判断是否到达或者偏离黑带。通过采用反射式光电检测电路对跑道上的黑线进行检测,并用两个遮光套管套住发光管和接收管以一定的角度贴近跑道,这样可以消除外界光线的干扰,信号检测如图2-3。
Ⅱ
图2-3信号检测
2.8行程计算
本设计采用红外检测,因为它具有定位精度高、可靠性强等优点,故采用红外光电码盘测速方案。具体电路图如图2-3所示。安装在电动机轴上的光栅会随着电动机的转动而转动,红外发光二极管和红外三极管分装在光栅两侧,当红外发光二极管点亮时,三极管就会接收到二极管的红外信号。这样当电机转动起来时,光栅随着电机转动,三极管就会不断接收到红外信号。然后将这些信号传送至单片机,经过计数器的计数就可计算出行车距离[19-20]。
通过车轮转一圈,记录一个脉冲,储存在计数器中,进行二进制乘法及BCD码转换以获得准确里程。则:里程=脉冲数*车轮周长。
图2-4 行程检测
2.9系统原理
最初启动时,由按键启动小车,复位。将小车放置在黑线跑道上,由外围电路的超声波传感器和红外光电传感器进行检测,检测小车是否在黑道轨道上行驶,是否偏离轨道,然后将检测到的数据送至单片机计数显示,单片机经过数据处理后,经过脉宽调速技术,控制小车的实时运动,由数码管显示小车的行驶路程和时间,这样就提高了小车的总体性能。如下图2-4。
Ⅱ
左电动机组 右电动机组 P0.0 P3.5 P0.1 P3.6 P0.2 P3.7 P0.3 左下方传感器 正前方传感器 右下方传感器
电动小车模块 控制器模块 车头传感器模块
图 2-4 系统原理图
第3章 硬件设计
系统硬件以AT89S52为核心,包括4个模块电路:电动驱动模块、信号检测模块、单片机控制处理模块和显示模块。
3.1电动驱动模块
电动驱动采用的是高低电平进行信号控制。当00输入时是截止状态,当01输入时,电机正转,当10输入时,电机反转,但不能高电平同时输入(其中1代表高电平,0代表低电平)。利用改变脉冲宽度控制电机的转速,使具有不同的转速,分高速和低速两种状态。
3.2信号检测模块
信号检测模块主要是由红外发光二极管、超声波传感器、红外三极管和光敏二极管构成。当小车在黑线上行驶时输出高电平,在白纸上时输出低电平。
3.3单片机控制处理模块
用光电传感器检测不同的信号,并经过单片机对信号进行处理,配合脉宽调速程序,使其控制电机的正反转,实现加速减速和转向。通过单片机内部定数器
Ⅱ
\\计数器进行定时、计数,再用单片机串行输入\\输出口进行显示控制。这种控制系统电路成熟、工作稳定、容易实现控制。
3.4显示模块
此设计的显示模块主要是往返时间和行驶里程的显示。
里程显示和往返时间的显示利用的是4位数码管的共用,采用数码管动态扫描的方式。行驶里程显示用霍尔集成块作检测头,当磁钢经过时输出一个低电平0。
3.5最小应用系统设计
一般最小系统都具有载入程序,在线调试,复位,数据传输和数字、模拟信号之间的相互转换等功能。最小系统硬件一般包括下载口,扩展端口,串口和相关功能的芯片组成。
AT89S52是片内有ROM/EPROM的单片机,因此,这种芯片构成的最小系统简单﹑可靠。在用AT89S52单片机构成最小应用系统时,将时钟电路和复位电路接在单片机接上构成最小应用系统。以实现单片机片上硬件功能,包括A/D,对LED的控制和与计算机串口进行通信等功能,并且方便今后对该单片机系统的直接使用和扩展。 3.5.1时钟电路
时钟电路可以简单定义如下:
1.就是产生象时钟一样准确的振荡电路。
2.任何工作都按时间顺序。用于产生这个时间的电路就是时钟电路。 时钟电路一般由晶体震荡器、晶震控制芯片和电容组成。
AT89S52片内设有一个由反相放大器所构成的振荡电路,XTAL1和XTAL2分别为振荡电路的输入端和输出端。时钟可以由内部方式产生或外部方式产生。内部方式时钟电路是在XTAL1和XTAL2引脚上外接定时元件,内部振荡电路就产生自激振荡。定时元件通常采用石英晶体和电容组成的并联谐振回路。晶体可以在1.2MHz-12MHz之间选择,电容值在50PF-30PF之间选择,电容的大小可以起到频率微调作用。如图3-1。外部时钟电路是XTAL1接地,XTAL2接外部振荡器。
Ⅱ
对外部振荡信号无特殊要求,只要保证脉冲宽度,一般采用频率低于12MHz的方波信号。
在设计印刷电路板时,晶体和电容应尽可能靠近单片机芯片安装,以减少寄生电容,更好的保证振荡器稳定和可靠地工作。为了提高温度稳定性,应采用NPO电容[10]。
C?XTAL131pS?12MC?XTAL231p
图3-1 内部时钟电路图
3.5.2复位电路
AT89S52的复位是由外部的复位电路来实现的。AT89S52 单片机有一个用于构成内部振荡器的反相放大器,XTAL1 和XTAL2 分别是放大器的输入、输出端。石英晶体和陶瓷谐振器都可以用来一起构成自激振荡器。从外部时钟源驱动器件的话,XTAL2 可以不接,而从XTAL1 接入。由于外部时钟信号经过二分频触发后作为外部时钟电路输入的,所以对外部时钟信号的占空比没有其它要求,最长低电平持续时间和最少高电平持续时间等还是要符合要求的。
复位电路通常采用上电自动复位和手动复位两种方式。在RESET输入端出现高电平时实现复位和初始化。在振荡器运行的情况下,要实现复位操作,必须使RST引脚至少保持两个机器周期(24个振荡周期)的高电平。CPU在第二个机器周期内执行内部复位操作,以后每一个机器周期重复一次,直至RST端电平变低。复位期间不产生ALE及PSEN信号。内部复位操作使堆栈指示器SP为07H,各端口都为1,特殊功能寄存器都复位为0,但不影响RAM的状态。当RST引脚返回低电平以后,CPU从0地址开始执行程序。对于加电复位电路,加电瞬间,RST端的电位与Vcc相同,随着RC电路充电电流的减小,RST端的电位逐渐下降。只要RST端保持10ms以上的高电平就能使单片机有效地复位。复位电路中的RC参数通常由实验调整。当振荡频率选用6MHz,使CR选22uF,RR选1k便能可靠地实现加电复位。若采用RC电路接施密特电路的输入端,施密特电路输出端接单片机和外围电路的复位端,即可使系统可靠地同步复位[10]。
Ⅱ
————
第4章 软件设计
系统软件设计说明
在进行微机控制系统设计时,除了系统硬件设计外,大量的工作就是如何根据每个生产对象的实际需要设计应用程序。因此,软件设计在微机控制系统设计中占重要地位。对于本系统,软件更为重要。
为了完成上述任务,在进行软件设计时,通常把整个过程分成若干个部分,每一部分叫做一个模块。所谓“模块”,实质上就是为完成某一功能所需的一段程序或子程序段,这种程序设计方法叫模块程序设计法。
模块程序设计法的特点是:模块相对独立,功能单一,编写相对简单,可以独立编写调试;可集体开发,缩短开发周期。不同的模块可以由不同的人员开发,最终能够合成完整的程序;开发出的模块,可在不同的应用程序中多次使用,减少重复劳动,提高开发效率;测试、更新以模块为单位进行而不会影响其他模块。
本系统软件采用模块化程序设计,由主程序、中断子程序、显示子程序等构成。
4.1 主程序设计
主程序清单见附表录1。 软件流程 如图3-1流程图所示:
Ⅱ
图3-1 流程图
4.2 显示子程序设计
程序清单见附录1。.
4.3 避障子程序设计
程序清单见附录1。
4.4可编程逻辑器件
可编程逻辑器件GAL16V8是LATTICE公司研制的一种电可擦除的可重复编程的低密度PLD器件。 GAL16V8以最大3.5ns的传输延迟时间,结合高性能的CMOS工艺与电可擦(E)悬浮栅工艺可为PLD市场提供最高速度的性能。高速
Ⅱ
2
擦写时间(<100ns)允许快速和有效的重复编程。
依靠输出逻辑宏单元(OLMC)允许用户来构建,这种通用的结构提供了最大的设计灵活性。作为GAL16V8的许多可能结构形式中最重要的一个子集,PAL结构被列在宏单元描述部分的表里面。GAL16V8借助于全部功能/ 熔丝图/参数的兼容性能够仿真任何一种PAL结构。
因此,实现了所有的GAL产品100%的现场可编程性和可操作性。此外,规定100次的擦写循环和超过20年的数据保持能力[5-9]。
GAL16V8技术特性 • 高性能ECMOS®工艺 —最大传输延迟3.5ns —Fmax=250MHz
—时钟输入到数据输出最大3.0ns —UltraMOS®先进的CMOS工艺 • 功耗比双极型减少50%到75% —低功率器件上的Icc典型值为75mA —1/4功率器件上的Icc典型值为45mA •对所有引脚有效上拉 • ECEEL工艺 —可重组合逻辑电路 —可重编程单元 —100%测试/100%合格率 —高速电可擦 (<100ms) —数据保留20年
Ⅱ
2
2
• 8个输出逻辑宏单元 —复杂逻辑设计的最大灵活性 —可编程输出极性
—具有全部功能、熔丝图、参数兼容性的仿真20引线的PAL®设备 • 所有寄存器的预载和开电源复位 —100%的功能可测性 • 应用包括: —DMA控制 —状态机控制 —高速图形处理 —标准逻辑速度提升
• 用于识别的电子签名[11-12]
Ⅱ附录
程序清单
#include uchar code LedShowData[]={0x03,0x9F,0x25,0x0D,0x99, //定义数码管显示数据 0x49,0x41,0x1F,0x01,0x19};//0,1,2,3,4,5,6,7,8,9 static unsigned int RecvData; //定义接收红外数据变量 static unsigned char CountData; //定义红外个数计数变量 static unsigned char AddData; //定义自增变量 static unsigned int LedFlash; //定义闪动频率计数变量 unsigned char HeardData; //定义接收到数据的高位变量 bit RunFlag=0; //定义运行标志位 bit EnableLight=0; //定义指示灯使能位 /***********完成基本数据变量定义**************/ sbit S1State=P1^0; //定义S1状态标志位 sbit S2State=P1^1; //定义S2状态标志位 sbit B1State=P1^2; //定义B1状态标志位 sbit IRState=P //定义IR状态标志位 sbit RunStopState=P1^4; //定义运行停止标志位 sbit FontIRState=P1^5; //定义FontIR状态标志位 sbit LeftIRState=P1^6; //定义LeftIR状态标志位 sbit RightIRState=P1^7; //定义RightIRState状态标志位 /*************完成状态指示灯定义*************/ sbit S1=P3^2; //定义S1按键端口 sbit S2=P3^4; //定义S2按键端口 /*************完成按键端口的定义*************/ sbit LeftLed=P2^0; //定义前方左侧指示灯端口 sbit RightLed=P0^7; //定义前方右侧指示灯端口 /*************完成前方指示灯端口定义*********/ sbit LeftIR=P3^5; //定义前方左侧红外探头 sbit RightIR=P3^6; //定义前主右侧红外探头 sbit FontIR=P3^7; //定义正前方红外探头 /*************完成红外探头端口定义***********/ sbit M1A=P0^0; //定义电机1正向端口 sbit M1B=P0^1; //定义电机1反向端口 sbit M2A=P0^2; //定义电机2正向端口 sbit M2B=P0^3; //定义电机2反向端口 /*************完成电机端口定义***************/ sbit B1=P0^4; //定义话筒传感器端口 sbit RL1=P0^5; //定义光敏电阻端口 Ⅱ sbit SB1=P0^6; //定义蜂鸣端口 /*********完成话筒,光敏电阻,蜂鸣器.端口定义**/ sbit IR1=P3^3; //定义红外接收端口 /*********完成红外接收端口的定义*************/ void Delay() //定义延时子程序 { uint DelayTime=30000; //定义延时时间变量 while(DelayTime--); //开始进行延时循环 return; //子程序返回 } void ControlCar(uchar CarType) { M1A=0; M1B=0; M2A=0; M2B=0; LeftLed=1; RightLed=1; Delay(); switch(CarType) { case 1: //前进 { M1A=1; M2A=1; ShowPort=LedShowData[1]; break; } case 2: //后退 { M1B=1; M2B=1; ShowPort=LedShowData[2]; RightLed=0; LeftLed=0; break; } case 3: //左转 { M1B=1; M2A=1; ShowPort=LedShowData[3]; LeftLed=0; break; } case 4: //右转 { M1A=1; M2B=1; ShowPort=LedShowData[4]; //定义小车控制子程序 //将电机1正向电平置低 //将电机1反向电平置低 //将电机2正向电平置低 //将电机2反向电平置低 //关闭前方左侧指示灯 //关闭前方右侧指示灯 //将此状态延时一段时间 //判断小车控制指令类型 //判断是否是前进 //将电机1正向端口置高 //将电机2正向端口置高 //数码管显示前进状态 //退出判断 //判断是否是后退 //将电机1反向端口置高 //将电机2反向端口置高 //数码管显示后退状态 //将前方右侧指示灯置低(亮) //将前方左侧指示灯置低(亮) //退出判断 //判断是否是左转 //将电机1反向端口置高 //将电机2正向端口置高 //数码管显示左转状态 //将前方左侧指示灯置低(亮) //退出判断 //判断是否是右转 //将电机1正向端口置高 //将电机2反向端口置高 //数码管显示右转状态 Ⅱ RightLed=0; //将前方右侧指示灯置低(亮) break; //退出判断 } default: //默认情况下的判断 { break; //直接退出判断 } } } void Timer0_IR1() interrupt 1 using 3 //定义红外定时器子程序 { TH0=0xFF; //向定时器定时间寄存器填入高八位值 TL0=0x19; //向定时器定时间寄存器填入低八位值 AddData++; //自增变量加1 } void Int1_IR1() interrupt 2 //定义红外接收中断子程序 { TR1=0; //将定时/计数器1关闭 IRState=!IRState; //将红外接收指示灯状态取反 if(4==AddData) //0 //判断接收到的数据是0 { RecvData=RecvData | 0; //判断到0就将当前位写0 RecvData=RecvData << 1; //将当前位向左移动1位 } else if(8==AddData)//1 //判断接收到的数据是1 { RecvData=RecvData | 1; //将当前位写1 RecvData=RecvData << 1; //将当前位向左移动1位 } CountData++; //将红外接收位计数器加1 if(CountData==8) //判断是否接收到8位数据 { HeardData=RecvData; //是8位数据时,则将数据暂存到高位变量中 } else if(CountData==16) //判断是否接收到16位数据 { ET0=0; //关闭红外定时器0 EX1=0; //关闭红外外部中断1 TR1=1; //打开定时/计数器1 AddData=0; //定时时间间隔变量清零 if(HeardData==226 || HeardData==112) //判断用户码是否正确 { HeardData=RecvData; //取出接收到的低八位数据 switch(HeardData) //判断低八位数据的值下列那一位 Ⅱ { case 32: //电源 //说明按下了电源键 { ControlCar(8); //将小车停止 RunFlag==1; //将运行标志位置1 break; //返回 } case 0: //1 //说明按下数字1键 {ShowPort= LedShowData[1]; //数码管显示数字1 ControlCar(1); //将小车置于前进状态 break; } case 8: //2 {ShowPort= LedShowData[2]; ControlCar(2); break; } case 4: //3 {ShowPort= LedShowData[3]; ControlCar(3); break; } case 12: //4 {ShowPort= LedShowData[4]; ControlCar(4); break; } case 2: //5 {ShowPort= LedShowData[5]; break; } case 10: //6 {ShowPort= LedShowData[6]; break; } case 6: //7 {ShowPort= LedShowData[7]; break; } case 14: //8 {ShowPort= LedShowData[8]; break; } case 64: //9 {ShowPort= LedShowData[9]; //返回 //说明按下了数字2键 //数码管显示数字2 //将小车置于后退状态 //返回 //说明按下了数字3键 //数码管显示数字3 //将小车置于左转状态 //返回 //说明按下了数字4键 //数码管显示数字4 //将小车置于右转状态 //返回 //说明按下了数字5键 //数码管显示数字5 //返回 //说明按下了数字6键 //数码管显示数字6 //返回 //说明按下了数字7键 //数码管显示数字7 //返回 //说明按下了数字8键 //数码管显示数字8 //返回 //说明按下了数字9键 //数码管显示数字9 Ⅱ break; //返回 } case 72: //0/30 //说明按下0/30键 {ShowPort= LedShowData[0]; //数码管显示数字0 break; //返回 } RecvData=0; //将接收到的数据清零 CountData=0; //将接收计数器清零 HeardData=0; //将接收高低数据变量清零 return; //返回 } AddData=0; //将定时器计数器清零 ET0=1; //打开定时器中断 } void ComBreak() interrupt 4 //定义串口通信子程序 {unsigned char RecvData; //定义串口数据接收变量 if(RI==1) //判断是否接收数据 { RecvData=SBUF; //将接收到的数据放入暂时变量 if(RecvData<10) //判断接收到的数据是否小于10 { ShowPort=LedShowData[RecvData];//将接收到的数据通过数码管显示出来 ControlCar(RecvData); //将串口数据置于小于状态 } SBUF=RecvData; //向电脑返回当前接收到的数据 RI=0; //清除接收中断标志位 } if(TI==1) //判断是否是发送中断 { TI=0; //清除发送中断标志位 } } void main(void) //主程序入口 { bit ExeFlag=0; //定义可执行标志位变量 RecvData=0; //将接收变量数值初始化 CountData=0; //将计数器变量数值初始化 AddData=0; //将定时器计数器初始化 HeardData=0; //将高低计数器初始化 LedFlash=1000; //对闪灯数据进行初始化 TMOD=0x01; //选择定时器0为两个16位定时器 TH0=0xFF; //对定时器进行计数值进行初始化 TL0=0x19; //同上,时间大约为25uS TR0=1; //同意开始定时器0 EX1=1; //同意开启外部中断1 Ⅱ IT1=1; //设定外部中断1为低边缘触发类型 ET0=0; SCON=80; //设置串口模式为8位数据 TMOD=33; //设置定时/计数器模式 TH1=0xFD; //给定时器1高八位初始化初值 TL1=0xFD; //给定时器1低八位初始化初值 TR1=1; //开启定时器1 ES=1; //开启串口通信功能 REN=1; //开启接收中断标志 EA=1; ControlCar(1); ShowPort=LedShowData[0]; while(1) { while(LedFlash--) { if(RL1==0) { RightLed=1; LeftLed=1; } else { RightLed=0; LeftLed=0; } if(IR1==0) {ExeFlag=1; } if(S1==0) { ControlCar(8); RunFlag==1; S1State=!S1State; goto NextRun; } if(S2==0) { ControlCar(1); RunFlag==0; S2State=!S2State; goto NextRun; } FontIRState=FontIR; LeftIRState=LeftIR; //总中断开启 //将小车置于前进状态 //数码管显示数字0 //程序主循环 //闪灯总延时 //判断光敏电阻的状态 //将前方右侧指示灯点亮 //将前方左侧指示灯点亮 //在光敏电阻为不通的状态下 //将前方右侧指示灯熄灭 //将前方左侧指示灯熄灭 //判断延时期间是否有红外信号输入 //将可执行标志位置1 //判断是否有S1按下 //将小车置于停止状态 //改变小车运行状态标志位 //改变S1按键标志位 //跳转到NextRun标签 //判断是否有S2按下 //将小车置于前进状态 //改变小车运行状态标志位 //改变S2按键标志位 //跳转到NextRun标签 //前方红外指示灯显示正前方红外探头状态 //左侧红外指示灯显示前方左侧红外探头状态 Ⅱ RightIRState=RightIR; //右侧红外指示灯显示前主右侧红外探头状态 if(FontIR==0 || LeftIR==1 || RightIR==1) //判断正前方,前左侧,前右侧红外探头状态 {ControlCar(2); //改变小车状态为后退 Delay(); //调用延时子程序 SB1=!SB1; //将蜂鸣器取反 ControlCar(1); //改变小车为前进状态 SB1=1; //关闭蜂鸣器声音 } if(B1==0) { if(RunFlag==0) { ControlCar(8); RunFlag=1; } else { ControlCar(1); RunFlag=0; } B1State=!B1State; } } NextRun: if(RunFlag==0) { RunStopState=!RunStopState; } else { RunStopState=1; } LedFlash=1000; if(ExeFlag==0) { EX1=1; TR1=1; } ExeFlag=0; } } //判断是否有话筒信号输入 //判断小车当前的运行标志位 //将小车置于停止状态 //改变小车运行标志位 //将小车置于前进状态 //改变小车运行标志位 //将话筒信号指示灯取反 //跳转标签 //判断运行标志位 //改变小车运行停止状态标志位 //将运行停止状态标志位置1 //运行闪动时间重设定 //判断可执行标志位 //开启外部中断1 //开启定时/计数器1 //可执行标志位置0 Ⅱ 参考文献 [1] 何立民.MCS-51单片机应用系统设计[M]. 北京航空航天大学出版社 [2] 方佩敏.新编传感器原理应用与电路详解[M]. 电子工业出版社1998 [3] 周秉功.继电器选型手册[M]. 机械工业出版社,1998 [4] 李仁.电器控制[M]. 机械工业出版社,2002 [5]常斗南主编.可编程序控制器原理•应用•实验[M].北京:机械工业出版社,1998 [6] 戴明宏主编.电器控制与PLC应用.[M].北京:北京航空航天大学出版社,2007 [7] 黄净主编.电气控制与可编程控制器[M].北京:机械工业出版社,2004 [8] 李向东主编.电器控制与PLC[M].北京:机械工业出版社,2007 [9] 蔡美琴.MCS-51系列单片机系统设计及其应用[M].高等教育出版社,2010.4 [10] 刘灿军.实用传感器[M]. 国防工业出版社,2004.14-15 [11] 张万忠.《可编程控制器入门与应用实例》北京,中国电力出版社,2004 [12] 常斗南主编.可编程序控制器原理*应用*实验.北京,机械工业出版社, 2005 [13]王质朴,吕运朋.MCS—51单片机原理接口及应用 [M]. 北京理工大学出版社,2009.221-222 [14]李广弟,单片机基础,北京:北京航空航天大学出版社,2001,56~64 [15] 何希才,新型实用电子电路400例,电子工业出版社,2000年,60~65 [16] 赵负图,传感器集成电路手册,第一版,化学工业出版社,2004,590~591 [17] 陈伯时,电力拖动自动控制系统,第二版,北京:机械工业出版社,2000年6月,127~130 [18]陈清泉,现代电动车、电机驱动及电力电子[M].机械工业出版社,2005 [19] Clark D W. The memory system of a high performance personal computer. Xeox Palo Alto Research Center, Tech Rep: CSL-81-1, 1981 [20] MC88100 RSIC Microprocessor User’s Manual (Second edition). Englewood Cliffs: Prentice Hall, 1990 Ⅱ 致谢 四年的大学生活已接近尾声,历时三个多月的毕业设计也即将结束。在此我衷心对各位机电工程学院、其他教过我的老师、同学对我的指导和帮助表示感谢。在本次毕业设计过程中通过参考、查阅大量有关单片机方面的参考资料,请教各位老师有关单片机控制系统设计制造方面的有关问题,特别是单片机控制系统设计在实际中可能遇到的具体问题,使我在这短短的时间里,对单片机这个领域的认识有了一个很大的提高。同时也使我对单片机自动控制系统设计设计的过程有了深刻的理解。 虽然在这次设计中对于知识的运用和衔接还不够熟练。但是我将在以后的工作和学习中继续努力、不断完善。这几个月的设计是对过去所学知识的系统提高和扩充的过程,为今后的发展打下了良好的基础。 由于自身水平有限,设计中一定存在很多不足之处,敬请各位老师批评指正。 再次感谢学院领导、缑亚楠老师的指导以及同学对我的帮助。 Ⅱ 因篇幅问题不能全部显示,请点此查看更多更全内容