找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3823|回復(fù): 6
收起左側(cè)

STC8H單片機(jī)串口中斷和外部中斷沖突

[復(fù)制鏈接]
ID:612392 發(fā)表于 2022-5-9 19:23 | 顯示全部樓層 |閱讀模式
最近在寫一個(gè)單片機(jī)程序,使用INT0將單片機(jī)從掉電模式喚醒,上升下降沿均可喚醒。
當(dāng)P32為低電平時(shí),P1.0輸出高電平,置高一個(gè)標(biāo)志位,再用串口發(fā)送一個(gè)char(這里用0XAA代替)。
程序運(yùn)行的時(shí)候,觸發(fā)INT0時(shí),程序就卡在UartSendByte(0XAA)這句,上位機(jī)能收到發(fā)出來(lái)的0XAA,但就不執(zhí)行后面的語(yǔ)句了,卡住了。
把UartSendByte(0XAA)這行語(yǔ)句去掉,運(yùn)行就正常。
中斷優(yōu)先級(jí)沒(méi)改過(guò),默認(rèn)的中斷優(yōu)先級(jí)。是不是因?yàn)楫?dāng)前程序在INT0的中斷程序里,不會(huì)響應(yīng)其它中斷?如果把串口中斷優(yōu)先級(jí)改得比INT0高是不是就OK了?

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

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

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

}

回復(fù)

使用道具 舉報(bào)

ID:301191 發(fā)表于 2022-5-9 21:57 | 顯示全部樓層
頂一下
回復(fù)

使用道具 舉報(bào)

ID:624769 發(fā)表于 2022-5-9 22:10 | 顯示全部樓層
要么:在 main 函數(shù)中增加   PS = 1;
要么:把你的        //UartSendByte(0XAA);     改成:  SBUF = 0xAA;
回復(fù)

使用道具 舉報(bào)

ID:390416 發(fā)表于 2022-5-9 22:35 | 顯示全部樓層
串口 別寫死了,單片機(jī)發(fā)送到串口助手,以及串口助手顯示到LCD1602 http://www.torrancerestoration.com/bbs/dpj-214747-1.html
回復(fù)

使用道具 舉報(bào)

ID:401564 發(fā)表于 2022-5-10 13:58 | 顯示全部樓層
雖然你的代碼只有一點(diǎn),但卻很亂
UartBusy這個(gè)要在啟動(dòng)的時(shí)候先清除,不然就會(huì)一直卡在那不動(dòng)了
你這個(gè)中斷不需要設(shè)置什么的了,默認(rèn)的就行
串口只會(huì)被打斷而已,外部中斷完成之后,中斷控制權(quán)還是會(huì)交給串口的
不應(yīng)該在,外部中斷中發(fā)送串口
當(dāng)你串口發(fā)送一半的時(shí)候,外部中斷被觸發(fā),進(jìn)入中斷,又發(fā)送一次串口,你這覺(jué)得這很亂嗎?
1,串口發(fā)送要在主程序中發(fā)送
2,外部中斷觸發(fā)之后,也就是按鍵按下,不是馬上發(fā)送,而進(jìn)入中斷之后,設(shè)置一個(gè)標(biāo)志位,表示按鍵按下了,這個(gè)標(biāo)志要在串口發(fā)送完成之后再清除
不然的話,按鍵抖動(dòng),就會(huì)產(chǎn)生串口不斷的發(fā)送數(shù)據(jù)比如這樣
void Int0_isr() interrupt 0        //外部中斷0
{       
if(!P32)        {
key_press=1;                          //按下按鍵
key_100ms=100;//可以用做一些延時(shí)之類的,比如這個(gè)是100mS,串口發(fā)送完成之后,100mS再次按鍵是無(wú)用的
}
        IE0=0;
}


key_press在串口發(fā)送之后再清除,
回復(fù)

使用道具 舉報(bào)

ID:1091094 發(fā)表于 2023-8-10 20:57 | 顯示全部樓層
這個(gè)和STC的89c51有什么區(qū)別嗎  我用的外部中斷加串口也是不怎么穩(wěn)定  好像沖突了
回復(fù)

使用道具 舉報(bào)

ID:195496 發(fā)表于 2023-8-11 09:05 | 顯示全部樓層
思路不清晰,不要在中斷中判斷管腳,在主程序中判斷后,寫個(gè)標(biāo)志,中斷判斷標(biāo)志后,清除標(biāo)志,發(fā)送數(shù)據(jù)。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表