欢迎来到精优文库网!

基于单片机智能小车毕业设计

文章来源:网友投稿 时间:2023-10-20 18:45:04

毕 业 设 计(论 文)
设计(论文)题目:
基于单片机的智能小车 学 院 名 称:
电子与信息工程学院 专 业:
电子与信息工程 班 级:
电信班 姓 名:
学 号 xxxxxxxxxx 指 导 教 师:
职 称 教授 定稿日期:2013 年X 月 X日 基于单片机的智能小车 摘 要 智能车辆是目前世界车辆研究领域的热点和汽车工业新的增长点。未来的车辆也一定是智能化的车辆。所以,智能化的车辆是未来人们生活重要的载体。因此有必要对智能车辆进行研究。研制一种智能,高效的智能小车控制系统具有重要的实际意义和科学理论价值。本文设计了一个能自动循迹的智能小车控制系统。以STC89C52单片机为控制核心,利用反射式光电传感器检测黑线实现小车循迹,利用超声波传感器检测道路上的障碍并提示,利用LCD1602显示小车的速度和路程。能实现小车自动根据地面黑线前进倒退、转向行驶,超声波测距提示障碍物,LCD1602实时显示小车的速度和行驶的路程,具有高度的智能化,达到设计目标。

关键词:智能小车,STC89C52单片机,超声波传感器,LCD1602 THE SMART CAR BASED ON MICROCONTROLLER ABSTRACT Intelligent vehicles are the hot spots of the world's vehicle research areas and the automotive industry a new growth point. The vehicles of the future must be intelligent vehicles. So, intelligent vehicles is an important carrier of the future of people's lives.Therefore, the study of intelligent vehicles are necessary. Therefore, the development of a smart, intelligent car control system with high efficiency is of practical significance and scientific important theoretical value. This paper introduces the design of a smart car control system that can automatic tracking.Based on signle-chip microcomputer STC89C52 To achieve track-finding using photoelectric sensor to detect black line,The use of ultrasonic sensors to detect obstacles on the road and prompt,Using the LCD1602 to display speed and distance. The car can realize automatic based on the black line forward regression. Steering,Ultrasonic ranging, prompting obstacles, LCD1602 real-time display of the speed of the car and drive away, with a high degree of intelligence, achieve the design goal. Key Words: Smart car, STC89C52 MCU, ultrasonic sensor,LCD1602 目录 摘 要 I ABSTRACT II 目录 III 第1章 绪论 1 1.1 智能小车的意义和作用 1 1.2 智能小车的现状 1 第2章 方案设计与论证 2 2.1 主控系统 2 2.2 电源模块 2 2.3 电机驱动模块 3 2.3.1 电机模块选择与论证 3 2.3.2 电机驱动模块选泽与论证 3 2.4 循迹模块 4 2.5 测速模块 5 2.6 显示模块 6 2.7 壁障模块 7 第3章 硬件设计 8 3.1 总体设计 8 3.2 驱动电路 8 3.3 信号检测电路 11 3.4 测速电路 12 3.5 显示电路 13 3.6 主控电路 13 第4章 软件设计 17 4.1 主程序模块设计 17 4.1.1 主程序流程图 17 4.1.2 主程序的设计 17 4.2 电机驱动程序的设计 19 4.2.1 电机驱动程序流程图 19 4.2.2 电机驱动程序的设计.................................................................................... 20 4.3 循迹模块程序的设计 22 4.3.1 循迹模块流程图 22 4.3.2 循迹模块程序的设计 22 4.4 测距壁障模块程序的设计 24 4.4.1 超声波测距模块流程图 24 4.4.2 超声波测距模块程序的设计 25 4.5 显示模块程序的设计 26 4.5.1 显示模块流程图 26 4.5.2 显示模块程序的设计 26 第5章 系统软硬件的调试 29 5.1 软件程序的调试 29 5.2 硬件电路的焊接与调试 30 参考文献 31 附录1 原理图 32 附录2 源程序 33 附录3实物图 43 致 谢 .....................................................................................................................................44 作品(软件)使用说明书 ..45 第1章 绪论 1.1 智能小车的意义和作用 智能的出现,为我们的生活和生产带来了很大的便利,同时也是以后的发展方向,智能就是可以在一个特定的环境中按照我们前面设定好的模式去自动的运作,它并不需要我们去人为的管理,就可以达到我们前面设定的目标,它的应用领域很广,如可以应用于工业控制、科学勘探、智能家居等领域。而智能小车就是智能的一个简单的应用,智能小车就是智能化玩具中的一种,由于这类智能玩具具有较好的交互性,可控性,能够按照人们设定的模式去自动运作也深受人们的喜欢。另外,智能小车还可以应用于危险搜索、机器人等许多方面,尤其在机器人方面具有很好的发展前景。因此,智能化小车的研究不仅具有很大的现实意义,还具有极为广阔的应用前景和市场价值。

1.2 智能小车的现状 智能小车的研究、开发和应用涉及传感技术、电气技术、电气控制技术、智能控制等学科,智能控制技术是一门跨科学的综合性技术,当代研究十分活跃,应用日益广泛的领域[1]。众所周知机器人技术的发展是一个国家高科技水平和工业自动化程度的重要标志和体现。因此目前世界各国都在开展对机器人技术的研究。机器人由于有很高的灵活性、可以帮助人们提高生产率、改进产品质量等优点,在世界各地的生产生活领域得到了广泛的应用[2]。智能小车正是模仿机器人的一种尝试。它是一种以汽车电子为背景,涵盖多学科的科技创新性设计,一般主要由路径识别、速度采集、角度控制以及车速控制等模块组成。这种智能小车能够自动搜寻前进路线,还能爬坡,感知前方的障碍物,并自动寻找前进方向,避开障碍物。另外如果加入相关声光讯号后,更能体现出智能化和人性化的一面。

