有的单片机(如8098)有专门的复位指令,某些增强型MCS-51体系单片机尽管没有复位指令,但片内集成了WATCHDOG电路,故抗搅扰也不成问题。而普及型MCS-51系列单片机(如8031和8032)已然无复位指令,又不带硬件WATCHDOS,假如没有外接硬件WATCHDOG电路,就有必要选用软件抗搅扰技能。常用的软件抗搅扰技能有:软件圈套、指令冗余、软件WATCHDOG等,它们的作用是在体系受搅扰时能及时发现,再用软件的办法使体系复位。所谓软件复位便是用一系列指令来仿照复位操作,这便是MCS-51系列单片机所特有的软件复位技能。
现用一简略的试验阐明,试验电路如附图所示。接于仿真插座P1.0的发光二极管LED0用来表明主程序的作业状况,接于P1。1的发光二极管LED1用于表明初级中止子程序的作业状况,接于P1。2的发光二极管LED2用来表明高档中止子程序的作业状况,接于P3。2口的按钮用来建立搅扰标志,程序检测到搅扰标志后成心进入死循环或掉进陷井,仿照受搅扰的状况,然后查验各种复位办法的实际作用。寮验初始化程序如下:
ORG 0000H
STAT: LJMP MAIN ;复位进口地址
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 ET0
SETB ET1
SETB EX0
SETB PT1
SETB TR0
SETB TR1
SETB EA
LOOP: CPL P1.0 ;主程序发光二极管LED闪耀
MOV R6,#80H
MOV R7,#0
TT1:
DJNZ R7,TT1
DJNZ R6,TT1
SJMP LOOP
PX0:
SETB 00H ;建立搅扰标志,模仿产生搅扰
PT0: CPL P1.1 ;初级中止程序发光二极管LED1闪耀
RETI
PT1: CPL P1.2 ;高档中止程序发光二极管LED2闪耀
RETI
END
试验进程如下:
1. 按上述程序发动履行,三个发光二极管都应闪耀(否则应先排除故障),表明主程序和各中止子程序正常。因模仿搅扰标志未加检测,故不受按钮影响。
2. 修正主程序如下,按下按钮后主程序即掉入死循环中。
LOOP: CPL P1.0
MOV R6,#80H
MOV R7,#0H
TT1: DJNZ R7,TT1
DJNZ R6,TT1
JNB 00H,LOOP ;受搅扰否?
STOP: LJMP STOP ;掉入死循环。
这时能够看到,主程序中止作业(LED0中止闪耀),而两个中止子程序持续运转(LED1和LED2持续闪耀)。
3. 将定时器T1妆作软件WATCHDOG,将30H单元用作软件WATCHDOG计数器。主程序中参加一条复位软件WATCHDOG的指令。
LOOP: CPL P1.0
MOV 30H,#0 ;复位软件WATCHDOG计数器
LOOP: CPL P1.0
MOV R6,#80H
MOV R7,#0H
TT1: DJNZ R7,TT1
DJNZ R6,TT1
JNB 00H,LOOP ;受搅扰否?
STOP: LJMP STOP ;掉入死循环。
T1中止子程序修正如下:
PT1: CPL P1.2 ;高档中止程序发光二极管闪耀
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. 在一切指令中,只要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 ;铲除初级中止激活标志
这时,有必要履行两次RETI,才干抵达0000H,以确保铲除悉数中止激活标志,抵达和硬件复位相同的作用。相同,软件陷井也有必要由下列三条指令
NOP
NOP
LJMP STAT
改成:
NOP
NOP
LJMP ERR
才干抵达意图。
当主程序遭到搅扰被软件圈套捕获时,中止标志并未置位,履行ERR进程中,RETI指令等效于RET指令,相同能够抵达软件复位的意图。有爱好的读者能够将软件圈套代替死循环,别离用LJMP STAT和LJMP ERR1来代替LJMP ERR,再将搅扰检测别离设在初级中止和主程序中,试验成果必定证明同:只要LJMP ERR才干万无一失地完成软件复位,使体系脱节搅扰同,康复正常。在MCS-51单片机的软件复位进程中,有必要接连履行两次中止回来指令RETI。