基于51单片机的自动往返小车Word格式.docx
《基于51单片机的自动往返小车Word格式.docx》由会员分享,可在线阅读,更多相关《基于51单片机的自动往返小车Word格式.docx(16页珍藏版)》请在冰豆网上搜索。
通过单片机内部定数器/计数器进行定时、计数,在用单片机串行输入/输出口进行显示控制。
此方案电路成熟、工作稳定、容易实现控制。
1.光电检测部分:
我们采用反射式光电检测电路对跑道上的黑线进行检测,并用两个遮光套管套住发光管和接收管以一定的角度紧贴跑道,这样可以消除外界光线的干扰,用
LM358电压比较器输出高低电平检测信号。
如图所示:
2.STC89C52单片机基本系统
此系统以89C52为核心,每检测到一个黑带由光电检测部分产生一个的脉冲,使单片机产生一个外部中断1,定义检测黑带数的变量加1,同时车轮每转一圈,霍尔元件输出一个脉冲,是安单片机产生一个外部中断0,定义圈数的变量加1.
通过P1.0和P1.1控制L298来控制电机的正转与反转及刹车。
当P1.0输出低电平,P1.1输出高电平时,电机正转,相反则电机反转,当P1.0和P1.1都是低电平时,使电动机被短路,提高了刹车效率,基本杜绝了由于制动惯性造成的小车的前冲现象。
通过P0口进行两个数码管的位选,P2口进行段码输出,其中一个数码管显示行驶时间,另外一个数码管显示行驶路程。
3.L298N电动机驱动模块部分
该电路采用电动机驱动芯片L298来控制电动机的正转与反转,加以第二路电机电源保证了电动机启动时有足够的电流。
在试验中控制电压为单片机输出的高低电平直接控制。
具体电路图连接如下:
4.电源部分由于电动机工作电流大,需要选用内阻小,供电电流强,质量轻,可反复使用的经济型电池,我们选用可充电电池组。
为使单片机工作稳定,避免电动机开关机和其转动时对其电源的影响,在此用两个电池组和稳压块7805分别为89C52和电动机驱动显示部分分别进行供电。
保证小车工作和显示的稳定性。
5.软件设计部分
单片机控制电路主要由一片STC89C52组成,通过P3口控制小车正转与反转,刹车,加速减速,通过两个四联数码管控制显示时间和里程以及小车行驶的时间。
其中P0口进行位选,P2口进行显示段码输出。
该系统采用上电复位加上手动复位联合复位系统进行初始化,单片机通过
P1.0,P1.1输出脉冲控制电机正转反转以及刹车,当P1.0,P1.1分别输出01是电动机正转,输出10时电动机反转,输出00时电动机两边短路,小车立即刹车。
流程图如下:
(1)外部中断0车轮美转一次,霍尔元件产生一个脉冲P3.3,通过下降沿触发外部中断0,并且在每进行一次外部中断记录圈数的变量加1.
(2)外中断1光电检测每检测到一条黑带就产生一个脉冲输入P3.2口,通过下降沿的方式触发外中断1,每中断一次记录黑带的变量加1,当检测到第六条黑带时,p1.0=1,p1.1=1,小车的电动机由于短路刹车,当检测到第十二条黑带时,小车再次刹车同时关掉所有中断
退出
(3)定时器中断0使用定时器T0产生5ms定时中断,每次执行该中断前要先给定时器0赋初值,定时器中断每执行一次,变量加1。
当i=200时,即每当计时1秒时,时间变量t加1,速度等于一秒转的圈数和小车车轮的周长相乘。
(4)定时器中断1主要用来产生不同的占空比的波型进行高低速控制,每次执行时,定时器1要赋初值。
(5)主程序主程序主要用来控制两个四联数码管的显示,通过循环语句不断的调用显示程序,使两个四联数码管按位不断循环亮点,当小车行驶时动态显示时间和路程,小车停止时显示小车行驶过程中的时间和路程。
6.安装与调试自动小车为玩具遥控小汽车的改装品,在改装的过程中最重要的是考虑设计光电检测管的位置,检测黑带的光电管放在车体的中央,用遮光管将其以一定反射角度压到跑道上。
路程检测用槽型光耦,放在小车的从动轮上。
轮子的周长约为21.6厘米,在轮子上用了一个霍尔元件,每转一圈一个脉冲。
在组装前对每一个单元电路进行测试,以保证外部硬件电路的无误,有利于最后的统调。
调整是以点到线,最后到整体调试的方法。
在调整的过程中我们发现了许多问题,如响应中断的次数的调整等。
并且为了小车碰到墙壁不至于停车,我们在小车的四角上都加上了导向轮,导向轮用随身听的压带轮制作即可。
7.附录元器件及程序如下:
基本元器件列表
一个STC89C52单片机
2个四位共阳数码管一个L298N芯片一个霍尔元件和小磁钢片一路循迹模块晶振(12M)及30pf电容开关
电阻10k100欧姆1k20k可调
ge=x%10;
shi=(x%100)/10;
bai=(x%1000)/100;
qian=x/1000;
}
voidshuma(ucharx,uchary)
{
P0=wema[8];
P2=duma[x];
P0=wema[y];
delay(5);
voidshumadian(ucharx,uchary)
P2=dianduma[x];
voidmiaoxianshi(uintx)
fenwei(x);
shuma(ge,3);
shuma(shi,2);
shumadian(bai,1);
shuma(qian,0);
voidlcxs(uintz)
fenwei(z);
shuma(ge,7);
shuma(shi,6);
shumadian(bai,5);
shuma(qian,4);
voiddjkz()
ucharn=20,m=60;
switch(heidai)
//将需要显示的数据显示在数码管上
//将定时器0输出的时间显示在数码管上
//将外部中断1输出的路程显示在数码
//控制电机运转
case0:
case1:
case2:
dianji1=1;
dianji2=0;
miaoxianshi(miao);
lcxs(lc);
break;
case3:
while(m--)
delay(70);
dianji1=0;
delay(30);
while(heidai==3)
delay(13);
delay
(1);
}break;
case4:
while(heidai==4)
delay(25);
case5:
case6:
while(n--)
dianji2=0;
delay(50);
dianji1=0;
dianji2=1;
delay10s();
while(heidai==6){
case7:
case8:
case9:
dianji2=1;
}while(heidai==7)
delay(90);
delay
(1);
case10:
case11:
case12:
while(n--){
TR0=0;
while
(1)
miaoxianshi(miao);
lcxs(lc);
default:
break;
voiddelay(ucharx)
uchari,j;
for(i=x;
i>
0;
i--)
for(j=50;
j>
j--);
voiddelay10s()
uinti,j;
for(i=15;
i--)for(j=123;
j--)
{miaoxianshi(miao);
voidext0()interrupt0
delay(50);
if(hdjc==0)
heidai++;
voidtime0()interrupt1
TH0=(65536-500)/256;
TL0=(65536-500)%256;
num++;
if(num==20)
num=0;
miao++;
voidext1()interrupt2
qs++;
lc=(int)(qs*38.5);
voidmain()
EA=1;
ET0=1;
EX0=1;
IT0=1;
//延时
//延时十秒钟
//外部中断0,用来检测黑带
//函数功能:
定时器中断0,用来记录时间
外部中断1,记录车轮转过的圈数
//打开总中断
//打开定时器中断0
//打开外部中断1
//外部中断0设置为跳变沿触发方式
//外部中断1设置为跳变沿触发方式
//设置定时器0为方式1
//定时器0高八位装初值
//定时器0低八位装初值
//打开定时器0
//进入主循环
//进入电机控制函数
EX1=1;
IT1=1;
TMOD=0x01;
TL0=(65536-500)%256;
TR0=1;
djkz();