第2章 方案设计与论证 2.1 主控系统 由于单片机具有价格低廉,资源丰富、有较为强大的控制功能,故本次设计采用STC89C52单片机作为整个系统的核心,用其控制行进中的小车以实现其既定的性能指标。STC89C52是一个超低功耗的增强型51单片机,和标准51系列单片机相比较它的运算速度更快,有超强的抗干扰能力,同时还支持ISP在线编程,片上集成了512字节的随机存取数据存储器(RAM),并且片内含8k字节空间的可以反复擦写1000次的Flash只读存储器, 32个I/O口,以及3个16位可编程定时计数器。其指令系统和传统的8051系列单片机指令系统完全兼容,降低了系统软件设计的难度,电路设计简单、价格低廉,在后来的实验中我们发现,STC 89C52精确度和运算速度也都完全符合我们系统的要求。

2.2 电源模块 由于本系统需要给整个智能小车系统供电,考虑了以下几种方案: 方案一:采用4节1.2V可充电电池组。在电充满时4节电池电压可以达到5v且可充电电池组具有较强的电流驱动能力及稳定的电压输出性能,但是直流电机工作时会对LCD1602显示造成干扰,使其显示不稳定。故放弃此方案。

方案二:使用双电源供电,将9v可充电方块电池电压降压、稳压到5V后给单片机系统和LCD1602及其它芯片供电。另外采用4节1.2V可充电电池组为直流电机供电,经测试在用此种供电方式下,单片机和传感器工作稳定,直流电机工作良好,LCD显示也很稳定,小车也能长时间工作。

综上考虑,我们选择了方案二来完成智能小车整个系统的供电。

2.3 电机驱动模块 2.3.1 电机模块选择与论证 方案一:使用步进电机作为智能小车系统的驱动电机,因为步进电机的转动角度可以精确的定位,这样就可以比较精确的定位小车的前进距离和位置。但是由于步进电机的输出力矩偏低,并且会随着电机转速的升高而下降,在达到较高的转速时其输出的力矩会急剧下降,因此不适于小车等对速度有着一定要求的系统。经过综合分析比较决定放弃此方案。

方案二:使用直流减速电机作为智能小车系统的驱动电机。直流减速电机的转动力矩比较大,而且体积较小,重量也很轻,使用方便。另外小车电机内部还装有减速齿轮组,所以并不需要去考虑调速的功能,可以很方便的通过单片机来控制直流减速电机的正传、反转、停止操作。

综合以上考虑选择方案二的直流减速电机作为整个智能小车的驱动电机。

2.3.2 电机驱动模块选择与论证 方案一:采用继电器对电动机进行控制,通过切换电动机的开关来调整小车的速度。这个方案的优点是电路相对比较简单,但是它的缺点也比较多,如:继电器的响应时间偏慢, 寿命较短,容易损坏,可靠性也不是很高。故决定放弃此方案。

方案二:采用专用的电机驱动芯片L298N来控制直流减速电机, L298N芯片(如图2-3)是一个具有高电压大电流的全桥驱动芯片,一片L298N芯片可以分别的控制两个直流减速电机,在6~46V的电压下,可以提供2A的额定电流,并且具有过热自动关断和电流反馈检测功能,安全可靠。该芯片是利用TTL电平进行控制的。通过单片机的IO口输出高低电平来改变芯片控制端的输入电平,即可以实现对电机进行正转、反转和停止操作。另外为了保证L298N的正常工作,我还安装了8个续流二极管1N4007。用该芯片作为电机驱动,驱动能力大、操作方便、稳定性好、性能优良。

综合以上分析与论证我们选择方案二的驱动芯片L298N作为整个智能小车系统的电机驱动电路。

图2-3 L298N 2.4 循迹模块 方案一:用光敏电阻来探测。光敏电阻的阻值会随着周围环境光线的变化而变化[6]。因此当光敏电阻在黑色轨迹的上方和白色轨迹的上方时,阻值会发生较为明显的变化。将阻值的变化值输入到电压比较器就可以输出高低电平。单片机就可以根据反馈来的不同的电平信号,发出相应的控制操作命令来控制小车的左转,右转,前进或者停止。但实际效果并不理想,误测几率偏大、容易受外界的光线环境的影响,不能够稳定的工作。因此考虑其它更加稳定的方案。

方案二:采用红外反射式光电管完成系统循迹[3]。TCRT5000(如图2-4)是一种一体化反射型光电探测器,传感器采用高发射功率红外光电二极管和高灵敏度光电晶体管组成,其发射器是一个砷化镓红外发光二极管,而接收器是一个高灵敏度,硅平面光电三极管。它是利用了光的反射原理,当光线照射在白纸上,反射量会比较大,反之,当光照射在黑色物体上,反射回去的量比较少,因为黑色会吸收光,这样就可以判断黑胶带带轨道的走向。采用红外线发射,外面可见光对接收信号的影响较小,利用红外对管对黑线边界进行检测,再用LM393对检测信号进行比较,取反,送单片机进行处理。此光电对管电路简单,工作性能稳定。

