标题: 请教51单片机中断程序 多谢 [打印本页]

作者: 大馒头    时间: 2023-4-25 12:27
标题: 请教51单片机中断程序 多谢
请问可否实现如下功能:在单片机外部中断服务程序里首先修改其自己的优先级,然后在执行这个外部中断服务程序里的代码时,再次触发这个外部中断

请问能实现么?

我遇到一个有点想不明白的问题:
我定义一个全局变量k,用于检测是低级的外部中断还是高级的外部中断,k为0时执行低级代码,k为1时执行高级代码
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仿真没问题。在低级中断无限循环时可以触发其自身高级中断,并能执行完一次闪烁再次返回低级中断无限循环
但是如果代码改成这样:低级外部中断时只执行一次,高级部分不变
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();
        }
}

以上代码仿真时,则一直留在了高级代码,不再返回低级继续执行了。
这是为什么呢?请求高人解惑!多谢多谢!

作者: Hephaestus    时间: 2023-4-25 14:27
你都k=0了,那么k==0只要满足一次永远满足,自然不会执行k!=0的代码了。
作者: 暖西夏    时间: 2023-4-25 14:33
对,你在K=0的代码里面先给K赋值1,在赋值0,那就不会进下面那个代码了
作者: byyw    时间: 2023-4-25 14:40
while(1)         
                {                       
                   P1=0xf0;               
                }       程序会一直死在这里把
作者: li64331218    时间: 2023-4-25 14:54
代码错误,仔细检查一下

作者: 大馒头    时间: 2023-4-25 15:46
Hephaestus 发表于 2023-4-25 14:27
你都k=0了,那么k==0只要满足一次永远满足,自然不会执行k!=0的代码了。

怪我没说明白。当执行k==0代码段时,其实时间挺长,有2秒钟。在这段代码最开始的地方,通过PX0=1修改了外部中断0的优先级,因此在这两秒钟器件,可以再次触发一次外部中断0(因为优先级已经改成高了,从而中断了过去那个低优先级的外部中断0程序)。
作者: 大馒头    时间: 2023-4-25 15:50
暖西夏 发表于 2023-4-25 14:33
对,你在K=0的代码里面先给K赋值1,在赋值0,那就不会进下面那个代码了

还是可以的。我没等低优先级的外部中断0服务程序执行完,就马上触发了高优先级外部中断0(通过修改PX0=1改变了外部中断0的优先级),因此按理说还没执行到k=0呢
作者: 大馒头    时间: 2023-4-25 15:51
byyw 发表于 2023-4-25 14:40
while(1)         
                {                       
                   P1=0xf0;            ...

这是我想要的结果。第一段尝试用无限循环,而第二段只是短时间显示
作者: yzwzfyz    时间: 2023-4-26 17:07
在中断未返回时,不会响应再次中断。直到返回时,才会被响应。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1