找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1079|回复: 8
收起左侧

请教51单片机中断程序 多谢

[复制链接]
ID:918409 发表于 2023-4-25 12:27 | 显示全部楼层 |阅读模式
请问可否实现如下功能:在单片机外部中断服务程序里首先修改其自己的优先级,然后在执行这个外部中断服务程序里的代码时,再次触发这个外部中断

请问能实现么?

我遇到一个有点想不明白的问题:
我定义一个全局变量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();
        }
}

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

使用道具 举报

ID:883242 发表于 2023-4-25 14:27 | 显示全部楼层
你都k=0了,那么k==0只要满足一次永远满足,自然不会执行k!=0的代码了。
回复

使用道具 举报

ID:807182 发表于 2023-4-25 14:33 | 显示全部楼层
对,你在K=0的代码里面先给K赋值1,在赋值0,那就不会进下面那个代码了
回复

使用道具 举报

ID:998389 发表于 2023-4-25 14:40 | 显示全部楼层
while(1)         
                {                       
                   P1=0xf0;               
                }       程序会一直死在这里把
回复

使用道具 举报

ID:291668 发表于 2023-4-25 14:54 | 显示全部楼层
代码错误,仔细检查一下
回复

使用道具 举报

ID:918409 发表于 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程序)。
回复

使用道具 举报

ID:918409 发表于 2023-4-25 15:50 | 显示全部楼层
暖西夏 发表于 2023-4-25 14:33
对,你在K=0的代码里面先给K赋值1,在赋值0,那就不会进下面那个代码了

还是可以的。我没等低优先级的外部中断0服务程序执行完,就马上触发了高优先级外部中断0(通过修改PX0=1改变了外部中断0的优先级),因此按理说还没执行到k=0呢
回复

使用道具 举报

ID:918409 发表于 2023-4-25 15:51 | 显示全部楼层
byyw 发表于 2023-4-25 14:40
while(1)         
                {                       
                   P1=0xf0;            ...

这是我想要的结果。第一段尝试用无限循环,而第二段只是短时间显示
回复

使用道具 举报

ID:123289 发表于 2023-4-26 17:07 | 显示全部楼层
在中断未返回时,不会响应再次中断。直到返回时,才会被响应。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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