经测试方案二不论是在黑暗或者是强光照射下,智能小车系统均可以很稳定的工作,对外界环境的适应能力比较强。因此我们选择方案二。

图2-4 TCRT5000 2.5 测速模块 方案一:采用霍尔传感器检测轮子上的小磁铁从而给单片机中断脉冲,通过单位时间内对脉冲的计数通过公式就可以算出实时的车速,达到测量速度的作用。霍尔元件具有体积小,动态特性好,频率响应宽度大,对外围电路要求简单,使用寿命长,安装方便,价格低廉等特点。但是需要和磁钢配对使用比较麻烦。

方案二:采用光电码盘,即透射式光电传感器(凹槽型如图2-5)进行测速。槽型光耦是由红外发光管和光敏三极管构成的,工作时红外发光管发出红外光线透过光耦的槽投射到光敏三极管上,光敏三极管导通,集电极输出低电平。当红外光线被检测物遮断时,光敏三极管截止,集电极输出高电平。遮挡一次槽型光耦输出一个脉冲,因此脉冲的个数就是被检测物的数量。车轮转动时带动码盘转动,单片机内部计时可测出给定的时间内通过的脉冲数,从而测出小车的实时速度。使用方便,抗干扰性较强。

通过比较方案一和方案二的优缺点,综合多方面因素决定选用方案二。

图2-5 槽型光电传感器 2.6 显示模块 方案一:采用LED数码管显示。数码管使用简单,价格低廉,但一个数码管只能显示一个数字,要显示多位数据时要使用多个数码管,这就增加了硬件电路的复杂度和额外功耗,而且LED数码管也无法显示字符。由于我们计划要显示小车运行的速度和路程,LED数码管没办法显示这么多的内容,因此考虑其它的方案。

方案二:采用LCD1602液晶(如图2-6)显示。LCD1602液晶具有功耗低,显示内容丰富清晰,显示信息量大,显示速度较快,界面友好,使用简单等特点而得到了广泛的应用。并且外围电路也比较简单,因此我们选择此方案。

通过以上方案论述我们选择方案二,显示小车运行速度和路程的任务。

图2-6 LCD1602液晶显示器 2.7 壁障模块 方案一:用漫反射式光电开关进行避障。光电开关的工作原理是根据光线发射头发出的光束,被物体反射,其接收电路据此做出判断反应,物体对红外光由同步回路选通而检测物体的有无。当有光线反射回来时,输出低电平。当没有光线反射回来时,输出高电平。操作简单但是测量的距离不远。

方案二:用超声波传感器进行测距避障。超声波传感器的原理是:超声波由压电陶瓷超声波传感器发出后,遇到障碍物便反射回来,然后再被超声波传感器接收[8]。超声波传感器在避障的设计中被广泛应用。为了使用方便,便于操作和调试,采用集成超声波测距模块HC-SR04(如图2-7)。

综合考虑本系统只需要检测障碍物,没有十分复杂的环境。为了使用的方便,便于操作和调试,最终选择了方案二。

图2-7 HC-SR04超声波测距模块 第3章 硬件设计 3.1 总体设计 智能小车采用前轮驱动,前轮左右两边各用一个电机驱动,通过电机驱动芯片L298N来控制前面两个轮子的转动与停止从而达到控制转向的目的,后轮是万向轮,起支撑转向作用。将4个红外光电传感器装在车体底盘的前端,小车根据传感器检测的情况来循迹前进。

小车速度的检测通过槽型光电传感器,将码盘装在电机的轴上,码盘跟随电机一起转动,将检测到的数据传回单片机进行处理。

小车的避障用超声波避障模块HC-SR04,将其置于车头,检测到障碍物时,小车做出相应的反应。

总体设计框图如图3-1。

图3-1 总体设计框图 3.2 驱动电路 电机驱动芯片采用L298N,是一款承受高压大电流的全桥型直流/步进电压驱动器,如下图3-2。

图3-2电机控制芯片L298N的引脚排列 其中L298N各引脚的编号与功能和内部逻辑如下表3-1和图3-3。

表3-1 L298N引脚编号与功能 引脚编号 名称 功能 1 电流传感器A 在该引脚和地之间接小阻值电阻可用来检测电流 2 输出引脚1 内置驱动器A的输出端1,接至电机A 3 输出引脚2 内置驱动器A的输出端2,接至电机A 4 电机电源端 电机供电输入端,电压可达46V 5 输入引脚1 内置驱动器A的逻辑控制输入端1 6 使能端A 内置驱动器A的使能端 7 输入引脚2 内置驱动器A的逻辑控制输入端2 8 逻辑地 逻辑地 9 逻辑电源端 逻辑控制电路的电源输入端为5V 10 输入引脚3 内置驱动器B的逻辑控制输入端1 11 使能端B 内置驱动器B的使能端 12 输入引脚4 内置驱动器B的逻辑控制输入端2 13 输出引脚3 内置驱动器B的输出端1,接至电机B 14 输出引脚4 内置驱动器B的输出端2,接至电机B 15 电流传感器B 在该引脚和地之间接小阻值电阻可用来检测电流 图3-3 L298N内部原理图 电机驱动A/B的控制逻辑如下表所示。

