搜索
您的当前位置:首页正文

基于单片机的智能小车控制系统(论文)

来源:欧得旅游网


专 科 毕 业 设 计 (论 文)

题 目 基于单片机智能小车控制系统设计 学生姓名 ____ X X X___ ______ 班 级 X X X X X X X______ 学 号 ____________X X __________ __ 院 (系)_ __电 子 工 程 学 院____ 专 业 ____应 用 电 子 技 术___ 指导教师 ______ _X X X____ _ _ 职 称 ______ __X X X__ _

二0XX 年 X 月 XX 日

成都工业学院专科毕业设计(论文)

摘 要

随着计算机、微电子、材料、机械、通信等技术的快速发展,车辆的智能化和机器人的发展速度也越来越快,作为21世纪自动化领域内非常伟大的成就它已经和人们的生产生活紧密的联系在了一起。智能车辆迅速成为世界车辆研究领域的热点和汽车工业新的增长点。所以,智能化的车辆是未来人们生活重要的载体。因此有必要对智能车辆进行研究。研制一种智能,高效的智能小车控制系统具有重要的实际意义和科学理论价值。本系统设计了一个能自动循迹的智能小车控制系统。以STC89C52单片机为控制核心,利用红外无线遥控智能小车,利用超声波传感器检测道路上的障碍并提示,利用LCD1602显示小车的速度和路程。能实现小车自动根据地面实况前进倒退、转向行驶,超声波测距提示障碍物,LCD1602实时显示小车的速度和行驶的路程,具有高度的智能化,达到设计目标。

关键词:智能小车;STC89C52单片机;超声波传感器;LCD1602

I

成都工业学院专科毕业设计(论文)

THE SMART CAR BASED ON MICROCONTROLLER

ABSTRACT

With the rapid development of computer, microelectronics, materials, machinery, communication and other technologies, the intelligentization of vehicles and the development of robots are getting faster and faster. As a very great achievement in the field of automation in the 21st century, Close ties together. Intelligent vehicles quickly become the world's automotive research hot spots and the new growth point of the automotive industry.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 AT89C51 To achieve infrared wireless remote control smart car, the use of ultrasonic sensors to detect obstacles on the road and prompted the use of LCD1602 show car 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; AT89C51 MCU;ultrasonic sensor;LCD1602

II

成都工业学院专科毕业设计(论文)

目 录

摘要 ......................................................... Ⅰ ABSTRACT ..................................................... Ⅱ 目录 ......................................................... Ⅲ 第1章

绪论 ................................ 错误!未定义书签。 1.1 课题的背景和意义 ..................... 错误!未定义书签。 1.2 课题的研究现状及发展趋势 ............................. 1 第2章

方案设计与论证 ...................................... 2 2.1 主控系统 ............................................. 2 2.2 电源模块 ............................................. 2 2.3

电机驱动模块 ......................................... 2

2.3.1 电机模块选择与论证 ................................. 2 2.3.2 电机驱动模块选泽与论证 ............................. 3 2.4 遥控模块 ............................................. 4 2.5 显示模块 ............................................. 5 2.6 壁障模块 ............................................. 5 第3章

硬件设计 ............................................. 6 3.1 总体设计 ............................................. 6 3.2 驱动电路 ............................................. 6 3.3 遥控电路 ............................................. 9 3.4 显示电路 ............................................ 11 3.5 避障电路 ............................................ 11 3.6 主控电路 ............................................ 13 第4章

软件设计 ............................................ 16 4.1

主程序模块设计 ...................................... 16

III

成都工业学院专科毕业设计(论文)

4.1.1 主程序流程图 ...................................... 16 4.1.2 主程序的设计 ...................................... 17 4.2

电机驱动程序的设计 .................................. 19

4.2.1 电机驱动程序流程图 ................................ 19 4.2.2 电机驱动程序的设计 ................................ 20 4.3

红外遥控程序的设计 .................................. 21

4.3.1 遥控模块流程图 ................................... 21 4.3.2 红外遥控程序的设计 ............................... 22 4.4

测距壁障模块程序的设计 .............................. 23

4.4.1 超声波测距模块流程图 ............................. 23 4.4.2 超声波测距模块程序的设计 ......................... 23 4.5

显示模块程序的设计 .................................. 24

4.5.1 显示模块流程图 ................................... 24 4.5.2 显示模块程序的设计 ............................... 25

第5章

软件仿真 ............................................ 28 5.1 KEIL软件 ........................................... 28 5.2

PROUES软件 ......................................... 28

第6章 实物安装与调试 ..................................... 30

6.1 器件清单 ............................................ 30 6.2 结果及分析 .......................................... 30 6.3

使用指南 ............................................ 31

第7章 结束语 ................................................. 32

参考文献 ...................................................... 33 致 谢 ......................................................34 附录一 原理图 ................................................ 35 附录二 源程序 ................................................ 36 附录三 实物图 ................................................ 45

IV

成都工业学院专科毕业设计(论文)

第1章 绪论

1.1

课题的背景和意义

智能作为现代社会的新产物,是以后的发展方向,他可以按照预先设定的模式在一个特定的环境里自动的运作,无需人为管理,便可以完成预期所要达到的或是更高的目标。本设计主要体现多功能小车的智能模式,设计中的理论方案、分析方法及特色与创新点等可以为自动运输机器人、采矿勘探机器人、家用自动清洁机器人等自动半自动机器人的设计与普及有一定的参考意义。同时小车可以作为玩具的发展对象,为中国玩具市场技术含量的缺乏进行一定的弥补,实现经济收益,形成商业价值。超声波作为智能车避障的一种重要手段,以其避障实现方便,计算简单,易于做到实时控制,测量精度也能达到实用的要求,在未来汽车智能化进程中必将得到广泛应用。我国作为一个世界大国,在高科技领域也必须占据一席之地,未来汽车的智能化是汽车产业发展必然的,在这种情况下研究超声波在智能车避障上的应用具有深远意义,这将对我国未来智能汽车的研究在世界高科技领域占据领先地位具有重要作用。

