⑴ 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);
 }
}