表3-2 电机驱动A/B的控制逻辑 输入信号 电机运动方式 使能端A/B 输入引脚1/3 输入引脚2/4 1 1 0 前进 1 0 1 后退 1 1 1 紧急停车 1 0 0 紧急停车 0 X X 自由转动 L298N可直接对电机进行控制,不需要隔离电路。通过单片机的I/O输入改芯片控制端的电平,即可以对电机进行正反转,停止的操作,操作非常方便,亦能满足直流减速电机的大电流要求[4]。调试时依照上表,用程序输入对应的码值,即可以实现对应的操作。其驱动电路原理图如下图3-4所示。

图3-4 L298N驱动原理图 3.3 信号检测电路 小车循迹的原理是在铺有约四厘米宽黑胶带的白纸 “路面”上行驶,由于黑纸和白色路面对光线的反射系数不同,可以根据接收的反射光的强弱来判断道路——黑纸轨迹。本设计采用简单易用,应用也较为普遍的红外探测法。

红外探测法,即用红外线在不同颜色的物表面具有不同的反射性质的特点[7]。在小车行驶过程中传感器的红外发射二极管不断发射红外线,当发射出的红外线没有被反射回来或被反射回来但强度不够大时,光敏三极管一直处于关断状态,此时模块的输出端为低电平,当红外线遇到白色地面时发生漫反射,红外线被反射回来反射光被装在小车上的接收管接收且强度足够大,光敏三极管饱和,此时模块的输出端为高电平;
如果遇到黑纸则红外光被吸收,小车上的接收管接收不到信号,再通过LM393作比较器来采集高低电平,从而实现信号的检测。避障亦是此原理。

通过设计了如图3-5所示的电路来检测,图中R18为限流电阻,当有光反射回来时,光电传感器的三极管导通,在LM393的2脚出产生低电平电压,通过LM393处理后在P1.0出产生高电平,返回给单片机,从而达到检测的目的。并通过变阻器RV1可调节传感器的灵敏度。

图3-5循迹原理图 3.4 测速电路 采用透射式光电传感器(凹槽型)进行测速。槽型光耦是由红外发光管和光敏三极管构成的,将码盘安装在电机轴上,当电机转动时,码盘也随之转动。工作时红外发光管发出红外光线透过光耦的槽投射到光敏三极管上,光敏三极管导通,集电极输出低电平。当红外光线被检测物遮断时,光敏三极管截止,集电极输出高电平。遮挡一次槽型光耦输出一个脉冲,因此脉冲的个数就是被检测物的数量。车轮转动时带动码盘转动,单片机内部计时可测出给定的时间内通过的脉冲数,从而测出小车的实时速度。其电路原理图与循迹原理图类似。如图3-6所示。

图3-6 测速电路原理图 3.5 显示电路 用LCD1602来显示数据,LCD液晶具有功耗低、显示内容丰富、清晰,显示信息量大,显示速度较快等特点。其中用滑动变阻器RV0来调节显示器的背光亮度。电路原理图如下图3-7。

图3-7显示电路原理图 3.6 主控电路 单片机是控制单元的核心。起着控制小车所有运行状态的作用。单片机控制模块使用的是宏晶公司生产的STC89C52,使用该芯片很容易实现对其它模块的控制。通过对单片机STC89C52写入程序,可以方便的用软件来控制,整个过程的控制部分如图3-8所示。

图3-8 单片机最小系统 STC89C52单片机最小系统包括了晶振电路,电源电路以及复位电路,其中复位电路的复位按键用于小车的复位。P1.3~P1.7分别控制电机驱动。其它P口用外接控制小车的各种控制开关,P0口外接上拉电阻,可用于外接LCD1602。

STC89C52 单片机介绍[5]:
STC89C52RC单片机是宏晶科技推出的新一代高速/低功耗/超强抗干扰的单片机,指令代码完全兼容传统8051单片机,12时钟/机器周期和6时钟/机器周期可以任意选择。

主要特性如下:
1. 增强型8051单片机,6时钟/机器周期和12时钟/机器周期可以任意选择,指令代码完全兼容传统8051。

2. 工作频率范围:0~40MHz,相当于普通8051的0~80MHz,实际工作频率可达48MHz。

3. 工作电压:5.5V~3.3V(5V单片机)/3.8V~2.0V(3V单片机)
4. 片上集成512字节RAM。

5. 用户应用程序空间为8K字节。

6. ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器,可通过串口(RxD/P3.0,TxD/P3.1)直接下载用户程序,数秒即可完成一片。

7. 通用I/O口(32个),复位后为:P1/P2/P3/P4是准双向口/弱上拉,P0口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需加上拉电阻。

8. 具有看门狗功能。

9. 具有EEPROM功能。

10. 共3个16位定时器/计数器。即定时器T0、T1、T2。

11. 外部中断4路,下降沿中断或低电平触发电路,Power Down模式可由外部中断低电平触发中断方式唤醒。

12. 通用异步串行口(UART),还可用定时器软件实现多个UART。

13. 工作温度范围:-40~+85℃(工业级)/0~75℃(商业级)
14. PDIP封装。

STC89C52单片机的引脚图如下图3-9。

图3-9 STC89C52RC引脚图 另外STC单片机有两种时钟模式,一种是单倍速,也就是12时钟模式,在该模式下,STC单片机与其他公司51系列单片机具有相同的机器周期,即12个振荡周期为一个机器周期;
另一种是双倍速,又称6时钟模式,在该模式下,STC单片机比其他公司的51单片机运行速度快一倍。

