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