我做了一個通過藍牙控制小車,初始化都是對,為什么藍牙中斷有時響應有時不響應,我通過單步執行發現程序老是在定時器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;
}
}
}
|