找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6852|回复: 9
收起左侧

51单片机关闭中断再打开中断下次还会进入中断吗(附程序)

[复制链接]
ID:381535 发表于 2018-10-13 09:09 | 显示全部楼层 |阅读模式
本帖最后由 gguo2 于 2018-10-13 09:10 编辑

外部下降沿触发中断,进入中断后EA=0关闭中断,while 语句执行完后再EA=1 打开中断。
请问下次再出现下降沿的时候还能进入这个中断程序吗?我目的是每发生一次下降沿,执行一次这个中断内部的函数。

void main()
{
        
  TMOD=0x01; // Timer mode 1
        TR0=1;     // Timer 0 enable
        TR1=1;     // Timer 1 enable
        
        
        IT0=1;  // Falling edge trigger
        EX0=1;  // External interrupt 0 enable
        EA=1;   // Master switch enable
        
        while (1)        ;
                        
}        

void EXINT0() interrupt 0         //0 stands for external interrupt 0
{
        EA=0;
       TH1=0xB1;
       TL1=0xEC;
        cnt=0;
        
      while (cnt<=100)
        {
         P1=0xE3;
         Delay10ms();
               
         P1=0xF3;
         Delay10ms();               

                if (TF1 == 1)
                {
                  TF1=0;
                  TH1=0xB1;
                        TL1=0xE0;
                        cnt++;
                }
        }
        EA=1;
        
}

回复

使用道具 举报

ID:388197 发表于 2018-10-13 11:07 | 显示全部楼层
进入中断后,关闭中断,执行中断程序里的代码完后,再打开,还是可以进入中断的.
但是一般不这么写,更多的是某中断执行完其代码后,将自身使能位关闭,然后再其他中断或者main函数里根据需要条件触发再打开,如.
void main(void)
{
    .....
    ......
    while(1)
    {
        ....
        .....
        if(xxxx&&ex0==0)
        {
            ex0 = 1;
        }
        ............
        ............
    }
}
void ex0_ISR() interrupt 0
{
    .............
    ...............
   .................
    ex0 = 0;
}
建议中断程序里尽量不要写循环,更加不应该写DELAY,完全可以通过写IF来判断,然后设置标志位,main函数再根据标志位来执行对应的功能.如:
bit flag_1;
void main(void)
{
    while(1)
    {
        if(flag_1==1)
        {
             while(xxx)
             {
                  .............
                  ...........
             }
             delay(xxxx);
             flag_1 = 0;
             ex0 = 1;
        }
    }
}

void ex0_ISR() interrupt 0
{
    ex0 = 0;
    flag_1 = 1;
}

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:401564 发表于 2018-10-13 11:59 | 显示全部楼层
不会C语言,但原理是不变的:你可以在中断程序里先关闭中断,在中断返回的时候再打开,下一次一样的可以触发中断,这样可以避免中断等级低的中断被中断等级高的中断打断.

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:387733 发表于 2018-10-13 10:59 | 显示全部楼层
只要中断是打开的,每次下降沿都会产生中断。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:408855 发表于 2018-10-13 11:01 | 显示全部楼层
可以的啊,只要退出中断就能再次进入的啊

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:408991 发表于 2018-10-13 13:39 | 显示全部楼层
会,只要中断打开了,申请通过,就会进入中断服务

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:409017 发表于 2018-10-13 14:19 | 显示全部楼层
会的会的
回复

使用道具 举报

ID:409045 发表于 2018-10-13 15:00 | 显示全部楼层
注意中断时间的设定

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:409613 发表于 2018-10-14 20:52 | 显示全部楼层
可以的
回复

使用道具 举报

ID:123289 发表于 2018-10-14 21:17 | 显示全部楼层
取决于中断源有没有消失!

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表