安卓蓝牙控制RGBLED调光调色,遇到问题,求大神帮助。。
在做一个手机通过蓝牙发送数据控制RGBLED变色的东西,单片机用的stc89c52rc,蓝牙模块用的HC05,LED是共阳4管脚的RGBLED,调色使用PWM调制。自己从网上找了一段代码,然后自己改了一下,但是发现用手机蓝牙串口助手发送3个十六进制数据后,led可以实现混色,但是无法继续接受数据。想要实现能够不断接受3位数据并实现动态调色的功能。我希望实现这样一种死循环“接收3位数据--数据赋值--进入中断进行PWM处理--处理完毕显示颜色--接收3位数据……”。我是初学者,可能代码里面问题很多,中断服务函数那块实在搞得焦头烂额。代码如下,请各位不吝赐教。
#include <REG52.H>
#define uchar unsigned char
#define uint unsigned int
sbit pwm1=P2^0; //红色管脚
sbit pwm2=P2^1;//绿色管脚
sbit pwm3=P2^2;//蓝色管脚
unsigned char tmp[3];//数据接收数组
unsigned char m=0;
unsigned char n;
uchar count;
uchar p1,p2,p3;
void delay(uint x)//延时函数
{
unsigned char i,j;
for(i=x;i>0;i--)
for(j=125;j>0;j--);
}
void Timer0_Init()//定时器设定(这块代码不太清楚,如何设置定时器?)
{
TMOD=0x01;
IE=0x82;
TH0=0xff;
TL0=0x9c;
TR0=1;
}
void Timer0_Int() interrupt 1 //中断服务函数(PWM调色,代码基本懂了,但中断函数的处理过程不懂)
{
TH0=0xff;
TL0=0x9c;
count++;
if (count <= p1) { pwm1=0;delay(10000); }
else { pwm1=1;}
if (count <= p2) { pwm2=0; delay(10000);}
else { pwm2=1;}
if (count <= p3) { pwm3=0; delay(10000);}
else { pwm3=1;}
if (count > 100 ) { count=0; }
}
void main()
{
pwm1=1; pwm2=1; pwm3=1;//初始化灯灭
count=0;
ES=0;
SCON = 0x50;
TMOD = 0x20;
TH1=TL1=0xFD; // 波特率9600 (本次测试采用晶振为11.0592)
PCON &= 0x7f; //此处对串口的初始化也不是很懂……
TR1 = 1;
TI=0;
RI=0;
ES=1;
while(1)
{
if(RI==1) // 是否有数据到来
{
RI = 0;
tmp[m] = SBUF;
TI=0;
SBUF=tmp[m];
m++;
if(m>=3) //收到3组数据处理一次
{
p1=tmp[0]; p2=tmp[1];p3=tmp[2];
Timer0_Init(); //这个函数具体放在哪里对整个过程有影响么?
m=0;
}
}
}
}
如果这个问题解决了,后面的就不难了,之后做出来会在这里和大家分享。