我們使用看門狗的目的就是當單片機程序跑飛時,通過看門狗復位重新使單片機正常工作。那么看門狗主要的功能就是復位,因此每一次看門狗復位就閃爍LED 燈一段時間。那么怎樣令看門狗復位呢?很簡單,只要初始化看門狗后不喂狗就是了。如果不想LED 閃爍即LED 狀態(tài)保持不變,就必須在看門狗定時器溢出時間范圍內(nèi)喂狗,即通過按鍵外部中斷進行喂狗操作。
#include "stc.h"
#define LED_PORT P2 //定義LED 控制端口為P2 口
void Delay(void)
{
unsigned char i,j;
for(i=0;i<130;i++)
for(j=0;j<255;j++);
}
void WDTInit(void)
{
WDT_CONTR=0x35;//使能看門狗,預分頻64
}
void WDTFeed(void)
{
WDT_CONTR=0x35;
}
void EXTInit(void)
{
EX1=1; //允許外部中斷1 中斷
IT1=0; //低電平觸發(fā)
EA=1; //允許所有中斷
}
void main(void)
{
unsigned char i;
for(i=0;i<20;i++) //循環(huán)閃爍LED 燈
{
LED_PORT=~LED_PORT;
Delay();
}
WDTInit(); //初始化看門狗
EXTInit(); //外部中斷初始化
while(1); //讓看門狗定時器溢出復位
}
void EXT1IRQ(void)interrupt 2
{
WDTFeed(); //喂狗
}
涉及看門狗功能的函數(shù)分別是看門狗初始化函數(shù)WDTInit 和喂狗操作函數(shù)WDTFeed。在WDTInit函數(shù)中只有一個賦值操作,就是要對WDT_CONTR 看門狗定時器特殊功能寄存器賦值位0x35,即啟動看門狗、看門狗將重新計數(shù)、并且預分頻值為64。當單片機工作在12MHz 頻率下且看門狗定時器預分頻值為64,這是看門狗定時器溢出時間為2.0971s,可以從以下公式計算得到。
溢出時間=(12 x 預分頻x32768)/當前MCU 工作頻率
=12x64x32768/12000000
=2.097152s
喂狗操作函數(shù)WDTFeed 實質(zhì)就是將WDT_CONTR 初值重載,讓看門狗定時器重新計數(shù)。這個重載操作類似于定時器/計數(shù)器重載初值的操作。
看門狗的使用,只是提供一種輔助,以防止單片機系統(tǒng)死機。在編寫程序沒有加進看門狗的情況下,確保程序穩(wěn)定地執(zhí)行,不能太依賴看門狗。
看門狗的喂狗操作要及時,否則會造成單片機復位。喂狗操作實質(zhì)就是將 WDT_CONTR初值重載,讓看門狗定時器重新計數(shù)。這個重載操作類似于定時器/計數(shù)器重載初值的操作。
造成單片機工作不穩(wěn)定的原因有很多:如工作環(huán)境溫度過冷、過熱、電磁輻射干擾嚴重,程序不穩(wěn)定等等。
在其他類型的單片機中,看門狗定時器能夠作真正的定時器來使用,很顯然,STC89C52RC單片機內(nèi)部的看門狗的功能就顯得有些單薄。