《课程设计(论文)基于89S52单片机控制的小车循迹系统.doc》由会员分享,可在线阅读,更多相关《课程设计(论文)基于89S52单片机控制的小车循迹系统.doc(19页珍藏版)》请在三一办公上搜索。
1、目录摘要21 设计要求32 方案的选择与比较32.1 主控芯片选择32.2 电源的选择32.3 寻迹方案32.3 电机驱动方案43 最终方案54各功能模块的实现54.1 微控制器模块的设计54.2电源模块原理图64.3 TCRT5000红外检测模块64.4 系统PCB图74.5 系统程序流程图85 性能测试96 性能评价及总结107 附录11附录1:元件清单11附录2 系统原理图12附录3系统程序138参考文献19摘要本文研究了基于89S52单片机控制的小车循迹系统,通过光电传感器TCR5000检测路线的轨迹,将信号反馈回单片机,并通过单片机处理后,调节控制电机的PWM波使小车稳定运行在预定的
2、轨迹上。由于电机驱动使用性能优良的L298N芯片,使得电机运行速度稳定。电机采用容易控制的直流电机,通过测试小车能检测多种不同轨迹路线且运行稳定,实用性强,其所实现功能相当于简易机器人。关键词:89S51单片机TCR5000 L298 直流电机1 设计要求设计一自动寻迹小车,其实现功能如下:1. 使其能够检测到轨迹的路线,并按照预订轨迹运行;2. 要求在小车冲出预定路线后能够自动回到预定轨迹上;3. 小车能够按多种不同的轨迹运行。2 方案的选择与比较2.1 主控芯片选择方案1:采用51系列单片机,该系列单片机结构简单,但是能实现很多功能。与其它单片机相比较价格便宜。端口电流较大,可以达到20m
3、A,驱动能力强。方案2:采用msp430系列单片机,该系列单片机片上资源丰富,功能强大,但是端口灌电流和拉电流较小,驱动能力不强。它主要运用在需要低功耗的地方。本系统主要是进行寻迹运行的检测以及电机的控制,经过对比分析,我们选用AT89S52单片机作为主控芯片来驱动电机,进而控制电机转速。2.2 电源的选择方案1:采用9V蓄电池为直流电机供电,将9V电压降压、稳压后给单片机系统和其他芯片供电。蓄电池具有较强的电流驱动能力以及稳定的电压输出性能。虽然蓄电池的体积过于庞大,在小型电动车上使用极为不方便。方案2:采用9V南孚干电池直接个电机驱动芯片L298N供电,并将9V经过7805稳压及电容滤波后
4、给单片机供电。由于方案2的质量小,且电池价格便宜,实用性强,足够实现系统功能,因此我们选用方案2。2.3 寻迹方案方案1:用光敏电阻组成光敏探测器。光敏电阻的阻值可以跟随周围环境光线的变化而变化。当光线照射到白线上面时,光线发射强烈,光线照射到黑线上面时,光线发射较弱。因此光敏电阻在白线和黑线上方时,阻值会发生明显的变化。将阻值的变化值经过比较器就可以输出高低电平。但是这种方案受光照影响很大,不能够稳定的工作。方案2:红外探测法,即利用红外线在不同颜色的物体表面具有不同的反射性质的特点,在小车行驶过程中不断红外发射管发出红外线,当发出的红外线照射到白色的平面后反射,若红外接收管能接收到反射回的
5、光线则检测出白线继而输出低电平,若接收不到发射管发出的光线则检测出黑线继而输出高电平。单片机就是通过接收到的高低电平为依据来确定黑线的位置和小车的行走路线。对于发射和接收红外线的红外探头,可以自己制作或直接采用集成式红外探头。经测试,此种方法简单可靠。经反复对比后,采用方案2。2.3 电机驱动方案方案1:采用传统的功率三极管作为功率放大器的输出控制直流电机。线性型驱动的电路结构和原理简单,成本低,加速能力强,但功率损耗大,特别是低速大转距运行时,通过电阻R的电流大,发热厉害,损耗大。方案2:采用继电器对电动机的开或关进行控制,通过开关的切换对小车的速度进行调整.此方案的优点是电路较为简单,缺点
6、是继电器的响应时间慢,易损坏,寿命较短,可靠性不高。方案3:采用专用芯片L298N作为电机驱动芯片。L298N是一个具有高电压大电流的全桥驱动芯片,它相应频率高,一片L298N可以分别控制两个直流电机,而且还带有控制使能端。用该芯片作为电机驱动,操作方便,稳定性好,性能优良。且由于L298N结合单片机可实现对小车速度的精确控制。这种调速方式有调速特性优良、调整平滑、调速范围广、过载能力大,能承受频繁的负载冲击,还可以实现频繁的无级快速启动、制动和反转等优点。由于L298N具有上述优点,因此我们采用方案三,其控制直流电机原理图如图二所示。图一 L298N驱动电机3 最终方案通过前面的分析我们的可
7、以得到如下方案:1. 采用89S52单片机作为主控制器;2. 采用9V南孚电电池直接供电;3. 用TCR5000对管进行寻迹;4. L298N作为直流电机的驱动芯片。其系统框图如图二:AT89S52电源模块电机驱动模块寻迹模块图二 系统框图4各功能模块的实现4.1 微控制器模块的设计采用89S52单片机作为主控芯片,由于单片机的封装是直插式的、因此我们没有在最小系统上设计程序下载接口,直接通过单片机开发板下载程序,然后将89S52芯片安装在最小系统上,原理图如图三。图三 最小系统4.2电源模块原理图电源模块原理图如图四,通过P2接到9V电池上,由S1控制电源的通断,再通过滤波、稳压电路产生5V
8、电压给单片机供电。图四 电源模块4.3 TCRT5000红外检测模块我们设计了如图五所示的检测电路,图中R2为限流电阻,当有光反射回来时,光电传感器的三极管导通,在LM324的2脚出产生低电平电压,通过LM324处理后在P3.0出产生高电平,返回给单片机,从而达到检测的目的。并通过变阻器R3可调节传感器的灵敏度。图五 红外检测4.4 系统PCB图通过上面对各个模块的分析,我们得到整个系统的电路图,并制成PCB版,如图七所示。图七 系统PCB图4.5 系统程序流程图图六 系统程序流程图5 性能测试将电路板焊接好并安装在小车上,接上电源便得到我们需要寻迹的小车结构,寻迹小车实物图如图八所示。图八
9、寻迹小车实物图下载程序,通过不断地调试,最后得到运行稳定的小车,此外,我们还测试了多种不同轨迹的路线,如图九所示。图九 正在寻迹的小车6 性能评价及总结通过不断测试与改进,此项目能够检测多种不同轨迹的曲线,并且运行稳定,具有较强的实用价值,虽然实现的功能只是寻迹,但任何复杂的功能都是由简单的功能构成,并且程序是由C语言编写,所以可以很容易移植到较复杂的项目中。在前阶段的不断学习与实践中,我们的创新基金项目也逐渐完成,虽然我们中途遇到过很多问题,学习毕竟是一件快乐的事,为了使系统运行更加稳定,我们不断地改善硬件和软件结构,这使得我们认识到自己是在不断地成长。就是在这样的不断成长中,我们丰富自己的
10、知识,锻炼团队合作能力,为自己将来走入工作岗位打下了良好的基础。在这里我们要特别感谢我们的指导老师,他在我们的学习中给予了大量的支持和指导,使我们能顺利的完成创新基金项目。7 附录附录1:元件清单为了方便采购原件,我们将需要用到的原件列出了一张表,如表一表一:原件清单元件数量AT89S52 单片机1片小车1部发光二极管5个自锁按钮1个不带锁按钮1个12MHz晶振1个排阻10k1个TCRT50005个LM3242片LM298N1片排针若干电阻若干电容若干导线若干散热片2个10k变阻器5个40、20脚DIP座子若干7805稳压片1片杜邦线若干铜柱若干附录2 系统原理图附录3系统程序图/*实现功能:
11、右轮占空比为80%转圆,左轮占空比为60%,通过光电传感器检测小车是否在圆上,若不在则调整速度重新回到圆上。电机用PWM调制,总周期为100ms。*/#include#define uchar unsigned charsfr WDT_CONTR=0xe1; /看门狗设置uchar num;uchar PWM0=25,PWM1=50,PWM2=60; /设置占空比/*光电传感器定义*/sbit right1=P30; /最右边光电sbit right2=P31;/右边第二个光电sbit mid=P33;/中间光电sbit left2=P32;/左边第二个光电sbit left1=P34;/最左
12、边光电/*电机驱动控制定义*/sbit En2=P20; /右轮使能sbit In21=P21;sbit In22=P22;sbit En1=P23;/左轮使能sbit In11=P24;sbit In12=P25;/*延时函数ms毫秒*/void delay(uchar ms)uchar i,j;for(i=ms;i0;i-)for(j=60;j0;j-);/*电机初始化函数*/void init()En1=1;/开电机使能En2=1;In11=0;/先确定电机的低电平In12=0;In21=0;In22=0;/*电机后退函数*/void back()In11=0;/先确定电机的低电平In1
13、2=0;In21=0;In22=0;delay(100-PWM0);In11=In21=1;delay(PWM0);/*电机调整*/void turn_R0()/小车向左微偏,需向右微转In11=0;/先确定电机的低电平In12=0;In21=0;In22=0;delay(100-PWM1);In12=1;delay(PWM1);void turn_R1()/小车向左大偏,需向右大转In11=0;/先确定电机的低电平In12=0;In21=0;In22=0;delay(100-PWM2);In12=1;delay(PWM2);void turn_L0()/小车向右微偏,需向左微转In11=0;
14、/先确定电机的低电平In12=0;In21=0;In22=0;delay(100-PWM1);In22=1;delay(PWM1);void turn_L1()/小车向右大偏,需向左大转In11=0;/先确定电机的低电平In12=0;In21=0;In22=0;delay(100-PWM2);In22=1;delay(PWM2);/*discriminant()函数用于判断小车是否有偏转flag=0表示不偏转,flag=1向右微偏,flag=2向右大偏flag=-1表示向左微偏,flag=-2表示向左大偏,flag=3表示出错*/char discriminant()char flag;if(
15、mid)&right1&right2&left1&left2) /不偏转flag=0;else if (mid&right2)&right1&left1&left2)/向右微偏flag=1;else if(right1&right2)&mid&left1&left2) /向右大偏flag=2;else if(mid&left2)&right1&right2&left1)/ 向左微偏flag=-1;else if(left1&left2)&mid&right1&right2)/向左大偏flag=-2;else flag=3;/出错return flag;/*主函数*/void main()cha
16、r n; /n用于接收discriminant()的数据TMOD=0x01;/设置定时器工作方式3TH0=(65536-100)/256;/装初值,1ms产生一次中断TL0=(65536-100)%256;EA=1;/开总中断ET0=1;/开启定时器0中断TR0=1;/开启定时器0init();/ 调用电机初始化函数WDT_CONTR=0x36;while(1)n=discriminant();switch(n)case 0:break;case 1:/检测到向右微偏,向左微转ET0=0;while(n=1)n=discriminant();turn_L0();ET0=1;break;case
17、 2:/检测到向右大偏,向左大转ET0=0;while(n=2)n=discriminant();turn_L1();ET0=1;break; case -1:/检测到向左微偏,向右微转ET0=0;while(n=-1)n=discriminant();turn_R0();ET0=1;break;case -2:/检测到向左大偏,向右大转ET0=0;while(n=-2)n=discriminant();turn_R1();ET0=1;break;case 3:/检测出错,倒退ET0=0;while(n=3)n=discriminant();back();ET0=1;break;WDT_CON
18、TR=0x36;void T0_time()interrupt 1TH0=(65536-100)/256;/装初值,1ms产生一次中断TL0=(65536-100)%256;num+;init();/*设置占空比*/if(num=(100-PWM0)In12=1;In22=1;if(num=100) In12=1;In22=1;num=0;8参考文献【1】郭天祥,51单片机C语言教程 北京:电子工业出版社 2009,1【2】杨欣,王玉凤,刘湘黔,张延强,51单片机应用实例详解 北京:【3】华大学出版社 2010,5【4】何小艇,电子系统设计(第三版),浙江:浙江大学出版社,2004,6【4】谭浩强,C语言设计(第三版),北京:清华大学出版社,2005,7【5】潘新民,王燕芳,单片机微型计算机实用系统设计,1992,7【6】【7】【8】【9】【10】