微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 新手求助,前辈们帮忙解答一下

新手求助,前辈们帮忙解答一下

时间:10-02 整理:3721RD 点击:
正在做一个单片机接收蓝牙信号,控制LED灯开关,亮暗的设计。产生PWM波用的是定时器0,用串口中断接收蓝牙信号。这两个中断会不会冲突。

下面是程序,蓝牙模块传输数据位8 位,停止位1 位,无校验位
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit PWM=P1^0;
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; //定时初值设置为100us
        TL0=0xa4;
        EA=1;
        ET0=1;
        TR0=1;
}
void init_USART() //串口初始化
{
        SCON=0x50; //设置串口通信数据位为8位
        TMOD=0x20; //设置定时器1
        TH1=0xFD;  //设置波特率为9600
        TL1=0xFD;
        TR1=1;
        EA=1;
        ES=1;
}
void timer0() interrupt 1        //定时器0产生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)//将字符转换成数字
{
        uint date,shu;
        if(n==0x4F)                 //如果接收字符为'O',开灯
                return 50;
        else if(n==0x43)          //如果接收字符为'C',关灯
                return 0;
        else if(n>=0x00 && n<=0x32)                //如果接收的字符在指定的范围内
                {
                        date=n/10;
                        shu=n%10;
                        shu=date*10+shu;
                        return shu;
                }
        else return scale;                                 //否则保持之前状态
}

可以试试,在进入到串口中断程序里面,关掉定时器0,等发送完数据,再打开定时器0

看哪个更优先了   

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top