求助,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中断,串口接收就正常,请给位指教,谢谢! 没看见你打开T2,另外,也没见过在定时器中断里自己开关的! T2是这条语句代开的AUXR |=(1<<4); //Timer run enable,定时器中断没粘贴上来 都没看到有定时器0中断函数,当然会死。
另外,串口里也要有发送中断处理程序,否则,你发一个字节,就不断的进入串口中断,看着MCU像死机一样。
记住一点:Timer0与串口1没有任何关系的,不会存在冲突,有冲突也是你的程序造成的。 不好意思,定时器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]