复位入口地址
LJMP PX0 ;按钮中断向量(低级中断)
ORG 000BH
LJMP PT0 ;t0中断向量(低级中断)
ORG 001BH
LJMP PT1 ;T1中断向量(高级中断)
ORG 0030H
MAIN:
CLR EA
MOV SP,#7
MOV P1,#0FFH
MOV P3,#0FFH
MOV TMOD,#11H
CLR 00H ;干扰标志初始化
SETB主程序发光二极管LED闪烁
MOV设立干扰标志,模拟发生干扰
PT0: CPL P1.1 ;低级中断程序发光二极管LED1闪烁
RETI
PT1: CPL P1.2 ;高级中断程序发光二极管LED2闪烁
RETI
END
实验步骤如下:
1.受干扰否?
STOP: LJMP STOP ;掉入死循环。复位软件WATCHDOG计数器
LOOP:受干扰否?
STOP: LJMP STOP ;掉入死循环。高级中断程序发光二极管闪烁
INC 30H
MOV A,30H
ADD A,#0FDH
JC ERR ;达到3次否?
RETI
ERR: LJMP STAT ;软件WATCHDOG动作
当按下按钮前,程序正常运行(三个LED全闪)。按下按钮后,主程序能迅速恢复工作,但
两个中断子程序被封锁,不再工作。过程如下:主程序检测到干扰后进入死循环,不能执
行复位30H单元的操作,T1中断使30H不断增值,计数到3时,软件WATCHDOG执行动作,执行
一条LJMP指令,使程序从头执行。MAIN过程中清除了干扰标志(表示干扰已经过去),使
主程序迅速恢复工作。按理说MAIN过程中也重新设定了各个中断,并开放了它们,为什么
中断不能恢复工作呢?这是因为中断激活标志的复位工作被遗忘了,因为它没有明确的位
地址可供编程,直接转向0000H地址并不能完成真正的复位。软件复位是使用软件陷井和软
件WATCHDOG后必须进行的工作,这时程序出错完全有可能发生中断子程序中,中断激活标
志已置位,它将阻止同级中断响应。由于软件WATCHDOG是高级中断,它将阻止所有中断响
应。由此可见,清除中断激活标志的得要性,很多文献的作者回为没有认识到这一点进入
误区。
4.高级中断程序发光二极管闪烁
INC 30H ;软件WATCHDOG计数器增值
MOV A,30H
ADD A,#0FD
JC ERR ;达到3次否?
RETI
ERR: CLR EA ;关中断
CLR A ;准备复位地址(0000H)
PUSH ACC
PUSH ACC
RETI ;清除中断激活标志并复位
这段程序先关中断,以便后续处理能顺利进行,然后用RETI指令替代LJMP指令,从而既清
除了中断激活标志又完成了转向0000H的任务。按这样改好后程序再运行,结果仍不理想:
按下按钮后,有时只有主程序和高级中断子程序能迅速恢复正常,而低级中断仍有被关闭
的可能。如果按如下方法把干扰转移到低级中断中,则按下按钮后低级中断必然被关闭:
LOOP:掉入死循环。正确的软件复位入口
MOV 66H,#0AAH ;重建上电标志
MOV 67H,#55H
MOV DPTR,#ERR1 ;准备第一次返回地址
PUSH DPL
PUSH DPH
RETI ;清除高级中断激活标志
ERR1: CLR A
PUSH ACC
PUSH ACC
RETI ;清除低级中断激活标志
这时,必须执行两次RETI,才能到达0000H,以保证清除全部中断激活标志,达到和硬件复
位相同的效果。同样,软件陷井也必须由下列三条指令
NOP
NOP
LJMP STAT
改成:
NOP
NOP
LJMP ERR
才能达到目的。
当主程序受到干扰被软件陷阱捕获时,中断标志并未置位,执行ERR过程中,RETI指令等效
于RET指令,同样可以达到软件复位的目的。有兴趣的读者可以将软件陷阱代替死循环,分
别用LJMP STAT和LJMP ERR1来替代LJMP ERR,再将干扰检测分别设在低级中断和主程序
中,实验结果必然证明同:只有LJMP ERR才能万无一失地实现软件复位,使系统摆脱干扰
同,恢复正常。在MCS-51单片机的软件复位过程中,必须连续执行两次中断返回指令RETI
才能确保系统恢复正常。