1.2 课题的研究现状及发展趋势

智能小车的研究、开发和应用涉及传感技术、电气技术、电气控制技术、智能控制等学科,智能控制技术是一门跨科学的综合性技术,当代研究十分活跃,应用日益广泛的领域[1]。众所周知机器人技术的发展是一个国家高科技水平和工业自动化程度的重要标志和体现。因此目前世界各国都在开展对机器人技术的研究。机器人由于有很高的灵活性、可以帮助人们提高生产率、改进产品质量等优点,在世界各地的生产生活领域得到了广泛的应用[2]。智能小车正是模仿机器人的一种尝试。它是一种以汽车电子为背景,涵盖多学科的科技创新性设计,现智能小车发展很快,从智能玩具到其它各行业都有实质成果。其基本可实现循迹、避障、检测贴片、寻光入库、避崖等基本功能,这几届的电子设计大赛智能小车又在向声控系统发展。

第1页

成都工业学院专科毕业设计(论文)

第2章 方案设计与论证

2.1 主控系统

本设计采用STC89C52单片机为主控芯片,通过电机驱动电路和超声波发射接收及液晶实时显示小车与障碍物的距离红外遥控设计而成,采用模块化的设计方案。并且运用红外遥控器控制小车的前进,后退,左右转和停止的功能。

2.2 电源模块

本次设计采用了7805芯片,因为7805电源芯片的电路简单,实用,并且能够完全满足智能避障小车和单片机控制系统和L298N(直流电机驱动)芯片的供电。7805芯片的实物有3个引脚,分别为输入IN端、输出OUT端和接地GND端,一般情况下可以提供1.5A的电流,如果在散热足够的情况下可以提供51单片机主控模块和直流电机驱动等模块的电压。根据7805电源芯片的情况再结合电机的工作电压,故选取了12V电源作为7805的输入电源。

2.3 电机驱动模块

2.3.1 电机模块选择与论证

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

第2页

成都工业学院专科毕业设计(论文)

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

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

图2.1 直流减速电机

2.3.2 电机驱动模块选择与论证

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

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

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

第3页

成都工业学院专科毕业设计(论文)

图2.2 L298N

2.4 遥控模块

本设计采用红外遥控来控制信号的传送。选择红外遥控装置作为小车的遥控控制器。红外遥控是通过遥控发射器内的编码芯片将按键信息调制成一串0和1的二进制代码,然后通过红外线发出,最后被红外接收装置接收进行解码,再运用单片机对解码后的码信息进行识别,然后再根据不同的码信息进行不同的控制操作[9]。

图2.3 VS1838封装

第4页

成都工业学院专科毕业设计(论文)

2.5 显示模块

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

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

通过以上方案论述我们选择方案二,显示小车与障碍物距离的任务。

图2.4 LCD1602液晶显示器

2.6 避障模块

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

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

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

第5页

成都工业学院专科毕业设计(论文)

第3章 硬件设计

3.1 总体设计

智能小车采用前轮驱动,前轮左右两边各用一个电机驱动,通过电机驱动芯片L298N来控制前面两个轮子的转动与停止从而达到控制转向的目的,后轮是拖动轮,起支撑作用。小车距离的检测通过超声波传感器HC-SR04,将检测到的数据传回单片机进行处理。

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

总体设计框图如图3.1。

键编编红系盘码码外统遥芯调发应控 片 制 射 答 晶振模块 红外遥控模块 电机驱动模块 STC89C52 超声避障模块 数据显示模块 a 遥控部分框图 b 小车部分框图

图3.1 系统总体设计框图

3.2 驱动电路

电机驱动芯片采用L298N,是一款承受高压大电流的全桥型直流/步进电压驱动器,如下图3.2。

第6页

成都工业学院专科毕业设计(论文)

图3.2电机控制芯片L298N的引脚排列

其中L298N各引脚的编号与功能和内部逻辑如下表3.1和图3.3。

引脚编号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 名称 电流传感器A 输出引脚1 输出引脚2 电机电源端 输入引脚1 使能端A 输入引脚2 逻辑地 逻辑电源端 输入引脚3 使能端B 输入引脚4 输出引脚3 输出引脚4 电流传感器B

表3.1 L298N引脚编号与功能 功能 在该引脚和地之间接小阻值电阻可用来检测电流 内置驱动器A的输出端1,接至电机A 内置驱动器A的输出端2,接至电机A 电机供电输入端,电压可达46V 内置驱动器A的逻辑控制输入端1 内置驱动器A的使能端 内置驱动器A的逻辑控制输入端2 逻辑地 逻辑控制电路的电源输入端为5V 内置驱动器B的逻辑控制输入端1 内置驱动器B的使能端 内置驱动器B的逻辑控制输入端2 内置驱动器B的输出端1,接至电机B 内置驱动器B的输出端2,接至电机B 在该引脚和地之间接小阻值电阻可用来检测电流 第7页

成都工业学院专科毕业设计(论文)

图3.3 L298N内部原理图

电机驱动A/B的控制逻辑如下表所示。

表3.2 电机驱动A/B的控制逻辑 输入信号 输入引脚1/3 输入引脚2/4 1 0 0 1 1 1 0 0 X X

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

第8页

成都工业学院专科毕业设计(论文)

图3.4 L298N驱动原理图

3.3 遥控电路

