|
正在做一個(gè)單片機(jī)接收藍(lán)牙信號(hào),控制LED燈開(kāi)關(guān),亮暗的設(shè)計(jì)。產(chǎn)生PWM波用的是定時(shí)器0,用串口中斷接收藍(lán)牙信號(hào)。這兩個(gè)中斷會(huì)不會(huì)沖突。
程序是這樣的,我就只能寫到這了,不知道哪還有問(wèn)題。亮度分為50級(jí),藍(lán)牙模塊傳輸數(shù)據(jù)位8 位,停止位1 位,無(wú)校驗(yàn)位
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit PWM=P1^0; //P10口輸出PWM波
uchar tmp;
uint scale;
void init();
void init_USART();
uint TQ(uchar n);
void main()
{
tmp=0x32;
init();
init_USART();
PWM=1;
while(1)
{
scale=TQ(tmp);
}
}
void init()
{
TMOD=0X02;
TH0=0xa4; //定時(shí)初值設(shè)置為100us
TL0=0xa4;
EA=1;
ET0=1;
TR0=1;
}
void init_USART() //串口初始化
{
SCON=0x50; //設(shè)置串口通信數(shù)據(jù)位為8位
TMOD=0x20; //設(shè)置定時(shí)器1
TH1=0xFD; //設(shè)置波特率為9600
TL1=0xFD;
TR1=1;
EA=1;
ES=1;
}
void timer0() interrupt 1 //定時(shí)器0產(chǎn)生PWM波,周期5ms
{
static uint t;
if(t==50)
{
t=0;
PWM=1;
}
if(t==scale)
{
PWM=0;
}
t++;
}
void USART() interrupt 4
{
if(RI)
{
RI=0;
ES=0;
tmp=SBUF;
ES=1;
}
}
unsigned int TQ(uchar n)//將字符轉(zhuǎn)換成數(shù)字
{
uint date,shu;
if(n==0x4F) //如果接收字符為'O',開(kāi)燈
return 50;
else if(n==0x43) //如果接收字符為'C',關(guān)燈
return 0;
else if(n>=0x00 && n<=0x32) //如果接收的字符在指定的范圍內(nèi)
{
date=n/10;
shu=n%10;
shu=date*10+shu;
return shu;
}
else return scale; //否則保持之前狀態(tài)
}
|
|