中断程序的编写包括主程序的编写和中断子程序的编写。
1.编写主程序(即中断初始化)
主程序的一般编写过程如下:
1)设置中断源和中断触发方式。根据需要确定中断的性质,通过设置寄存器TCON或SCON相应位的值来选择是外部中断,还是定时/计数器中断等;设置中断触发方式是低电平触发,还是下降沿触发。
2)设置中断优先顺序。根据中断紧急程度(当有多个中断源时)确定中断源的优先顺序,以此来设置寄存器IP中相应位的值。
3)打开中断。通过在寄存器IE中设置相应的值,打开各个中断。
2.编写中断子程序
中断子程序的编写过程如下:
1)关中断。进入中断后,一般先要将中断关闭,再进行现场保护,如在前面的实例中,可在“PUSH ACC”指令前加一条“CLR EA”指令,就能将总中断关闭。
2)保护现场。为了防止执行中断子程序的过程中改变ACC和PSW中的数据,要用“PUSH”指令将ACC和PSW中的数据送入堆栈中保护起来。
3)开启中断。现场保护好后,再开启中断,如在前面实例的“PUSH PSW”指令后加一条“SETB EA”指令,就能将总中断打开。
4)执行中断服务。中断服务程序是中断子程序中的核心,前面实例中的“CPL P2.2”指令就是中断服务程序。
5)关闭中断。中断服务程序执行后又要关闭中断,以恢复现场,如在前面的实例中,可在“CPL P2.2”指令后加一条“CLR EA”指令,就能将总中断关闭。
6)恢复现场。恢复现场的方法是用“POP”指令将堆栈中的数据送还给ACC和PSW。(www.xing528.com)
7)退出中断子程序,返回主程序。在中断子程序的最后用“RETI”指令可以退出中断子程序,返回主程序。
【例4-1】 如图4-4所示,使用外部中断0改变LED闪烁方式。当主程序正常执行时,P2连接的8个LED将闪烁。若按下开关,LED变为单灯左移,左移3个循环(最左边到最右边为一个循环)后恢复中断前状态,程序将继续执行八个LED闪烁的功能。
解答:设计要点如下:
1)首先必须设置中断向量,的中断向量为03H。希望在中断后执行中断子程序(LED循环左移三次)。将中断子程序命名为INT—0,方便理解和记忆,但不能使用INT0,以免与汇编语言关键字重复,导致错误。
2)声明中断向量后,打开总开关EA及开关(EX0),置触发方式为边沿触发(IT0置“1”),另外把堆栈指针移至安全位置5FH(MOV SP,#5FH)。
IE的初始化设置为
3)主程序实现的是8个LED闪烁,中断子程序里一开始先把主程序的数据存入堆栈,包括状态字寄存器PSW和累加器A,然后将工作寄存器切换到RB1(第一组),以避免返回到主程序之后的结果受到影响。中断返回(RETI)前再出栈,“一定是先入后出,后入先出”。
4)中断子程序执行单灯左移3个循环程序。两个寄存器R1和R0充当计数循环的计数器。从最左边移动到最右边需8次,用R1为其计数;这样的动作需循环3次,用R0来记录。
流程图与程序设计如下:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。