红外接收器也叫做一体化红外接收头,其内部是由红外监测二极管,放大器,限副器,带通滤波器,积分电路,比较器等构成的。红外监测二极管接收到红外信号后,会把信号送到放大器和限幅器,限幅器把脉冲幅度控制在一定的水平。交流信号进入带通滤波器,带通滤波器只允许30khz到60khz的负载波通过,然后脉冲信号再通过解调电路和积分电路进入比较器,由比较器输出高低电平信号,还原出发射端的信号波形。但为了提高接收的灵敏度输出的高低电平和发射端是反相的。红外接收头有很多的种类,一般都有电源引脚、信号输出引脚和接地引脚。根据发射端调制载波的不同应选用相应解调频率的接收头,本设计我们采用车载遥控发射器、一体化红外接收头1838来解调HT6221编码芯片的编码。其实物图如图3.5所示:

第9页

成都工业学院专科毕业设计(论文)

图3.5(1) 1838红外接收头 图3.5(2) 车载遥控发射器

由于红外接收头内部放大器也很大的增益,这样很会容易引起干扰,因此在接收头的电源引脚上须加上大小在22uf以上的滤波电容。本设计的红外接收电路如图3.6所示:

图3.6 红外接收电路图

其中U6为1838红外接收头,电容C4为滤波电容,DOUT 是解调信号的输出端,直接与单片机的P3.2引脚即INT0中断相连[8]。

解码的重点是怎样识别位0和位1,由于位0和位1的低电平脉宽相同但高电平脉宽不一样。所以需要根据高电平的宽度区别位0和位1,如果从0.56ms低电平信号过后延时了0.56ms以后如果能读到低电平信号说明该位为0反之则为1,为了可靠起见延时必须介于0.56ms和1.12ms之间,否则如果该位为0读到的已是下一位的高电平,因此我们取其中间值即(1.12ms+0.56ms)/2=0.84ms。

当按下遥控器的按键后,便有红外脉冲编码信号发出,经红外接收头接收解码后在其输出端输出检波整形后的方波信号,然后直接输入至单片机外部中断进行码信息的识别,单片机再调用相应子程序执行对应的操作。

第10页

成都工业学院专科毕业设计(论文)

3.4 显示电路

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

图3.7显示电路原理图

3.5 避障电路

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

第11页

成都工业学院专科毕业设计(论文)

图3.8 HC-SR04超声波测距模块

HC-SR04电气参数如表3.3所示,声波时序图如图3.9(1)所示,超声波检测原理图如图3.9(2)所示。

表3.3 HC-SR04电气参数

图3.9(1)超声波声波时序图

第12页

成都工业学院专科毕业设计(论文)

图3.9(2)超声波检测原理图

3.6 主控电路

单片机是控制单元的核心。起着控制小车所有运行状态的作用。单片机控制模块使用的是STC公司生产的STC89C52RC,使用该芯片很容易实现对其它模块的控制。通过对单片机STC89C52RC写入程序,可以方便的用软件来控制。

第13页

成都工业学院专科毕业设计(论文)

图3.10 单片机最小系统

STC89C52RC单片机最小系统包括了晶振电路,电源电路以及复位电路,其中复位电

路的复位按键用于小车的复位。P1.3~P1.7分别控制电机驱动。其它P口用外接控制小车的各种控制开关,P0口外接上拉电阻,可用于外接LCD1602。

STC89C52RC单片机介绍:

STC89C52RC是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有 8K字节系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。主要特性如下:

1. 增强型8051单片机,6时钟/机器周期和12时钟/机器周期可以任意选择,指

令代码完全兼容传统8051。

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

48MHz。

3. 工作电压:5.5V~3.3V(5V单片机)/3.8V~2.0V(3V单片机)

第14页

成都工业学院专科毕业设计(论文)

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.10

图3.11 STC89C52引脚图

第15页

成都工业学院专科毕业设计(论文)

第4章 软件设计

4.1

主程序模块的设计

4.1.1 主程序的流程图

本设计软件部分主要分为五大模块,分别为显示模块、超声波模块、电机驱动模块、红外遥控模块、主程序模块。其中定时器0用来计数器溢出,超出测量范围,T1用于检测脉宽信号;外部中断0用于红外遥控。在图4-1主程序流程图中,开始时先是单片机的初始化,包括定时器初始化,外部中断的初始化,液晶的初始化。然后调用循迹子程序,小车正常行驶,如果遇到了障碍则调用超声波模块子程序,判断前方30cm处是否有障碍物,如果检测到左右障碍则小车后退到安全距离后,再次正常行驶。

第16页

成都工业学院专科毕业设计(论文)

开始 N

开关接通 Y 单片机初始化 调用显示子程序 调用测距子程序 遥控信号 Y N 调用红外遥控子程序 由键值改变小车状态 调用避障子程序 图4.1 主程序流程图

4.1.2 主程序的设计

void main() {

EN1 = EN2 = 1; cmg88(); LCMInit(); delay(5); DisplayListChar(0, 0, Range); DisplayListChar(0, 1, table); TMOD |= 0x01; TMOD = 0x20;

//使能左右电机 //关数码管 //LCM初始化 //延时

//1602第一行显示range数组的内容 //1602第二行显示table数组的内容 //定时器0工作方式1,16位定时模式 //定时器1工作方式2,8位自动重装

第17页

成都工业学院专科毕业设计(论文)

TH1 = 0x00; //写0,表示溢出一次时间是256个机器周期 TL1 = 0x00; ET1 = 1; //开定时器1中断 TR1 = 1; //启动定时器1 IT0 = 1; //设置外部中断0的跳转方式 EX0 = 1; //启动外部中断0 TH0 = 0;

TL0 = 0;

ET0 = 1; //允许T0中断 EA = 1; //开总中断 while(1) {

StartModule(); //启动测距模块 while(!RX); //等待 TR0=1; //开启计数 while(RX); //计数并等待 TR0=0; //关计数 Conut(); //计算距离 Avoid(); //避障

if(IRok) //判断脉宽是否检测完毕 {

IRcordpro(); //根据脉宽检测出4个字节的数据 IRok = 0; //重新等待脉宽检测 if(IRpro_ok) //判断是否解码完成 {

switch(IRcord[2]) {

case 0x18: forward(); //前进 delay(1000); break;

case 0x52: backward(); //后退 delay(1000); break;

case 0x08: left_rapidly(); //左转 delay(1000); break;

case 0x5A: right_rapidly(); //右转 delay(1000); break;

case 0x1C: stop(); //停止 delay(2000); break; default:break; }

第18页

成都工业学院专科毕业设计(论文)

}

IRpro_ok = 0; }

} }

