#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);
}
/*******延时函数——延时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(15);
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=1;
EA=1;
while(1)
{
csb();
if(S>100)
{
Sensor_5_Car_State_Adjustment();
}
if(S<=100)
{ pwm1=0;
pwm2=0;
stop();
}
}
}
void straight() //直走函数
{
leftmotor_in1=0;
leftmotor_in2=1;
rightmotor_in3=0;
rightmotor_in4=1;
}
void turn_left() //左转函数
{
leftmotor_in1=1;
leftmotor_in2=0;
rightmotor_in3=0;
rightmotor_in4=1;
}
void turn_right() //右转函数
{
leftmotor_in1=0;
leftmotor_in2=1;
rightmotor_in3=1;
rightmotor_in4=0;
}
void stop() //停止函数
{
leftmotor_in1=0;
leftmotor_in2=0;
rightmotor_in3=0;
rightmotor_in4=0;
}
void Sensor_5_Car_State_Adjustment(void)
{
P0_State=P0_State&0x00;
switch(P0_State)
{
case 0x1f:
case 0x1b: pwm1=40;
pwm2=40; straight(); //P0.0|P0.1|P0.2|P0.3|P0.4为11011说明小车正常寻迹下一步小车直行
break;
case 0x1d: while(1) //P0.0|P0.1|P0.2|P0.3|P0.4为11101说明小车左偏下一步小车右拐
{
pwm2=35;
pwm1=35;
turn_right();
if(P0^2==0)
break;
}
break;
case 0x17: while(1) //10111
{
pwm2=35;
pwm1=35;
turn_left();
if(P0^2==0)
break;
} //P0.0|P0.1|P0.2|P0.3|P0.4为10111说明小车右偏下一步左拐
break;
case 0x03:
pwm1=50;
pwm2=50;
straight();
delay(1);
while(1) //P1.0|P1.1|P1.2|P1.3|P1.4为00011说明小车遇到左T标置物小车左拐
{
pwm1=30;
pwm2=40;
turn_left();
if(P0^2==0)
{
break;
}
}
break;
case 0x18:
pwm1=50;
pwm2=50;
straight();
delay(1);
while(1) //P0.0|P0.1|P0.2|P0.3|P0.4为11000说明小车遇到右T标志物下一步小车右拐
{
pwm1=40;
pwm2=30;
turn_right();
if(P0^2==0)
{
break;
}
}
break;
case 0x11: //P0.0|P0.1|P0.2|P0.3|P0.4为00001说明小车遇到十字标志物下一步直行
case 0x10: //P0.0|P0.1|P0.2|P0.3|P0.4为10001说明小车遇到十字标志物体下一步小车直行
case 0x01: //P0.0|P0.1|P0.2|P0.3|P0.4为10000说明小车遇到十字标志物下一步直行
case 0x00: //P0.0|P0.1|P0.2|P0.3|P0.4为00000说明小车遇到十字标志物下一步小车直行
while(1)
{
pwm1=40;
pwm2=40;
turn_right();
if(P0^2==0)
{
break;
}
}
break;
case 0x1c:
while(1) //11100
{
pwm1=50;
pwm2=50;
turn_right();
if(P0^2==0)
break;
}
break;
case 0x07:
while(1) //00111
{
pwm1=50;
pwm2=50;
turn_left();
if(P0^2==0)
break;
}
break;
case 0x0b : while(1) //01011
{
pwm1=40;
pwm2=30;
turn_left();
if(P0^2==0)
{
break;
}
}
break;
case 0x1a: //11010
while(1)
{
pwm1=30;
pwm2=40;
turn_right();
if(P0^2==0)
{
break;
}
}
break;
case 0x0f: while(1) //01111
{
pwm1=50;
pwm2=50;
turn_left();
if(P0^2==0)
{
break;
}
}
break;
case 0x1e:
while(1)
{
pwm1=50;
pwm2=50;
turn_right(); //11110
if(P0^2==0)
break;
}
break;
default:
break; //P.0|P0.1|P0.2|P0.3|P0.4 其他情况不做任何改动
}
}
|