|
52单片机控制小车,但编程出现问题,求高手解决
[复制链接]
我想让小车在检测到第三条黑线时左拐,再检测三条,左拐,最后再检测两条,然后原地打转。可实际运行时,小车检测到第三条黑线后就不停的左转,我怀疑是T0 T1 定时计数器发生冲突。以下是相关程序,也不知哪里错了,求高手指点!
#include
#include
#define uint unsigned int
#define uchar unsigned char
uchar speed_left,speed_right,a,b,c,d,i,j;
sbit P00=P0^0;
sbit P01=P0^1;
sbit P02=P0^2;//控制右电机
sbit P03=P0^3;//控制右电机
sbit P04=P0^4;//寻迹左
sbit P05=P0^5;//寻迹中
sbit P06=P0^6;//寻迹右
sbit P07=P0^7;
sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
sbit P14=P1^4;
sbit P15=P1^5;
sbit P16=P1^6;
sbit P17=P1^7;
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
sbit P24=P2^4;
sbit P25=P2^5;
sbit P26=P2^6;
sbit P27=P2^7;
sbit P36=P3^6;
void init() //为变量赋值
{
PT0=1; //T0中断设为最高优先级
TMOD=0x51; // 01010001
TH0=(65536-100)/256; //PWM的定时器设定
TL0=(65536-100)%256;
EA=1;
ET0=1;
TR0=1;
TH1=0xFF;
TL1=0xFD; //出发,拐弯计数器设定
ET1=1;
TR1=1;
a=0; //用变量a控制小车转弯次数
P04=1;
P05=1;
P00=0;
P01=1;
P02=0;
P03=1;
P06=0;
P07=0;
P10=1;
P11=1;
P12=1;
P13=1;
}
void delay (uint z) //延时函数 z
{
uint x;
uint y;
for(x=z;x>0;x--)
for(y=1000;y>0;y--);
}
void straight()
{
speed_left=70;
speed_right=70;
}
void left1()
{
speed_left=15;
speed_right=50;
delay(15);
}
void left0()
{
P00=1;P01=0;P02=0;P03=1;
speed_left=-40;
speed_right=40;
}
void right1()
{
speed_left=50;
speed_right=15;
delay(15);
}
void right0()
{
P00=0;P01=1;P02=1;P03=0;
speed_left=40;
speed_right=40;
}
void stop()
{
speed_left=0;
speed_right=0;
}
void main()
{
EX0=1;
IT0=1;
init();
while(1)
{
//通过条件判断,让车跨黑线行驶
if((P14==0&&P15==1&&P16==0)||(P14==1&&P15==1&&P16==1)||(P14==1&&P15==0&&P16==1)||(P14==0&&P15==0&&P16==0))
{
straight();
}
if((P14==1&&P15==0&&P16==0)||(P14==0&&P15==1&&P16==1))
{
left1();
}
if((P14==0&&P15==0&&P16==1)||(P14==1&&P15==1&&P16==0))
{
right1();
}
}
}
void zuozhuan() interrupt 3
{
a++;
TH1=0xFF;
TL1=0xFD;
if(a==2)
{
TH1=0xFF;
TL1=0xFE;
left0();
delay(25);
}
else if(a==3)
{
TR1=0; //到达场地中央,转圈寻火焰,并停止计数器工作
left0();
delay(1000);
a++;
}
else
{
left0();
delay(30);
}
}
void time0(void) interrupt 1 //PWM定时器中断程序
{
i++;
j++;
if(i<=speed_right)
{
P04=1;
}
else P04=0;
if(i==100)
{
i=0;
}
if(j<=speed_left)
{
P05=1;
}
else P05=0;
if(j==100)
{
j=0;
}
TH0=(65536-100)/256;
TL0=(65536-100)%256;
}
|
|