| 蓝牙对战部分app不会搞,就想做成一个蓝牙遥控小车,使用蓝牙串口助手连接,可以调节速度,控制左转右转倒车可是单独的pwm控制车速没问题,单独的蓝牙串口通信也没问题,两个放在一起就会导致蓝牙串口没**常工作。pwm信号使用定时器0产生,中断是0.5ms一次。串口采用9600波特率,但是一旦使用定时器0就会导致串口收到的数据不正确。代码如下:(代码接收蓝牙信号没问题,因为定时器0已屏蔽,如果打开就会出问题,接收数据不正确)哪位大神帮忙看下什么问题。 #include <REG52.H>
 
 sbit vcc1=P0^0;
 sbit vss1=P0^1;
 sbit vcc2=P0^2;
 sbit vss2=P0^3;
 
 unsigned char b,c,pwm,t;//b接受SUBF,pwm控制2个车轮转速
 // 此表为 LED 的字模                    0                 1     2     3     4     5     6     7    8     9           a     b     c    d     e      f
 unsigned char code LED7Code[] = {~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71};
 
 void init()
 {
 P1=0x11;
 SCON = 0x50;      //REN=1允许串行接受状态,串口工作模式1
 TMOD|= 0x21;      //定时器1工作方式2  ,   定时器0工作方式1
 PCON|= 0x00;
 // 波特率9600、数据位8、停止位1。无校验位 (11.0592)
 TH1 = 0xFD;
 TL1 = 0xFD;
 TH0 = 0xfe; //11.0592  定时器0用于产生pwm  ,0.5ms
 TL0 = 0x33;
 TR1  = 1;
 //TR0=1;
 ET0=1;
 ES   = 1;        //开串口中断
 EA   = 1;        // 开总中断
 PS         = 1;//串口中断优先
 }
 void main (void) {
 
 init();
 pwm=100;
 //vss1=vss2=0;
 while(1)
 {
 if (RI)       //RI接受中断标志
 {  RI=0;             //清除RI接受中断标志
 b=SBUF;        //SUBF接受/发送缓冲器
 }
 c =(b%16)&0x7f;
 //P0=LED7Code[c] ;
 
 switch(c){
 case 0:P0=LED7Code[c];break;//pwm=100; break;
 case 1:P0=LED7Code[c] ;break;//pwm=80; break;
 case 2:P0=LED7Code[c] ;break;//pwm=70; break;
 case 3:P0=LED7Code[c] ;break;//pwm=60; break;
 //case 4:reverse(); break;
 default:P0=LED7Code[9];break;//stop();
 }
 if(t>100) t=0;
 if(t<pwm) ;//vcc1=vcc2=0;
 else ;//vcc1=vcc2=1;
 }
 }
 如果把定时器0的中断时间调的长一些也可以运行,但是小车会有明显的卡顿现象。
 void T0zd(void) interrupt 1    //3 为定时器1的中断号  1 定时器0的中断号 0 外部中断1 2 外部中断2  4 串口中断
 {
 TH1 = 0xfe; //11.0592
 TL1 = 0x33;
 t++;
 }
 如果定时器0中断时间长一些也能正常运行,但是小车运**顿,所以最长就是0.5ms了
 |