|
单片机教程 栏目导航
第一页..单片机入门教程
第二页..单片机c语言
第三页..红外遥控和步进电机
第四页..单片机问答
我使用的单片机是AT89C51,试过用弹出指令强行返回中断的方法,确实能够返回主程序,具体做法是:首先将堆栈中的地址弹出,然后压入主程序中新的地址,最后执行RETI指令就可以返回到该地址了。如果弹出指令执行完后直接用跳转指令而不通过RETI指令也能返回到主程序,但下次中断来时将不能再次响应。请问是从被嵌套的高优先级中断程序中怎样返回主程序,是不是还必须得通过最低级中断才能返回。要是直接返回的话,是否下次中断还能够正常响应? 答:对于51系列的单片机而言,当中端响应发生时,会将相应的优先级有效触发器职位;当退出中断时,执行RETI,单片机又自动将优先级有效触发器清0。因此,如果直接使用跳转指令从中断子程序出来的话,单片机没有清0优先级有效触发器,下一次中断发生时就不能响应了。
如果要从高优先级中断程序返回主程序的话,必须执行两条RETI指令,才可以清除高/低优先级有效触发器。具体的程序可以是:
MOV DPTR, #LABLE1 POP ACC ;将高优先级子程序返回地址出栈 POP ACC PUSH DPL ;将LABLE1地址入栈 PUSH DPH RETI LABLE1: POP ACC ;将低优先级子程序返回地址出栈 POP ACC MOV DPTR, #LABEL2 PUSH DPL ;将LABLE2,即需要返回的主程序地址入栈 PUSH DPH RETI
|