第4章 软件设计 4.1 主程序模块的设计 4.1.1 主程序的流程图 图4-1 主程序流程图 在图4-1主程序流程图中,开始时先是单片机的初始化,包括定时器初始化,外部中断的初始化,液晶的初始化。然后调用循迹子程序,小车循迹前进,如果定时时间到了则调用超声波模块子程序,判断前方50cm处是否有障碍物,如果有的话led闪烁,如果检测到停止线则小车停止。

4.1.2 主程序的设计 void main() { Timer_Init(); //定时器初始化 INT0_Init(); //外部中断初始化 LCD_Init(); //LCD1602初始化 TR1=1; //启动定时器 lcd_write_cmd(0x80); LED1 = 1; LED2 = 1; while(1) { PWM(); //pwm调速 track(); //调用循迹子程序 lcd_write_cmd(0x80+0x09); lcd_write_dat(qian); lcd_write_cmd(0x80+0x0a); lcd_write_dat(bai2); lcd_write_cmd(0x80+0x0b); lcd_write_dat(shi2); lcd_write_cmd(0x80+0x0c); lcd_write_dat(ge2); lcd_write_cmd(0x80+0x47); lcd_write_dat(bai1); lcd_write_cmd(0x80+0x48); lcd_write_dat(shi1); lcd_write_cmd(0x80+0x49); lcd_write_dat(ge1); if(flag1==1&&flag2==1) { csb(); //调用超声波子程序 flag1=0; } } } 4.2 电机驱动程序的设计 4.2.1 电机驱动程序流程图 图4-2 电机驱动程序流程图 电机驱动程序流程图如上图4-2,开始先检测小车的状态如果相对黑线是直的,则调用直走子程序,即左右两个电机都正转;
如果小车偏向黑线的左边则调用向右走子程序,即左电机正转右电机反转;
如果小车偏向黑线的右边则调用向左走子程序,即左电机反转右电机正转;
如果小车完全偏离黑线则调用向后退子程序,即两个电机都反转;
如果小车到终点了则调用停止子程序,即两个电机都不转。

4.2.2 电机驱动程序的设计 void goahead() //小车直走 { IN1 = 1; IN2 = 0; IN3 = 1; IN4 = 0; } void goback() //小车后退 { IN1 = 0; IN2 = 1; IN3 = 0; IN4 = 1; } void turnright() //小车向右转 { IN1 = 1; IN2 = 0; IN3 = 0; IN4 = 1; } void turnleft() //小车向左转 { IN1 = 0; IN2 = 1; IN3 = 1; IN4 = 0; } void zw_turnright() //用于转弯时的左转 { IN1 = 1; IN2 = 0; IN3 = 0; IN4 = 0; } void zw_turnleft() //用于转弯时的右转 { IN1 = 0; IN2 = 0; IN3 = 1; IN4 = 0; } void stop() //小车停止 { IN1 = 0; IN2 = 0; IN3 = 0; IN4 = 0; } void PWM(void) //小车调速 { PWM_ENA = 1; PWM_ENB = 1; delayXms(H); PWM_ENA = 0; PWM_ENB = 1; delayXms(L); PWM_ENA = 0; PWM_ENB = 0; delayXms(N); } 4.3 循迹模块程序的设计 4.3.1 循迹模块流程图 图4-3 循迹模块流程图 在图4-3 循迹模块流程图中,通过检测P1口第四位的电平并把它赋给变量temp然后用switch-case语句来根据P1口低四位的电平,给出相应的电平送到电机驱动芯片L298N去,从而控制小车的直走,左转,右转,后退,停止等动作。

4.3.2 循迹模块子程序设计 void track( void ) { uchar temp = 0; temp = P1 & 0x0f; //取P1口低四位赋给变量temp switch( temp ) { case 0x09: goahead(); //直走 break; case 0x0c: case 0x0e: turnleft();//左转 break; case 0x03: case 0x07: turnright();//右转 break; case 0x0f: goback();// 后退 break; case 0x00: stop(); //停止 break; case 0x08: zw_turnleft();//用于直角转弯时的左转 delayXms(20); break; case 0x01: zw_turnright(); //用于直角转弯时的右转 delayXms(20); break; default: break; } } 4.4 测距避障模块程序的设计 4.4.1 测距模块流程图 图4-4测距模块流程图 测距模块流程图如图4-4,开始时单片机先给超声波测距模块Trig端发送一个高电平且这个高电平要持续20us,然后再给Trig端发送一个低电平,即启动了超声波测距模块,超声波测距模块会自动发送8个40KHZ的方波,等待是否有信号返回,如果有信号返回会通过IO口超声波测距模块的Echo端输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间,测试距离=(高电平时间*340)/ 2,单位为m。如果距离小于50cm,车前的两个LED等闪烁提示,如果距离小于7cm,小车自动停下。

4.4.2 测距模块程序设计 void csb() { TH0=0; TL0=0; TX=1; //Trig发送端发出一个高电平 delay_20us(); //延时20us TX=0; //Trig发送端发出一个低电平 while(RX==0); //等待接收端为高电平 TR0=1; //启动定时器 while(RX); //等待接收端为低电平 TR0=0; //关闭定时器 time=TH0*256+TL0; juli=time*0.017; // (1/(12*1000000))*340*12*100/2得到的是距离单位为cm ;

if(juli<=7) { stop(); LED1 = !LED1; LED2 = !LED2; delayXms(100); flag3=1; } else if((juli>5)&&(juli<=50)) { LED1 = !LED1; LED2 = !LED2; delayXms(100); flag3=0; } else if(juli>50) { LED1=1; LED2=1; flag3=0; } } 4.5 显示模块程序的设计 4.5.1 显示模块流程图 图4-5显示模块流程图 图4-5为显示模块流程图,先是初始化LCD1602然后在液晶的第一行显示“Journey: cm“液晶第二列显示“Speed: mm/s “然后在主程序不断的调用显示程序刷新cm或者mm前面的数字。

4.5.2 显示程序设计 bit lcd_busy() //判忙函数 { bit result; RS=0; RW=1; E=1; _nop_(); _nop_(); _nop_(); _nop_(); result = (bit)(P0&0x80); E=0; return result; } void lcd_write_cmd(uchar cmd) //液晶写指令 { while(lcd_busy()); RS=0; RW=0; E=0; _nop_(); _nop_(); P0=cmd; _nop_(); _nop_(); _nop_(); _nop_(); E=1; _nop_(); _nop_(); _nop_(); _nop_(); E=0; } void lcd_write_dat(uchar dat) //液晶写数据指令 { while(lcd_busy()); RS=1; RW=0; E=0; P0=dat; _nop_(); _nop_(); _nop_(); _nop_(); E=1; _nop_(); _nop_(); _nop_(); _nop_(); E=0; } void LCD_Init() ///液晶初始化指令 { delayXms(12); lcd_write_cmd(0x38); delayXms(4); lcd_write_cmd(0x0c); delayXms(4); lcd_write_cmd(0x06); delayXms(4); lcd_write_cmd(0x01); delayXms(4); lcd_write_cmd(0x80); for(i=0;i<16;i++) //液晶第一列显示“Journey: mm“ lcd_write_dat(display1[i]); lcd_write_cmd(0x80+0x40);//液晶第二列显示“Speed: mm/s “ for(i=0;i<16;i++) lcd_write_dat(display2[i]); } 第5章 制作安装与调试 5.1 软件程序的调试 软件调试的任务是利用ISIS开发工具进行在线仿真调试,发现和纠正程序错误,同时也能发现仿真结果故障。程序的调试是一个模块一个模块地进行的,从最简单的程序开始,先画好单片机最小系统烧录一个最简单的点亮led的程序看单片机最小系统仿真电路是否连接正确了,是否后慢慢的调试和扩充。我们首先单独调试各功能子程序,检验程序是否能够实现预期的功能,接口电路的控制是否正常等;
最后逐步将各子程序连接起来总调。

仿真图如图5-1所示:
图5-1 智能小车仿真图 5.2 硬件电路的焊接与调试 在硬件电路焊接中,由于需要焊接的模块较多,为了提高调试的效率,将整个系统分成多个部分进行焊接和调试。开始一个模块设计之前和完成一个模块设计之后都要进行测试。在动手之前务必查清楚所用元件资料,对于稍微复杂一点的电路 ,之前可以先搭建其中的一部分电路,测试一下是否正常,然后再进行总的电路设计。这样循序渐进设计可以节省时间并且保证电路的正确性。另外电路设计之后的测试也同样重要,特别是和程序有关的外围检测、驱动等模块,如果不排除硬件故障在调试的时候很难分清到底是硬件还是软件的问题,因此硬件设计完成之后首先需要测试硬件能够正常工作,这样在遇到问题时才能够排除硬件的干扰找出问题的所在。

对小车的整体的调试按照模块来进行,分为以下几个步骤:
①首先测试电源的工作情况,各个模块能否得到良好供电。

②然后检查单片机能否正常的烧写程序和工作。

③光电管安装完成后根据测试数据调节电位器选择合适的参考电压。

④测试两前轮电机的工作情况,并试验电机的驱动能力。

⑤让小车在黑色轨道上初步循迹运行。

⑥反复测试各参数变化对小车的影响,找出最有效的配置。

⑦对小车运行过程中各种可能出现的情况测试,发现问题,找出解决方法。

⑧整理数据,优化程序设计。

经过多次调试,本系统能够基本满足设计要求,能够较快较平稳的沿黑色路面行驶。

参考文献 [1] 李瀚霖等. 智能小车研究与设计[J]. 科技致富向导, 2011年26期. [2] 王志良. 竞赛机器人制作技术[M]. 北京: 机械工业出版社, 2007.6.15. [3] 韩毅, 杨天. 基于HCS12单片机的智能寻迹模型车的设计与实现[J]. 学术期刊, 2008, 29(18):1535-1955. [4] 王晓明. 电动机的单片机控制[J]. 学术期刊, 2002, 13(15):1322-1755. [5] 温子祺等. 51单片机C语言创新教程[M]. 北京: 北京航航天大学出版社, 2011.4. [6] 朱小燕等. 浅谈智能控制小车的设计[J]. 机电信息, 2011. [7] 唐华溢等. 智能循迹小车系统与应用[J]. 科技与生活, 2010. [8] 何晔. 基于AT89S52单片机自动避障自动追光小车新设计[J]. 科技致富向导, 2011.4. [9] 张毅刚,彭喜元,彭宇. 单片机原理及应用[M]. 北京: 高等教育出版社,2010.5. [10] 赵海兰. 基于单片机的红外遥控智能小车的设计[J]. 无线互联科技, 2011年3期. [11] 姚培等. 基于单片机控制的智能循迹避障小车[J]. 机电信息,2010年12期. [12] 于连国,李伟,王妍玮. 基于单片机的智能小车设计[J]. 林业机械与木工设备, 2011年4期. [13] 赵振德. 多功能遥控智能小车的制作[J]. 电子制作, 2011年4期. [14] 胡汉才. 单片机原理与接口技术[M]. 北京:清华大学出版社,1999.4. [15] Yamato I . et al High frequency link DC/ AC converter for UPS with a new voltageclamper[J]1IEEE PESC ,1990 :52-105. 附录1原理图 附录2源程序 #include <reg52.h> //包含头文件,头文件包含特殊功能寄存器的定义 #include <intrins.h> //Keil外部函数库包含文件,_nop_函数在此库中 #define uint unsigned int #define uchar unsigned char #define ulong unsigned long #define diameter 60 //码盘直径 #define disc 20 //码盘栅格数20个即20个脉冲是一圈 #define H 100 #define L 10 #define N 20 uint i,n,m,time=0; uchar bai1,shi1,ge1,qian,bai2,shi2,ge2,flag1=0,flag2=1; ulong speed,count1,count2,journey,juli; //以下是定义端口 sbit PWM_ENA = P3^0; sbit PWM_ENB = P3^1; sbit IN1 = P1^4; sbit IN2 = P1^5; sbit IN3 = P1^6; sbit IN4 = P1^7; sbit RS=P2^5; sbit RW=P2^6; sbit E =P2^7; sbit LED1 = P2^0; sbit LED2 = P2^1; sbit TX=P3^6; //超声波模块Trig触发信号控制端 sbit RX=P3^7; //接收回波控制端 uchar display1[]={“Journey: mm“}; uchar display2[]={“Speed: mm/s “}; void delay_20us() //延时20us { int a; a=2; while(a>0) a--; } void delay1ms(void) //延时1ms { uint j; for(j=0;j<=120;j++) { _nop_(); } } void delayXms(uint ms)延时n毫秒 { uint k; for(k=0;k<ms;k++) {delay1ms();} } bit lcd_busy() //判忙函数 { bit result; RS=0; RW=1; E=1; _nop_(); _nop_(); _nop_(); _nop_(); result = (bit)(P0&0x80); E=0; return result; } void lcd_write_cmd(uchar cmd) //液晶写指令 { while(lcd_busy()); RS=0; RW=0; E=0; _nop_(); _nop_(); P0=cmd; _nop_(); _nop_(); _nop_(); _nop_(); E=1; _nop_(); _nop_(); _nop_(); _nop_(); E=0; } void lcd_write_dat(uchar dat) //液晶写数据指令 { while(lcd_busy()); RS=1; RW=0; E=0; P0=dat; _nop_(); _nop_(); _nop_(); _nop_(); E=1; _nop_(); _nop_(); _nop_(); _nop_(); E=0; } void LCD_Init() ///液晶初始化指令 { delayXms(12); lcd_write_cmd(0x38); delayXms(4); lcd_write_cmd(0x0c); delayXms(4); lcd_write_cmd(0x06); delayXms(4); lcd_write_cmd(0x01); delayXms(4); lcd_write_cmd(0x80); for(i=0;i<16;i++) //液晶第一列显示“Journey: mm“ lcd_write_dat(display1[i]); lcd_write_cmd(0x80+0x40);//液晶第二列显示“Speed: mm/s “ for(i=0;i<16;i++) lcd_write_dat(display2[i]); } void Timer_Init() //定时器0和定时器1初始化函数 { TMOD=0x11; ET0=1; TR0=0; ET1=1; EA=1; TH1 = (65535-50000)/256; //初使加载50毫秒 TL1 = (65535-50000)%256; } void INT0_Init() //外部中断0初始化 { IT0 = 1; EX0 = 1; EA = 1; } void EXT_INT0(void) interrupt 0 //外部中断0中断处理函数 { count1++; count2++; } void T0_time() interrupt 1 //定时器0中断处理函数 { TH0=0; TL0=0; } void T1_time() interrupt 3 //定时器1中断处理函数 { TR1=0; TH1 = (65535-50000)/256; TL1 = (65535-50000)%256; n++; m++; if(m==2) { m=0; flag1=1; } if(n==20) //定时2秒(40个50ms为1秒)
{ n=0; journey = count2 * 3.14* diameter/disc/10 ; //路程等于总脉冲输除以栅格数乘以周长单位cm qian = (journey/1000)+48; bai2 = (journey%1000/100)+48; shi2 = (journey%1000%100/10)+48; ge2 = (journey%1000%100%10)+48; speed=count1*3.14* diameter/disc/2 ;//单位是mm/s因为定时两秒所以除以2 bai1 = (speed/100)+48; shi1 = (speed%100/10)+48; ge1 = (speed%100%10)+48; count1=0; } TR1=1; } void goahead() //小车直走 { IN1 = 1; IN2 = 0; IN3 = 1; IN4 = 0; } void goback() //小车后退 { IN1 = 0; IN2 = 1; IN3 = 0; IN4 = 1; } void turnright() //小车向右转 { IN1 = 1; IN2 = 0; IN3 = 0; IN4 = 1; } void turnleft() //小车向左转 { IN1 = 0; IN2 = 1; IN3 = 1; IN4 = 0; } void zw_turnright() //用于转弯时的左转 { IN1 = 1; IN2 = 0; IN3 = 0; IN4 = 0; } void zw_turnleft() //用于转弯时的右转 { IN1 = 0; IN2 = 0; IN3 = 1; IN4 = 0; } void stop() //小车停止 { IN1 = 0; IN2 = 0; IN3 = 0; IN4 = 0; } void PWM(void) //小车调速 { PWM_ENA = 1; PWM_ENB = 1; delayXms(H); PWM_ENA = 0; PWM_ENB = 1; delayXms(L); PWM_ENA = 0; PWM_ENB = 0; delayXms(N); } void track( void ) { uchar temp = 0; temp = P1 & 0x0f; //取P1口低四位赋给变量temp switch( temp ) { case 0x09: goahead(); //直走 break; case 0x0c: case 0x0e: turnleft();//左转 break; case 0x03: case 0x07: turnright();//右转 break; case 0x0f: goback();// 后退 break; case 0x00: stop(); //停止 break; case 0x08: zw_turnleft();//用于直角转弯时的左转 delayXms(20); break; case 0x01: zw_turnright(); //用于直角转弯时的右转 delayXms(20); break; default: break; } } void csb() //超声波模块检测子函数 { TH0=0; //重新装初值 TL0=0; TX=1; //触发一次 delay_20us(); //延时,for(i=0;i<100;i++)_nop_(); TX=0; while(RX==0); //没接收到回波时等待 TR0=1; //接收到回波打开定时器 while(RX); //回波没结束等待 TR0=0; //接收到回波后关闭定时器 time=TH0*256+TL0; juli=time*0.017; //(1/(12*1000000))*340*12*100/2得到的是距离单位为cm ;

if(juli<=7) { stop(); LED1 = !LED1; LED2 = !LED2; delayXms(100); flag3=1; } else if((juli>5)&&(juli<=50)) { LED1 = !LED1; LED2 = !LED2; delayXms(100); flag3=0; } else if(juli>50) { LED1=1; LED2=1; flag3=0; } } void main() { Timer_Init(); //定时器初始化 INT0_Init(); //外部中断初始化 LCD_Init(); //LCD1602初始化 TR1=1; //启动定时器 lcd_write_cmd(0x80); LED1 = 1; LED2 = 1; while(1) { PWM(); //pwm调速 track(); //调用循迹子程序 lcd_write_cmd(0x80+0x09); lcd_write_dat(qian); lcd_write_cmd(0x80+0x0a); lcd_write_dat(bai2); lcd_write_cmd(0x80+0x0b); lcd_write_dat(shi2); lcd_write_cmd(0x80+0x0c); lcd_write_dat(ge2); lcd_write_cmd(0x80+0x47); lcd_write_dat(bai1); lcd_write_cmd(0x80+0x48); lcd_write_dat(shi1); lcd_write_cmd(0x80+0x49); lcd_write_dat(ge1); if(flag1==1&&flag2==1) { csb(); //调用超声波子程序 flag1=0; } } } 附录3实物图 致谢 毕业论文暂告收尾,这也意味着我在大学学习生活既将结束。回首既往,自己一生最宝贵的时光能于这样的校园之中,能在众多学富五车、才华横溢的老师们的熏陶下度过,实是荣幸之极。在这四年的时间里,我在学习上和思想上都受益非浅。这除了自身努力外,与各位老师、同学和朋友的关心、支持和鼓励是分不开的。

在毕业论文设计过程中,我遇到了许许多多的困难。在此我首先要感谢我的指导老师XX老师给我悉心的帮助和对我耐心而细致的指导,并提出了很多宝贵的修改意见。除了敬佩胡老师的专业水平以外,他的踏踏实实和一丝不苟的作风是我学习和工作的榜样,并将积极影响我今后的学习和工作。并且他循循善诱的指导和独特新颖的创意,给了我莫大的帮助。这次做毕业设计的经历也会使我终身受益,我感受到做毕业设计是要真真正正用心去做的一件事情,是真正的自己学习和设计的过程。

在此,我还要感谢大学四年传授我们专业知识的所有老师。同时感谢我院、系领导对我们的教导和关注,并提供了良好的学习环境,使我们能够在此专心学习,陶冶情操。感谢XX学院电信学院在设计环境和器材方面给予了大力的帮助和支持。

大学四年的生活已经接近尾声,回首已经走过的岁月,心中感慨万千。在论文即将完成之际,我的心情久久不能平静。从开始到现在都有老师同学和父母给了我无限的关心和指导,祝各位老师工作顺利,身体健康。最后感谢我的母校—宁波工程学院四年来对我的大力栽培! 感谢评阅老师百忙之中抽出时间对本论文进行了评阅! 作品(软件)使用说明书 本次设计的智能小车使用简单。首先将9号电池和4节5号电池分别装进小车指定位置,然后将小车停在事先准备好的赛道上,最后按下9号电池附近的开关,小车便可开始循迹前进。前方50cm左右有障碍物的话,安装在小车前面的两个led绿灯会闪,前方7cm左右有障碍物的话,小车会自动停下,直到障碍物移除,小车会继续循迹前进,到赛道终点时小车会自动停下。(注意5号电池附近的开关控制电机的转动,开始时默认已经打开)

推荐访问:毕业设计 单片机 小车

本文来源:https://www.windowchina.cn/fanwendaquan/gongwenfanwen/60905.html

推荐内容