標(biāo)題: 請(qǐng)教51單片機(jī)中斷程序 多謝 [打印本頁(yè)]

作者: 大饅頭    時(shí)間: 2023-4-25 12:27
標(biāo)題: 請(qǐng)教51單片機(jī)中斷程序 多謝
請(qǐng)問(wèn)可否實(shí)現(xiàn)如下功能:在單片機(jī)外部中斷服務(wù)程序里首先修改其自己的優(yōu)先級(jí),然后在執(zhí)行這個(gè)外部中斷服務(wù)程序里的代碼時(shí),再次觸發(fā)這個(gè)外部中斷

請(qǐng)問(wèn)能實(shí)現(xiàn)么?

我遇到一個(gè)有點(diǎn)想不明白的問(wèn)題:
我定義一個(gè)全局變量k,用于檢測(cè)是低級(jí)的外部中斷還是高級(jí)的外部中斷,k為0時(shí)執(zhí)行低級(jí)代碼,k為1時(shí)執(zhí)行高級(jí)代碼
void int0( )  interrupt 0  using 1        
{        if(k==0)
        {
                PX0=1;
                k=1;               
                                                                                                        
                while(1)         
                {                        
                   P1=0xf0;               
                }               
        }
        else
        {        
                P1=0xff        ;                                       
                Delay( ) ;                                       

                P1=0x00;                                                
                Delay( );        
         }
}

以上代碼在Proteus仿真沒(méi)問(wèn)題。在低級(jí)中斷無(wú)限循環(huán)時(shí)可以觸發(fā)其自身高級(jí)中斷,并能執(zhí)行完一次閃爍再次返回低級(jí)中斷無(wú)限循環(huán)
但是如果代碼改成這樣:低級(jí)外部中斷時(shí)只執(zhí)行一次,高級(jí)部分不變
void int0( )  interrupt 0  using 1               
{        
        if(k==0)
        {
                PX0=1;
                k=1;
               
                P1=0xf0;                                                        
                Delay() ;                                                
                Delay() ;                                                
                P1=0x0f;
                Delay() ;                                                
                Delay() ;                                                

                PX0=0;
                k=0;        
        }
        else
        {        
                P1=0xff        ;                                       
                Delay() ;                                       

                P1=0x00;                                                
                Delay();
        }
}

以上代碼仿真時(shí),則一直留在了高級(jí)代碼,不再返回低級(jí)繼續(xù)執(zhí)行了。
這是為什么呢?請(qǐng)求高人解惑!多謝多謝!

作者: Hephaestus    時(shí)間: 2023-4-25 14:27
你都k=0了,那么k==0只要滿(mǎn)足一次永遠(yuǎn)滿(mǎn)足,自然不會(huì)執(zhí)行k!=0的代碼了。
作者: 暖西夏    時(shí)間: 2023-4-25 14:33
對(duì),你在K=0的代碼里面先給K賦值1,在賦值0,那就不會(huì)進(jìn)下面那個(gè)代碼了
作者: byyw    時(shí)間: 2023-4-25 14:40
while(1)         
                {                       
                   P1=0xf0;               
                }       程序會(huì)一直死在這里把
作者: li64331218    時(shí)間: 2023-4-25 14:54
代碼錯(cuò)誤,仔細(xì)檢查一下

作者: 大饅頭    時(shí)間: 2023-4-25 15:46
Hephaestus 發(fā)表于 2023-4-25 14:27
你都k=0了,那么k==0只要滿(mǎn)足一次永遠(yuǎn)滿(mǎn)足,自然不會(huì)執(zhí)行k!=0的代碼了。

怪我沒(méi)說(shuō)明白。當(dāng)執(zhí)行k==0代碼段時(shí),其實(shí)時(shí)間挺長(zhǎng),有2秒鐘。在這段代碼最開(kāi)始的地方,通過(guò)PX0=1修改了外部中斷0的優(yōu)先級(jí),因此在這兩秒鐘器件,可以再次觸發(fā)一次外部中斷0(因?yàn)閮?yōu)先級(jí)已經(jīng)改成高了,從而中斷了過(guò)去那個(gè)低優(yōu)先級(jí)的外部中斷0程序)。
作者: 大饅頭    時(shí)間: 2023-4-25 15:50
暖西夏 發(fā)表于 2023-4-25 14:33
對(duì),你在K=0的代碼里面先給K賦值1,在賦值0,那就不會(huì)進(jìn)下面那個(gè)代碼了

還是可以的。我沒(méi)等低優(yōu)先級(jí)的外部中斷0服務(wù)程序執(zhí)行完,就馬上觸發(fā)了高優(yōu)先級(jí)外部中斷0(通過(guò)修改PX0=1改變了外部中斷0的優(yōu)先級(jí)),因此按理說(shuō)還沒(méi)執(zhí)行到k=0呢
作者: 大饅頭    時(shí)間: 2023-4-25 15:51
byyw 發(fā)表于 2023-4-25 14:40
while(1)         
                {                       
                   P1=0xf0;            ...

這是我想要的結(jié)果。第一段嘗試用無(wú)限循環(huán),而第二段只是短時(shí)間顯示
作者: yzwzfyz    時(shí)間: 2023-4-26 17:07
在中斷未返回時(shí),不會(huì)響應(yīng)再次中斷。直到返回時(shí),才會(huì)被響應(yīng)。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1