AT89S51單片機看門狗定時器的使用
T89S51看門狗定時器由一個14位定時器及WDTRST(地址為6AH)寄存器構成。開啟看門狗定時器后,14位定時器會自動計數,每16384(214)個機器周期溢出一次,并產生一個高電平復位信號,使系統復位。對于12MHZ的時鐘脈沖每16384us(約0.016s)產生一個復位信號。
如果啟動看門狗定時器,當系統超過0.016s沒有動作(程序跑飛),看門狗定時器自動復位,讓系統歸復于正常運作狀態。為了系統既能正常工作又不會出現死機(程序跑飛),在0.016s內必須喂狗一次,即對看門狗定時器進行復位,看門狗的啟動和復位的方法是一樣的。
在匯編語言中啟動或復位看門狗定時器的命令如下。
MOV 6AH, #1EH
MOV 6AH, #0E1H
若要在C語言中使用看門狗定時器功能,由于reg51.h中并沒有聲明WDTRST寄存器,所以必須先聲明WDTRST寄存器。
Sfr WDTRST=0xa6;
進行聲明以后可以用一下命令啟用或復位看門狗定時器。
WDTRST=0x1e;
WDTRST=0xe1;
下面用一個C語言進行說明
#include 《reg51.h》
Sfr WDTRST=0xa6;
Main()
{ ……;
WDTRST=0x1e;
WDTRST=0xe1;
While(1)
{ WDTRST=0x1e;
WDTRST=0xe1;
……;
……; 這部分執行時間必須少于0.016s } }
以上程序中系統在做一個無限循環的動作,通過看門狗定時器可以防止程序在執行過程中跑飛。因為只要程序一跑出while()循環,看門狗定時器溢出以后得不到復位,所以自動復位系統,讓程序從mian()開始重新運行。
但是在C語言應用看門狗定時器也特別小心,一定要在看門狗定時器啟動后的0.016s內喂一次狗。
注:在匯編語言中每條指令的執行時間都是可以準確算出來,下面是一個匯編語言編寫的8路led向左移程序應用看門狗定時器的實例。
ORG 00H 1 1us
MOV 0A6H,#1EH 2 1us
MOV 0A6H,#0E1H 3 1us
START: MOV A,#0FEH 4 1us
LOOP: MOV P2,A 5 1us
CALL DELAY 6 2us
RL A 7 2us
JMP LOOP 8 2us
DELAY: MOV R7,#200 9 1us
DV: MOV R6,#250 10 1us
DJNZ R6,$ 11 2us
MOV 0A6H,#1EH 2 1us
MOV 0A6H,#0E1H 3 1us
DJNZ R7,DV 12 2us
RET 13 2us
END 14 2us
在程序的每個行標號后面是12MHZ時鐘脈沖下的指令執行時間,為了讓系統正常工作且不死機將看門狗定時器啟動指令放在1和2之間,將看門狗定時器復位指令放在11和12之間。
現在一起通過執行時間來計算看門狗定時器復位指令放在那里比較合適。
程序執行順序:1 2 3 4 5 6 9 10 11 12 9 10 ……
運行時間: 1us 1 1 1 1 2 1 1 2*250 us (1+250*2+2)*199
程序運行到11的時候用的時間是2*250+6=506us《16384us
程序運行到12的時候用的時間是506+(1+250*2+2)*199=10063us》16384us
從比較結果可以看出,看門狗定時器的喂狗指令必須放在11和12之間。可以想一下放在12和13之間會是什么效果。
評論
查看更多