资源描述
目 录
摘要 1
1 引 言 1
2 方案论证 2
2.1 控制核心的选择及其简介 2
2.2 小车驱动方式的选择 4
2.3 直流电机驱动模块 5
2.4 障碍检测模块 6
2.5 电源模块 7
3 系统硬件设计 8
3.1 车体结构及其驱动电路 8
3.1.1 直流电机电路设计 9
3.1.2 通道控制 9
3.1.3 电机调速 10
3.1.4 驱动模块 11
3.2 避障模块 12
3.3 硬件完毕后的小车总体图 13
4 系统软件设计 14
4.1 主程序设计 15
4.2 障碍检测模块程序设计 15
4.3 语音播放程序设计 17
5 使用说明 20
总结与展望 21
参考文献 23
附录1 24
附录2 27
附录3 31
基于单片机控制的智能小车设计与制作
摘 要: 课题的重要任务是设计并制作一辆智能小车,规定实现小车的语音控制、直线前进与倒退、避免撞到障碍物三大功能。设计以80C51单片机为控制核心,应用光电传感器和超声波传感器,成功实现了小车的三大功能。课题完毕了红外线传感器、小车骨架、直流电机以及电源等硬件的选择、采购、各传感器的接口电路设计和制作,以及各传感器和电路的安装位置和方式的安排,并完毕了整个硬件的制作工作。此外,对整个控制软件进行设计和程序的编制以及程序的调试,并最终完毕软件和硬件的融合,实现小车的预期功能。
关键词:智能小车、红外防碰撞传感器、单片机
1 引 言
当今世界,传感器技术和自动控制技术正在飞速发展,机械、电气和电子信息已经不再明显分家,自动控制在工业领域中的地位已经越来越重要,“智能”这个词也已经成为了热门词汇。现在国外的自动控制和传感器技术已经达成了很高的水平,特别是日本,比如日本本田制作的机器人,其仿人双足行走已经做得十分逼真,并且具有一定的学习能力,还据说其智商已达成6岁儿童的水平。
作为机械行业的代表产品—汽车,其与电子信息产业的融合速度也显著提高,呈现出两个明显的特点:一是电子装置占汽车整车(特别是轿车)的价值量比例逐步提高,汽车将由以机械产品为主向高级的机电一体化方向发展,汽车电子产业也很有也许成为依托整车制造业和用车提高配置而快速成为新的增长点;二是汽车开始向电子化、多媒体化和智能化方向发展,使其不仅作为一种代步工具、同时能具有交通、娱乐、办公和通讯等多种功能。
无容置疑,机电一体化人才的培养不管是在国外还是国内,都开始重视起来,重要表现在大学生的各种大型的创新比赛,比如:亚洲广播电视联盟亚太地区机器人大赛(ABU ROBCON)、全国大学生“飞思卡尔”杯智能汽车竞赛等众多重要竞赛都能很好的培养大学生对于机电一体化的爱好与强化机电一体化的相关知识。但很现实的状况是,国内不管是在机械还是电气领域,与国外的差距还是很明显的,所以作为物流自动化专业的学生,必须加倍努力,为逐步赶上国外先进水平并超过之而努力。
我选择这个课题作为我课程设计的目的在于:通过独立设计并制作一辆具有简朴智能化的简易小车,获得项目整体设计的能力,使自己在控制方面有一定的结识。所以立“基于单片机控制的智能小车设计与制作”一题作为尝试。
此项设计是在袁斌老师的指导下,采用80C51单片机作为控制核心,逐步实现蜂鸣器唱歌、规避障碍和直线行走三大功能。完毕硬件实物制作与组装,并编制相关程序,使其实现功能的融合,做出具有预先规定功能的实物。
2 方案论证
小车总体功能描述:在小车的底盘上有一个总开关,当开关闭合时,小车开始工作,唱着歌直线前行,并可实现调速。在小车前进过程中,将调用避障函数进行避障,所以一旦离障碍物的距离小于安全距离时,(设的安全距离为20CM),小车进入壁障模式。小车前方装有两个红外壁障传感器,当检测到左侧有障碍时,向右转,当检测到右侧有障碍物时,向左转,当检测到前方障碍物无法避开时,小车停车并倒退,此时蜂鸣器发出警报声。下面根据设计规定,针对各模块需要完毕的功能,本着简朴、实用、便宜、容易操作、稳定的原则,对各模块进行充足的理论分析和方案论证。
2.1 控制核心的选择及其简介
主控制器采用MCS51系列单片机AT89C52,AT89C52是一个低电压,高性能CMOS 8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央解决器和Flash存储单元[3]。
MCS51单片机的内部基本结构框图如图2-1所示,由以下部分组成[4]:
(1) 一个8 位的微解决器(CPU)。
(2) 片内数据存储器RAM(128B),用以存放可以读写的数据,如运算的中间结果、最终结果以及状态标志位等。
(3) 片内程序存储器ROM(4KB),用以存放已编制好的程序及程序中用到的常数。
(4) 四个8 位并行I/O 接口P0~P3,每个口既可以用作输入,也可以用作输出使用。
(5) 两个定期器/计数器,每个定期器/计数器都可以设立成计数方式,用以对外部事件进行计数,也可以设立成定期方式,并可以根据计数或定期的结果实现计算机控制。
(6) 五个中断源的中断控制系统,提供两个中断优先级,能实现两级中断嵌套。
(7) 一个全双工串行异步通信接口,用于实现单片机之间或单机与微机之间的串行通信。
(8) 片内振荡器和时钟产生电路,但需要外接石英晶体和微调电容,最高允许振荡频率为12MHz。
单片机内部各功能部件通过内部总线连接,传送地址信息、数据信息和控制信息,各功能部件分时使用总线,即所谓的内部单总线结构。
AT89C52与其他MCS51单片机的不同之处在于具有8KB可反复擦写(大于1000次)Flash ROM以及3个16位可编程定期/计数器中断。可反复擦写的Flash ROM使得单片机能反复写入程序,使用更加地方便。
综合我设计的系统,单片机的优势就显现出来了:操作简朴、方便、快捷。充足发挥其资源丰富,强大地控制功能和位寻址操作功能,更可贵的是其价格低廉。
图2.1 51板实物图
2.2 小车驱动方式的选择
玩具小车上的两个电机均为一般的玩具直流电动机,前轮用一个电机控制方向,后轮的电机用来驱动小车,这就是传统的控制小车方向的方式,缺陷是转向过于灵敏;此外一种常见驱动方式为两电机四驱,差速转向,其优点是转向性能好,能实现原地360°转向,且在循迹行走的时候能比较稳定的行驶,但是这种驱动方式的硬件制作比较有难度;尚有一种驱动方案是采用三轮方案,即前面或后面安装一个万向轮,然后两电机分别控制两驱动轮,这种驱动方式具有两电机四驱的优点,并且硬件制作简朴多了。
比较上面三种方案,一方面排除了第三种方案,由于一开始的定位是要做四轮车。对于第二种驱动方式虽然有制作的经验,但是制作过于麻烦。综合以上三种方案,拟定后轮采用两个直流电机传递动力,转向时控制直流电机实现一个轮子反转,另一个轮子正转,达成预期转向的目的;前轮用滚珠代替轮子,可实现360°自由转向,灵敏度较高。
图2.2 驱动方式实物图
2.3 直流电机驱动模块
L298N是ST公司生产的一种高电压、大电流电机驱动芯片。该芯片可以驱动一台两相步进电机或四相步进电机,也可以驱动两台直流电机。
图2.3 L298驱动模块实物图
2.4 障碍检测模块
智能小车既然智能,至少规定其在行走的过程中不能碰到障碍物,所以其必须具有避障的功能。避障的基本原理为小车不断发射某种东西(比如光或波),并不断检测这种东西的反射情况来判断前面有无障碍。
一般障碍检测传感器的选择有两种:
A.运用光电开关。这种方法简朴实用,也很稳定,并且接口电路简朴,甚至不用单独设计接口电路。但是其体积较大,并且检测距离不够远,对障碍的规定也比较高,比如碰到玻璃之类的透明物体就不能有效辨认了。
B.运用超声波。这种方法较为复杂,特别是接口电路的设计,有一定的难度,但其具有体积小、灵敏度高、检测距离远、对障碍物规定不高等优点。
光电开关避障比较简朴,就是在一定距离内有反射就认为碰到障碍,可以适当调节接受灵敏度来小幅度调节避障距离,这种方式不需要单片机参与计算,所以可认为单片机节省资源;而超声波的避障原理则相对复杂一些:超声波发射器向某一方向发射波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接受器收到发射波就立即停止计时。超声波在空气中的传播
图2.3 TCT40-16T/R1
速度为340m/s,根据计时器记录时间t,就可以计算出发射点距离障碍物的距离(s),即:s=340t/2。当计算的距离小于程序中设定的障碍安全距离时,则认为碰到障碍。所以这个距离可以方便的在程序中调节,但是这种避障方式需要单片机参与计算,占用了资源。
图2.4E18-D80NK传感器实物图
综合对比两种方案的优略,最终采用超声波避障,从网络上查得一种比较合适的超声波传感器,型号为E18-D80NK,其实物图如图2-4所示。该传感器的使用有效地避免了可见光的干扰,检测距离可达80cm。
2.5电源模块
方案一是采用有限电源通过稳压芯片供电,其优点是可提供稳定的5V电压,但占用资源过大;方案二是采用8个1.5V的干电池供电。综合以上两种方案和已有的材料,拟定用型号为YSD-12260(12V)大容量锂离子可充电电池供电。一条线路直接接驱动模块,给电机供电,另一条线路接稳压模块,降压至5V给单片机供电。 3 系统硬件设计
在第2章方案论证的基础上,根据设计规定,对各模块的硬件进行系统设计。
3.1 车体结构及其驱动电路
车体驱动方式已经在前一章拟定下来,硬件部分则在原有小车基础上进行,小车的实物图如图3.1所示,控制板下的电路板为电机驱动电路板。
该小车为四轮结构,车的结构示意图如图3.1所示。其中前面两个滚珠由铜柱支撑,来调节小车的前进方向。在自然状态下,前轮向前滚动。后面两个车轮由后轮电机驱动,为整个小车提供动力,所以又称前面的轮子为方向轮,后面的两个轮子为驱动轮。 图3.1 小车实物图
3.1.1直流电机电路图
直流电机的线路在开发面板上已集成好了,接线时只需按程序设定好的通道接线。
图3.2 直流电机驱动电路
3.1.2通道控制
通过对电机接口电平进行控制,实现两步电机的正反转,以此来实现小车前进、转向、倒退。结合对后轮的状态分析,得到小车的运营状态与输入的对照表,如表3.1所示:
表3.1 输入与小车运动状态对照表
IOB11
IOB10
IOB9
IOB8
左电机
右电机
小车
0
0
0
0
停转
停转
停
1
0
1
0
正转
正转
前进
1
0
0
1
正转
反转
右转
0
1
1
0
反转
正转
左转
0
1
0
1
反转
反转
后退
3.1.3电机调速
PWM是英文“Pulse Width Modulation”的缩写,简称脉宽调制。它是运用微解决器的数字输出对模拟电路进行控制的一种有效的技术,广泛应用于测量,通信,功率控制与变换等许多领域。一种模拟控制方式,根据相应载荷的变化来调制晶体管栅极或基极偏置,来实现开关稳压电源输出晶体管或晶体管导通时间的改变,这种方式能使电源的输出电压在工作条件下变化时保持恒定。
PWM调速系统有下列优点:
(1)由于PWM调速系统的开关频率较高,仅靠电枢电感的滤波作用就可以获得脉动很小的直流电流,电枢电流容易连续,系统的低速运营平稳,调速范围较宽,可达1:10000左右。由于电流波形比V-M系统好,在相同的平均电流下,电动机的损耗和发热都比较小。
(2)同样由于开关频率高,若与快速响应的电机相配合,系统可以获得很宽的频带,因此快速响应性能好,动态抗扰能力强。
(3)由于电力电子器件只工作在开关状态,主电路损耗较小,装置效率较高。
根据以上综合比较,以及本设计中受控电机的容量和直流电机调速的发展方向,本设计采用了H型单极型可逆PWM变换器进行调速。
脉宽调速也可通过单片机控制继电器的闭合来实现,但是驱动能力有限。为顺利实现电动小汽车的前行与倒车,本设计采用了可逆PWM变换器。可逆PWM变换器主电路的结构式有H型、T型等类型。我们在设计中采用了常用的双极式H型变换器,它是由4个三极电力晶体管和4各续流二极管组成的桥式电路。
执行PWM操作之前,这种微解决器规定在软件中完毕以下工作:
* 设立提供调制方波的片上定期器/计数器的周期
* 在PWM控制寄存器中设立接通时间
* 设立PWM输出的方向,这个输出是一个通用I/O管脚
* 启动定期器
* 使能PWM控制器
图3.3 PWM波图
3.1.4 驱动模块
L298是SGS公司的产品,比较常见的是15脚Multiwatt封装的L298N,内部同样包含4通道逻辑驱动电路。可以方便的驱动两个直流电机,或一个两相步进电机。输出电压最高可达50V,可以直接通过电源来调节输出电压;可以直接用单片机的IO口提供信号;并且电路简朴,使用比较方便。
L298N可接受标准TTL逻辑电平信号VSS,VSS可接4.5~7 V电压。4脚VS接电源电压,VS电压范围VIH为+2.5~46 V。输出电流可达2.5 A,可驱动电感性负载。1脚和15脚下管的发射极分别单独引出以便接入电流采样电阻,形成电流传感信号。L298可驱动2个电动机,OUT1,OUT2和OUT3,OUT4之间可分别接电动机,本实验装置我们选用驱动一台电动机。5,7,10,12脚接输入控制电平,控制电机的正反转。EnA,EnB接控制使能端,控制电机的停转。In3,In4的逻辑图与表1相同。由表1可知EnA为低电平时,输入电平对电机控制起作用,当EnA为高电平,输入电平为一高一低,电机正或反转。同为低电平电机停止,同为高电平电机刹停。
图3.4 L298N内部功能模块
表3.2 L298N的状态相应
3.2避障模块
光电开关工作时,由内部振荡回路产生的调制脉冲经反射电路后,由发射管辐射出光脉冲。当被测物体进入受光器作用范围时,被反射回来的光脉冲进入光敏二极管。并在接受电路中将光脉冲解调为电脉冲信号,再经放大器放大和同步选通整形,然后用数字积分或RC积分方式排除干扰,最后经延时(或不延时)触发驱动器输出光电开关控制信号。
直接反射光电开关是一种集发射器和接受器于一体的传感器,当有被检测物体通过时,将光电开关发射器发射的足够量的光线反射到接受器,于是光电开关就产生了开关信号。当被检测物体的表面光亮或其反光率极高时, 直接反射式的光电开关是首选的检测模式。
光电式传感器(光电开关)NPN常开
型号:E18-D80NK。
光电开关E18的技术参数:
1、输出电流 DC/SCR/继电器 Control output:100mA/5V供电
2、消耗电流 DC/AC:DC<15mA
3、响应时间 DC/AC:DC<2ms
4、指向角:3°-15°,有效距离3-80CM可调
5、检测物体:透明或不透明体
6、工作环境温度:-25℃~+55℃
7、标准检测物体:太阳光10000LX以下 白炽灯3000LX以下
8、外壳材料:塑料
9、防护等级:IP66
3.3硬件完毕后的小车总体图
完毕了所有硬件的设计和制作(总体电路图见附录),然后进行硬件的组装,组装好的小车如图3-5所示。
图3.5 组装完毕的小车实物图
4 系统软件设计
在第2章的方案论证部分已经对小车的总体功能有所描述了,第3章也完毕了小车所有的硬件,本章则将以小车总体功能和硬件为基础进行系统的软件设计。
开关是否按下
左障碍
右障碍
左右障碍
初 始 化
高速速行驶
停车检查
低速行驶
左转向
后退,警报
右转向
否
是
否
是否碰到障碍
线
是
是
否
是
否
是
否
图4.1 主程序流程图
4.1 主程序设计
主程序的作用是把小车的各个功能连接起来,以实现小车预期的功能。图4.1为小车主程序的流程图。具体程序可参考附录1。
流程描述:打开小车的电源开关时执行端口初始化程序,电动机全速运营,红外传感器开始检测,连续用IF判断,当检测道障碍时,若为左障碍,则小车向右转,若为右障碍时,则小车向左转,若左右都有障碍无法避免时,则小车倒车,并且启动警报声。
4.2 障碍检测模块程序设计
障碍检测模块的程序是在小车执行语音命令前进、左拐、右拐时在前进、左拐、右拐的子程序中调用的,障碍检测其实是个测距的过程,图4.2是避障程序的流程图。具体程序还可参考附录2。
进入
否
退出
是否返回没
解决结果并置标志位
关外部中断
初始化
发波
开中断
是否超时没
进入
退出
记下时间值
否
是
是
延时
主程序流程图 中断程序流程图
图4.2 避障程序流程图
流程描述:在调用避障程序的时候,一方面进行初始化,然后发射几个40KHz的波,同时开始计时,延时一断时间再开中断,延时的作用是避开余波信号的干扰,在中断中记录相关数据,然后返回主程序对数据进行解决,再得出距离并与安全距离比较,假如小于安全距离,则认为碰到障碍,将障碍标志位置1,反之置0。
避障程序其实是个测距的程序,在小车前进、左拐、右拐的过程中不断的调用,不断检测障碍标志位,当障碍标志位为1时就认为碰到障碍了,下面以前进程序的流程图(图4.3)为例进行说明,左拐、右拐的程序很相似,在此不再作说明,这些程序可参考附录4。
进入
退出
是否有障没
前进
关辨认器并初始化
开辨认器并停车
是否有障没
是否超时
急停
否
是
是
否
是
否
图4-3 前进程序流程图
流程描述:在接到前进命令时,调用小车的前进命令,一方面关闭辨认器,防止干扰,然后初始化相关端口,然后调用避障程序,看看是否小车前面本来就有障碍,假如有,则不前进并播放碰到障碍语音提醒,没有的话就开始前进,前进的过程中不断的调用避障程序,并检测障碍标志,当障碍标志为1时立即停车,并播放碰到障碍的语音提醒。假如小车一直没有碰到障碍,在前进一段设定的时间后会自然停止。
问题讨论:由小车的避障程序和前进程序可以看出,避障程序在等待回波中断的时候浪费了不少时间,所以在循线中没法实现避障,在此,提出一个解决方案:把数据解决程序都放到中断程序里,这样就能节省大量的时间而使得避障功能能在循线时实现了。由于时间问题,没有对此方案进行验证。
4.3 语音播放程序设计
语音播放程序很多函数都是有函数库提供,所以语音播放函数比较简朴,其分为两部分,一是播放流程控制(如图4.4),一是中断播放服务程序(如图4.6)。具体的程序还可参考附录3。
图4.4 播放流程图
图4.5 中断播放服务流程图
5 使用说明
智能小车总体图如图5.1所示,其使用说明如下:
图5.1 小车实物图
小车的硬件连接如下:
IOP0^1~IOP0^4 红外避障端口;
IOP1^4和IOP1^5 右电机输出端口;
IOP1^6和IOP1^7 左电机输出端口;
IOP1^1 PWM1波,接GNA
IOP1^3 PWM2波,接GNB
A1/A2 接左直流电机
B1/B2 接右直流电机
电源接稳压器输入端,降压至5V,接入单片机(+5V,GND)
电源接入驱动输入端,给驱动供电;直流电机接驱动输出端。
红外传感器由单片机供电。
所有连接都已经连接好,使用者不要随便拆卸。
小车采用12V锂离子电池供电,装在小车最前面,使用时请对的安装电池!
安装电池后就可以打开小车底部的电源开关了,
总结展望
根据本次设计规定,我系统地阅读了大量的资料,并认真分析了设计课题的需求,还系统学习了51单片机的工作原理及其使用方法,并独自设计智能小车的整个项目。
虽然条件艰苦,但通过不懈钻研和努力,购买到了所有所需的元器件,并系统的进行了多项实验,最终做出了整个小车的硬件系统,然后结合课题任务和小车硬件进行了程序的编制,最终顺利的通过了系统软硬件的联机调试,成功实现设计任务所规定的直线行走调速、报警和避障三大功能。
通过本次课程设计,不仅是对我所学单片机知识的考察,更是对我的自学能力和收集资料能力以及动手能力的考验。本次课程设计使我对一个项目的整体设计有了初步结识,还结识了几种传感器,并能独立设计出其接口电路,再有对电路板的制作有了一定的了解,并学会了使用Protel设计电路。本次毕业设计还使我意识到了实验的重要性,在硬件制作和软件调试的过程中,出现了很多问题,最终都是通过实验的方法来解决的。尚有以前对程序只是一个很模糊的概念,通过这次的课程设计使我对程序完全有了一个新的结识,并能使用C纯熟的进行编程了。通过本次课程设计,极大的锻炼了我思考和分析问题的能力,并对机电一体化有了一个更深的结识。
总之,在课程设计的过程中,无论是对于学习方法还是理论知识,我都有了新的结识,受益匪浅,这将激励我在此后再接再厉,不断完善自己的理论知识,提高实践运作能力。
由于时间有限,我所设计的智能小车和已有的智能的小车相比,还处在初级阶段。重要体现在:
1. 我的智能小车功能简朴,重要是调速和避障功能,后期还可以向语音系统、无线摄像传输、智能遥控等方向发展
2. 我的智能小车灵敏度较差,重要是由于在设计和制作过程中,以原有的一些材料为主,比如传感器自身就是灵敏度不高。尚有在制作工艺上还存在很多问题,导致灵敏度不高。
3. 程序的设计还不够简洁完善,导致单片机在控制硬件执行指令时存在误差。
参考文献
[1] 郭天祥老师2023在哈工大51单片机的教学视频
[2] 吴国风.C语言程序设计教程[M].合肥:中国科学技术出版社,2023.
[3] 程昱.Protel DXP 电路设计白金教学[M].北京:科学出版社,2023.
[4] 侯少云.基于DSP 和模糊控制的寻线行走机器人设计[J].电子技术应用,2023.
[5] 赵广超.基于超声波传感的系统设计.
[6] 郭长玉.简易智能电动车设计报告.
[7] 吴建平.红外反射式传感器在自主式寻迹小车导航中的应用.
[8] 吴斌华.基于途径辨认的智能车系统设计.电子技术应用,2023.
[9] 李正军.计算机控制系统[M].机械工业出版社,2023.
附录1:
主程序清单:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit l=P0^1;//定义红外避障检测端口
sbit r=P0^4;
sbit mz1=P1^7;//定义电机Mz1电平输出端口
sbit mz2=P1^6;//定义电机Mz2电平输出端口
sbit my1=P1^5;//定义电机My1电平输出端口
sbit my2=P1^4;//定义电机My2电平输出端口
sbit PWM1=P1^1;
sbit PWM2=P1^3;
void delay_ms(uint z)//声明延时函数
{
uint x,y;
for(x=z;x<250;x++)
for(y=0;y<100;y++);
}
main()//主函数
{
PWM1=1;
PWM2=1;
while(1)//无限循环
{
if(l==0&&r==1)//表达l方有障碍物 进行r转向
{
mz1=1;
mz2=0;
my1=0;
my2=1;
delay_ms(100);//状态保持100ms
}
if(l==1&&r==0)//表达r方有障碍物 进行l转向
{
mz1=0;
mz2=1;
my1=1;
my2=0;
delay_ms(100);//状态保持100ms
}
if(l==0&&r==0)
{
mz1=0;
mz2=1;
my1=0;
my2=1;
}
if(l==1&&r==1)//表达前方无障碍物 直线行驶
{
mz1=1;
mz2=0;
my1=1;
my2=0;
}
}
}
附录2:
L298N驱动直流电机程序
#include<reg51.h>
#define sen_port P1
sbit SEN1=P1^0;
sbit SEN2=P1^1;
sbit EN1=P2^2;
sbit IN1=P2^3;
sbit IN2=P2^4;
sbit EN2=P2^5;
sbit IN3=P2^6;
sbit IN4=P2^7;
void delay(int n) //延时子程序
{
unsigned char i,j,k;
for(i=n;i>0;i--)
for(j=100;j>0;j--)
for(k=200;k>0;k--);
}
unsigned char sensor_inp()
{
unsigned char sensor;
sensor = sen_port;
sensor &= 0x03;
P0 = sensor;
return sensor;
}
void forward() //two motos are runing forward
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
EN1=1;
EN2=1;
}
void backward() //two motos are runing backward
{
IN1=0;
IN2=1;
IN3=0;
IN4=1;
EN1=1;
EN2=1;
}
void turn_left() //left moto is runing, but right moto is brake
{
IN1=1;
IN2=0;
IN3=0;
IN4=0;
EN1=1;
EN2=1;
}
void rotate_left() //right moto is runing forward, and left moto is running backward
{
IN1=1;
IN2=0;
IN3=0;
IN4=1;
EN1=1;
EN2=1;
}
void turn_right() //right moto is runing, but left moto is brake
{
IN1=0;
IN2=0;
IN3=1;
IN4=0;
EN1=1;
EN2=1;
}
void rotate_right() //left moto is running forward, and right moto is running backward
{
IN1=0;
IN2=1;
IN3=1;
IN4=0;
EN1=1;
EN2=1;
}
void free() //two motos is free
{
IN1=0;
IN2=0;
IN3=0;
IN4=0;
EN1=0;
EN2=0;
}
void stop() //two motos stop
{
IN1=1;
IN2=1;
IN3=1;
IN4=1;
EN1=1;
EN2=1;
}
void main(void)
{
delay(10);
P0=0x55;
while(1)
{
// P0=P1;
// delay(100); forward();
// delay(100); stop();
delay(100); backward();
delay(100); stop();
delay(100); turn_left();
delay(100); stop();
delay(100); turn_right();
delay(100); stop();
delay(100); rotate_left();
delay(100); stop();
delay(100); rotate_right();
delay(100); stop();
delay(100); stop();
delay(20); forward();
delay(20); backward();
delay(20);
/*
*/
}
}
附录3:
蜂鸣器程序音乐清单:
#include <reg52.h>
#define uchar unsigned char
sbit beep=P1^0; //定义蜂鸣器输出端口
uchar timer0h,timer0l,time;
//世上只有妈妈好 数据表
code uchar sszymmh[]={6,2,3,5,2,1,3,2,2,5,2,2,1,3,2,6,2,1,5,2,1,
6,2,4,3,2,2,5,2,1,6,2,1,5,2,2,3,2,2,1,2,1,
6,1,1,5,2,1,3,2,1,2,2,4,2,2,3,3,2,1,5,2,2,
5,2,1,6,2,1,3,2,2,2,2,2,1,2,4,5,2,3,3,2,1,
2,2,1,1,2,1,6,1,1,1,2,1,5,1,6,0,0,0
};
// 音阶频率表 高八位
code uchar FREQH[]={0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, //1,2,3,4,5,6,7,8,i
0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,} ;
// 音阶频率表 低八位
code uchar FREQL[]={0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, //1,2,3,4,5,6,7,8,i
0xEE,0x44, 0x6B,0xB4,0xF4,0x2D,
0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,};
void delay(uchar t) // 延时函数
{
uchar t1;
unsigned long t2;
for(t1=0;t1<t;t1++)
{
for(t2=0;t2<8000;t2++);
}
TR0=0;
}
void song() // 音乐解决函数
{
TH0=timer0h;
TL0=timer0l;
TR0=1;
delay(time);
}
/******************************************************************
主函数
******************************************************************/
void main(void)
{
uchar k,i;
P0=0;
TMOD=1; //置CT0定期工作方式1
EA=1;
ET0=1; //IE=0x82 //CPU开中断,CT0开中断
while(1)
{
i=0;
while(i<100) //音乐数组长度 ,唱完从头再来
{
k=sszymmh[i]+7*sszymmh[i+1]-1;
timer0h=FREQH[k];
timer0l=FREQL[k];
time=sszymmh[i+2];
i=i+3;
song();
}
}
}
void t0int() interrupt 1 //定期器中断函数
{
TR0=0;
beep=!beep;
TH0=timer0h;
TL0=timer0l;
TR0=1;
}前进程序清单:
void Car_Go(unsigned int n) // 实现功能: 前进
{ unsigned int i=0; unsigned int k=0; unsigned int j=1;
BSR_StopRecognizer();
展开阅读全文