《最新wifi智能小车设计.doc》由会员分享,可在线阅读,更多相关《最新wifi智能小车设计.doc(35页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精品资料wifi智能小车设计.目录1 设计理念与背景1.1 当代智能汽车的发展现在是一个智能化的时代,各种智能化设备正在逐步替代人为的操作。随着汽车工业的迅速发展,关于智能汽车的研究也就越来越受人关注。全国电子大赛和省内电子大赛几乎每次都有智能小车这方面的题目,全国各高校也都很重视该题目的研究。对于智能汽车的研究,国内外都有很大的成就,谷歌的无人驾驶汽车,已经能够在高速公路上安全行驶数千公里,在高速行驶下都能有这么好的操控能力,无非是智能汽车领域的一座里程碑。对于智能泊车系统,现在也已经进入了民用领域,很多车型也装配了该系统,有了他,汽车用超声波传感器扫描路面两侧,通过比较停车的空间和车辆的长
2、度,自动寻找合适的停车位。找到合适位置后,驾驶者只需控制刹车,车辆自动控制转向操作,即可将车停进停车位,并且液晶屏会有相应的显示。对于这样现代如此强大的科技手段,无线智能已经不再是幻想,是人们想要达到的一种高度了。从20世纪70年代开始,美国、英国、德国等发达国家开始进行无人驾驶汽车的研究,目前在可行性和实用化方面都取得了突破性的进展。在无人驾驶技术研究方面位于世界前列的德国汉堡Ibeo公司研制的无人驾驶汽车,2007年4月11日在英国伦敦科学博物馆与公众见面。这辆无人驾驶智能汽车经德国大众汽车公司生产的帕萨特2.0改装而成,外表看来与普通家庭汽车并无差别,但却可以在错综复杂的城市公路系统中无
3、人驾驶。目前日本、欧美已有企业取得实用化成果。与国外相比,国内在智能车辆方面的研究起步较晚,规模较小,开展这方面研究工作的单位主要是一些大学和研究所,如国防科技大学、清华大学、吉林大学、北京理工大学、长安大学、沈阳自动化所等。我国从20世纪80年代开始进行无人驾驶汽车的研究,国防科技大学在1992年成功研制出我国第一辆真正意义上的无人驾驶汽车。先后研制出四代无人驾驶汽车。第四代全自主无人驾驶汽车于2000年6月在长沙市绕城高速公路上进行了全自主无人驾驶试验,试验最高时速达到75.6Km/h。在2004年10月12日的第六届高交会上,红旗无人驾驶汽车就引起了极大的轰动。它在高速公路上最高稳定无人
4、驾驶速度为130公里/小时;峰值无人驾驶速度为170公里/小时。并同时具备安全超车和系统小型化两个主要指标。为如此,他们把它称为“中国汽车界的神舟五号”。2005年,首辆城市无人驾驶汽车在上海交通大学研制成功,该车有望于两年之内率先在上海世纪公园进行示范运营,并在2010年世博会上一展身手。到时游客只需在公园的入口处按下一个按钮,一辆没有司机的四座敞篷汽车就会从远处开过来缓缓停下,然后搭载着乘客前往他们想去的景点。1.2 设计的理念与目的我们将利用自己现有的知识与力量在现代科技的庇护下搭建一个属于自己的智能小车,可以体现现代年轻一辈的科技头脑与科技力量。我们初步想法是以89C52 为控制核心,
5、利用超声波传感器检测道路上的障碍并测量小车与障碍之间的距离,小车通过红外传感器能够的自动避障,通过改变PWM信号的占空比可以控制快慢速行驶,以及自动停车,自动寻迹等功能。通过对本小车研究,我们可以初步构建智能汽车的模型与理论基础。本设计主要研究内容就是基于89C52设计一部智能小车,小车能够实现自动循迹,自动避障,超声波测量距离。智能小车控制系统,包括了对驱动电路,红外通讯等的探索和研究。本项目文主要从小车设计方案的选取、硬件设计、软件设计、测试结果方面进行主要论述。我们在第3部分主讲单片机的硬件设计,包括了单片机最小系统的电路设计;整个小车的一个供电电源的设计,需要通过电源给整个系统供给电压
6、;电机的驱动模块,详细的说明了电机驱动的原理,视频信号的采集;我们将在第4部分程序的设计给出了程序整体的流程图各个模块子程序流程图及编写思想;最后我们将简述整机的每个模块调试及方法。为了达到最初的设计目的,使现代智能化的力量无限的放大,让现代科技的光芒通过我们的双手照在人们眼睛里。同时也想通过设计来提高我们自身的能力与知识。2 设计方案的论证及选择2.1 总体设计系统图本设计将以单片机为基础,以它为核心再配合电源模块与驱动模块并在此基础上添加液晶显示,测距避障以实现各个功能。路由器用于接收电脑等终端设备发送的指令和将摄像头采集到的视频信号传送到电脑等终端设备;单片机最小系统是整个小车的控制核心
7、,控制着各个模块统一协调工作;电机驱动电路用于驱动电机转动,可以使电机产生正转、反转,从而使车体产生前进、后退、转弯等动作;电机的作用就是使整个车体运动;电平转换电路是将路由器输出的3.3V串口电平转换为单片机能判断的高低电平;电源电路作用是为整个小车系统共电;舵机制作成云台,然后装上摄像头,使摄像头可实现上下、水平方向180度旋转调节;摄像头用于采集视频信号;蜂鸣器电路用于报警提示;照明电路为小车在夜间行驶提供照明。详细系统结构图如下:LCD1602模块超声波壁障模块 STC89C52RC 总系统图2.2 主控系统由于单片机具有价格低廉,资源丰富、有较为强大的控制功能,故本次设计采用STC8
8、9C52单片机作为整个系统的核心,用其控制行进中的小车以实现其既定的性能指标。STC89C52是一个超低功耗的增强型51单片机,和标准51系列单片机相比较它的运算速度更快,有超强的抗干扰能力,同时还支持ISP在线编程,片上集成了512字节的随机存取数据存储器(RAM),并且片内含8k字节空间的可以反复擦写1000次的Flash只读存储器, 32个I/O口,以及3个16位可编程定时计数器。其指令系统和传统的8051系列单片机指令系统完全兼容,降低了系统软件设计的难度,电路设计简单、价格低廉,在后来的实验中我们发现,STC 89C52精确度和运算速度也都完全符合我们系统的要求。2.3 电源模块首先
9、作为智能车的核心生命源,我们决定采用传统的18650池,单节标称电压一般为3.7V ,把三节串联起来差不多就足够了。我们也讨论过使用双电源供电,将9v可充电方块电池电压降压、稳压到5V后给单片机系统和LCD1602及其它芯片供电。另外采用4节1.2V可充电电池组为直流电机供电,经测试在用此种供电方式下,单片机和传感器工作稳定,直流电机工作良好,LCD显示也很稳定,小车也能长时间工作。但是经过深思熟虑之后,我们还谁放弃了这个想法。毕竟我们做的不是高精度小车,何必花费过多的精力在这个方面啦?2.4 电机驱动模块2.4.1 电机模块选择与论证 方案一:使用步进电机作为智能小车系统的驱动电机,因为步进
10、电机的转动角度可以精确的定位,这样就可以比较精确的定位小车的前进距离和位置。但是由于步进电机的输出力矩偏低,并且会随着电机转速的升高而下降,在达到较高的转速时其输出的力矩会急剧下降,因此不适于小车等对速度有着一定要求的系统。经过综合分析比较决定放弃此方案。 方案二:使用直流减速电机作为智能小车系统的驱动电机。直流减速电机的转动力矩比较大,而且体积较小,重量也很轻,使用方便。另外小车电机内部还装有减速齿轮组,所以并不需要去考虑调速的功能,可以很方便的通过单片机来控制直流减速电机的正传、反转、停止操作。 综合以上考虑选择方案二的直流减速电机作为整个智能小车的驱动电机。2.4.2 电机驱动模块选择与
11、论证 方案一:采用继电器对电动机进行控制,通过切换电动机的开关来调整小车的速度。这个方案的优点是电路相对比较简单,但是它的缺点也比较多,如:继电器的响应时间偏慢, 寿命较短,容易损坏,可靠性也不是很高。故决定放弃此方案。 方案二:采用专用的电机驱动芯片L298N来控制直流减速电机, L298N芯片(如图2-4)是一个具有高电压大电流的全桥驱动芯片,一片L298N芯片可以分别的控制两个直流减速电机,在646V的电压下,可以提供2A的额定电流,并且具有过热自动关断和电流反馈检测功能,安全可靠。该芯片是利用TTL电平进行控制的。通过单片机的IO口输出高低电平来改变芯片控制端的输入电平,即可以实现对电
12、机进行正转、反转和停止操作。另外为了保证L298N的正常工作,上面还有8个续流二极管1N4007。用该芯片作为电机驱动,驱动能力大、操作方便、稳定性好、性能优良。 综合以上分析与论证我们选择方案二的驱动芯片L298N作为整个智能小车系统的电机驱动电路图2-4 L298N驱动芯片2.5 显示模块方案一:采用LED数码管显示。数码管使用简单,价格低廉,但一个数码管只能显示一个数字,要显示多位数据时要使用多个数码管,这就增加了硬件电路的复杂度和额外功耗,而且LED数码管也无法显示字符。由于我们计划要显示小车运行的速度和路程,LED数码管没办法显示这么多的内容,因此考虑其它的方案。 方案二:采用LCD
13、1602液晶(如图2-5)显示。LCD1602液晶具有功耗低,显示内容丰富清晰,显示信息量大,显示速度较快,界面友好,使用简单等特点而得到了广泛的应用。并且外围电路也比较简单,因此我们选择此方案。 通过以上方案论述我们选择方案二,显示小车运行速度和路程的任务。图2-7 LCD1602液晶显示2.6 避障模块方案一:用漫反射式光电开关进行避障。光电开关的工作原理是根据光线发射头发出的光束,被物体反射,其接收电路据此做出判断反应,物体对红外光由同步回路选通而检测物体的有无。当有光线反射回来时,输出低电平。当没有光线反射回来时,输出高电平。操作简单但是测量的距离不远。 方案二:用超声波传感器进行测距
14、避障。超声波传感器的原理是:超声波由压电陶瓷超声波传感器发出后,遇到障碍物便反射回来,然后再被超声波传感器接收8。超声波传感器在避障的设计中被广泛应用。为了使用方便,便于操作和调试,采用集成超声波测距模块HC-SR04(如图2-6)。 综合考虑本系统只需要检测障碍物,没有十分复杂的环境。为了使用的方便,便于操作和调试,最终选择了方案二图2-6 HC-SR04超声测距模块2.7 路由器模块网上有很多WiFi智能小车都用到了路由器,路由器的种类很多,质量参差不齐,适用环境也根据条件的不同发生着变化。但是目前最受DIY爱好者青睐的这是可以一种可以刷进openwrt系统的智能路,该路由器的强大资源配置
15、情况如下:OpenWrt 可以被描述为一个嵌入式的 Linux 发行版,(主流路由器固件有 dd-wrt,tomato,openwrt三类)而不是试图建立一个单一的、静态的系统。OpenWrt的包管理提供了一个完全可写的文件系统,从应用程序供应商提供的选择和配置,并允许您自定义的设备,以适应任何应用程序。对于开发人员,OpenWrt 是使用框架来构建应用程序,而无需建立一个完整的固件来支持;对于用户来说,这意味着其拥有完全定制的能力,可以用前所未有的方式使用该设备。OpenWrt 选择了另一条路,它,一点一点的把各软件加入进去,使其接近 Linksys 版的功能,而OpenWrt 的成功之处是
16、它的文件系统是可写的,开发者无需在每一次修改后重新编译,令它更像一个小型的 Linux。OpenWRT是一个高度模块化、高度自动化的嵌入式Linux系统,拥有强大的网络组件和扩展性,常常被用于工控设备、电话、小型机器人、智能家居、路由器以及VOIP设备中。 同时,它还提供了100多个已编译好的软件,而且数量还在不断增加,而 OpenWrt SDK 更简化了开发软件的工序。OpenWRT不同于其他许多用于路由器的发行版,它是一个从零开始编写的、功能齐全的、容易修改的路由器操作系统。实际上,这意味着您能够使用您想要的功能而不加进其他的累赘,而支持这些功能工作的linux kernel又远比绝大多数
17、发行版来得新。如果对 Linux 系统有一定的认识, 并想学习或接触嵌入式 Linux 的话, OpenWRT很适合。 但OpenWRT支持各种处理器架构,无论是对ARM,X86,PowerPC或者MIPS都有很好的支持。 其多达3000多种软件包,囊括从工具链(toolchain),到内核(linux kernel),到软件包(packages),再到根文件系统(rootfs)整个体系,使得用户只需简单的一个make命令即可方便快速地定制一个具有特定功能的嵌入式系统来制作固件。除此之外,我们还有制作好的与其兼容的RT5350系列WiFi芯片及其配套路由器底板。所以,在此我们选择RT5350W
18、iFi芯片和与其兼容的路由器底板。2.7.1 wifi芯片原理图2.7.2 摄像头3 硬件电路的设计3.1 总体设计智能小车采用前轮驱动,前轮左右两边各用一个电机驱动,通过电机驱动芯片L298N来控制前面两个轮子的转动与停止从而达到控制转向的目的,后轮是万向轮,起支撑转向作用。将4个红外光电传感器装在车体底盘的前端,小车根据传感器检测的情况来循迹前进。 小车速度的检测通过槽型光电传感器,将码盘装在电机的轴上,码盘跟随电机一起转动,将检测到的数据传回单片机进行处理。 小车的避障用超声波避障模块HC-SR04,将其置于车头,检测到障碍物时,小车做出相应的反应。3.2 驱动电路电动小车的驱动不但要求
19、电机驱动系统具有高转矩重量比、宽调速范围、高可靠性,而且电机的转矩-转速特性受电源功率的影响,这就要求驱动具有尽可能宽的高效率区。我们所使用的电机一般为直流电机,主要用到永磁直流电机、伺服电机及步进电机三种。直流电机的控制很简单,性能出众,直流电源也容易实现。我们使用的这种直流电机的驱动及控制需要电机驱动芯片进行驱动。常用的电机驱动芯片有L297/298,MC33886,ML4428等,本次使用L298驱动芯片。3.2.1 电机驱动模块的使用我们使用的L298N是ST公司生产的一种高电压、大电流电机驱动芯片。该芯片采用15脚封装。主要特点是:工作电压高,最高工作电压可达46V;输出电流大,瞬间
20、峰值电流可达3A,持续工作电流为2A;额定功率25W。内含两个H桥的高电压大电流全桥式驱动器,可以用来驱动直流电动机和步进电动机、继电器线圈等感性负载;采用标准逻辑电平信号控制;具有两个使能控制端,在不受输入信号影响的情况下允许或禁止器件工作有一个逻辑电源输入端,使内部逻辑电路部分在低电压下工作;可以外接检测电阻,将变化量反馈给控制电路。使用L298N芯片驱动电机,该芯片可以驱动一台两相步进电机或四相步进电机,也可以驱动两台直流电机。项目使用的是4个直流电机,项目中使用了一块L298N电机驱动来驱动这四个直流电机的转动。其实引脚图如下图3-2-1所示。其中6和11引脚是它的使能端,一个使能端控
21、制一个电机,只有当它们都是高电平的时候两个电机才有可能工作,5、7、10、12是298的信号输入端和单片机的IO口相连,2、3、13、14脚是输出端,输入5和7脚控制输出2和3脚,输入的10、12脚控制输出的13、14脚。图3-2-1 L298N驱动芯片引脚3.2.2 电机驱动的原理驱动部分我们使用的是L298N驱动芯片构成的一个驱动电路模块如图3-2-2所示。图3-2-2-1 驱动电路模块电机驱动原理图如图3-2-2-2:图3-2-2-2 电路驱动原理图使用直流/步进两用驱动器可以驱动两台直流电机。分别为M1和M2。引脚A,B可用于输入PWM脉宽调制信号对电机进行调速控制。(如果无须调速可将
22、两引脚接5V,使电机工作在最高速状态,既将短接帽短接)实现电机正反转就更容易了,输入信号端IN1接高电平输入端IN2接低电平,电机M1正转。(如果信号端IN1接低电平, IN2接高电平,电机M1反转。)控制另一台电机是同样的方式,输入信号端IN3接高电平,输入端IN4接低电平,电机M2正转。(反之则反转),PWM信号端A控制M1调速,PWM信号端B控制M2调速。电机驱动状态表电机旋转方式控制端IN1控制端IN2控制端IN3控制端IN4输入PWM信号改变脉宽可调速调速端A调速端BM1正转高低/高/反转低高/高/停止低低/高/M2正转/高低/高反转/低高/高停止低低/高3.3 显示电路用LCD16
23、02来显示数据,LCD液晶具有功耗低、显示内容丰富、清晰,显示信息量大,显示速度较快等特点。其中用滑动变阻器RV0来调节显示器的背光亮度。电路原理图如下图3-4。3.4 单片机最小系统的设计单片机是控制单元的核心。起着控制小车所有运行状态的作用。单片机控制模块使用的是宏晶公司生产的STC89C52,使用该芯片很容易实现对其它模块的控制。通过对单片机STC89C52写入程序,可以方便的用软件来控制,整个过程的控制部分。3.4.1 主控芯片的介绍89C52是宏晶公司MCS-51系列单片机中基本的产品,它采用ETC公司可靠的CHMOS工艺技术制造的高性能8位单片机,属于标准的MCS-51的HCMOS
24、产品。它结合了HMOS的高速和高密度技术及CHMOS的低功耗特征,它基于标准的MCS-51单片机体系结构和指令系统,属于80C51增强型单片机版本,集成了时钟输出和向上或向下计数器等更多的功能,适合于类似马达控制等应用场合。89C52内置8位、256字节内部数据存储器RAM、8k片内程序存储器(ROM)32个双向输入/输出(I/O)口、3个16位定时/计数器和5个两级中断结构,一个全双工串行通信口,片内时钟振荡电路。此外,89C52还可工作于低功耗模式,可通过两种选择空闲和掉电模式。在空闲模式下冻结CPU而RAM、串行口和中断系统维持其功能。掉电模式下,保存RAM数据,时钟振荡停止,同时停止芯
25、片内其它功能。89C52有PDIP(40pin)和PLCC(44pin)两种封装形式。主要功能特性如下:1、标准MCS-51内核和指令系统;2 、32个双向I/O口;3、3个16位可编程定时/计数器;4、向上或向下定时计数器;5、6个中断源;6、全双工串行通信口。7、帧错误侦测;8、自动地址识别;9、空闲和掉电节省模式;10、片内8kROM(可扩充64kB外部存储器);11、256x8bit内部RAM(可扩充64kB外部存储器);12、时钟频率3.5-12/24/33MHz;13、改进型快速编程脉冲算法;14、5.0V工作电压;15、布尔处理器;16、4层优先级中断结构;17、兼容TTL和CM
26、OS逻辑电平;18、PDIP(40)和PLCC(44)封装形式。3.4.2 单片机最小系统STC89C52RC单片机最小系统: 89C52单片机的I/O口的输入功能用于传感器信号的输入处理。通过单片机对外部传感器的信号采集处理,从而对外部条件进行判断以确定小车下一步的运行状态。 89C52单片机的I/O口信号输出,主要是给驱动模块送控制信号用于控制电机的转动、给舵机送PWM控制信号控制舵机的偏转以及控制开关蜂鸣器、灯光等。单片机的内部定时器的使用是用于产生PWM信号,以及其他需要精确时间的地方。单片机的串口中断,用于与路由器进行的串口通讯,接收电脑终端发送的串口指令。单片机的外部中断用于红外信
27、号的接收,然后通过解码程序得到命令,从而控制小车的运动。4 程序调试4.1 调试软件STC-ISP串口助手调试软件:KEIL uVision4编译器:5 设计小结历经半个月的培训和长时间的编程,小车终于调试成功,虽然看上去功能比较强大,具备智能小车基本所需要的功能,但并没有让自己感到满足,其中存在很多方面的缺陷,同时也体现出自己能力的不足,在自己今后的学习中也有很大的启发作用。我们队几个人从单片机最小系统到电机驱动模块,都得自己画电路版,焊电路版,查资料,写程序,记得有几次我们测试程序失败,然后不停在程序上找原因,可最后发现是电路板画错了,不得不重新画过,然后再焊电路板。在这过程中考验了我们的
28、耐心和智慧,锻炼了我们的实践能力,在设计中提高了我们数电模电的理论水平,也让我们感受到实践的坎坷和乐趣通过本次WIFI智能小车的理论学习、论文编写和实物的制作,进一步的认识到了自身存在的不足。特别是自己在路由器方面知识的欠缺,这使得我在小车在起步制作时路由器部分的处理花费了大量的时间。但通过我在网上不断的查询相关的资料,在网上请教这方面的高手,最终我还是完成了路由器部分的处理。但是我还是不知道其中具体的一些细节的原理,如我的摄像头为什么会在后期不能使用,使用不同摄像头时路由器要进行怎样的一个处理。还有在整机装配的时候我没有注意到一些细节的地方,这使得我把小车拆装了多次。要想把事情做好提高效率,
29、这就需要注意学习生活工作中做事的细节,以及对自己知识的扩充。还要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在设计课程过程中遇到问题是很正常德,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题的课程设计结束了,但是从中学到的知识会让我受益终身。 发现、提出、分析、解决问题和实践能力的提高都会受益于我在以后的学习、工作和生活中。设计过程,好比是我们人类成长的历程,常有一些不如意,但毕竟这是第一次做,难免会遇到各种各样的问题。在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻
30、,掌握得不够牢固。同时,通过这次的课程设计,我的各方面能力也得到了大幅度的提高。在知识上:一方面,我系统的总结了自己的专业知识,明确了自己今后事业的发展方向。另一方面,我如饥似渴的自学了单片机及其外围电路知识,并通过自己独立对软件的编写和实物制作,最终完成了整个WIFI智能小车的设计。在能力上:我通过不断查阅资料、与师生交流学习新知识、在网上请教相关的人士,然后又将自己沉淀后的知识和经验运用到实际电路设计理念中,丰富其功能与质量。在综合素质上,我虽然遇到很多的挑战和困难,但从未想过放弃,最终凭借自己百折不饶、勇于钻研的精神解决了这些技术难点。当然,由于我的知识和能力有限,整个设计还有很多不足之
31、处有待完善和改进,恳请老师指教,这必将是我在踏上工作岗位之前的最大一笔收获。附录1 电路原理图图表 1-STC89C52最小系统原理图图表 2-路由器底板原理图附录2 源程序#include #include #include #include steer.h#include motor.h#include lcd1602.h#include distance.h#include serial.hvoid GoAhead();void GoLeft();void GoRight();void Stop();void Back();void InitTimer0();void DelayMs(u
32、nsigned int ms);void SerialSetMode(unsigned char dat);void main()InitLcd1602();InitTimer0();InitSerial();SetReceFunction(SerialSetMode);LcdShowStr(0,1,Hello);SetMotorSpeed(20,20);while(1);void SerialSetMode(unsigned char dat)static unsigned char cnt = 0;unsigned char str20;strcnt=dat;cnt+; if(dat=-)
33、/最后一个字符strcnt=0;cnt=0;if(!strcmp(up-,str)CarGoAhead();if(!strcmp(down-,str)CarGoBack();if(!strcmp(left-,str)CarGoLeft();if(!strcmp(right-,str)CarGoRight();if(!strcmp(stop-,str)CarStop();LcdShowStr(0,0,str);void DelayMs(unsigned int ms)unsigned int i, j;for(i=0; ims; i+)for(j=0; j110; j+);void InitTi
34、mer0()TMOD |= 0x01;TH0 = (65536-1000)/256;TL0 = (65535-1000)%256;/0.1MsTR0 = 1;EA = 1;ET0 = 1;void InterruptTimer0() interrupt 1TH0 = (65536-1000)/256;TL0 = (65535-1000)%256;/0.1MsCarSpeedRun();#ifndef _MOTOR_H_#define _MOTOR_H_#include /*电机控制I/O口*/右sbit EnB = P15;sbit In4 = P14;sbit In3 = P13;/左sbi
35、t In2 = P12;sbit In1 = P11;sbit EnA = P10;/*电机速度寄存器*范围:0-100 */extern unsigned int LeftMotorSpeed;extern unsigned int RightMotorSpeed;/*小车运行状态*/typedef enumMode_GoAhead,Mode_GoBack,Mode_Stop,Mode_GoLeft,Mode_GoRightRunMode;extern RunMode CarRunMode;/*电机运行状态宏转换*/#define RightMotorGo EnB=1; In3=1; In4
36、=0;#define RightMotorBack EnB=1; In3=0; In4=1;#define RightMotorStop EnB=1; In3=0; In4=0;#define LeftMotorGo EnA=1; In1=0; In2=1;#define LeftMotorBack EnA=1; In1=1; In2=0;#define LeftMotorStop EnA=1; In1=0; In2=0;/*基础函数声明*/extern void CarGoAhead();/小车前进extern void CarGoBack(); /小车倒车extern void CarSt
37、op(); /小车制动extern void CarGoLeft(); /小车左转extern void CarGoRight();/小车右转/*高级函数声明*/extern void SetMotorSpeed(unsigned char Speed1,unsigned char Speed2);/设置电机速度extern void CarSpeedRun();/小车以一定速度运动,定时器中断内部调用#endif#include motor.hunsigned int LeftMotorSpeed = 50;unsigned int RightMotorSpeed = 50;unsigned
38、 int MaxMotorSpeed = 50;RunMode CarRunMode = Mode_Stop;extern bit AheadBar;extern bit LeftBar;extern bit RightBar;void SetMotorSpeed(unsigned char Speed1,unsigned char Speed2)LeftMotorSpeed = Speed1;RightMotorSpeed = Speed2;void CarSpeedRun()static unsigned char cnt = 0;cnt+;if(cnt = MaxMotorSpeed)c
39、nt = 0;if(cntLeftMotorSpeed)EnA = 1;elseEnA = 0;if(cntRightMotorSpeed)EnB = 1;elseEnB = 0;void CarGoAhead()if(AheadBar = 0)CarRunMode = Mode_GoAhead;RightMotorGo;LeftMotorGo;void CarGoBack()CarRunMode = Mode_GoBack;RightMotorBack;LeftMotorBack;void CarStop()CarRunMode = Mode_Stop;RightMotorStop;Left
40、MotorStop;void CarGoLeft()if(LeftBar = 0)CarRunMode = Mode_GoLeft;RightMotorGo;LeftMotorStop;void CarGoRight()if(RightBar = 0)CarRunMode = Mode_GoRight;RightMotorStop;LeftMotorGo;#include serial.hbit McuSendEnd = 0;unsigned char *SerialSendData; /发送数据指针unsigned char SerialReceData; /接收数据void (*ReceD
41、ataFunction)(unsigned char); /接收数据回调函数void InitSerial()TMOD=0x20;TH1=253;TL1=253;TR1=1; REN=1;SM0=0;SM1=1;EA=1;ES=1;SetReceFunction(TempReceDataFuntion);void TempReceDataFuntion(unsigned char ReceData)unsigned temp = ReceData;void SetReceFunction(void (*temp)(unsigned char)ReceDataFunction = temp;vo
42、id SetSendChar(unsigned char *dat)SerialSendData = dat;void StartSendChar(unsigned char *dat)SetSendChar(dat);SBUF = *SerialSendData;void Serial() interrupt 4if(RI = 1)RI = 0;SerialReceData = SBUF;ReceDataFunction(SerialReceData);if(TI = 1)if(*SerialSendData) != 0)SerialSendData+;SBUF = *SerialSendD
43、ata;elseMcuSendEnd = 1;TI = 0;#ifndef _SERIAL_H_#define _SERIAL_H_#include extern bit McuSendEnd; /单片机数据发送完毕位extern unsigned char *SerialSendData; /发送数据指针extern unsigned char SerialReceData; /接收数据/*初始化串口*参 数:无*返回值:无*使用串口通信时调用*/void InitSerial();/*开始发送数据*参 数:dat待发送字符串指针*返回值:无*发送字符串时调用*/void StartSendChar(unsigned char *dat);/*