蓝牙对战部分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了
|