标题:
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