delay(65);

4.2 电机驱动程序的设计

4.2.1 电机驱动程序流程图

电机驱动子函数 默认前进 检测到左障碍 正常前进 检测到右障碍 检测到左右障碍 调用右转子程序 调用前进子程序 调用左转子程序 调用后退子程序 右电机停止 左电机正转 左右电机正转 右电机正转 左电机停止 左右电机反转 小车右转 小车前进 小车左转 小车后退 返回 图4.2 电机驱动程序流程图

电机驱动程序流程图如上图4.2,当接通电源开关时,小车则调用默认前行程序,正常前行。超声波检测模块启用检测子程序。当检测到小车左侧有障碍物,则小车调用右转子程序,使小车达到安全行驶距离,右转程序流程一样,不在赘述。如果小车检测到左右障碍,这时小车会短时间停车,然后调用后退子程序,使小车后退到安全距离,再次回到正常行驶状态。如果后退到一定距离还未达到安全行驶距离,则小车则会再次调用相应子程序使小车达到正常行驶的距离。

第19页

成都工业学院专科毕业设计(论文)

4.2.2 电机驱动程序的设计

#include sbit IN1 = P1^2; sbit IN2 = P1^3; sbit IN3 = P1^6; sbit IN4 = P1^7; sbit EN1 = P1^4; sbit EN2 = P1^5;

void delay(unsigned int z) { unsigned int x,y;

for(x = z; x > 0; x--)

for(y = 114; y > 0 ; y--); }

void main() {

EN1 = 1; EN2 = 1; IN1 = 0; IN2 = 1; IN3 = 1; IN4 = 0; delay(3000); EN1 = 0; EN2 = 0; delay(3000); EN1 = 1; EN2 = 1; IN1 = 1; IN2 = 0; IN3 = 0; IN4 = 1; delay(3000); EN1 = 0; EN2 = 0; delay(3000); EN1 = 1; EN2 = 1; IN1 = 0; IN2 = 1; IN3 = 0; IN4 = 0; delay(3000);

第20页

成都工业学院专科毕业设计(论文)

}

EN1 = 0; EN2 = 0; delay(3000); EN1 = 1; EN2 = 1; IN1 = 1; IN2 = 1; IN3 = 1; IN4 = 0; delay(3000); EN1 = 0; EN2 = 0; while(1);

4.3 红外遥控程序的设计

4.3.1 红外遥控模块流程图

红外遥控子函数 遥控信号 发射右转信号 发射前进信号 发射左转信号 发射后退信号 发射停止信号 调用右转子程序 调用前进子程序 调用左转子程序 调用后退子程序 调用停止子程序 右电机停止 左电机正转 左右电机正转 小车右转 小车前进 右电机正转 左电机停止 小车左转 返回 左右电机反转 左右电机停转 小车后退 小车停车 图4.3 红外遥控模块流程图

在图4.3 红外遥控模块流程图中,通过遥控器发射控制信号,然后检测分析P3.2口接收到的信号,从而控制小车的行驶状态。程序中为了缓和小车在行进中存在的惯性,所

第21页

成都工业学院专科毕业设计(论文)

以每个状态切换时都会有一小段延时效果。

4.3.2 红外遥控子程序设计

void timer0() interrupt 1 {

flag=1;

}

void StartModule() {

TX=1; Delay10us(2); TX=0; }

void forward() {

left_motor_go; right_motor_go; }

void backward() {

left_motor_back; right_motor_back; }

void stop() {

right_motor_stops; left_motor_stops; }

void left_rapidly() {

left_motor_back; right_motor_go; }

void right_rapidly() {

left_motor_go; right_motor_back; }

第22页

成都工业学院专科毕业设计(论文)

4.4 测距避障模块程序的设计

4.4.1 测距模块流程图

测距子程序 避障子程序 发射超声波 有障碍? 接收返回超声波 Y 后退 计算与障碍物的距离 左转 调用显示子程序 返回 图4.4 测距模块流程图

前进 N 返回

测距模块流程图如图4.4,开始时单片机先给超声波测距模块Trig端发送一个高电平且这个高电平要持续20us,然后再给Trig端发送一个低电平,即启动了超声波测距模块,超声波测距模块会自动发送8个40KHZ的方波,等待是否有信号返回,如果有信号返回会通过IO口超声波测距模块的Echo端输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间,测试距离=(高电平时间*声速(340M/S))/2,单位为mm。如果距离小于30cm,小车会后退并转向。

4.4.2 测距模块程序设计

void Conut(void)

{

time=TH0*256+TL0; TH0=0; TL0=0;

第23页

成都工业学院专科毕业设计(论文)

S=(float)(time*1.085)*0.17; if((S>=7000)||flag==1) {

flag=0;

disbuff[0]=10; disbuff[1]=10; disbuff[2]=10; disbuff[3]=10; } else {

disbuff[0]=S/1000; disbuff[1]=S%1000/100; disbuff[2]=S%100/10; disbuff[3]=S%10; } }

4.5 显示模块程序的设计

4.5.1 显示模块流程图

显示子函数 初始化LCD1602显示屏 液晶第一列显示:==Range Finder== 液晶第二列显示:Distance:000.0mm 结束

图4.5 显示模块流程图

