第13章智能电动车智能电动车近年来全国和一些省级大学生电子设计大赛中,经常出现关于智能小车的题目,例如智能寻迹小车、智能取水小车、小车搬运木块等题目,以及高档次的飞思卡尔智能小车比赛,引起了众多爱好者的广泛关注和兴趣。这些设计对单片机的学习和应用都有很大的帮助,因此有必要利用小车这一平台做一个综合的设计实例,提高单片机的综合应用能力。13.1技术要求•设计并制作一个简易智能电动车,其行驶路线示意图如图13-1所示:图13-1小车行驶路线示意图1)电动车从起跑线出发(车体不得超过起跑线),沿引导线到达B点。在“直道区”铺设的白纸下沿引导线埋有1~3块宽度为15cm、长度不等的薄铁片。电动车检测到薄铁片时,需立即发出声光指示信息,并实时存储、显示在“直道区”检测到的薄铁片数。2)电动车到达B点以后进入“弯道区”,沿圆弧引导线到达C点(也可脱离圆弧引导线到达C点)。C点下埋有边长为15cm的正方形薄铁片,要求电动车到达C点检测到薄铁片后在C点处停车5s,停车期间发出断续的声光信息。3)电动车在光源的引导下,通过障碍区进入停车区并达到车库。电动车必须在两个障碍物之间通过且不得与其接触。4)电动车完成上述任务后应立即停车,但全程行驶时间不能大于90s,行驶时间达到90s时必须立即自动停车。13.2设计原理•智能小车控制系统同样采用STC89C52单片机作为控制核心,根据传感器采集到的信号,控制小车的行进和转向。为了实现设计要求系统可分为寻迹检测、金属片探测、躲避障碍、光源检测和电机控制等功能模块,系统原理框图如图13-2所示:•图13-2智能小车系统原理框图小车启动后,首先利用红外对管传感器对黑色引导线进行检测,并将检测信号送入单片机进行判断和处理,驱动左轮和右轮电机以达到控制小车行进方向的目的。当地下有金属时,金属探测器发出一个低电平信号送入单片机,并利用数码管进行计数。沿引导线到达C点后,停车5s,并发出断续的声光信号。当小车再次启动时,利用激光传感器对障碍物进行检测,根据检测结果,驱动电机使小车绕过障碍物,并利用光敏电传感器接收光源信号,控制小车准确进入车库并停车,完成预定任务。13.3硬件电路设计•系统硬件电路由STC89C52最小系统、各传感器检测电路、电机驱动电路、计数和声光指示电路组成。其中STC89C52最小系统在前面的章节中已做了详细介绍,这里不再赘述。13.3.1传感器检测电路1.红外寻迹电路寻迹检测电路采用红外对管传感器RPR220检测黑线,它由红外发光二极管和光敏三极管组成,具体电路如图13-3所示。红外发光二极管发出红外光,当红外光照射到黑线时,被黑线吸收,不能反射到光敏三极管上,光敏三极管处于截止状态,电阻R4中没有电流,LM324的2脚电压为0V,3脚电压通过电位器R5分压后得到,一定大于0V。由于LM324工作在开环比较状态,经过比较,LM324输出端为高电平;当红外光照射到白线时,会反射到光敏三极管上,光敏三极管导通,R4中有电流通过,两端产生电压,这样LM324的2脚电压将大于3脚电压,LM324输出低电平。小车上装有三个同样的红外寻迹电路,分别装在小车底部中间和左右两侧,与单片机的P32、P33、P36脚连接。当中间的寻迹电路输出高电平时,小车继续行进;当如果右边的寻迹电路输出为高电平,则小车右转在前进;当左边的寻迹电路输出为高电平时,则小车左转在前进。图13-3红外寻迹电路2.金属探测电路金属探测电路采用三个开关型霍尔传感器UGN3040,分别与单片机P15、P16、P35脚连接,当检测到有磁性金属片时,其输出端输出低电平,否则输出高电平。将检测信号送入单片机进行计数,并利用数码管显示出来。金属探测电路如图13-4所示。3.红外避障电路避障电路采用脉冲调制红外发射—接收器。为了使小车能够顺利通过障碍区,在车头安装3个红外避障电路,分别于单片机的P12、P13、P14脚连接。当右左边的避障电路探测到障碍物时,就向单片机发出信号,控制小车左转;当左边避障电路探测到障碍物时,发出另一信号,控制小车右转。为防止三个红外探测器相互干扰,设计采用不同频率对红外信号进行脉冲调制。电路图如图13-5所示。•当D4发出的红外光遇到障碍物被反射回来,反射信号由D5接收,经LM358放大电路放大送入LM567进行鉴别,若频率与调制频率相等,则在LM567的输出端输出低电平;若频率不等,则输出高电平。单片机通过检测输出脚电平就可以判断是否有障碍物。•设计中采用LM567芯片的6脚的振荡方波作为调制脉冲。LM567的频率捕捉范围为:•电路中瓷片电容C10为0.001uF,电位器R24为100K,可以通过电位器调节不同的频率,使三个红外发射接收器不产生相互干扰。4.光源检测电路采用光敏电阻作为光源检测器件,电路如图13-6所示。光敏电阻在光照的条件下电阻值很小,与光照强度成反比。没有检测到光源时,光敏电阻值比较大,调节电位器使得电路输出为低电平,LED灯亮;当检测到光源时,光敏电阻值很小,电路输出高电平,LED灯灭。小车上装有3个相同的光源检测电路,位于小车的中间和左右两端,与单片机的P04、P05、P06脚连接。当中间的光敏电阻检测到光源时,小车保持继续前行;当左边的光敏电阻检测到光源时,小车向左行进;当右边的光敏电阻检测到光源时,小车向右行进。图13-6光源检测电路13.3.2电机驱动电路设计采用2个直流电机完成小车的行进动作,驱动电路如图13-7所示。驱动电路采用L293芯片与单片机的P30、P00、P01、P31、P02、P03引脚连接,其中P30、P00、P01用于控制接在L293的3脚和6脚上的电动机A;P31、P02、P03用于控制接在L293的11脚和14脚上的电动机B。L293芯片的1脚(ENA)和9脚(ENB)为使能端,即只有它们为高电平时,单片机才能控制电机正反转,控制小车行进。L293输入电平控制信号和电机工作状态的关系如表13-1所示。表13-1L293输入输出逻辑关系ENA(B)IN1(IN3)IN2(IN4)电机运行状况HHL正转HLH反转HIN1与IN2电平相同IN3与IN4电平相同快速停止LXX停止13.3.3声光指示电路声光指示电路用于小车检测到金属片时进行提示。在直道区检测到金属片时,单片机P10脚输出高电平,点亮发光二极管,蜂鸣器发出鸣叫。当小车到达C点时,P10、P11脚输出高低电平脉冲,使电路发出断续的声光指示信息,电路如图13-8所示。13.3.4计数电路计数电路采用一个数码管与单片机P2口相连,用来显示检测到的金属片数,电路图如图13-9所示。13.4软件设计•在软件程序设计过程中,根据各检测电路的输出信号来调用相应的中断程序,以实现对小车动作的控制,最终控制小车准确进入车库并停车,完成设计要求。13.4.1程序流程图系统初始化后,小车向前行进,利用红外对管对地面黑线进行寻迹,同时计时器开始计时。根据P3.2和P3.3脚信号的变化进行中断,控制小车按黑线行进。当检测到有金属片时,P35脚中断,计数器加1;当遇到障碍物时,小车根据P12、P13、P14脚的电平,控制小车转向,避开障碍物,开始寻找光源,按光源的指引进入车库。若90s内小车没有进入车库,定时器0中断,小车停止。程序流程图如图13-10所示。开始小车向前跑探测金属片探测诱导光源计时器开始计时探测障碍物金属片加一寻光源行走到90s了吗?避障行驶实时显示停车NYNYYNNY检测到光源?检测到金属片?检测到障碍物?初始化/start小车向前跑图13-10程序流程图13.4.2源程序/*******************************头文件**********************************/#includereg52.h#includeintrins.h/*******************************宏定义***********************************/#defineucharunsignedchar#defineuintunsignedint/*******************************端口定义*********************************/sbitENA=P3^0;//左边发动机使能端sbitENB=P3^1;//右边发动机使能端sbitIN1=P0^0;sbitIN2=P0^1;sbitIN3=P0^2;sbitIN4=P0^3;sbitYOU=P3^3;//右转(右边的红外传感器)sbitZUO=P3^2;//左转(左边的红外传感器)sbitQIAN=P3^6;//前进(中间的红外传感器)sbitJYOU=P1^2;//右边的激光传感器sbitJZUO=P1^3;//左边的激光传感器sbitJQIAN=P1^4;//前面的激光传感器sbitTPSLZUO=P1^5;//左边的霍尔传感器sbitTPSLYOU=P1^6;//右边的霍尔传感器sbitTPSLQIAN=P3^5;//前面的霍尔传感器sbitGDKGQIAN=P0^4;//前面的光电开关sbitGDKGYOU=P0^5;//右面的光电开关sbitGDKGZUO=P0^6;//左面的光电开关sbitXiaoDeng=P1^0;//小灯sbitBEEP=P1^1;//蜂鸣器uchartemp1;ucharcodeTable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};/********************************主函数***********************************/voidmain(){Init();while(1){Bizhang(Tpsl);guangyuan(Tpsl);ruku();display(Tpsl);}}/*******************************初始化函数********************************/voidInit(){IP=0X0A;//设置定时器T0,T1的优先级TH1=0XFF;//定时器T1做为中断使用TL1=0XFF;TMOD=0X11;TH0=(65536-50000)/256;TL0=(65536-50000)%256;ET0=1;ET1=1;TR1=1;IT0=1;EX0=1;IT1=1;EX1=1;EA=1;//打开总中断}/******************************外部中断0函数*****************************/voidex0(void)interrupt0using0{while(ZUO==0)//P0=0B00000100;//向左转P0=0X04;//向左转while(QIAN==0)//P0=0B00000101;//前进P0=0X05;//前进}/*****************************外部中断1函数******************************/voidex1(void)interrupt1using1{while(YOU==0)//P0=0B00000001;//向右转P0=0X01;//向右转while(QIAN==0)//P0=0B00000101;//前进P0=0X05;//前进}/*****************************定时器0中断子函数**************************/voidtimer0(){ucharj;if((TPSLZUO)|(TPSLQIAN)|(TPSLYOU)==0){if(j1800){j++;TH0=(65536-50000)/256;TL0=(65536-50000)%256;}elseP0=0X00;//小车停止}}/***********************************