2016-12-30 89 views
0

結束外部中斷服務程序(ISR)我寫的與硬件一個簡單的LED閃爍代碼中斷的8051 0當按下按鈕,它進入中斷服務程序(ISR)。執行後它應該回到主函數但它不會到來。 這是我的c代碼。任何積極的答覆將不勝感激。如何在8051

sbit LED = P1^0; 

void delay(int ms) 
{ 
    int i; 

    for(i=0;i<ms;i++) 
    { 
    TMOD = 0x01;    
    TH0 = 0xFC;    
    TL0 = 0x66; 
    TR0 = 1; 
    while(TF0==0);          
    TR0 = 0; 
    TF0 = 0; 
    } 
} 



void main(void) 
{ 
    P1 = 0x00; 
/// P3 = 0x04; 
    IT0 = 1;  
    EX0 = 1;  
    EA = 1; 
    LED=1; 

    while(1) 
    { 
     LED=~LED; 
     delay(200); 
    } 

return ; 
} 



void external0_isr() interrupt 0  
{ 
    EA=0; 
    LED =0 ; 
    delay(2000); 
    LED=1; 
    EX0=1; 
    EA=1; 

    return; 
} 
+1

一般情況下,你想花盡可能少的時間儘可能在ISR。 '延遲(2000)'似乎不合適。 –

回答

1

當你進入按鈕中斷,禁止中斷EA=0; 這也將禁用定時器中斷。因此,計劃將在你的日常delay(2000)while(TF0==0)掛起。

+0

謝謝你的迴應。通過評論EA = 0來試用它,但它不起作用。 –

+0

EA = 0的原因是通過彈跳按鈕來防止多個IO中斷。通常情況下,即使您只按1次,如果您沒有任何噪聲濾波電容,MCU可能會收到3-5中斷信號。此外,您應該避免在設計中嵌套中斷(中斷內部中斷)。最後,不要在中斷中使用延遲。中斷應儘可能快。 –

+0

爲了確保中斷是不是故障的原因,請使用'爲loop',而不是系統定時器改變你的'delay'功能。 http://blowtech.blogspot.com/2013/08/different-ways-to-generate-delays-in.html –