图4.5为显示模块流程图,先是初始化LCD1602然后在液晶的第一行显示\"==Range

第24页

成都工业学院专科毕业设计(论文)

Finder==\"液晶第二列显示\"Distance:000.0mm\"然后在主程序不断的调用显示程序刷新mm前面的数字。

4.5.2 显示程序设计

unsigned char ReadStatusLCM(void) {

LCM_Data = 0xFF; LCM_RS = 0; Delay10us(1); LCM_RW = 1; Delay10us(1); do{

LCM_E = 0; Delay10us(1); LCM_E = 0; Delay10us(1); LCM_E = 1; Delay10us(1); }

while (LCM_Data & Busy); return(LCM_Data); }

void WriteDataLCM(unsigned char WDLCM) {

ReadStatusLCM(); LCM_Data = WDLCM; LCM_RS = 1; Delay10us(1); LCM_RW = 0; Delay10us(1); LCM_E = 0; Delay10us(1); LCM_E = 0; Delay10us(1); LCM_E = 1; Delay10us(1); }

void WriteCommandLCM(unsigned char WCLCM,BuysC) {

if (BuysC) ReadStatusLCM();

第25页

成都工业学院专科毕业设计(论文)

LCM_Data = WCLCM; LCM_RS = 0; Delay10us(1); LCM_RW = 0; Delay10us(1); LCM_E = 0; Delay10us(1); LCM_E = 0; Delay10us(1); LCM_E = 1; Delay10us(1); }

void LCMInit(void) {

LCM_Data = 0;

WriteCommandLCM(0x38,0); delay(5);

WriteCommandLCM(0x38,0); delay(5);

WriteCommandLCM(0x38,0); delay(5);

WriteCommandLCM(0x38,1); WriteCommandLCM(0x08,1); WriteCommandLCM(0x01,1); WriteCommandLCM(0x06,1); WriteCommandLCM(0x0c,1); }

void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData) {

Y &= 0x1; X &= 0xF;

if (Y) X |= 0x40; X |= 0x80;

WriteCommandLCM(X, 1); WriteDataLCM(DData); }

void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData) {

unsigned char ListLength;

ListLength = 0; Y &= 0x1;

第26页

成都工业学院专科毕业设计(论文)

X &= 0xF;

while (DData[ListLength]>0x19) {

if (X <= 0xF)

}

}

{

DisplayOneChar(X, Y, DData[ListLength]); ListLength++; X++; } 第27页

成都工业学院专科毕业设计(论文)

第5章 软件仿真

5.1 KEIL软件

Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(μVision)将这些部分组合在一起。运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。如果你使用C语言编程,那么Keil几乎就是你的不二之选,即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。优点如下:

⒈Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。

⒉与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。用过汇编语言后再使用C来开发,体会更加深刻。

5.2 Protues软件

Proteus软件是英国Lab Center Electronics公司出版的EDA工具软件(该软件中国总代理为广州风标电子技术有限公司)。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是目前比较好的仿真单片机及外围器件的工具。虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。

Proteus是英国著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,

第28页

成都工业学院专科毕业设计(论文)

2010年又增加了Cortex和DSP系列处理器,并持续增加其他系列处理器模型。在编译方面,它也支持IAR、Keil和MPLAB等多种编译器。优点如下:

1.Proteus可提供的仿真元器件资源:仿真数字和模拟、交流和直流等数千种元器件,有30多个元件库。

2.Proteus可提供的仿真仪表资源 :示波器、逻辑分析仪、虚拟终端、SPI调试器、I2C调试器、信号发生器、模式发生器、交直流电压表、交直流电流表。理论上同一种仪器可以在一个电路中随意的调用。

3.除了现实存在的仪器外,Proteus还提供了一个图形显示功能,可以将线路上变化的信号,以图形的方式实时地显示出来,其作用与示波器相似,但功能更多。这些虚拟仪器仪表具有理想的参数指标,例如极高的输入阻抗、极低的输出阻抗。这些都尽可能减少了仪器对测量结果的影响。

4.Proteus可提供的调试手段 Proteus提供了比较丰富的测试信号用于电路的测试。这些测试信号包括模拟信号和数字信号

我们首先单独调试各功能子程序,检验程序是否能够实现预期的功能,接口电路的控制是否正常等;最后逐步将各子程序连接起来总调。

第29页

成都工业学院专科毕业设计(论文)

第六章 实物安装与调试

6.1 器件清单

表6.1 器件列表 器件名称 PROTUES KEIL 电机 超声波探测模块 LCD1602 底板 电路板 STC89C52单片机 单片机最小系统 开关(有锁) 电机驱动模块 红外接收模块 LED灯 车轮 电池盒 电池 遥控器 3k电阻 杜邦线 扎带 器件类型 软件 硬件 数量(个) 1 1 2 1 1 1 1 1 1 1 1 1 1 4 2 8 1 1 若干 若干

6.2 结果及分析

在这个课题中我们计划三步完成小车,第一步当然也是最重要的一步,小车的软件核心部分,相当于小车的血液。在论文前面有所分析,这里不再赘述。第二步则是小车的整装调试,这一部分相当于是小车的骨架。我们先在电路板上面设计了模块的布局位置,将每一个模块的最佳位置固定好,方便后面插线连接。然后再将每一个模块打孔用螺丝固定好。第三步也是最重要的一步,在整车连接无误后,先用万用表检测通断,查看有无短路或断路的情况。由于我们按照计划一步一步的整合装车所以硬件连接没有上述问题。接着将单片机连接到最小系统上面,进行整车测试。反复多次调程序,最终达到预期效果。

以下是详细步骤步骤:

第30页

成都工业学院专科毕业设计(论文)

①首先测试电源的工作情况,各个模块能否得到良好供电。 ②然后检查单片机能否正常的烧写程序和工作。

