基于AT89C52单片机的智能小车c语言程序

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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();

}

}

相关文档
最新文档