基于51单片机智能小车循迹程序共18页.docx
《基于51单片机智能小车循迹程序共18页.docx》由会员分享,可在线阅读,更多相关《基于51单片机智能小车循迹程序共18页.docx(13页珍藏版)》请在冰豆网上搜索。
![基于51单片机智能小车循迹程序共18页.docx](https://file1.bdocx.com/fileroot1/2022-11/29/642e6c64-8983-4ce7-83be-6eaf0c2c80fb/642e6c64-8983-4ce7-83be-6eaf0c2c80fb1.gif)
基于51单片机智能小车循迹程序共18页
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
/**********************************/
ucharled_data[9]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80};
ucharcircle=0,cir_comp=0,cir_count=0;//设定(shèdìnɡ)圈数,实际圈数
ucharturn_count=0;
bitend=0;//圈数跑完标志(biāozhì)
/*********************************/
sbitxg0=P1^0;//左寻轨对管
sbitxg1=P1^1;//中间(zhōngjiān)寻轨对管
sbitxg2=P1^2;//右寻轨对管
sbitxz=P1^3;//感应挡板对管
/*********************************/
sbitQ_IN1=P2^0;//车前左轮控制
sbitQ_IN2=P2^1;
sbitQ_IN3=P2^2;//车前右轮控制
sbitQ_IN4=P2^3;
sbitH_IN1=P2^4;//车尾左轮控制
sbitH_IN2=P2^5;
sbitH_IN3=P2^6;//车尾(chēwěi)右轮控制
sbitH_IN4=P2^7;
sbitQ_ENA=P3^0;//车前左轮(zuǒlún)使能,PWM
sbitQ_ENB=P3^1;//车前右轮使能,
sbitH_ENA=P3^6;//车尾(chēwěi)左轮使能,
sbitH_ENB=P3^7;//车尾右轮使能,
/****************************************/
#definestra_q_l100//直线行走时,四个轮子占空比调试
#definestra_q_r100
#definestra_h_l100
#definestra_h_r100
#defineturn_q_l100//转弯时四个轮子的占空比调试
#defineturn_q_r100
#defineturn_h_l100
#defineturn_h_r100
#defineturnr_time2900//右转弯时的延时常数
#defineturnl_time3000//左转弯时的延时常数
#definedt_time5800//原地掉头时延时常数
#defineover_time1000//停止延时
#defineback_time2500//走完环形,回到直道延时转弯
#defineblack_time1500//过黑线的时间
#definecorrect_l_time700//左矫正(jiǎozhèng)时间
#definecorrect_r_time700//右矫正(jiǎozhèng)时间
#definehou_time200
/***************************************/
ucharq_duty_l,q_duty_r,h_duty_l,h_duty_r,//车前后左右轮占空比
i=0,j=0,k=0,m=0;
/**************************************/
voiddelay_cir(uintn)
{
ucharx;
while(n--)
{
for(x=0;x<250;x++);
};
}
/***********************************/
voiddelay(uintct)//延时函数(hánshù)
{
uintt;
t=ct;
while(t--);
}
/***************************************/
voidstraight()//直走
{
q_duty_l=stra_q_l;
q_duty_r=stra_q_r;
h_duty_l=stra_h_l;
h_duty_r=stra_h_r;
Q_IN1=1;
Q_IN2=0;
Q_IN3=1;
Q_IN4=0;
H_IN1=1;
H_IN2=0;
H_IN3=1;
H_IN4=0;
}
/***************************************/
voidhoutui()//后退(hòutuì)
{
q_duty_l=stra_q_l;
q_duty_r=stra_q_r;
h_duty_l=stra_h_l;
h_duty_r=stra_h_r;
Q_IN1=0;
Q_IN2=1;
Q_IN3=0;
Q_IN4=1;
H_IN1=0;
H_IN2=1;
H_IN3=0;
H_IN4=1;
}
/***************************************/
voidturn_left()//左转(zuǒzhuǎn)
{
q_duty_l=turn_q_l;
q_duty_r=turn_q_r;
h_duty_l=turn_h_l;
h_duty_r=turn_h_r;
Q_IN1=0;//左轮(zuǒlún)反转
Q_IN2=1;
H_IN1=0;
H_IN2=1;
Q_IN3=1;//右轮正转
Q_IN4=0;
H_IN3=1;
H_IN4=0;
delay(turnl_time);
}
/***********************************/
voidturn_right()//右转
{
q_duty_l=turn_q_l;
q_duty_r=turn_q_r;
h_duty_l=turn_q_l;
h_duty_r=turn_q_r;
Q_IN1=1;//左轮(zuǒlún)正转
Q_IN2=0;
H_IN1=1;
H_IN2=0;
Q_IN3=0;//右轮反转(fǎnzhuǎn)
Q_IN4=1;
H_IN3=0;
H_IN4=1;
delay(turnr_time);
}
/**************************************************/
voidturn_round()//原地(yuándì)掉头
{
q_duty_l=turn_q_l;
q_duty_r=turn_q_r;
h_duty_l=turn_h_l;
h_duty_r=turn_h_r;
Q_IN1=0;//左轮(zuǒlún)反转
Q_IN2=1;
H_IN1=0;
H_IN2=1;
Q_IN3=1;//右轮正转
Q_IN4=0;
H_IN3=1;
H_IN4=0;
delay(dt_time);
}
/******************************************************/
voidover()//小车(xiǎochē)停止
{
Q_IN1=0;
Q_IN2=0;
Q_IN3=0;
Q_IN4=0;
H_IN1=0;
H_IN2=0;
H_IN3=0;
H_IN4=0;
}
/*****************************************************/
voidcorrect_right()//左偏,向右矫正(jiǎozhèng)
{
q_duty_l=turn_q_l;
q_duty_r=turn_q_r;
h_duty_l=turn_q_l;
h_duty_r=turn_q_r;
Q_IN1=1;//左轮(zuǒlún)正转
Q_IN2=0;
H_IN1=1;
H_IN2=0;
Q_IN3=0;//右轮反转(fǎnzhuǎn)
Q_IN4=1;
H_IN3=0;
H_IN4=1;
delay(correct_r_time);
}
voidcorrect_left()//右偏,向左矫正(jiǎozhèng)
{
q_duty_l=turn_q_l;
q_duty_r=turn_q_r;
h_duty_l=turn_h_l;
h_duty_r=turn_h_r;
Q_IN1=0;//左轮(zuǒlún)反转
Q_IN2=1;
H_IN1=0;
H_IN2=1;
Q_IN3=1;//右轮正转
Q_IN4=0;
H_IN3=1;
H_IN4=0;
delay(correct_l_time);
}
/*************************************/
voidxunji()
{
if(xg1==1)
{
turn_count++;
over();
delay(over_time);
if(turn_count==1)
{straight();
delay(black_time);
}
else
if(turn_count==2)
{houtui();
delay(hou_time);
turn_left();
}
else
if(turn_count==3)
{houtui();
delay(hou_time);
turn_right();
}
else
if(turn_count==4)
{houtui();
delay(hou_time);
turn_right();
}
else
if(turn_count==5)
{straight();
delay(black_time);
}
else
if(turn_count==6)
{houtui();
delay(hou_time);
turn_right();
}
else
if(turn_count==7)
{houtui();
delay(hou_time);
turn_right();
straight();
delay(back_time);
turn_left();
}
else
if(turn_count==8)
{straight();
delay(black_time);
}
else
if(turn_count==9)
{houtui();
delay(100);
turn_round();
}
if(turn_count>=9)
{turn_count=0;
cir_count++;
circle--;
}
if(cir_count==cir_comp)
{end=1;
over();
delay(500);
}
}
else
if((xg0==0)&&(xg1==0)&&(xg2==0))
{straight();}
else
if((xg0==1)&&(xg1==0)&&(xg2==0))
{over();
delay(over_time);
houtui();
delay(hou_time);
correct_right();
}//左偏,向右矫正(jiǎozhèng)
else
if((xg0==0)&&(xg1==0)&&(xg2==1))
{over();
delay(over_time);
houtui();
delay(hou_time);
correct_left();
}//右偏,向左矫正(jiǎozhèng)
}
/***********************************************/
voidint0(void)interrupt0//中断(zhōngduàn)圈数设定
{
EX0=0;
delay_cir(250);
circle++;
cir_comp++;
if(circle>8)
{circle=0;
cir_comp=0;
}
P0=led_data[circle];
EX0=1;
}
/*************************************/
voidtime1(void)interrupt3//T1溢出中断(zhōngduàn),电机调速
{
i++;
j++;
k++;
m++;
if(iQ_ENA=1;
elseQ_ENA=0;
if(i>100)
{Q_ENA=1;i=0;}
if(jQ_ENB=1;
elseQ_ENB=0;
if(j>100)
{Q_ENB=1;j=0;}
if(kH_ENA=1;
elseH_ENA=0;
if(k>100)
{H_ENA=1;k=0;}
if(mH_ENB=1;
elseH_ENB=0;
if(m>100)
{H_ENB=1;m=0;}
P0=led_data[circle];
TH1=0XFF;
TL1=0XF6;
}
/*************************************/
voidmain()
{
P0=led_data[circle];
P1=0xFF;
P1=0XFF;//P1口做输入(shūrù)
P2=0X00;//P2口初始化,小车(xiǎochē)禁止
P3=0XFF;
TMOD=0X11;//T0,T1,工作(gōngzuò)方式1
TH1=0XFF;//T1中断一次10US
TL1=0XF6;
TR1=1;
EX0=1;
ET1=1;
EA=1;
while
(1)
{
while((xz==1)&&(end!
=1))//无挡板,扫描对管,前进
{
xunji();
};
};
}
内容总结
(1)#include
#include
#defineuintunsignedint
#defineucharunsignedchar
/**********************************/
ucharled_data[9]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80}
(2)while(n--)
{
for(x=0
(3)}
else
if(turn_count==9)
{houtui()
(4)}
if(turn_count>=9)
{turn_count=0