|
#include<reg52.h>
#define uint unsigned int;
#define uchar unsigned char
sbit Trig=P3^1;
sbit Echo=P3^2;
sbit zuo1=P2^2;
sbit you1=P2^1;
sbit zuo2=P2^3;
sbit you2=P2^0;
sbit A=P1^0;
sbit E=P1^1;
sbit C=P1^2;
sbit D=P1^3;
sbit ENA=P1^4;
sbit ENB=P1^5;
sbit a=P2^4;
sbit b=P2^5;
sbit c=P2^6;
sbit d=P2^7;
uchar PWML,PWMR,t;
uint x,y;
uint timeH,distance,timeL,time;
void delay1(int e)
{
int i,j;
for(i=e;i>0;i--)
for(j=5;j>0;j--);
}
void delayms(int f)
{
int i,j;
for(i=f;i>0;i--)
for(j=110;j>0;j--);
}
void delay(int g)
{
int i,j;
for(i=2;i>0;i--)
for(j=g;j>0;j--);
}
void delay_20us()
{
uchar s;
for(s=0;s<100;s++);
}
void yaokong()
{
if(a==1)
x=1;
if(b==1)
x=2;
if(c==1)
x=3;
if(d==1)
x=4;
}
void qianjin1()
{
while(x!=4)
{
A=0;E=1;
C=0;D=1;
PWML=30;
PWMR=30;
delayms(1000);
PWML=100;
PWMR=100;
delayms(1000);
PWML=0;
PWMR=0;
delayms(1000);
A=1;E=0;
C=1;D=0;
PWML=100;
PWMR=100;
delayms(1000);
PWML=30;
PWMR=30;
delayms(1000);
x=4;
}
}
void qianjin()
{ P1=0xfa; //前進(jìn)//
delay(15-8);
P1=0xff;
delay(8);
}
void qianjin2()
{ P1=0xfa; //前進(jìn)
delay1(50);
P1=0xf0;
delay1(50);
}
void zuozhuan()
{ P1=0xf2; //左轉(zhuǎn)動(dòng)
delay(15-9);
P1=0xff;
delay(9);
}
void zuozhuan1()
{
P1=0xf2;
delay1(10);
P1=0xf0;
delay1(1);//左轉(zhuǎn)動(dòng)//
}
void youzhuan()
{ P1=0xf8; //右轉(zhuǎn)動(dòng)//
delay(15-9);
P1=0xff;
delay(9);
}
void xunji()
{
if((zuo1==1)&&(zuo2==1)&&(you2==1)&&(you1==0))
{
y=1;//youzhuan();
}
if((zuo1==1)&&(zuo2==1)&&(you2==1)&&(you1==1))
{
y=0;//qianjin();
}
if((zuo1==0)&&(zuo2==1)&&(you2==1)&&(you1==1))
{
y=2;//zuozhuan();
}
if((zuo1==1)&&(zuo2==1)&&(you2==0)&&(you1==0))
{
y=1;//youzhuan();
}
if((zuo1==0)&&(zuo2==0)&&(you2==1)&&(you1==1))
{
y=2;// zuozhuan();
}
if((zuo1==1)&&(zuo2==0)&&(you2==0)&&(you1==0))
{
y=1;//youzhuan();
}
if((zuo1==0)&&(zuo2==0)&&(you2==0)&&(you1==1))
{
y=2;// zuozhuan();
}
switch(y)
{
case 0:qianjin();break;
case 1:youzhuan();break;
case 2:zuozhuan();break;
}
}
void chaoshengbo()
{
Trig=0;//拉低脈沖輸入引腳
TH1=0;//定時(shí)器高位清零
TL1=0;//定時(shí)器低位清零
Trig=1;//超聲波輸入端
delay_20us();//延時(shí)20us
Trig=0;//產(chǎn)生一個(gè)20us的脈沖
while(Echo==0);//等待Echo回波引腳變低電平
EX0=1;//打開(kāi)外部中斷0
TR1=1;//啟動(dòng)定時(shí)器1
while(Echo==1);//等待測(cè)量結(jié)果
TR1=0;//關(guān)閉定時(shí)器1
EX0=0;//關(guān)閉外部中斷
time=timeH*256+timeL;
distance=time*0.172;//毫米
if(distance>300)
{
qianjin2();
}
else
{
zuozhuan1();
}
}
void panduan()
{
if(x==1)
{
TR0=0;
TR1=0;
xunji();
}
if(x==2)
{
TR1=0;
TR0=1;
qianjin1();
}
if(x==3)
{
TR0=0;
chaoshengbo();
}
if(x==4)
{
P1=0xf0;
}
}
void init()
{
TMOD=0x11;
TH0=(65536-50)/256;
TL0=(65536-50)%256;
EA=1;
ET0=1;
ET1=1;
P1=0xf0;
P2=0x0f;
}
void main()
{
init();
while(1)
{
yaokong();
panduan();
}
}
void T0_time() interrupt 1
{
TH0=(65536-50)/256;
TL0=(65536-50)%256;
if(t<PWML)
{
ENA=1;
}
else
ENA=0;
if(t<PWMR)
ENB=1;
else
ENB=0;
t++;
if(t>=100)
t=0;
}
void exter() interrupt 0//外部中斷,判斷回波電平
{
timeH=TH1;//取出定時(shí)器的值
timeL=TL1;//取出定時(shí)器的值
}
void timer1() interrupt 3// 定時(shí)器1中斷,超聲波測(cè)距計(jì)時(shí)
{
TH1=0;
TL1=0;
}
|
評(píng)分
-
查看全部評(píng)分
|