信息与通信工程学院
单片机系统课程设计报告
完成日期:2014年 12 月 8日
系: 专 业: 班 级: 设计题目: 学生姓名: 指导教师: 通信工程系 通信工程 通信工程124班 智能小车 张歆迪 赵京京 吴宝春
摘 要
本设计主要应用STC89C52作为控制核心,与驱动电路相结合,充分发挥STC89C52的数据处理和实时控制功能,使系统工作处于最佳状态,提高系统的灵敏度。当小车前进时,单片机执行循迹程序,红外传感器开始检测路面黑线情况,单片机根据反馈信号作出判断送给电机驱动模块,控制小车让其在黑线上实现前进后退以及转向功能。或者通过超声波模块检测前方一定范围内是否有障碍物,单片机再根据反馈信号作出判断送给驱动模块,控制小车的转弯和避障。
关键词:单片机 循迹 避障 STC89C52
目 录
摘 要 .............................................................. 1
1设计任务和要求 ...................................................... 1
1.1 设计背景 ........................................................ 1
1.2 设计任务 ........................................................ 1
2设计方案 ............................................................ 2
2.1 驱动模块 ........................................................ 2
2.2 路面探测模块 .................................................... 2
2.3避障模块 ........................................................ 3
2.4 本设计采用方案及原理 ............................................ 3
2.4.1模块清单 ..................................................... 4
3系统硬件设计 ........................................................ 5
3.1单片机最小系统设计 .............................................. 5
3.1.1控制器模块 ................................................... 5
3.2电源电路设计 .................................................... 5
3.3电机驱动模块 .................................................... 5
3.3.1引脚说明 ..................................................... 6
3.3.2硬件连接 ..................................................... 7
3.4避障模块 ........................................................ 7
3.4.1引脚说明 ..................................................... 7
3.4.2超声波测距原理图及说明 ....................................... 8
3.4.3超声波传感器时序图 ........................................... 8
3.5红外探测模块 .................................................... 9
3.5.1引脚说明 ..................................................... 9
3.5.2检测原理 ..................................................... 9
3.5.3原理图说明 .................................................. 10
4 系统软件设计 ....................................................... 11
4.1 主程序设计 ..................................................... 11
4.2 循迹子程序 ..................................................... 11
4.3 避障部分程序设计 ............................................... 12
4.4脉宽调制PWM在小车中的应用 ..................................... 13
5调试及性能分析 ..................................................... 14
5.1调试过程中出现的问题 ........................................... 14
5.2性能分析 ....................................................... 14
6心得体会 ........................................................... 15
致 谢 ............................................................. 17
参 考 文 献 .......................................................... 18
附录1 程序清单 ...................................................... 19
1.1前进、后退、加速减速程序 ....................................... 19
1.2循迹程序 ....................................................... 26
1.3避障程序 ....................................................... 30
附录2 电路原理图 .................................................... 37
附录3 PCB图 ......................................................... 39
附录4 硬件电路板图 .................................................. 40
1设计任务和要求
1.1 设计背景
随着汽车工业的快速发展,关于汽车的研究也越来越受到人们的关注。从20世纪70年代,美欧等发达国家开始进行无人驾驶汽车的研究,我国从上世纪80年代开始着手无人驾驶汽车的研制开发,虽与国外相比还有一些距离,但目前也取得了阶段性成果。智能汽车概念的提出给汽车产业带来机遇也带来挑战。汽车的智能化必将是未来汽车产业发展的趋势,在这样的背景下,我们开展了基于单片机的智能小车的研究。我国作为一个世界大国,在高科技领域也必须占据一席之地,未来汽车的智能化是汽车产业发展必然的结果,在这种情况下研究智能小车的应用具有深远意义,这将对我国未来智能汽车的研究在世界高科技领域占据领先地位具有重要作用。该设计利用单片机STC89C52RC作为主控芯片,该芯片是一种高速、低功耗、抗干扰能力强的芯片,其最高时钟工作频率为48MHz,用户应用程序空间为8K。能够满足程序空间需要。
本课题通过独立设计并制作一辆具有简单智能化的简易小车,获得项目整体设计的能力,并掌握传感器综合控制的方法。
1.2 设计任务
利用单片机设计制作一个可以通过键盘控制前进后退转向以及自动避障和自动循迹的智能小车。
2设计方案
按照系统功能的要求,简易智能车系统可划分为控制部分和信号检测部分。其中信号检测部分包括障碍物探测模块、路面检测模块;控制部分包括电机驱动模块、控制器模块。控制部分和信号检测部分以及电源部分共5个模块。主控模块采用STC89C52作为控制核心。模块方框图如图2.1所示。
图2.1 小车的基本模块方框图
为了使各个模块具有较好的性能,分别提出以下不同设计方案:
2.1 驱动模块
方案一:采用数控电位器X9313集合NE555多谐振荡器输出PWM信号。通过单片机控制数控电位器来调整NE555多谐振荡器的输出方波的占空比,达到对电机速度的控制。这个方案的优点是控制比较方便、软件资源消耗少。
方案二:L298N内部包含4通道逻辑驱动电路。是一种二相和四相电机的专用驱动器,即内含两个H桥的高电压大电流双全桥式驱动器,接收标准TTL逻辑点评信号,可驱动46V、2A以下的电机。
2.2 路面探测模块
方案一:使用发光二极管和光敏二极管。此方案缺点在于环境的其他光源对光敏二极管的工作产生很大的干扰,一旦外界光强改变,很可能造成误判和漏判,计时采用超高亮发光管可以降低一定的干扰,但这又增加额外的功耗。
方案二:采用红外传感器。此方案可以降低可见光的干扰,灵敏度高,同时其尺寸
小。质量轻。价格也低廉。外围电路简单,安装起来方便,电源要求不高,用它作为近距离传感器是最理想的。
方案三:利用激光。此方案虽然抗干扰性强、可靠性高,但其缺点在于体积大、功耗大、价格高。一般用在要求非常高的场合,本系统采用方案二已经能够胜任,无须采用此方案。
2.3避障模块
方案一:用超声波传感器进行避障。超声波传感器的原理是:超声波由传感器发出后,遇到障碍物便反射回来,再被超声波传感器接收。然后将这个信号放大后送入单片机。超声波传感器在避障的设计中被广泛应用。
方案二:用红外光电开关进行避障。光电开关的工作原理是根据投光器发出的光束,被物体阻断或部分反射,受光器最终据此做出判断反应,是利用被检测物体对红外光束的遮光或反射,由同步回路选通而检测物体的有无,其物体不限于金属,对所有能反射光线的物体均能检测。
2.4 本设计采用方案及原理
驱动模块提出的方案中,两方案相比较,软件控制量相当,但方案一的硬件电路较为复杂,驱动能力不如方案二。综合考虑两种方案的优缺点,我们选择方案二来实现本系统。
路面检测模块确定方案二的红外传感器作为循迹模块。由于它的价格和效果都可达到我们想要的目的,并且安装方便,对其他硬件软件的要求都不高。
障碍物检测模块我们选用超声波传感器。由于超声波传感器对于测距避障功能来说精度相对较高,并且安装方便,便于控制。
电源采用7.2V电源给系统的各个模块供电,这种方法可以有效的隔离电机开关时对系统所产生的冲击干扰,并且稳定的电压提高了系统的稳定性。
图2.2系统方框图
2.4.1模块清单
主控模块:STC89C52芯片,复位电路,振荡电路
路面检测模块:红外传感器
电机及驱动模块:两个电机驱动芯片L298N,四个直流电机
障碍物检测模块:超声波传感器HC-SR04
电源模块:7.2V电池
3系统硬件设计
3.1单片机最小系统设计
3.1.1控制器模块
小车使用STC89C52单片机作为主控芯片,图3.1为最小系统原理图。主要包括:振荡电路、下载电路、复位电路、电源电路。其中各个部分的功能如下:
振荡电路:给单片机提供一个外接的11.0592MHz的石英晶振;
电源电路:给单片机提供5V电源;
复位电路:在电压达到正常值时给单片机一个复位信号;
下载电路:将程序下载到单片机内。
图3.1 单片机最小系统
3.2电源电路设计
小车采集路面信息、检测障碍物、由芯片给出指令控制其前进转向等动作,各部分都需要电路支持,电源尤为重要。在本设计中,51单片机使用5V电源,考虑到电源为充电电池,额定电压为7.2V,所以单片机及驱动模块采用7805稳压后的5V电源供电。
3.3电机驱动模块
电机驱动电路主要通过改变电机的正转和反转实现小车的前后左右的方向选择。目
前市面上专用的驱动芯片很多,如L298N、BST7970、MC33886 等,基于价格、驱动电流及压降等方面来看,选用L298N较为合适。也可利用单片机产生PWM信号接到ENA、ENB端子,对电机的转速进行调节。
3.3.1引脚说明
表3.1 L298N的逻辑功能
ENA(ENB) IN1(IN3) IN2(IN4) 电机运行状况
1 1 0 正转
1 0 1 正转
0 * * 不转
电源模块供电电压为6-12V,可以直接驱动两个3-16V的直流电机,并提供5V电压输出,可以直接给小车控制板供电.对于实验室两驱小车和舵机转向小车需要1个驱动模块,四驱小车则需要2个驱动模块。
图3.2 L298N外观引脚说明
图3.3 L298N芯片引脚图
图3.4 L298N原理图
3.3.2硬件连接
电源部分:电池直接给单片机供电,此电源允许7-12V 输入,然后再用杜邦线将5V 电源直接接入L298N驱动模块;
电机部分:两个L298N 模块的OUT1、OUT2、OUT3、OUT4直接接四个电机;
单片机控制端:P2.0-P2.7分别与两L298N的IN1-IN8相连。
3.4避障模块
图3.5超声波避障模块外形图
3.4.1引脚说明
Vcc:接电源正极
Trig:控制端,接单片机IO口
Echo:接收端,接单片机IO口
Gnd:接电源负极
3.4.2超声波测距原理图及说明
超声波传感器主要包括发射器和接收器两大部分,由于超声波在空气中传播的速度为已知(340m/s),我们只需要计算出从发射到接收之间的时间差就可以算出距离。具体的作法是超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。(超声波在空气中的传播速度为340m/s,根据计时器记录的时间t,就可以计算出 发射点距障碍物的距离(s),即:s=340t/2)。
图3.6 超声波传感器原理图
3.4.3超声波传感器时序图
目前市面上有专门的集发射和接收于一体的超声波传感器,如图3.5所示为此次设计用HC-SR04型传感器,共引出4个引脚,一个电源正极(5V),一个GND,Trig为触发信号触发控制端,Echo为回响信号端。下面介绍超声波传感器的时序图。
图3.7 时序图
通过时序图可知,在使用时,触发控制端Trig首先必须给一个10us以上的高电平,然后等待发射头声波信号输出,一旦有信号输出,回响信号端会产生高电平,此时开始计时。随后声波信号一直在空气中传播,遇到障碍物会反射回来,当反射回来的信号到达接收头时,此时回响信号端会由高电平变为低电平,停止计时。
3.5红外探测模块
路面检测电路采用红外传感器,在车底的前部安装了两个反射式红外传感器。
图3.8 红外循迹模块外观图
3.5.1引脚说明
GND:接单片机的地
VCC:接单片机的+5V
S:信号输出端,接单片机IO口
3.5.2检测原理
检测原理为当发射管照射在黑白分明的路面时,由于黑色吸光,反射回来的光就较少,接收管接收到的红外光就较少,表现为电阻大;同理,当照射在白色表面时反射的红外光就比较多,表现为电阻较小,此时通过外接电路就把电阻信号变成大小不一的电压信号,然后通过比较器转换成高低电平信号,再将此信号送到单片机,单片机就可以判断黑白路面,进而完成循迹功能。
图3.9 黑白路面检测原理框图
3.5.3原理图说明
图3.10 红外传感器原理图
根据上面原理图,循迹时,当照在白色路面,S输出低电平0,指示灯亮;当照在黑色路面,S输出高电平1,指示灯不亮。
4 系统软件设计
4.1 主程序设计
主程序主要起到一个导向和决策功能,决定什么时候小车该做什么。小车各种功能的实现主要通过调用具体的子程序。本设计主程序的执行顺序主要是先将小车置于黑线之上且黑线介于左右车轮之间,给小车通电之后执行循迹程序,若检测到前方一定距离内有障碍物,则避障再循迹。
图4.1 主程序流程图
4.2 循迹子程序
将小车置于黑线之上且黑线介于左右车轮之间,当只有左边红外管检测到黑线时,小车左转;当只有右边红外管检测到黑线时,小车右转;当两个红外管都检测到黑线时,小车停止。
图4.2 循迹流程图
4.3 避障部分程序设计
在没有检测到障碍物时,小车向前行进。当在一定距离内检测到障碍物时,小车后退转向,再次判断前方是否有障碍物,直到没有障碍物,小车继续前行。
图4.3 避障程序流程图
4.4脉宽调制PWM在小车中的应用
通过前面的内容我们知道,通过H桥电路,可有效的解决单片机I/O口驱动能力不足的问题,并且可以实现电机的正转、反转及刹车,但对于如何对电机的速度进行调整L298N却无能为力,要很好的解决这个问题,就要用到PWM技术。
对STC89C52这样的单片机,因为其内部没有PWM模块,所以要得到PWM我们只能用软件方式来实现,即通过执行软件延时循环交替改变端口某个二进制位输出逻辑状态来产生脉宽调制信号,设置不同的延时时间得到不同的占空比,对于一些简单和要求不高的速度调节,通常可以采用此种方法。下面重点介绍用一个定时器的实现PWM 的方法。因为市面上的智能小车所采用的电机大多数为减速电机,通过复杂的实验此电机最佳的工作频率为1000HZ(太高容易发生哨叫,太低电机容易发生抖动),所以下面以周期为1ms(1000HZ)进行举例,要产生其它频率的PWM 波,程序中只需作简单修改即可。用一个定时器时(如定时器T0),首先你要确定PWM 的周期T和占空比D,确定了这些以后,你可以用定时器产生一个时间基准t,比如定时器溢出n次的时间是PWM的高电平的时间,则D*T=n*t,类似的可以求出PWM低电平时间需要多少个时间基准n'。因为这里我们是产生周期为1ms(1000HZ)的PWM,所以可设置中断的时间基准为0.01ms,,然后中断100 次即为1ms。在中断子程序内,可设置一个变量如time,在中断子程序内,有三条重要的语句:1、当time>=100 时,time 清零(此语句保证频率为1000HZ),2、当time>n 时(n 应该在0-100 之间变化开),让单片相应的I/O 口输出高电平,当time
5调试及性能分析
5.1调试过程中出现的问题
整机焊接完毕,首先对硬件进行检查,再逐步对模块进行调试。发现焊接好的电路板不能下载程序,仔细检查过后发现是谐振电容选择错误,经过更换可以下载程序了。以后在焊接前一定要对该电容进行检测,确保谐振电容完好,否则将导致晶振不起振,单片机无法正常工作。
其次,写入电机控制程序,控制其正反转,停机均正常。在使用L298N驱动电机的时候,需要测试L298N的每个输入引脚控制电机的正反转情况,并记录下来,方便以后编程。
加入避障子程序,小车运转正常,调整灵敏度达到最佳效果。接着调试循迹模块的时候,将红外模块安装完毕且下载正确的程序之后并没有得到想要的效果,红外传感器感应不到白色路面,经过检查是因为传感器离地太远,更改距离之后可以循迹。
5.2性能分析
本设计以单片机STC89C52R为核心实现小车避障循迹。小车通电后先执行循迹程序,在循迹过程中如果在小车前方的安全距离内检测到障碍物,则小车执行避障程序,直到前方安全距离内没有障碍物,小车再继续执行循迹程序。由于自身能力有限,部分功能效果不是很好,但基本实现了自动避障和循迹的目的,有许多地方有待改进。
6心得体会
根据本次设计要求,我们小组阅读了大量的资料,并认真分析了设计课题的需求,还系统学习了52系列单片机的工作原理以及使用方法,并独自设计智能小车的整个项目。
虽然目前掌握的知识较少,但经过不懈的努力和多次试验,最终做出了整个小车的硬件系统,然后结合课题任务和小车硬件进行了程序的编制,本系统能够基本满足设计要求,小车能够较平稳的沿黑线行驶且能自动躲避障碍物,但由于经验能力有限,该系统还存在着许多不尽人意的地方有待于进一步的完善与改进。
通过本次课程设计,不仅是对我们课本所学知识的考查,更是对我们的自学能力和收集资料能力以及动手能力的考验。本次设计使我们对一个项目的整体设计有了初步认识,还认识了几种传感器并且了解它们的工作原理,再有对电路板的制作有了一定的了解。本次设计使我们意识到了实验的重要性,在硬件制作和软件调试的过程中出现了许多问题,最终都是通过实验的方法来解决的。还有以前对程序只是一个很模糊的概念,通过这次的课程设计使我对程序有了一个新的认识,并能使用C语言进行编程。这次的课程设计锻炼了我们思考和分析问题的能力,并对单片机有了更深的认识。
总之,在设计的过程中,无论是对于学习方法还是理论知识,我们都有了新的认识,受益匪浅,这将激励我们今后再接再厉,不断完善自己的理论知识,提高实践运作能力。
结 论
本课题研究的内容主要是智能小车的避障系统和循迹系统。以实验组装小车为基础,使用了超声波传感器和红外传感器来探测周围环境,同时对采集到的数据信息进行处理并且取得了以下成果:
(1)自动沿预设轨迹行驶,即在行驶过程中能够自动检测黑线并沿黑线行走,实现直走和转弯的功能,若有偏离,能够自动纠正并返回到黑线轨迹上来。
(2)当小车探测到行进前方有障碍物时,可自动躲避障碍物,从无障碍物区通过。
(3)自动检测停车线并停车。
从运行情况来看避障的效果比较好,循迹的效果不是很好,我认为是可能是红外循迹模块没有达到最敏感的状态。
通过本次课程设计,是我重新认识了单片机,整个制作的过程是苦恼与乐趣并存的,结果并不重要,重要的是增加了知识的储备,学到了新的东西才是最应该庆幸的,这使得我在单片机的学习上有了很大进步。
致 谢
本设计能够顺利完成,还要感谢吴宝春老师以及身边的很多同学的指导和帮助。在设计过程中,吴老师给予了悉心的指导,最重要的是给了我解决问题的思路和方法,并且在设计环境和器材方面给予了大力的帮助和支持,在此,我对吴老师表示最真挚的感谢,同时感谢所有帮助过我的同学。
参 考 文 献
[1]刘守义,单片机应用技术,西安电子科技大学出版社。2007
[2]潘新民,王燕芳.微型计算机控制技术.电子工业出版社.2007
[3]张永凤.单片机应用实训教程.西安电子科技大学出版社.2007
[4]全国大学生电子设计竞赛组委会.第五届全国大学生电子设计竞赛获奖作品选编(2001).北京理工大学出版社.2002
[5]张文阁,赵冬娥,郝晓剑,潘保青.一种移动脉冲宽度可调的CCD驱动电路[J].测试技术学报.1996,(03)
[6]郭惠,吴迅,单片机C语言程序设计完全自学手册[M].电子工业出版社,2008,10:1-200.
[7]王东锋,王会良,董冠强,单片机C语言应用100例[M].电子工业出版社,2009,3:145-300
[8]王晓明,电动机的单片机控制[J],学术期刊,2002,13(15):1322-1755.
附录1 程序清单
1.1前进、后退、加速减速程序
#include
#define uint unsigned int
#define uchar unsigned char
uchar time,count=50,flag=1;//低电平的占空比
sbit PWM1=P2^0;//PWM 通道 1,正转脉冲
sbit PWM2=P2^1;//PWM 通道 2,反转脉冲
sbit PWM3=P2^2;//PWM 通道 3,正转脉冲
sbit PWM4=P2^3;//PWM 通道 4,反转脉冲
sbit PWM5=P2^4;//PWM 通道 5,正转脉冲
sbit PWM6=P2^5;//PWM 通道 6,反转脉冲
sbit PWM7=P2^6;//PWM 通道 7,正转脉冲
sbit PWM8=P2^7;//PWM 通道 8,反转脉冲
sbit key_turn=P1^1; //电机换向
sbit key_add=P1^2;//电机加速
sbit key_dec=P1^3;//电机减速
/************函数声明**************/
void delayxms(uint z);
void Motor_turn(void);
void Motor_add();
void Motor_dec();
void timer0_init(void);
/*********主函数********************/
void main(void)
{
timer0_init();
while(1)
{
Motor_turn();
Motor_add();
Motor_dec();
}
}
/****************延时处理**********************/ void delayxms(uint z)//延时xms 程序
{
uint x,y;
for(y=z;x>0;x--)
for(y=110;y>0;y--);
}
/************电机正反向控制**************/ void Motor_turn(void)
{
if(key_turn==0)
{
delayxms(2);
if(key_turn==0)
{
flag=~flag;
}
while(!key_turn);
}
}
void Motor_add()//电机加速
{
if(key_add==0)
{
delayxms(2);
if(key_add==0)
{
}
count+=5; if(count>=100) { } count=0; } while(!key_add); }
void Motor_dec()//电机减速
{
}
/***********定时器0 初始化***********/
void timer0_init(void)
{
TMOD=0x01; //定时器0 工作于方式1
TH0=(65536-10)/256;
TL0=(65536-10)%256;
if(key_dec==0) { delayxms(2); if(key_dec==0) { count-=5; if(count>=100) { } count=0; } while(!key_dec); }
TR0=1;
ET0=1;
EA=1;
}
/**************定时0 中断处理******************/ void timer0_int(void) interrupt 1
{
TR0=0;//设置定时器初值期间,关闭定时器
TH0=(65536-10)/256;
TL0=(65536-10)%256;
TR0=1;
if(flag==1)//电机正转
{
PWM1=1;
time++;
if(time
{
PWM2=0;
}
else
PWM2=1;
if(time>=100)
{
time=0;
}
}
else //电机反转
{
PWM2=1;
time++;
if(time
{
PWM1=0;
}
else
PWM1=1;
if(time>=100)
{
time=0;
}
}
if(flag==1)//电机正转
{
PWM3=1;
time++;
if(time
{
PWM4=0;
}
else
PWM4=1;
if(time>=100)
{
time=0;
}
}
else //电机反转
{
PWM4=1;
time++;
if(time
{
PWM3=0;
}
else
PWM3=1;
if(time>=100)
{
time=0;
}
}
if(flag==1)//电机正转
{
PWM5=1;
time++;
if(time
{
PWM6=0;
}
else
PWM6=1;
if(time>=100)
{
time=0;
}
}
else //电机反转
{
PWM6=1;
time++;
if(time
{
PWM5=0;
}
else
PWM5=1;
if(time>=100)
{
time=0;
}
}
if(flag==1)//电机正转
{
PWM7=1;
time++;
if(time
{
PWM8=0;
}
else
PWM8=1;
if(time>=100)
{
time=0;
}
}
else //电机反转
{
PWM8=1;
time++;
if(time
{
PWM7=0;
}
else
PWM7=1;
if(time>=100)
{
time=0;
}
}
}
1.2循迹程序
#include
#define uchar unsigned char
#define uint unsigned int
uchar pro_left,pro_right,i,j;
sbit in1=P2^0;
sbit in2=P2^1;
sbit in3=P2^2;
sbit in4=P2^3;
sbit in5=P2^4;
sbit in6=P2^5;
sbit in7=P2^6;
sbit in8=P2^7;
sbit en1=P1^0;
sbit en2=P1^1;
sbit left_red=P1^2;
sbit right_red=P1^3;
sbit mid_red=P1^4;
void delay(uint z)
{
uchar i;
while(z--)
{ for(i=0;i
}
void init()
{
left_red=0;//白线
mid_red=1;//黑线
right_red=0;
TMOD=0X01;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
EA=1;
ET0=1;
TR0=1;
en1=1;
en2=1;
}
void time0(void)interrupt 1
{
i++;
j++;
if(i
else en1=0;
if(i==40){en1=~en1;i=0;}
if(j
else en2=0;
if(j==40){en2=~en2;j=0;}
TH0=(65536-100)/256;
TL0=(65536-100)%256;
}
void straight()//直走
{
pro_right=29;
pro_left=29;
in1=1;
in2=0;
in3=1;
in4=0;
in5=1;
in6=0;
in7=1;
in8=0;
}
void turn_left()//左转
{
pro_right=5;
pro_left=29;
left1=0;
left2=1;
right1=1;
right2=0;
}
void turn_right()//右转
{
pro_right=29;
pro_left=5;
left1=0;
left2=1;
right1=1;
right2=0;
}
void turn_back()//后退
{
left1=1;
left2=0;
right1=0;
right2=1;
pro_right=29;
pro_left=29;
}
void infrared()//循迹
{
uchar flag;
if(left_red==1)
{flag=1;}
else
if(right_red==1)
{flag=2;}
else
if((left_red==0)&(mid_red==0)&(right_red==0))
{flag=3;}
else flag=0;
switch(flag)
{
case0:straight();
break;
case1:turn_left();
break;
case2:turn_right();
break;
case3:turn_back();
break;
default:
break;
}
}
void main(void)
{
init();
delay(1);
while(1)
{
infrared();
//straight();
}
}
void int0(void)interrupt 0{
}
1.3避障程序
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit TRIG = P3^6 ;
sbit ECHO = P3^7 ;
sbit pwm = P0^0; //PWM信号输出口
sbit in1 = P2^0; //左1
sbit in2 = P2^1;
sbit in3 = P2^2; //左2
sbit in4 = P2^3;
sbit in5 = P2^4; //右1
sbit in6 = P2^5;
sbit in7 = P2^6; //右2
sbit in8 = P2^7;
uchar n,count,angle,left,right; //距离标志位,0.5ms次数,角度标识 float S; //距离变量
void DelayUs2x(uchar t)
{
while(--t);
}
void DelayMs(uchar t)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
void go ()
{
in1=1;
in2=0;
in3=1;
in4=0;
in5=1;
in6=0;
in7=1;
in8=0;
}
void back ()
{
in1=0;
in2=1;
in3=0;
in4=1;
in5=0;
in6=1;
in7=0;
in8=1;
}
void turnleft ()
{
in1=0;
in2=1;
in3=0;
in4=1;
in5=1;
in6=0;
in7=1;
in8=0;
}
void turnright ()
{
in1=1;
in2=0;
in3=1;
in4=0;
in5=0;
in6=1;
in7=0;
in8=1;
}
void stop()
{
in1=0;
in2=0;
in3=0;
in4=0;
in5=0;
in6=0;
in7=0;
in8=0.0000;
}
/*------------------------------------------------
定时器0初始化
------------------------------------------------*/
void TIM0init(void)
{
TMOD|= 0x11;//定时器1工作方式1 (超声波) 定时器0舵机 TH1=0x00;
TL1=0x00;
TH0=0xff;
TL0=0xa3; //11.0592MHz晶振,0.5ms
ET1=1;
ET0=1;
EA=1;
TR0=1; //定时器开始
IE=0x82;
}
void chaoshengbo ()
{
TRIG=1; //触发信号是高电平脉冲,宽度大于10us
DelayUs2x(10);
TRIG=0;
while(!ECHO); //等待高电平
TR1=1;
while(ECHO); //等待低电平
TR1=0;
S=TH1*256+TL1;//取出定时器值高8位和低8位合并
S=S/58; //为什么除以58等于厘米, Y米=(X秒*344)/2
// X秒=( 2*Y米)/344 -> X秒=0.0058*Y米 -> 厘米=微秒/58
if(S>=25)
{n=1;}
if(S
{n=0;}
TH1=0;
TL1=0; //清除定时器0寄存器中的值
}
/*------------------------------------------------
主函数
------------------------------------------------*/
main()
{
angle=12;
count=0;
TIM0init(); //初始化定时器
while(1)
{
chaoshengbo();
DelayMs(20);
if(n==1)
{go();}
if (n==0)
{
stop();
n=1;
angle=5;
count=0;
DelayMs(400);
chaoshengbo();
DelayMs(20);
right=n;
n=1;
angle=12;
count=0;
DelayMs(400);
angle=19;
count=0;
DelayMs(400);
chaoshengbo();
DelayMs(20);
left=n;
angle=12;
count=0;
DelayMs(400);
n=1;
if(right==1)
{
turnright();
DelayMs(450);
}
else if(right==0&&left==1)
{
turnleft();
DelayMs(450);
}
else
{
back();
DelayMs(500);
turnleft();
DelayMs(1000);
}
}
}
}
/*------------------------------------------------
定时器中断子程序
------------------------------------------------*/
void Time0_0(void) interrupt 3
{
ECHO=0;
}
void Time1_Int() interrupt 1
{
TH0=0xff;
TL0=0xa3;
if(count
pwm=1; //确实小于,pwm输出高电平 else
20ms
}
pwm=0; count=(count+1); count=count%40; //大于则输出低电平 //0.5ms次数加1 //次数始终保持为40即保持周期为
附录2 电路原理图
附录2.1 最小系统原理图
附录2.2 L298N原理图
附录2.3 红外传感器原理图
附录2.4
超声波模块原理图
附录3 PCB图
附录3.1 PCB图
附录4 硬件电路板图
附录4.1 硬件电路板
信息与通信工程学院
单片机系统课程设计报告
完成日期:2014年 12 月 8日
系: 专 业: 班 级: 设计题目: 学生姓名: 指导教师: 通信工程系 通信工程 通信工程124班 智能小车 张歆迪 赵京京 吴宝春
摘 要
本设计主要应用STC89C52作为控制核心,与驱动电路相结合,充分发挥STC89C52的数据处理和实时控制功能,使系统工作处于最佳状态,提高系统的灵敏度。当小车前进时,单片机执行循迹程序,红外传感器开始检测路面黑线情况,单片机根据反馈信号作出判断送给电机驱动模块,控制小车让其在黑线上实现前进后退以及转向功能。或者通过超声波模块检测前方一定范围内是否有障碍物,单片机再根据反馈信号作出判断送给驱动模块,控制小车的转弯和避障。
关键词:单片机 循迹 避障 STC89C52
目 录
摘 要 .............................................................. 1
1设计任务和要求 ...................................................... 1
1.1 设计背景 ........................................................ 1
1.2 设计任务 ........................................................ 1
2设计方案 ............................................................ 2
2.1 驱动模块 ........................................................ 2
2.2 路面探测模块 .................................................... 2
2.3避障模块 ........................................................ 3
2.4 本设计采用方案及原理 ............................................ 3
2.4.1模块清单 ..................................................... 4
3系统硬件设计 ........................................................ 5
3.1单片机最小系统设计 .............................................. 5
3.1.1控制器模块 ................................................... 5
3.2电源电路设计 .................................................... 5
3.3电机驱动模块 .................................................... 5
3.3.1引脚说明 ..................................................... 6
3.3.2硬件连接 ..................................................... 7
3.4避障模块 ........................................................ 7
3.4.1引脚说明 ..................................................... 7
3.4.2超声波测距原理图及说明 ....................................... 8
3.4.3超声波传感器时序图 ........................................... 8
3.5红外探测模块 .................................................... 9
3.5.1引脚说明 ..................................................... 9
3.5.2检测原理 ..................................................... 9
3.5.3原理图说明 .................................................. 10
4 系统软件设计 ....................................................... 11
4.1 主程序设计 ..................................................... 11
4.2 循迹子程序 ..................................................... 11
4.3 避障部分程序设计 ............................................... 12
4.4脉宽调制PWM在小车中的应用 ..................................... 13
5调试及性能分析 ..................................................... 14
5.1调试过程中出现的问题 ........................................... 14
5.2性能分析 ....................................................... 14
6心得体会 ........................................................... 15
致 谢 ............................................................. 17
参 考 文 献 .......................................................... 18
附录1 程序清单 ...................................................... 19
1.1前进、后退、加速减速程序 ....................................... 19
1.2循迹程序 ....................................................... 26
1.3避障程序 ....................................................... 30
附录2 电路原理图 .................................................... 37
附录3 PCB图 ......................................................... 39
附录4 硬件电路板图 .................................................. 40
1设计任务和要求
1.1 设计背景
随着汽车工业的快速发展,关于汽车的研究也越来越受到人们的关注。从20世纪70年代,美欧等发达国家开始进行无人驾驶汽车的研究,我国从上世纪80年代开始着手无人驾驶汽车的研制开发,虽与国外相比还有一些距离,但目前也取得了阶段性成果。智能汽车概念的提出给汽车产业带来机遇也带来挑战。汽车的智能化必将是未来汽车产业发展的趋势,在这样的背景下,我们开展了基于单片机的智能小车的研究。我国作为一个世界大国,在高科技领域也必须占据一席之地,未来汽车的智能化是汽车产业发展必然的结果,在这种情况下研究智能小车的应用具有深远意义,这将对我国未来智能汽车的研究在世界高科技领域占据领先地位具有重要作用。该设计利用单片机STC89C52RC作为主控芯片,该芯片是一种高速、低功耗、抗干扰能力强的芯片,其最高时钟工作频率为48MHz,用户应用程序空间为8K。能够满足程序空间需要。
本课题通过独立设计并制作一辆具有简单智能化的简易小车,获得项目整体设计的能力,并掌握传感器综合控制的方法。
1.2 设计任务
利用单片机设计制作一个可以通过键盘控制前进后退转向以及自动避障和自动循迹的智能小车。
2设计方案
按照系统功能的要求,简易智能车系统可划分为控制部分和信号检测部分。其中信号检测部分包括障碍物探测模块、路面检测模块;控制部分包括电机驱动模块、控制器模块。控制部分和信号检测部分以及电源部分共5个模块。主控模块采用STC89C52作为控制核心。模块方框图如图2.1所示。
图2.1 小车的基本模块方框图
为了使各个模块具有较好的性能,分别提出以下不同设计方案:
2.1 驱动模块
方案一:采用数控电位器X9313集合NE555多谐振荡器输出PWM信号。通过单片机控制数控电位器来调整NE555多谐振荡器的输出方波的占空比,达到对电机速度的控制。这个方案的优点是控制比较方便、软件资源消耗少。
方案二:L298N内部包含4通道逻辑驱动电路。是一种二相和四相电机的专用驱动器,即内含两个H桥的高电压大电流双全桥式驱动器,接收标准TTL逻辑点评信号,可驱动46V、2A以下的电机。
2.2 路面探测模块
方案一:使用发光二极管和光敏二极管。此方案缺点在于环境的其他光源对光敏二极管的工作产生很大的干扰,一旦外界光强改变,很可能造成误判和漏判,计时采用超高亮发光管可以降低一定的干扰,但这又增加额外的功耗。
方案二:采用红外传感器。此方案可以降低可见光的干扰,灵敏度高,同时其尺寸
小。质量轻。价格也低廉。外围电路简单,安装起来方便,电源要求不高,用它作为近距离传感器是最理想的。
方案三:利用激光。此方案虽然抗干扰性强、可靠性高,但其缺点在于体积大、功耗大、价格高。一般用在要求非常高的场合,本系统采用方案二已经能够胜任,无须采用此方案。
2.3避障模块
方案一:用超声波传感器进行避障。超声波传感器的原理是:超声波由传感器发出后,遇到障碍物便反射回来,再被超声波传感器接收。然后将这个信号放大后送入单片机。超声波传感器在避障的设计中被广泛应用。
方案二:用红外光电开关进行避障。光电开关的工作原理是根据投光器发出的光束,被物体阻断或部分反射,受光器最终据此做出判断反应,是利用被检测物体对红外光束的遮光或反射,由同步回路选通而检测物体的有无,其物体不限于金属,对所有能反射光线的物体均能检测。
2.4 本设计采用方案及原理
驱动模块提出的方案中,两方案相比较,软件控制量相当,但方案一的硬件电路较为复杂,驱动能力不如方案二。综合考虑两种方案的优缺点,我们选择方案二来实现本系统。
路面检测模块确定方案二的红外传感器作为循迹模块。由于它的价格和效果都可达到我们想要的目的,并且安装方便,对其他硬件软件的要求都不高。
障碍物检测模块我们选用超声波传感器。由于超声波传感器对于测距避障功能来说精度相对较高,并且安装方便,便于控制。
电源采用7.2V电源给系统的各个模块供电,这种方法可以有效的隔离电机开关时对系统所产生的冲击干扰,并且稳定的电压提高了系统的稳定性。
图2.2系统方框图
2.4.1模块清单
主控模块:STC89C52芯片,复位电路,振荡电路
路面检测模块:红外传感器
电机及驱动模块:两个电机驱动芯片L298N,四个直流电机
障碍物检测模块:超声波传感器HC-SR04
电源模块:7.2V电池
3系统硬件设计
3.1单片机最小系统设计
3.1.1控制器模块
小车使用STC89C52单片机作为主控芯片,图3.1为最小系统原理图。主要包括:振荡电路、下载电路、复位电路、电源电路。其中各个部分的功能如下:
振荡电路:给单片机提供一个外接的11.0592MHz的石英晶振;
电源电路:给单片机提供5V电源;
复位电路:在电压达到正常值时给单片机一个复位信号;
下载电路:将程序下载到单片机内。
图3.1 单片机最小系统
3.2电源电路设计
小车采集路面信息、检测障碍物、由芯片给出指令控制其前进转向等动作,各部分都需要电路支持,电源尤为重要。在本设计中,51单片机使用5V电源,考虑到电源为充电电池,额定电压为7.2V,所以单片机及驱动模块采用7805稳压后的5V电源供电。
3.3电机驱动模块
电机驱动电路主要通过改变电机的正转和反转实现小车的前后左右的方向选择。目
前市面上专用的驱动芯片很多,如L298N、BST7970、MC33886 等,基于价格、驱动电流及压降等方面来看,选用L298N较为合适。也可利用单片机产生PWM信号接到ENA、ENB端子,对电机的转速进行调节。
3.3.1引脚说明
表3.1 L298N的逻辑功能
ENA(ENB) IN1(IN3) IN2(IN4) 电机运行状况
1 1 0 正转
1 0 1 正转
0 * * 不转
电源模块供电电压为6-12V,可以直接驱动两个3-16V的直流电机,并提供5V电压输出,可以直接给小车控制板供电.对于实验室两驱小车和舵机转向小车需要1个驱动模块,四驱小车则需要2个驱动模块。
图3.2 L298N外观引脚说明
图3.3 L298N芯片引脚图
图3.4 L298N原理图
3.3.2硬件连接
电源部分:电池直接给单片机供电,此电源允许7-12V 输入,然后再用杜邦线将5V 电源直接接入L298N驱动模块;
电机部分:两个L298N 模块的OUT1、OUT2、OUT3、OUT4直接接四个电机;
单片机控制端:P2.0-P2.7分别与两L298N的IN1-IN8相连。
3.4避障模块
图3.5超声波避障模块外形图
3.4.1引脚说明
Vcc:接电源正极
Trig:控制端,接单片机IO口
Echo:接收端,接单片机IO口
Gnd:接电源负极
3.4.2超声波测距原理图及说明
超声波传感器主要包括发射器和接收器两大部分,由于超声波在空气中传播的速度为已知(340m/s),我们只需要计算出从发射到接收之间的时间差就可以算出距离。具体的作法是超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。(超声波在空气中的传播速度为340m/s,根据计时器记录的时间t,就可以计算出 发射点距障碍物的距离(s),即:s=340t/2)。
图3.6 超声波传感器原理图
3.4.3超声波传感器时序图
目前市面上有专门的集发射和接收于一体的超声波传感器,如图3.5所示为此次设计用HC-SR04型传感器,共引出4个引脚,一个电源正极(5V),一个GND,Trig为触发信号触发控制端,Echo为回响信号端。下面介绍超声波传感器的时序图。
图3.7 时序图
通过时序图可知,在使用时,触发控制端Trig首先必须给一个10us以上的高电平,然后等待发射头声波信号输出,一旦有信号输出,回响信号端会产生高电平,此时开始计时。随后声波信号一直在空气中传播,遇到障碍物会反射回来,当反射回来的信号到达接收头时,此时回响信号端会由高电平变为低电平,停止计时。
3.5红外探测模块
路面检测电路采用红外传感器,在车底的前部安装了两个反射式红外传感器。
图3.8 红外循迹模块外观图
3.5.1引脚说明
GND:接单片机的地
VCC:接单片机的+5V
S:信号输出端,接单片机IO口
3.5.2检测原理
检测原理为当发射管照射在黑白分明的路面时,由于黑色吸光,反射回来的光就较少,接收管接收到的红外光就较少,表现为电阻大;同理,当照射在白色表面时反射的红外光就比较多,表现为电阻较小,此时通过外接电路就把电阻信号变成大小不一的电压信号,然后通过比较器转换成高低电平信号,再将此信号送到单片机,单片机就可以判断黑白路面,进而完成循迹功能。
图3.9 黑白路面检测原理框图
3.5.3原理图说明
图3.10 红外传感器原理图
根据上面原理图,循迹时,当照在白色路面,S输出低电平0,指示灯亮;当照在黑色路面,S输出高电平1,指示灯不亮。
4 系统软件设计
4.1 主程序设计
主程序主要起到一个导向和决策功能,决定什么时候小车该做什么。小车各种功能的实现主要通过调用具体的子程序。本设计主程序的执行顺序主要是先将小车置于黑线之上且黑线介于左右车轮之间,给小车通电之后执行循迹程序,若检测到前方一定距离内有障碍物,则避障再循迹。
图4.1 主程序流程图
4.2 循迹子程序
将小车置于黑线之上且黑线介于左右车轮之间,当只有左边红外管检测到黑线时,小车左转;当只有右边红外管检测到黑线时,小车右转;当两个红外管都检测到黑线时,小车停止。
图4.2 循迹流程图
4.3 避障部分程序设计
在没有检测到障碍物时,小车向前行进。当在一定距离内检测到障碍物时,小车后退转向,再次判断前方是否有障碍物,直到没有障碍物,小车继续前行。
图4.3 避障程序流程图
4.4脉宽调制PWM在小车中的应用
通过前面的内容我们知道,通过H桥电路,可有效的解决单片机I/O口驱动能力不足的问题,并且可以实现电机的正转、反转及刹车,但对于如何对电机的速度进行调整L298N却无能为力,要很好的解决这个问题,就要用到PWM技术。
对STC89C52这样的单片机,因为其内部没有PWM模块,所以要得到PWM我们只能用软件方式来实现,即通过执行软件延时循环交替改变端口某个二进制位输出逻辑状态来产生脉宽调制信号,设置不同的延时时间得到不同的占空比,对于一些简单和要求不高的速度调节,通常可以采用此种方法。下面重点介绍用一个定时器的实现PWM 的方法。因为市面上的智能小车所采用的电机大多数为减速电机,通过复杂的实验此电机最佳的工作频率为1000HZ(太高容易发生哨叫,太低电机容易发生抖动),所以下面以周期为1ms(1000HZ)进行举例,要产生其它频率的PWM 波,程序中只需作简单修改即可。用一个定时器时(如定时器T0),首先你要确定PWM 的周期T和占空比D,确定了这些以后,你可以用定时器产生一个时间基准t,比如定时器溢出n次的时间是PWM的高电平的时间,则D*T=n*t,类似的可以求出PWM低电平时间需要多少个时间基准n'。因为这里我们是产生周期为1ms(1000HZ)的PWM,所以可设置中断的时间基准为0.01ms,,然后中断100 次即为1ms。在中断子程序内,可设置一个变量如time,在中断子程序内,有三条重要的语句:1、当time>=100 时,time 清零(此语句保证频率为1000HZ),2、当time>n 时(n 应该在0-100 之间变化开),让单片相应的I/O 口输出高电平,当time
5调试及性能分析
5.1调试过程中出现的问题
整机焊接完毕,首先对硬件进行检查,再逐步对模块进行调试。发现焊接好的电路板不能下载程序,仔细检查过后发现是谐振电容选择错误,经过更换可以下载程序了。以后在焊接前一定要对该电容进行检测,确保谐振电容完好,否则将导致晶振不起振,单片机无法正常工作。
其次,写入电机控制程序,控制其正反转,停机均正常。在使用L298N驱动电机的时候,需要测试L298N的每个输入引脚控制电机的正反转情况,并记录下来,方便以后编程。
加入避障子程序,小车运转正常,调整灵敏度达到最佳效果。接着调试循迹模块的时候,将红外模块安装完毕且下载正确的程序之后并没有得到想要的效果,红外传感器感应不到白色路面,经过检查是因为传感器离地太远,更改距离之后可以循迹。
5.2性能分析
本设计以单片机STC89C52R为核心实现小车避障循迹。小车通电后先执行循迹程序,在循迹过程中如果在小车前方的安全距离内检测到障碍物,则小车执行避障程序,直到前方安全距离内没有障碍物,小车再继续执行循迹程序。由于自身能力有限,部分功能效果不是很好,但基本实现了自动避障和循迹的目的,有许多地方有待改进。
6心得体会
根据本次设计要求,我们小组阅读了大量的资料,并认真分析了设计课题的需求,还系统学习了52系列单片机的工作原理以及使用方法,并独自设计智能小车的整个项目。
虽然目前掌握的知识较少,但经过不懈的努力和多次试验,最终做出了整个小车的硬件系统,然后结合课题任务和小车硬件进行了程序的编制,本系统能够基本满足设计要求,小车能够较平稳的沿黑线行驶且能自动躲避障碍物,但由于经验能力有限,该系统还存在着许多不尽人意的地方有待于进一步的完善与改进。
通过本次课程设计,不仅是对我们课本所学知识的考查,更是对我们的自学能力和收集资料能力以及动手能力的考验。本次设计使我们对一个项目的整体设计有了初步认识,还认识了几种传感器并且了解它们的工作原理,再有对电路板的制作有了一定的了解。本次设计使我们意识到了实验的重要性,在硬件制作和软件调试的过程中出现了许多问题,最终都是通过实验的方法来解决的。还有以前对程序只是一个很模糊的概念,通过这次的课程设计使我对程序有了一个新的认识,并能使用C语言进行编程。这次的课程设计锻炼了我们思考和分析问题的能力,并对单片机有了更深的认识。
总之,在设计的过程中,无论是对于学习方法还是理论知识,我们都有了新的认识,受益匪浅,这将激励我们今后再接再厉,不断完善自己的理论知识,提高实践运作能力。
结 论
本课题研究的内容主要是智能小车的避障系统和循迹系统。以实验组装小车为基础,使用了超声波传感器和红外传感器来探测周围环境,同时对采集到的数据信息进行处理并且取得了以下成果:
(1)自动沿预设轨迹行驶,即在行驶过程中能够自动检测黑线并沿黑线行走,实现直走和转弯的功能,若有偏离,能够自动纠正并返回到黑线轨迹上来。
(2)当小车探测到行进前方有障碍物时,可自动躲避障碍物,从无障碍物区通过。
(3)自动检测停车线并停车。
从运行情况来看避障的效果比较好,循迹的效果不是很好,我认为是可能是红外循迹模块没有达到最敏感的状态。
通过本次课程设计,是我重新认识了单片机,整个制作的过程是苦恼与乐趣并存的,结果并不重要,重要的是增加了知识的储备,学到了新的东西才是最应该庆幸的,这使得我在单片机的学习上有了很大进步。
致 谢
本设计能够顺利完成,还要感谢吴宝春老师以及身边的很多同学的指导和帮助。在设计过程中,吴老师给予了悉心的指导,最重要的是给了我解决问题的思路和方法,并且在设计环境和器材方面给予了大力的帮助和支持,在此,我对吴老师表示最真挚的感谢,同时感谢所有帮助过我的同学。
参 考 文 献
[1]刘守义,单片机应用技术,西安电子科技大学出版社。2007
[2]潘新民,王燕芳.微型计算机控制技术.电子工业出版社.2007
[3]张永凤.单片机应用实训教程.西安电子科技大学出版社.2007
[4]全国大学生电子设计竞赛组委会.第五届全国大学生电子设计竞赛获奖作品选编(2001).北京理工大学出版社.2002
[5]张文阁,赵冬娥,郝晓剑,潘保青.一种移动脉冲宽度可调的CCD驱动电路[J].测试技术学报.1996,(03)
[6]郭惠,吴迅,单片机C语言程序设计完全自学手册[M].电子工业出版社,2008,10:1-200.
[7]王东锋,王会良,董冠强,单片机C语言应用100例[M].电子工业出版社,2009,3:145-300
[8]王晓明,电动机的单片机控制[J],学术期刊,2002,13(15):1322-1755.
附录1 程序清单
1.1前进、后退、加速减速程序
#include
#define uint unsigned int
#define uchar unsigned char
uchar time,count=50,flag=1;//低电平的占空比
sbit PWM1=P2^0;//PWM 通道 1,正转脉冲
sbit PWM2=P2^1;//PWM 通道 2,反转脉冲
sbit PWM3=P2^2;//PWM 通道 3,正转脉冲
sbit PWM4=P2^3;//PWM 通道 4,反转脉冲
sbit PWM5=P2^4;//PWM 通道 5,正转脉冲
sbit PWM6=P2^5;//PWM 通道 6,反转脉冲
sbit PWM7=P2^6;//PWM 通道 7,正转脉冲
sbit PWM8=P2^7;//PWM 通道 8,反转脉冲
sbit key_turn=P1^1; //电机换向
sbit key_add=P1^2;//电机加速
sbit key_dec=P1^3;//电机减速
/************函数声明**************/
void delayxms(uint z);
void Motor_turn(void);
void Motor_add();
void Motor_dec();
void timer0_init(void);
/*********主函数********************/
void main(void)
{
timer0_init();
while(1)
{
Motor_turn();
Motor_add();
Motor_dec();
}
}
/****************延时处理**********************/ void delayxms(uint z)//延时xms 程序
{
uint x,y;
for(y=z;x>0;x--)
for(y=110;y>0;y--);
}
/************电机正反向控制**************/ void Motor_turn(void)
{
if(key_turn==0)
{
delayxms(2);
if(key_turn==0)
{
flag=~flag;
}
while(!key_turn);
}
}
void Motor_add()//电机加速
{
if(key_add==0)
{
delayxms(2);
if(key_add==0)
{
}
count+=5; if(count>=100) { } count=0; } while(!key_add); }
void Motor_dec()//电机减速
{
}
/***********定时器0 初始化***********/
void timer0_init(void)
{
TMOD=0x01; //定时器0 工作于方式1
TH0=(65536-10)/256;
TL0=(65536-10)%256;
if(key_dec==0) { delayxms(2); if(key_dec==0) { count-=5; if(count>=100) { } count=0; } while(!key_dec); }
TR0=1;
ET0=1;
EA=1;
}
/**************定时0 中断处理******************/ void timer0_int(void) interrupt 1
{
TR0=0;//设置定时器初值期间,关闭定时器
TH0=(65536-10)/256;
TL0=(65536-10)%256;
TR0=1;
if(flag==1)//电机正转
{
PWM1=1;
time++;
if(time
{
PWM2=0;
}
else
PWM2=1;
if(time>=100)
{
time=0;
}
}
else //电机反转
{
PWM2=1;
time++;
if(time
{
PWM1=0;
}
else
PWM1=1;
if(time>=100)
{
time=0;
}
}
if(flag==1)//电机正转
{
PWM3=1;
time++;
if(time
{
PWM4=0;
}
else
PWM4=1;
if(time>=100)
{
time=0;
}
}
else //电机反转
{
PWM4=1;
time++;
if(time
{
PWM3=0;
}
else
PWM3=1;
if(time>=100)
{
time=0;
}
}
if(flag==1)//电机正转
{
PWM5=1;
time++;
if(time
{
PWM6=0;
}
else
PWM6=1;
if(time>=100)
{
time=0;
}
}
else //电机反转
{
PWM6=1;
time++;
if(time
{
PWM5=0;
}
else
PWM5=1;
if(time>=100)
{
time=0;
}
}
if(flag==1)//电机正转
{
PWM7=1;
time++;
if(time
{
PWM8=0;
}
else
PWM8=1;
if(time>=100)
{
time=0;
}
}
else //电机反转
{
PWM8=1;
time++;
if(time
{
PWM7=0;
}
else
PWM7=1;
if(time>=100)
{
time=0;
}
}
}
1.2循迹程序
#include
#define uchar unsigned char
#define uint unsigned int
uchar pro_left,pro_right,i,j;
sbit in1=P2^0;
sbit in2=P2^1;
sbit in3=P2^2;
sbit in4=P2^3;
sbit in5=P2^4;
sbit in6=P2^5;
sbit in7=P2^6;
sbit in8=P2^7;
sbit en1=P1^0;
sbit en2=P1^1;
sbit left_red=P1^2;
sbit right_red=P1^3;
sbit mid_red=P1^4;
void delay(uint z)
{
uchar i;
while(z--)
{ for(i=0;i
}
void init()
{
left_red=0;//白线
mid_red=1;//黑线
right_red=0;
TMOD=0X01;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
EA=1;
ET0=1;
TR0=1;
en1=1;
en2=1;
}
void time0(void)interrupt 1
{
i++;
j++;
if(i
else en1=0;
if(i==40){en1=~en1;i=0;}
if(j
else en2=0;
if(j==40){en2=~en2;j=0;}
TH0=(65536-100)/256;
TL0=(65536-100)%256;
}
void straight()//直走
{
pro_right=29;
pro_left=29;
in1=1;
in2=0;
in3=1;
in4=0;
in5=1;
in6=0;
in7=1;
in8=0;
}
void turn_left()//左转
{
pro_right=5;
pro_left=29;
left1=0;
left2=1;
right1=1;
right2=0;
}
void turn_right()//右转
{
pro_right=29;
pro_left=5;
left1=0;
left2=1;
right1=1;
right2=0;
}
void turn_back()//后退
{
left1=1;
left2=0;
right1=0;
right2=1;
pro_right=29;
pro_left=29;
}
void infrared()//循迹
{
uchar flag;
if(left_red==1)
{flag=1;}
else
if(right_red==1)
{flag=2;}
else
if((left_red==0)&(mid_red==0)&(right_red==0))
{flag=3;}
else flag=0;
switch(flag)
{
case0:straight();
break;
case1:turn_left();
break;
case2:turn_right();
break;
case3:turn_back();
break;
default:
break;
}
}
void main(void)
{
init();
delay(1);
while(1)
{
infrared();
//straight();
}
}
void int0(void)interrupt 0{
}
1.3避障程序
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit TRIG = P3^6 ;
sbit ECHO = P3^7 ;
sbit pwm = P0^0; //PWM信号输出口
sbit in1 = P2^0; //左1
sbit in2 = P2^1;
sbit in3 = P2^2; //左2
sbit in4 = P2^3;
sbit in5 = P2^4; //右1
sbit in6 = P2^5;
sbit in7 = P2^6; //右2
sbit in8 = P2^7;
uchar n,count,angle,left,right; //距离标志位,0.5ms次数,角度标识 float S; //距离变量
void DelayUs2x(uchar t)
{
while(--t);
}
void DelayMs(uchar t)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
void go ()
{
in1=1;
in2=0;
in3=1;
in4=0;
in5=1;
in6=0;
in7=1;
in8=0;
}
void back ()
{
in1=0;
in2=1;
in3=0;
in4=1;
in5=0;
in6=1;
in7=0;
in8=1;
}
void turnleft ()
{
in1=0;
in2=1;
in3=0;
in4=1;
in5=1;
in6=0;
in7=1;
in8=0;
}
void turnright ()
{
in1=1;
in2=0;
in3=1;
in4=0;
in5=0;
in6=1;
in7=0;
in8=1;
}
void stop()
{
in1=0;
in2=0;
in3=0;
in4=0;
in5=0;
in6=0;
in7=0;
in8=0.0000;
}
/*------------------------------------------------
定时器0初始化
------------------------------------------------*/
void TIM0init(void)
{
TMOD|= 0x11;//定时器1工作方式1 (超声波) 定时器0舵机 TH1=0x00;
TL1=0x00;
TH0=0xff;
TL0=0xa3; //11.0592MHz晶振,0.5ms
ET1=1;
ET0=1;
EA=1;
TR0=1; //定时器开始
IE=0x82;
}
void chaoshengbo ()
{
TRIG=1; //触发信号是高电平脉冲,宽度大于10us
DelayUs2x(10);
TRIG=0;
while(!ECHO); //等待高电平
TR1=1;
while(ECHO); //等待低电平
TR1=0;
S=TH1*256+TL1;//取出定时器值高8位和低8位合并
S=S/58; //为什么除以58等于厘米, Y米=(X秒*344)/2
// X秒=( 2*Y米)/344 -> X秒=0.0058*Y米 -> 厘米=微秒/58
if(S>=25)
{n=1;}
if(S
{n=0;}
TH1=0;
TL1=0; //清除定时器0寄存器中的值
}
/*------------------------------------------------
主函数
------------------------------------------------*/
main()
{
angle=12;
count=0;
TIM0init(); //初始化定时器
while(1)
{
chaoshengbo();
DelayMs(20);
if(n==1)
{go();}
if (n==0)
{
stop();
n=1;
angle=5;
count=0;
DelayMs(400);
chaoshengbo();
DelayMs(20);
right=n;
n=1;
angle=12;
count=0;
DelayMs(400);
angle=19;
count=0;
DelayMs(400);
chaoshengbo();
DelayMs(20);
left=n;
angle=12;
count=0;
DelayMs(400);
n=1;
if(right==1)
{
turnright();
DelayMs(450);
}
else if(right==0&&left==1)
{
turnleft();
DelayMs(450);
}
else
{
back();
DelayMs(500);
turnleft();
DelayMs(1000);
}
}
}
}
/*------------------------------------------------
定时器中断子程序
------------------------------------------------*/
void Time0_0(void) interrupt 3
{
ECHO=0;
}
void Time1_Int() interrupt 1
{
TH0=0xff;
TL0=0xa3;
if(count
pwm=1; //确实小于,pwm输出高电平 else
20ms
}
pwm=0; count=(count+1); count=count%40; //大于则输出低电平 //0.5ms次数加1 //次数始终保持为40即保持周期为
附录2 电路原理图
附录2.1 最小系统原理图
附录2.2 L298N原理图
附录2.3 红外传感器原理图
附录2.4
超声波模块原理图
附录3 PCB图
附录3.1 PCB图
附录4 硬件电路板图
附录4.1 硬件电路板