amoBBS 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
查看: 1212|回复: 4

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

[复制链接]
发表于 2016-1-12 15:27:34 | 显示全部楼层 |阅读模式
这两天用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[RX1_Cnt] = SBUF;               
                if(RX1_Cnt == 7)
                {
                        RX1_Cnt = 0;
                        B_RX1_OK = 1;
                }
                else RX1_Cnt++;
        }
}

只要在定时器0初始化时,停止计时或禁止定时器0中断,串口接收就正常,请给位指教,谢谢!
发表于 2016-1-12 15:51:39 | 显示全部楼层
没看见你打开T2,另外,也没见过在定时器中断里自己开关的!
 楼主| 发表于 2016-1-12 16:32:44 | 显示全部楼层
T2是这条语句代开的AUXR |=  (1<<4);   //Timer run enable,定时器中断没粘贴上来
发表于 2016-1-12 16:55:07 | 显示全部楼层
都没看到有定时器0中断函数,当然会死。
另外,串口里也要有发送中断处理程序,否则,你发一个字节,就不断的进入串口中断,看着MCU像死机一样。

记住一点:Timer0与串口1没有任何关系的,不会存在冲突,有冲突也是你的程序造成的。
 楼主| 发表于 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;
}
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|阿莫电子论坛(原ourAVR/ourDEV) ( 公安备案:44190002001997(交互式论坛) 工信部备案:粤ICP备09047143号 )

GMT+8, 2019-9-20 14:28

阿莫电子论坛, 原"中国电子开发网"

© 2004-2018 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表