③光电管安装完成后根据测试数据调节电位器选择合适的参考电压。 ④测试两前轮电机的工作情况,并试验电机的驱动能力。 ⑤反复测试各参数变化对小车的影响,找出最有效的配置。

⑥对小车运行过程中各种可能出现的情况测试,发现问题,找出解决方法。 ⑦让小车进行实地运行,发现问题并解决。 ⑧整理数据,优化程序设计。

经过多次调试,本系统能够基本满足设计要求,能够较快较平稳的正常行驶。

6.3 使用指南

本次设计的智能小车使用简单。首先将8节1.5v的干电池装到小车的指定电池盒里,然后将小车停在事先准备好的测试区域里,最后按下小车的总开关,小车便可正常行驶。前方30cm左右有障碍物的话,小车会转弯,前方7cm左右有障碍物的话,小车会自动停下一小段时间,然后后退,直到达到安全转弯距离,小车会继续正常前进。当按下遥控器上面的“2”号键,小车会一直向前行驶直到遇见障碍物;当按下“8”号键,小车会后退;当按下“4”号键,小车会左转;当按下“6”号键,小车会右转;当按下“5”号键小车会停车。(注意启动小车前请检查线路有无脱线情况)

第31页

成都工业学院专科毕业设计(论文)

第七章 结束语

本论文在曾一江老师的悉心指导下完成的。老师渊博的专业知识、严谨的治学态度,精益求精的工作作风,诲人不倦的高尚师德,严于律己、宽以待人的崇高风范,朴实无法、平易近人的人格魅力对本人影响深远。不仅使本人树立了远大的学习目标、掌握了基本的研究方法,还使本人明白了许多为人处事的道理。本次论文从选题到完成,每一步都是在老师的悉心指导下完成的,倾注了老师大量的心血。在此,谨向老师表示崇高的敬意和衷心的感谢!在写论文的过程中,遇到了很多的问题,在老师的耐心指导下,问题都得以解决。所以在此,再次对老师道一声:老师,谢谢您!

时光匆匆如流水,转眼便是大学毕业时节,春梦秋云,聚散真容易。离校日期已日趋渐进,毕业论文的完成也随之进入了尾声。从开始进入课题到论文的顺利完成,一直都离不开老师、同学、朋友给我热情的帮助,在这里请接受我诚挚的谢意!在此我向学校应用电子技术专业的所有老师表示衷心的感谢,谢谢你们三年的辛勤栽培,谢谢你们在教学的同时更多的是传授我们做人的道理,谢谢三年里面你们孜孜不倦的教诲!

三年寒窗,所收获的不仅仅是愈加丰厚的知识,更重要的是在阅读、实践中所培养的思维方式、表达能力和广阔视野。很庆幸这三年来我遇到了如此多的良师益友,无论在学习上、生活上,还是工作上,都给予了我无私的帮助和热心的照顾,让我在一个充满温馨的环境中度过三年的大学生活。感恩之情难以用言语量度,谨以最朴实的话语致以最崇高的敬意。

最后要感谢的是我的父母,他们不仅培养了我对中国传统文化的浓厚的兴趣,让我在漫长的人生旅途中使心灵有了虔敬的归依,而且也为我能够顺利的完成毕业论文提供了巨大的支持与帮助。在未来的日子里,我会更加努力的学习和工作,不辜负父母对我的殷殷期望!我一定会好好孝敬他们,报答他们!爸妈,我爱你们!

“长风破浪会有时,直挂云帆济沧海。”这是我少年时最喜欢的诗句。就用这话作为这篇论文的一个结尾,也是一段生活的结束。希望自己能够继续少年时的梦想,永不放弃。

第32页

成都工业学院专科毕业设计(论文)

参考文献

