基于AT89C52单片机的智能小车c语言程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#define uchar unsigned char
#define uint unsigned int
uchar pro_left=35,pro_right=35,i,j; //左右占空比标志
sbit left1=P2^1;//定义端口
sbit left2=P2^0;
sbit right1=P2^3;
sbit right2=P2^2;
sbit pleft=P2^7;
sbit pright=P2^6;
sbit en1=P1^0;
sbit en2=P1^1;
//循迹口三个红外传感器
sbit left_red=P1^2; //白线位置
sbit right_red=P1^4; //白线位置
void delay(uint z)
{
uchar i;
while(z--)
{for(i=0;i<121;i++);}
}
void init()
{
left_red=0; //白线位置
right_red=0;
TMOD=0X01;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
EA=1;
ET0=1;
TR0=1;
en1=1;
en2=1;
}
void time0(void)interrupt 1//定时中断{
i++;
j++;
if(i<=pro_right) {en1=1;}
else en1=0;
if(i==40) {en1=~en1;i=0;}
if(j<=pro_left) {en2=1;}
else en2=0;
if(j==40) {en2=~en2;j=0;}
TH0=(65536-100)/256;
TL0=(65536-100)%256;
}
void straight() //走直线函数
pro_right=20;
pro_left=20;
left1=1;
left2=0;
right1=1;
right2=0;
}
void turn_left() //左转弯函数{
pro_right=0;
pro_left=20;
left1=1;
left2=0;
right1=1;
right2=0;
}
void turn_right() //右转弯函数{
pro_right=40;
pro_left=0;
left1=1;
left2=0;
right1=1;
right2=0;
void turn_back() //后退(反转)函数{
left1=0;
left2=1;
right1=0;
right2=1;
pro_right=20;
pro_left=20;
}
void infrared() //循迹和避障
{
uchar flag;
if((pright==1)||(pleft==1))
{
if((left_red==1)&(right_red==0)) {flag=1;}
else
if((right_red==1)&(left_red==0)) {flag=2;}
else
if((left_red==0)&(right_red==0)) {flag=3;}
else {flag=0;}
}
else if((pright==0)&(pleft==1)) {flag=4;}
else if((pright==1)&(pleft==0)) {flag=5;}
else if((pright==0)&(pleft==0)) {flag=6;}
else {flag=0;}
switch (flag)
{
case 0:straight();
break;
case 1:turn_right();
delay(1000);
break;
case 2:turn_left();
delay(1000);
break;
case 3:straight();
delay(1000);
break;
case 4:turn_back();
delay(1000);
turn_left();
delay(1000);
break;
case 5:turn_back();
delay(1000);
turn_right();
delay(1000);
break;
case 6:turn_back();
delay(1000);
turn_left();
delay(1000);
break;
default:
break;
}
}
main ()
{
init();
delay(1);
while(1)
{
infrared();
}
}