|
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define P0_State P0
sbit leftmotor_in1=P2^7;
sbit leftmotor_in2=P2^6;
sbit rightmotor_in3=P2^5;
sbit rightmotor_in4=P2^4;
sbit Trig=P1^1;
sbit Echo=P1^2;
sbit en_1=P2^3;
sbit en_2=P2^2;
uint S,time,i,j,pwm1,pwm2;
void stop();
void straight();
void turn_left();
void turn_right();
void Sensor_5_Car_State_Adjustment();
void delay20us(unsigned char t)
{
while(--t);
}
/*******延時(shí)函數(shù)——延時(shí)50ms*******/
void delay(uint xms) //@11.0592MHz
{
unsigned char m, n;
for(m=xms;m>0;m--)
for(n=110;n>0;n--);
}
void csb()
{
Trig=1;
delay20us(20);
Trig=0;
while(!Echo);
TR0=1;
while(Echo);
TR0=0;
time=TH0*256+TL0;
S=(time*1.7)/100;
TH0=0;
TL0=0;
}
void T0_time()interrupt 1
{
}
void T1_time()interrupt 3
{
TR1=0;
TH1=(65536-100)/256;
TL1=(65536-100)%256;
i++;
j++;
if(i<pwm1)
{
en_1=1;
}
else
en_1=0;
if(j<pwm2)
{
en_2=1;
}
else
en_2=0;
if(i>=100)
{
i=0;
}
if(j>=100)
{
j=0;
}
TR1=1;
}
void main()
{
TMOD=0x10;
TH1=(65536-100)/256;
TL1=(65536-100)%256;
TH0=0;
TL0=0;
ET1=1;
ET0=1;
TR1=1;
TR0=0;
EA=1;
while(1)
{
csb();
if(S>10)
{
straight();
}
else if(S<=10)
{
stop();
}
}
}
void straight() //直走函數(shù)
{
leftmotor_in1=0;
leftmotor_in2=1;
rightmotor_in3=0;
rightmotor_in4=1;
}
void turn_left() //左轉(zhuǎn)函數(shù)
{
leftmotor_in1=1;
leftmotor_in2=0;
rightmotor_in3=0;
rightmotor_in4=1;
}
void turn_right() //右轉(zhuǎn)函數(shù)
{
leftmotor_in1=0;
leftmotor_in2=1;
rightmotor_in3=1;
rightmotor_in4=0;
}
void stop() //停止函數(shù)
{
leftmotor_in1=0;
leftmotor_in2=0;
rightmotor_in3=0;
rightmotor_in4=0;
}
void Sensor_5_Car_State_Adjustment()
{
P0_State=P0_State&0x00;
switch(P0_State)
{
case 0x1b: pwm1=40;
pwm2=40;
straight(); //P0.0|P0.1|P0.2|P0.3|P0.4為11011說(shuō)明小車正常尋跡下一步小車直行
break;
case 0x1d: //P0.0|P0.1|P0.2|P0.3|P0.4為11101說(shuō)明小車左偏下一步小車右拐
pwm2=30;
pwm1=30;
turn_right();
break;
case 0x17: //10111
pwm2=35;
pwm1=35;
turn_left();
//P0.0|P0.1|P0.2|P0.3|P0.4為10111說(shuō)明小車右偏下一步左拐
break;
case 0x03:
pwm1=50;
pwm2=50;
straight();
delay(1);
//P1.0|P1.1|P1.2|P1.3|P1.4為00011說(shuō)明小車遇到左T標(biāo)置物小車左拐
pwm1=30;
pwm2=40;
turn_left();
break;
case 0x18:
pwm1=50;
pwm2=50;
straight();
delay(1);
//P0.0|P0.1|P0.2|P0.3|P0.4為11000說(shuō)明小車遇到右T標(biāo)志物下一步小車右拐
pwm1=40;
pwm2=40;
turn_right();
break;
case 0x11: //P0.0|P0.1|P0.2|P0.3|P0.4為00001說(shuō)明小車遇到十字標(biāo)志物下一步直行
case 0x10: //P0.0|P0.1|P0.2|P0.3|P0.4為10001說(shuō)明小車遇到十字標(biāo)志物體下一步小車直行
case 0x01: //P0.0|P0.1|P0.2|P0.3|P0.4為10000說(shuō)明小車遇到十字標(biāo)志物下一步直行
case 0x00: //P0.0|P0.1|P0.2|P0.3|P0.4為00000說(shuō)明小車遇到十字標(biāo)志物下一步小車直行
pwm1=40;
pwm2=40;
turn_right();
delay(50);
break;
case 0x1c:
//11100
pwm1=40;
pwm2=40;
turn_right();
if(P0^2==0)
break;
break;
case 0x07:
//00111
pwm1=40;
pwm2=40;
turn_left();
delay(100);
break;
case 0x0b : //01011
pwm1=40;
pwm2=20;
turn_left();
break;
case 0x1a: //11010
pwm1=30;
pwm2=40;
turn_right();
break;
case 0x0f: //01111
pwm1=40;
pwm2=40;
turn_left();
delay(50);
break;
case 0x1e:
pwm1=40;
pwm2=40;
turn_right(); //11110
delay(50);
break;
default:
break; //P.0|P0.1|P0.2|P0.3|P0.4 其他情況不做任何改動(dòng)
}
}
|
|