[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.

第33页

成都工业学院专科毕业设计(论文)

致 谢

轻轻敲击键盘,转眼间又是一年五月天,三年前的我还是那么的朝气蓬勃,但随着时间的流逝和生活的磨砺我慢慢沉淀,渐渐沉稳。临毕业之际,面对工作的焦虑,在此情形下形成的这篇论文难免仓促,心里始终为此而不安。

时光如梭,即将离别校园,再一次感受着生活了三年的校园泥土的气息,心中充满的除了不舍,还是不舍。不舍的同时,对母校和这里的一切让我感动的人和事我都心存感激。

在这里,我要特别感谢我的指导老师曾一江教授,曾老师高尚的道德品格,严谨的治学态度,渊博的专业知识、谦虚的做人原则和积极乐观的处世风格,都在潜移默化中不断影响着我。从老师身上,我学到的不只是专业知识,更重要的是严于律己、宽以待人的宽广胸怀。真心的感谢曾老师对自己学习、生活和成长中的帮助,也衷心的祝福老师身体健康,工作顺心。此外,还要感谢所有的任课老师:学识渊博的吴睿老师、治学严谨的徐丽老师、博学多闻的王东艳老师,你们在课堂亦或是课间对我们的每一句话都将会成为我们日后远行最最珍贵的教诲和叮咛。感谢学院的罗院长,还有刘炳甫老师、包中婷老师对我工作能力的栽培,你们对我的信任和关怀,让我在实践中不断地锻炼和成长。

其次,我要感谢一直陪伴了我三年的兄弟们,我们曾经一起疯、一起笑、一起拼搏、一起畅想未来,在我难过仿徨时给我安慰和帮助,在我疯狂时给我包容和理解,在我成功快乐时与我一起分享,人生中最美好的青春年华,感谢你们陪我一起走过。

再次,我要感谢我的父母和亲人,是你们带给我所有的快乐和幸福,是你们的关爱和牵挂,让我的大学生活更加绚烂多彩。感谢身边所有给予我莫大帮助和关怀的亲爱的同窗好友们,是你们在专业学习中的帮助和生活中的鼓励,让我的生命更加饱满,更加成熟,我要对你们真心的说一句:谢谢!

尚未配妥剑,出门便是江湖。朋友们,咱们江湖再见,最后再道一声:珍重,且行且珍惜!

感谢评阅老师百忙之中抽出时间对本论文进行了评阅!

第34页

成都工业学院专科毕业设计(论文)

附录一 原理图

第35页

成都工业学院专科毕业设计(论文)

附录二 源程序

#include //51头文件

#include //包含Nop等系统函数

#include //QX-A51智能小车配置文件

typedef unsigned char INT8U; typedef unsigned char uchar; typedef unsigned int INT16U;

sbit DU = P2^6; //数码管段选

sbit RX = P2^0; //ECHO超声波模块回响端 sbit TX = P2^1; //TRIG超声波模块触发端 sbit LCM_RW = P3^6; //定义LCD引脚 sbit LCM_RS = P3^5; sbit LCM_E = P3^4;

#define LCM_Data P0 //定义液晶屏数据口

#define Busy 0x80 //用于检测LCM状态字中的BUSY标识

unsigned char pwm_left_val = 100; //左电机占空比值 取值范围0——170,0最快

unsigned char pwm_right_val = 110; //右电机占空比值 取值范围0——170,0最快

unsigned char pwm_t; //周期 unsigned int time = 0; //传输时间 unsigned long S = 0; //距离

bit flag = 0; //超出测量范围标志位

sbit IR = P3^2; //定义红外脉冲数据接口,外部中断0输入口

uchar IRtime; //检测红外高电平持续时间(脉宽) ucha rIRcord[4]; //此数组用于存放分离出来的4个字节的数据(用户码2个字节+键值码2个字节)

ucharIRdata[33]; //此数组用于存放红外的33位数据(第一位为引导码+用户码16+键值码16)

bit IRpro_ok, IRok; //第一个用于红外接收4个字节数据完毕,IRok用于检测脉宽完毕

unsigned char code Range[] =\"==Range Finder==\";//LCD1602显示格式 unsigned char code ASCII[13] = \"0123456789.-M\"; unsigned char code table[]=\"Distance:000.0mm\"; unsigned char code table1[]=\" Out of range\";

第36页

成都工业学院专科毕业设计(论文)

unsigned char disbuff[4] = { 0,0,0,0}; //距离显示缓存 void time0() interrupt 3 //定义定时器1 {

IRtime++; //检测脉宽,一次为278us }

/******************************红外*******************************/ void int0() interrupt 0 {

static uchar i; 平的持续时间存入IRdata

static bit startflag; if(startflag) {

if( (IRtime < 53) && (IRtime >= 32) )

i = 0; 存放到IRdata的第一个位

IRdata[i] = IRtime; 个时间存放到数组里面到后面判断

IRtime = 0; 存入脉宽

i++; if(i == 33) 标是从0开始i等于33表示执行了34次 {

IRok = 1; i = 0; } }

else {

IRtime = 0; 始计数

startflag = 1; } }

void IRcordpro() {

uchar i, j, k, cord, value;

k = 1; 脉宽

for(i = 0; i < 4; i++) {

for(j = 0; j < 8; j++)

//定义外部中断0 //声明静态变量,i用于把33次高电//开始存储脉宽标志位 //开始接收脉宽检测 //如果是引导码那么就执行i=0把它//以T0的溢出次数来计算脉宽,把这//计数清零,下一个下降沿的时候再//计数脉宽存入的次数 //如果存入的次数是34次,数组的下//表示脉宽检测完毕

//把脉宽计数清零准备下次存入 //引导码开始进入把脉宽计数清零开//开始处理标志位置1 //提取它的33次脉宽进行数据解码 //从第一位脉宽开始取,丢弃引导码第37页

成都工业学院专科毕业设计(论文)

{

cord = IRdata[k]; //把脉宽存入cord if(cord > 5) value = value | 0x80; if(j < 7) {

value = value >> 1; //value位左移一次接收8位数据 }

k++; //每执行一次脉宽位加1 }

IRcord[i] = value; //每处理完一个字节把它存入IRcord数组中

value = 0; //清零value方便下一次存入数据 }

IRpro_ok = 1; //接收完4个字节后IRpro_ok置1表示红外解码完成 }

/******************************************************************************/

void delay(unsigned int z) //毫秒级延时 {

unsigned int x,y;

for(x = z; x > 0; x--)

for(y = 114; y > 0 ; y--); }

void Delay10us(unsigned char i) //10us延时函数 {

unsigned char j; do{

j = 10; do{

_nop_(); }while(--j); }while(--i); }

void cmg88() //关共阴极码管 {

DU=1;

P0=0X00; //给低电平表示全部熄灭 DU=0; }

第38页

成都工业学院专科毕业设计(论文)

/********************LCD1602液晶屏驱动函数 ***********************/

//*************************读状态***************************// unsigned char ReadStatusLCM(void) {

LCM_Data = 0xFF; LCM_RS = 0; Delay10us(1); LCM_RW = 1; Delay10us(1); do{

LCM_E = 0; Delay10us(1); LCM_E = 0; Delay10us(1); LCM_E = 1; Delay10us(1); }

while (LCM_Data & Busy); //检测忙信号 return(LCM_Data); }

/*******************************写数据*****************************/ void WriteDataLCM(unsigned char WDLCM) {

ReadStatusLCM(); //检测忙 LCM_Data = WDLCM; LCM_RS = 1; Delay10us(1); LCM_RW = 0; Delay10us(1);

LCM_E = 0; Delay10us(1);

LCM_E = 0; //延时 Delay10us(1); LCM_E = 1; Delay10us(1); }

//*************************写指令 ******************************//

void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略检测 {

if (BuysC) ReadStatusLCM(); //根据需要检测忙 LCM_Data = WCLCM; LCM_RS = 0; Delay10us(1);

第39页

成都工业学院专科毕业设计(论文)

LCM_RW = 0; Delay10us(1); LCM_E = 0; Delay10us(1); LCM_E = 0; Delay10us(1); LCM_E = 1; Delay10us(1); }

//***************************LCM初始化***************************// void LCMInit(void) {

LCM_Data = 0;

WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号 delay(5);

WriteCommandLCM(0x38,0); delay(5);

WriteCommandLCM(0x38,0); delay(5);

WriteCommandLCM(0x38,1); //显示模式设置,开始每次检测忙信号

WriteCommandLCM(0x08,1); //关闭显示 WriteCommandLCM(0x01,1); //显示清屏

WriteCommandLCM(0x06,1); //显示光标移动设置 WriteCommandLCM(0x0c,1); //显示开及光标设置 }

//*******************按指定位置显示一个字符*********************//

void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData) {

Y &= 0x1; X &= 0xF; //限制x不能大于15,y不能大于1 if (Y) X |= 0x40; X |= 0x80;

WriteCommandLCM(X, 1); WriteDataLCM(DData); }

//*******************按指定位置显示一串字符**********************//

void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData) {

第40页

成都工业学院专科毕业设计(论文)

unsigned char ListLength;

ListLength = 0; Y &= 0x1; X &= 0xF;

while (DData[ListLength]>0x19) {

if (X <= 0xF) {

DisplayOneChar(X, Y, DData[ListLength]); ListLength++; X++; } } }

/***************************************************************************/

/*定时器0中断*/

void timer0() interrupt 1 //T0中断用来计数器溢出,超出测量范围 {

flag=1; //中断溢出标志 }

void StartModule() //启动超声波模块 {

TX=1; //启动一次模块 Delay10us(2); TX=0; }

void forward() {

left_motor_go; right_motor_go;

} //小车前进 void backward() {

left_motor_back; right_motor_back;

} //小车后退 void stop() {

