hehe611 发表于 2016-1-12 15:27:34

求助,STC15W408AS串口1中断和定时器0中断冲突!

这两天用STC15W408AS写个小程序,在使用过程中,发现同时使用串口1中断和定时器0中断有冲突,初始化和中断函数如下:
void UsartInit(void)
{
        RS485_DIR = 0;
        RX1_Cnt = 0;
        SCON= (SCON & 0x3f) | 0x40;                //8位数据
        P_SW1 &= ~0xc0;                              //UART1使用P30,P31
        AUXR &= ~(1<<4);                               //Timer sto
        AUXR |= 0x01;                                       //S1 BRT Use Timer2;
        AUXR |=(1<<2);                            //Timer2 set as 1T mode
        T2H = (uchar)(Timer2_Reload >> 8);
        T2L = (uchar)Timer2_Reload;
        AUXR |=(1<<4);                             //Timer run enable
        REN = 1;                                           //允许接收
        PS = 1;                                          //串口中断优先级高
        ES = 1;                                           //允许中断
}

void Timer0Init(void)                //20毫秒@22.1184MHz
{
        AUXR &= 0x7F;                  //12T模式
        TMOD &= 0xF0;               
        TMOD |= 0x01;                  
        TL0 = 0x00;                  //定时器0初值
        TH0 = 0x70;                    //定时器0初值
        TF0 = 0;                            //清除TF0标志
        PT0 = 0;
        ET0 = 1;                     //允许中断
        TR0 = 1;                           //开始计时
}

void Usart1_Int (void) interrupt 4
{
        if(RI)
        {
                RI = 0;
                RX1_Buffer = SBUF;               
                if(RX1_Cnt == 7)
                {
                        RX1_Cnt = 0;
                        B_RX1_OK = 1;
                }
                else RX1_Cnt++;
        }
}

只要在定时器0初始化时,停止计时或禁止定时器0中断,串口接收就正常,请给位指教,谢谢!

饭桶 发表于 2016-1-12 15:51:39

没看见你打开T2,另外,也没见过在定时器中断里自己开关的!

hehe611 发表于 2016-1-12 16:32:44

T2是这条语句代开的AUXR |=(1<<4);   //Timer run enable,定时器中断没粘贴上来

小李非刀 发表于 2016-1-12 16:55:07

都没看到有定时器0中断函数,当然会死。
另外,串口里也要有发送中断处理程序,否则,你发一个字节,就不断的进入串口中断,看着MCU像死机一样。

记住一点:Timer0与串口1没有任何关系的,不会存在冲突,有冲突也是你的程序造成的。

hehe611 发表于 2016-1-12 17:02:14

不好意思,定时器0中断程序没有粘贴上来:
/********************* Timer0中断函数************************/
void timer0_int (void) interrupt 1
{
        TL0 = 0x00;                  //设置定时器初值
        TH0 = 0x70;                  //设置定时器初值
        if(RX_cnt>0) RX_cnt--;
Tim_Cnt++;
        if(Tim_Cnt>15000)
        {
                Tim_Cnt = 0;
                BK = 0;
                TR0 = 0;
        }               
}
另外串口发送用的查询方式,禁用了串口中断:

void TX1_write2buff(uchar dat)        //写入发送缓冲,指针+1
{
        ES = 0;
        RS485_DIR = 1;
SBUF = dat;
        while(TI == 0);
        TI = 0;
        RS485_DIR = 0;
        ES = 1;
}
页: [1]
查看完整版本: 求助,STC15W408AS串口1中断和定时器0中断冲突!