我做了一个通过蓝牙控制小车,初始化都是对,为什么蓝牙中断有时响应有时不响应,我通过单步执行发现程序老是在定时器0循环,大佬们怎么解决这个事情呢,下面是源代码:
#include <reg51.h>
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
sbit IRIN=P3^2;
sbit IN1=P1^0;
sbit IN2=P1^1;
sbit ENA=P0^2;
sbit pwm=P2^1;//输出PWM信号
sbit k1=P3^2;
u8 a,b,c;
void delay(int i)
{
while(i--);
}
void uart_init()
{
TMOD|=0x20;
PCON =0x00;
SCON = 0x50;
TH1 = 0xFd; //设置波特率 9600
TL1 = 0xFd;
TR1 = 1; //启动定时器1
ES = 1; //开串口中断
EA = 1; //开总中断
}
void uart() interrupt 4
{
if(RI==1)
RI=0;
a=SBUF;
}
void InitTimer()
{
TMOD|=0x01;//开定时器0,1
TH0=0xff;//定时1.5MS,这时舵机处于0度
TL0=0xf6;
EA=1;//开总断
ET0=1;
TR0=0;
}
void timer0() interrupt 1//定时器0中断函数
{
TH0=0xff;//定时1.5MS,这时舵机处于0度
TL0=0xf6;
b++;
if(b==1) pwm=0;
else if(b==2) pwm=1;
else if(b==c) b=0;
TR0=0;
}
void Int0Init()
{
EX0=0;
IT0=0;
EA=1;
}
void Int0() interrupt 0
{
while(k1==0)
{
if(a==0x03)
{
c=26;
k1=1;
EX0=0;
}
else if(a==0x04)
{
c=37;
k1=1;
EX0=0;
}
else if(a==0x01)
{
c=31;
k1=1;
EX0=0;
}
}
}
void main()
{
InitTimer();
uart_init();
Int0Init();
TR0=0;
while(1)
{
if(a==0x01)
{
IN1=0;
IN2=1;
EX0=1;
TR0=1;
k1=0;
} //左转 28 2
else if(a==0x02)
{
EX0=1;
TR0=0;
IN1=1;
IN2=0;
}
//else if(a==0x00)
else if(a==0x03)
{
EX0=1;
TR0=1;
k1=0;
}
else if(a==0x04)
{
EX0=1;
TR0=1;
k1=0;
}
else if(a==0x05)
{
IN1=0;
IN2=0;
}
}
}
|