right_motor_stops;

第41页

成都工业学院专科毕业设计(论文)

left_motor_stops;

} //小车停止 void left_rapidly() {

left_motor_back; right_motor_go;

} //小车左转 void right_rapidly() {

left_motor_go; right_motor_back;

} //小车右转 /****************计算超声波所测距离并显示 ****************/ void Conut(void) {

time=TH0*256+TL0; TH0=0; TL0=0;

S=(float)(time*1.085)*0.17; //算出来是MM if((S>=70000)||flag==1) //超出测量范围 {

flag=0;

DisplayListChar(0, 1, table1); //1602显示数组table1 } else {

disbuff[0]=S/1000; //距离千位 disbuff[1]=S%1000/100; //距离百位 disbuff[2]=S%100/10; //距离十位 disbuff[3]=S%10; //距离个位

DisplayListChar(0, 1, table); //显示Distance:000.0mm DisplayOneChar(9, 1, ASCII[disbuff[0]]); //显示千位 DisplayOneChar(10, 1, ASCII[disbuff[1]]); DisplayOneChar(11, 1, ASCII[disbuff[2]]);

DisplayOneChar(12, 1, ASCII[10]); //显示‘.’ DisplayOneChar(13, 1, ASCII[disbuff[3]]); } }

/**************************超声波避障***************************/ void Avoid() {

if(S < 3000) //设置避障距离 {

第42页

成都工业学院专科毕业设计(论文)

stop(); delay(10); backward(); delay(400); do{

left_rapidly(); delay(100); stop(); delay(100); StartModule(); while(!RX); TR0=1; while(RX); TR0=0; Conut(); }while(S < 1800);

} else {

forward(); } }

void main() {

EN1 = EN2 = 1; cmg88(); LCMInit(); delay(5); DisplayListChar(0, 0, Range); DisplayListChar(0, 1, table); TMOD |= 0x01; TMOD = 0x20; TH1 = 0x00; 周期

TL1 = 0x00; ET1 = 1; TR1 = 1; IT0 = 1; EX0 = 1; TH0 = 0;

TL0 = 0;

ET0 = 1; EA = 1;

//停车 //后退 //后退时间

//左转 //左转时间 //停车 //停车时间

//再次启动模块测距,判断是否正常行驶 //当RX为零时等待 //开启计数

//当RX为1时计数并等待 //关闭计数 //计算距离

//判断前面障碍物距离

//前进

//使能左右电机 //关数码管 //LCM初始化 //延时

//1602第一行显示range数组的内容 //1602第二行显示table数组的内容 //定时器0工作方式1,16位定时模式 //定时器1工作方式2,8位自动重装 //写0,表示溢出一次时间是256个机器

//开定时器1中断 //启动定时器1

//设置外部中断0的跳转方式 //启动外部中断0

//允许T0中断 //开总中断

第43页

成都工业学院专科毕业设计(论文)

}

while(1) {

StartModule(); //启动测距模块 while(!RX); //等待 TR0=1; //开启计数 while(RX); //计数并等待 TR0=0; //关计数 Conut(); //计算距离 Avoid(); //避障

if(IRok) //判断脉宽是否检测完毕 {

IRcordpro(); //根据脉宽检测出4个字节的数据 IRok = 0; //重新等待脉宽检测 if(IRpro_ok) //判断是否解码完成 {

switch(IRcord[2]) {

case 0x18: forward(); //前进 delay(1000); break;

case 0x52: backward(); //后退 delay(1000); break;

case 0x08: left_rapidly(); //左转 delay(1000); break;

case 0x5A: right_rapidly(); //右转 delay(1000); break;

case 0x1C: stop(); //停止 delay(2000); break; default:break; }

IRpro_ok = 0; }

} }

delay(65);

第44页

成都工业学院专科毕业设计(论文)

附录三 实物图

第45页

成都工业学院专科毕业设计(论文)

第46页

因篇幅问题不能全部显示,请点此查看更多更全内容

Top