智能循迹避障小车完整程序亲测好使.docx
《智能循迹避障小车完整程序亲测好使.docx》由会员分享,可在线阅读,更多相关《智能循迹避障小车完整程序亲测好使.docx(7页珍藏版)》请在冰豆网上搜索。
智能循迹避障小车完整程序亲测好使
/V^X
^yx^Tx^7^^|>
//利用51定时器产生PWM波来调节电机速度
//速度变化范围从0-100可调
//使用三路做寻迹使用,哪一路检测在黑线哪一路为
//高电平
〃没检测到黑线表示有反射对应输出低电平信号
K^f
^T>^7^
#include
#defineuintunsignedint
#defineucharunsignedchar
/*电机四个接口定义*/
sbitini二P0"0;
sbitin2二P(T1;
sbitin3二P0"2;
sbitin4二P0"3;
/*计时器*/
ucharj,k,i,a,Al,A2,second,minge,minshi;
sbitdula=P2^6;
sbitwela=P2^7;
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
ucharcodetable2[]={0xbf,0x86,Oxdb,Oxcf,
0xe6,Oxed,Oxfd,0x87,
Oxff,Oxef,0xf7,Oxfc,
0xb9,Oxde,0xf9,Oxfl};
voiddelay(uchari)
{
for(j=i;j>0;j—)
for(k=110;k>0;k—);
}
voiddisplay(ucharsh_c,ucharg_c,ucharmin_ge,ucharmin_shi){
dula=l;
Portable[sh_c];
dula=0;
PO二Oxff;
wela=l;
PO二Oxfb;
wela=0;
delay(5);
dula=l;
Portable[g_c];
dula=O;
PO二Oxff;
wela=l;
PO二Oxf7;
wela=0;
delay(5);
dula=l;
Portable[min_shi];
dula=0;
PO二Oxff;
wela=l;
P0=0xfe;
wela=0;
delay(5);
dula=l;
P0=table2[min_ge];
dula=0;
PO二Oxff;
wela=l;
PO二Oxfd;
wela=0;
delay(5);
/*左、中、右三路循迹传感器接口定义*/sbitzuo二P1"O;
sbitzhong二Pl"1;
sbityou二Pl"2;
/*避障接口定义*/
sbitbz_zuo二P3/3;
sbitbz_zhong二P3/4;
sbitbz_you二P3/5;
ucharcount二0;
/*利用定时器0定时中断,产生PWM波*/
voidInit_timer()
{
THO=(65535-10)/256;
TLO=(65535-10)%256;
TMOD=0x01;
TRO二1;
ETO二1;
EA=1;
}
/*左轮速度调节程序*/
voidzuolun(ucharspeed)
辻(count<=speed)//count计数变量
ini=1;
in2=0;
}
else
{
ini=0;
in2=1;
}
//同上
}
voidyoulun(ucharspeed)
{
if(count<=speed)
{
in3=1;
in4=0;
}
else
in3二0;
in4=1;
}
voidInline()//检测黑线信号
{
uchartemp;
temp=P1;
switch(temp)
{
case0x01:
zuolun(0);youlun(90);break;//左侧循迹传感器压线,小车向左前修正
case0x02:
zuolun(100);youlun(100);break;//中间循迹传感器压线,保持直走此处两值使电机速度保持相同
case0x04:
zuolun(90);youlun(O);break;//右侧循迹传感器压线,小车向右前修正
case0x08:
zuolun(90);youlun(0);break;//左侧避障传感器有
信号小车右转
case0x10:
zuolun(90);youlun(0);break;//中间避障传感器有信号小车左转
case0x20:
zuolun(90);youlun(0);break;//右侧避障传感器有信号小车左转
/*
if(zuo==l)
zuolun(lO);
youlun(50);
}
elseif(zhong==l)
{
zuolun(99);
youlun(99);
}
elseif(you==l)
{
zuolun(50);
youlun(lO);
}*/
}
voidmain()//主函数
{
Init_timer();〃调用函数
while
(1)
Inline();
minge=O;
minshi=O;
second++;
if(second==60)
second二0,minge++;
Al=second/10;
A2=second%10;
if(minge==10)
minge=0,minshi++;
for(a=200;a>0;a--)
{
display(Al,A2,minge,minshi);
};
}
}
voidTimerO_int()interrupt1〃定时器中断计数
{
THO=(65535-10)/256;
TLO=(65535-10)%256;
count++;
if(count>=100)
count=0
}
}