有时候小车撞倒障碍物可以倒车,转弯,可是一般几次以后就进入一个死循环:撞倒障碍物倒车,然后前进,撞倒障碍物,倒车,前进。不知道程序哪错了,感觉没执行完似的。
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar CYCLE,PWM_R,PWM_L,num,num1,num2;
sbit IN1=P1^0;
sbit IN2=P1^1;
sbit IN3=P1^2;
sbit IN4=P1^3;
sbit pwm1=P1^4; //PWM
sbit pwm2=P1^5;
sbit left=P2^1; //控制口
sbit right=P2^2;
void delayms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void init()
{
IN1=1;IN2=0;
IN3=1;IN4=0;
TMOD=0x01;
TH0=(65536-100)/256;
TL0=(65536-100)%256; //定时0.1mS
EA=1;
ET0=1;
TR0=1;
CYCLE =10; // 时间可以调整 这个是10调整 8位PWM就是256步
}
void turn_right() //右转
{
PWM_L=10;PWM_R=0;
}
void turn_left() //左转
{
PWM_L=0;PWM_R=10;
}
void turn_stright() //直线走
{
PWM_L=5;PWM_R=5;
}
void bizhang()
{
if((left==1)&&(right==1))
{
turn_stright();
}
if((left==0)&&(right==0))
{
num++;
if(num==4)
{
num=0;
IN1=0;IN2=1; //倒车0.5s
IN3=0;IN4=1;
turn_stright();
delayms(1000);
IN1=1;IN2=0;
IN3=1;IN4=0;
PWM_R=0;PWM_L=0;
delayms(200);
turn_left();
delayms(500);
PWM_R=0;PWM_L=0;
delayms(200);
turn_right();
delayms(500);
PWM_R=0;PWM_L=0;
delayms(200);
}
else
{
PWM_R=0;PWM_L=0; //停车
delayms(100);
IN1=0;IN2=1; //倒车0.5s
IN3=0;IN4=1;
turn_stright();
delayms(500);
IN1=1;IN2=0;
IN3=1;IN4=0;
PWM_R=0;PWM_L=0;
delayms(200);
turn_left();
delayms(500);
PWM_R=0;PWM_L=0;
delayms(200);
turn_right();
delayms(500);
PWM_R=0;PWM_L=0;
delayms(200);
}
// turn_stright();
}
if((left==1)&&(right==0))
{
num1++;
if(num1==4)
{
num1=0;
IN1=0;IN2=1; //倒车0.5s
IN3=0;IN4=1;
turn_stright();
delayms(1000);
IN1=1;IN2=0;
IN3=1;IN4=0;
PWM_R=0;PWM_L=0;
delayms(200);
turn_left();
delayms(500);
PWM_R=0;PWM_L=0;
delayms(200);
turn_right();
delayms(500);
PWM_R=0;PWM_L=0;
delayms(200);
}
else
{
PWM_R=0;PWM_L=0; //停车
delayms(100);
IN1=0;IN2=1; //倒车0.5s
IN3=0;IN4=1;
turn_stright();
delayms(500);
IN1=1;IN2=0;
IN3=1;IN4=0;
PWM_R=0;PWM_L=0;
delayms(200);
turn_left();
delayms(500);
PWM_R=0;PWM_L=0;
delayms(200);
turn_right();
delayms(500);
PWM_R=0;PWM_L=0;
delayms(200);
}
//turn_stright();
}
if((left==0)&&(right==1))
{
num2++;
if(num2==4)
{
num2=0;
IN1=0;IN2=1; //倒车0.5s
IN3=0;IN4=1;
turn_stright();
delayms(1000);
IN1=1;IN2=0;
IN3=1;IN4=0;
PWM_R=0;PWM_L=0;
delayms(200);
turn_right();
delayms(500);
PWM_R=0;PWM_L=0;
delayms(200);
turn_left();
delayms(500);
PWM_R=0;PWM_L=0;
delayms(200);
}
else
{
PWM_R=0;PWM_L=0; //停车
delayms(100);
IN1=0;IN2=1; //倒车0.5s
IN3=0;IN4=1;
turn_stright();
delayms(500);
IN1=1;IN2=0;
IN3=1;IN4=0;
PWM_R=0;PWM_L=0;
delayms(200);
turn_right();
delayms(500);
PWM_R=0;PWM_L=0;
delayms(200);
turn_left();
delayms(500);
PWM_R=0;PWM_L=0;
delayms(200);
}
// turn_stright();
}
}
void main()
{
init();
while(1)
{
bizhang();
}
}
void tim(void) interrupt 1
{
static unsigned char count,count1;
TH0=(65536-100)/256;
TL0=(65536-100)%256; //定时0.1mS
if (count==PWM_R)
{
pwm1 = 0;
}
count++;
if(count == CYCLE)
{
count=0;
if(PWM_R!=0)
pwm1 = 1;
}
if (count1==PWM_L)
{
pwm2 = 0;
}
count1++;
if(count1 == CYCLE)
{
count1=0;
if(PWM_L!=0)
pwm2 = 1;
}
} |