2016-12-30 119 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 –