⑴ AT89S52 單片機的看門狗watchdog代碼及硬體注意事項
在程序初始化中向看門狗寄存器(WDTRST地址是0A6H)中先寫入01EH,再寫入0E1H。即可激 活看門狗。
ORG 0000H
LJMP begin
Begin:
MOV 0A6H,#01EH ;先送1E
MOV 0A6H,#0E1H ;後送E1
;在程序初始化中激活看門狗。
……
……
For:
……
MOV 0A6H,#01EH ;先送1E
MOV 0A6H,#0E1H ;後送E1
;喂狗指令
……
LJMP For
在C語言中要增加一個聲明語句。 在AT89X51.h聲明文件中增加一行 sfr WDTRST = 0xA6;
Main()
{
WDTRST=0x1E;
WDTRST=0xE1;//初始化看門狗。
While (1)
{
WDTRST=0x1E;
WDTRST=0xE1;//喂狗指令
}
}
其他參考代碼:
AJMP MAIN ;匯編
MAIN:
;啟動看門狗
Mov 0A6H,#01EH ;先送1E
Mov 0A6H,#0E1H ;後送E1
;主程序
START:
ACALL WDT ;調用復位看門狗子程序
AJMP START
;主程序
;復位看門狗子程序
WDT:
Mov 0A6H,#01EH ;先送1E
Mov 0A6H,#0E1H ;後送E1
RET
END
注意事項:
1. 89S52的看門狗必須由程序激活後才開始工作。所以必須保證CPU有可靠的上電復位。否則看門狗也無法工作。
2. 看門狗使用的是CPU的晶振。在晶振停振的時候看門狗也無效。
3. 89S52隻有14位計數器。在16383個機器周期內必須至少喂狗一次。而且這個時間是固定的,無法更改。當晶振為12M時每16個毫秒需喂狗一次。還可利用定時器把看門狗的喂狗時間延長幾秒至幾分鍾。
你不往寄存器寫值,默認是沒有開看門狗的,你就不用管了
AT89S52單片機看門狗C語言程序
watchdog.h:
#include <reg52.h>
sbit LED1 = P1^0;
sbit LED2 = P1^1;
sfr WDTRST = 0xA6; //定義AT89S52擴展寄存器
/*********************************************************/
/*函數名字:wdtclear */
/*輸入參數:無 */
/*輸出參數:無 */
/*功能描述:喂狗指令 */
/*創建日期: 2009-04-25 */
/*********************************************************/
void wdtclear(void)
{
WDTRST=0x1E;
WDTRST=0xE1;
}
/*********************************************************/
/*函數名字:delay_nms */
/*輸入參數:延時毫秒周期參數 */
/*輸出參數:無 */
/*功能描述:延時 n 毫秒 */
/*創建日期: 2009-04-25 */
/*********************************************************/
void delay_nms(unsigned int n)
{
unsigned int i;
unsigned int ii;
for(i=0;i<n;i++)
{
for(ii=0;ii<1000;ii++);
wdtclear(); //LED1閃爍. 注釋掉這條語句後,LED1常亮
}
}
watchdog.c:
#include "watchdog.h"
main()
{
unsigned int i;
WDTRST = 0x1E; //開看門狗,包含兩條指令。一旦開看門狗就沒有辦法關閉。
WDTRST = 0xE1;
LED1 = 0;
while(1)
{
LED1 = 0;
delay_nms(100); //超過16毫秒不喂狗,看門狗溢出復位。
LED1 = 1;
delay_nms(100);
}
}