标题: STC8H单片机串口中断和外部中断冲突 [打印本页]

作者: cjjdemon    时间: 2022-5-9 19:23
标题: STC8H单片机串口中断和外部中断冲突
最近在写一个单片机程序,使用INT0将单片机从掉电模式唤醒,上升下降沿均可唤醒。
当P32为低电平时,P1.0输出高电平,置高一个标志位,再用串口发送一个char(这里用0XAA代替)。
程序运行的时候,触发INT0时,程序就卡在UartSendByte(0XAA)这句,上位机能收到发出来的0XAA,但就不执行后面的语句了,卡住了。
把UartSendByte(0XAA)这行语句去掉,运行就正常。
中断优先级没改过,默认的中断优先级。是不是因为当前程序在INT0的中断程序里,不会响应其它中断?如果把串口中断优先级改得比INT0高是不是就OK了?

void INT0_Isr() interrupt 0
{
        if(!P32)
        {
                P10=1;                                //AFE wake up
                PoweronFlag=1;
                //UartSendByte(0XAA);
        }
}

以下是UartSendByte()及串口中断程序,都是直接copy STC手册的
void UartSendByte(uchar dat)
{
        while(UartBusy);
        UartBusy=1;
        SBUF=dat;        
}

void Uart1_Isr() interrupt 4
{
        while(TI)                                                
        {
                TI=0;
                UartBusy=0;
        }

}


作者: 人工置顶员    时间: 2022-5-9 21:57
顶一下
作者: 188610329    时间: 2022-5-9 22:10
要么:在 main 函数中增加   PS = 1;
要么:把你的        //UartSendByte(0XAA);     改成:  SBUF = 0xAA;
作者: 人人学会单片机    时间: 2022-5-9 22:35
串口 别写死了,单片机发送到串口助手,以及串口助手显示到LCD1602 http://www.51hei.com/bbs/dpj-214747-1.html
作者: Y_G_G    时间: 2022-5-10 13:58
虽然你的代码只有一点,但却很乱
UartBusy这个要在启动的时候先清除,不然就会一直卡在那不动了
你这个中断不需要设置什么的了,默认的就行
串口只会被打断而已,外部中断完成之后,中断控制权还是会交给串口的
不应该在,外部中断中发送串口
当你串口发送一半的时候,外部中断被触发,进入中断,又发送一次串口,你这觉得这很乱吗?
1,串口发送要在主程序中发送
2,外部中断触发之后,也就是按键按下,不是马上发送,而进入中断之后,设置一个标志位,表示按键按下了,这个标志要在串口发送完成之后再清除
不然的话,按键抖动,就会产生串口不断的发送数据比如这样
void Int0_isr() interrupt 0        //外部中断0
{       
if(!P32)        {
key_press=1;                          //按下按键
key_100ms=100;//可以用做一些延时之类的,比如这个是100mS,串口发送完成之后,100mS再次按键是无用的
}
        IE0=0;
}


key_press在串口发送之后再清除,

作者: 3038838599    时间: 2023-8-10 20:57
这个和STC的89c51有什么区别吗  我用的外部中断加串口也是不怎么稳定  好像冲突了
作者: 大漠落日    时间: 2023-8-11 09:05
思路不清晰,不要在中断中判断管脚,在主程序中判断后,写个标志,中断判断标志后,清除标志,发送数据。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1