c - 如何结束8051中的外部中断服务程序(ISR)

标签 c embedded 8051

我用8051的硬件中断0编写了一个简单的led闪烁代码。 当按钮被按下时,它进入中断服务程序(ISR)。执行后它应该返回到主函数中,但它没有出现。 这是我的c代码。任何积极的答复将不胜感激。

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;
} 

最佳答案

进入按钮中断时,禁用全局中断EA=0; 这也会禁用定时器中断。因此,您的程序将卡在 delay(2000) 例程中的 while(TF0==0) 处。

关于c - 如何结束8051中的外部中断服务程序(ISR),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41389051/

相关文章:

c++ - ImageMagick 使用我的真实字体 (Magick++) 转换 SVG

c - 从 cmd.exe 运行时如何从 cscope-win32 启动 gvim.exe?

c - ARM 上的高效复制,两个 16 位提取还是 1 个 32 位?

c - 8051 μCU - 如何处理并发中断?

c - 如何在c中声明大小为n x n的内存。

c - fprintf 在将其发送到文件时给出意外的输出

c - 从C中的单链表中删除前节点

c - Visual Studio - fatal error C1057

embedded - 将 q 寄存器中的 128 位数据转换(求和)为 16 位数据的高效算法

C8051f312微 Controller