智能小车设计报告魏旭峰、孔凡明、陈梦洋(河北科技大学电气信息学院)摘要:AT89S52单片机是一款八位单片机,他的易用性和多功能性受到了广大使用者的好评。该设计是结合科研项目而确定的设计类课题。本系统以设计题目的要求为目的,采用89S52单片机为控制核心,利用红外线传感器检测道路上的黑线,控制电动小汽车的自动寻路,快慢速行驶。整个系统的电路结构简单,可靠性能高。实验测试结果满足要求,本文着重介绍了该系统的硬件设计方法及测试结果分析。采用的技术主要有:通过编程来控制小车的速度及方向;传感器的有效应用;1602液晶显示的应用;关键词:89S52单片机、光电检测器、PWM调速、电动小车第一章方案设计与论证一供电系统二光电检测系统三单片机最小应用系统设计四液晶显示1602的应用五电机驱动第二章软件设计第二章方案设计与论证根据要求,小车应在规定的赛道上行驶,赛道中央黑线宽为25MM,确定如下方案:在现有玩具电动车的基础上,加装光电检测器,实现对电动车的位置的实时测量,并将测量数据传送至单片机进行处理,然后由单片机根据所检测的各种数据实现对电动车的转向和速度的智能控制.这种方案能实现对电动车的运动状态进行实时控制,控制灵活、可靠,精度高,可满足对系统的各项要求。一供电系统本模块使用LM2940芯片输出+5V的电压,为89S52单片机光电检测电路供电,采用LM1117可控变压芯片输出+6V电压为舵机供电.而电机则由单片机来控制,当单片机输出的电压不同时,电机的转速不同,以此来达到控制小车速度的目的.电路如图:二光电检测系统本模块采用七对红外线发射和接收对管,来检测小车前方黑线位置和模拟车站停车位置.发射管发射管出红外线,当对管正下方为白色跑道时,发射管发射出去的红外线会被反射回来,接收因接收到红外线而导通,两端电压为零,当对管正下方为黑色线时,黑线将吸收红外线,接收管因接收不到红外线而无法导通,两端电压为+4V左右,将接收管端电压与一个给定电压经LM324比较后输出0和+5V两固定个值,当对管正下方为白色时输出+5V电压,当对管正下方为黑线时输出0V,输出的电压交给单片机,以此来确定黑线的位置.电路如图:三单片机最小应用系统设计89S52单片机是本系统的核心所在,自动寻迹和调速都是它控制,七对光电对管经比较器输出的电压输入单片机,单片机根据电压的高低来判断黑线位置,进而调整速度和方向,电路如下:四舵机的应用舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。目前在高档遥控玩具,如航模,包括飞机模型,潜艇模型;遥控机器人中已经使用得比较普遍。舵机是一种俗称,其实是一种伺服马达。其工作原理是:单片机放的控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。五电机驱动电机驱动电路是根据单片机的控制型号来控制电机的转动的,电路如下:第二章软件设计#includereg52.hsbitmoto=P2^0;//舵机位定义sbitin1=P2^1;////电机位定义sbitin2=P2^2;////电机位定义sbitL1=P1^7;////光电管位定义sbitL2=P1^1;sbitL3=P1^2;sbitL4=P1^3;sbitL5=P1^4;sbitL6=P1^5;sbitL7=P1^6;#defineucharunsignedchar//宏定义ucharduoj,dianj,time0=0,time1=0,L=0,e=30;voidtimer0()interrupt1//定时器零控制舵机{time0++;if(time0==duoj)moto=0;if(time0==80){time0=0;moto=1;}TH0=(65536-313)/256;TL0=(65536-313)%256;}voidtimer1()interrupt3///定时器一控制电机{time1++;if(time1==dianj)in1=1;if(time1==80){time1=0;in1=0;}TH1=(65536-340)/256;TL1=(65536-340)%256;}voidmain()/////主函数开始{TMOD=0x11;TH0=(65536-313)/256;TL0=(65536-313)%256;TH1=(65536-340)/256;TL1=(65536-340)%256;EA=1;ET0=1;ET1=1;in1=0;moto=1;TR0=1;TR1=1;while(1)//////检测黑线位置{while(1){if(P1==0xff){duoj=8;dianj=55;break;}//全白时缓进if(L1==0){duoj=10;dianj=37;L=1;break;}//L1if(L7==0){duoj=6;dianj=37;L=7;break;}//L7if(L2==0){duoj=10;dianj=22;L=2;break;}//L2if(L6==0){duoj=6;dianj=22;L=6;break;}//L6if(L3==0){duoj=9;dianj=27;L=3;break;}//L3if(L5==0){duoj=7;dianj=27;L=5;break;}//L5if(L4==0){duoj=8;dianj=70;L=4;break;}//l4//else{duoj=8;dianj=17;break;}}while(P1==0xff)当检测不到信号时保持最后的状态{switch(L){case1:duoj=10;dianj=39;break;case2:duoj=10;dianj=22;break;//case3:duoj=9;dianj=25;break;//case4:duoj=8;dianj=70;break;//case5:duoj=7;dianj=25;break;case6:duoj=6;dianj=22;break;case7:duoj=6;dianj=39;break;}}}}////////主函数结束