我使用的单片机是AT89C51,试过用弹出指令强行返回中断的方法,确实能够返回主程序,具体做法是:首先将堆栈中的地址弹出,然后压入主程序中新的地址,最后执行RETI指令就可以返回到该地址了。如果弹出指令执行完后直接用跳转指令而不通过RETI指令也能返回到主程序,但下次中断来时将不能再次响应。请问是从被嵌套的高优先级中断程序中怎样返回主程序,是不是还必须得通过最低级中断才能返回。要是直接返回的话,是否下次中断还能够正常响应?

答:对于51系列的单片机而言,当中端响应发生时,会将相应的优先级有效触发器职位;当退出中断时,执行RETI,单片机又自动将优先级有效触发器清0。因此,如果直接使用跳转指令从中断子程序出来的话,单片机没有清0优先级有效触发器,下一次中断发生时就不能响应了。
如果要从高优先级中断程序返回主程序的话,必须执行两条RETI指令,才可以清除高/低优先级有效触发器。具体的程序可以是: MOV DPTR, #LABLE1
POP ACC;将高优先级子程序返回地址出栈 POP ACC
PUSH DPL;将LABLE1地址入栈
PUSH DPHRETILABLE1:
POP ACC;将低优先级子程序返回地址出栈 POP ACC
MOV DPTR, #LABEL2
PUSH DPL;将LABLE2,即需要返回的主程序地址入栈 PUSH DPHRETI

生成海报
点赞

单片机

单片机学习,电子制作DIY学习与分享,各种新鲜的,有趣的,好玩的,一起来吧!机器人、无人机、树莓派/Raspberry Pi、arduino、极客、创客等

暂无评论

发表评论

相关推荐

叙述MCS-51中断响应处理过程。

CPU响应中断的过程可归纳如下:
(1)置位相应的优先级状态触发器,阻止低级中断。 (2)清零中断请求源标志(串行口中断除外)。 (3)把程序计数器PC的内容入栈(保护断点)。 (4)把相应的中断入口地址送PC。 (5)执行中断子程序。 (6)遇到指令RETI时,先清零优先级状态触发器,从栈顶弹出两字节送PC,返回主程序。

叙述MCS=51 CPU响应中断的条件?

(1)有申请的中断为高优先级中断。
(2)现行指令周期为最后一个机器周期。
(3)正在执行的指令不是中断返回指令或者是对IE,IP的写操作指令,如果是则还需执行一条指令。

简述80C51中断响应的过程。不同的中断源的中断入口地址是多少?

单片机一旦响应中断请求,就由硬件完成以下功能:
(1) 根据响应的中断源的中断优先级,使相应的优先级状态触发器置1;
(2) 执行硬件中断服务子程序调用,并把当前程序计数器PC的内容压入堆栈,保护断点,寻找中断源;
(3) 清除相应的中断请求标志位(串行口中断请求标志RI和TI除外);
(4) 把被响应的中断源所对应的中断服务程序的入口地址(中断矢量)送入PC,从而转入相应的中断服务程序。 (5)中断返回,程序返回断点处继续执行。 外部中断0(INT0) 0003H定时器T0中断 000BH外部中断1(INT1) 0013H定时器T1中断 001BH串行口中断 0023H

微信扫一扫

微信扫一扫

微信扫一扫,分享到朋友圈

我使用的单片机是AT89C51,试过用弹出指令强行返回中断的方法,确实能够返回主程序,具体做法是:首先将堆栈中的地址弹出,然后压入主程序中新的地址,最后执行RETI指令就可以返回到该地址了。如果弹出指令执行完后直接用跳转指令而不通过RETI指令也能返回到主程序,但下次中断来时将不能再次响应。请问是从被嵌套的高优先级中断程序中怎样返回主程序,是不是还必须得通过最低级中断才能返回。要是直接返回的话,是否下次中断还能够正常响应?