MCS51系列单片机软件复位的方法
4. 在所有指令中,只有RETI指令能清除中断激活标志。出错处理程序ERR主要是完成这一功能,其它的善后工作交由复位后的系统去完成。为此,我们重新设计T1中断子程序如下所示:
PT1: CPL P1.2 ;高级中断程序发光二极管闪烁
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: CPL P1.0
MOV R6,#80H
MOV R7,#0H
TT1: DJNZ R7,TT1
DJNZ R6,TT1
SJMP LOOP
PT0: CPL P1.1
JB 00H,STOP
RETI
STOP: LJMP STOP ;掉入死循环。
仔细分析后可能得出结论:当软件WATCHDOG是嵌套在低级中断中起作用时,复位后只清除了高级中断激活标志,低级中断标志仍然被置位,从而使低级中断一直被关闭。
5. 修改出错处理如下:
ERR: CLR EA ;正确的软件复位入口
MOV 66H,#0AAH ;重建上电标志
MOV 67H,#55H
MOV DPTR,#ERR1 ;准备第一次返回地址
PUSH DPL
PUSH DPH
RETI ;清除高级中断激活标志
ERR1: CLR A
PUSH ACC
PUSH ACC
RETI ;清除低级中断激活标志
评论