STC89C52看门狗
扫描二维码
随时随地手机看文章
我们使用看门狗的目的就是当单片机程序跑飞时,通过看门狗复位重新使单片机正常工作。那么看门狗主要的功能就是复位,因此每一次看门狗复位就闪烁LED 灯一段时间。那么怎样令看门狗复位呢?很简单,只要初始化看门狗后不喂狗就是了。如果不想LED 闪烁即LED 状态保持不变,就必须在看门狗定时器溢出时间范围内喂狗,即通过按键外部中断进行喂狗操作。
#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; //低电平触发
EA=1; //允许所有中断
}
void main(void)
{
unsigned char i;
for(i=0;i<20;i++) //循环闪烁LED 灯
{
LED_PORT=~LED_PORT;
Delay();
}
WDTInit(); //初始化看门狗
EXTInit(); //外部中断初始化
while(1); //让看门狗定时器溢出复位
}
void EXT1IRQ(void)interrupt 2
{
WDTFeed(); //喂狗
}
涉及看门狗功能的函数分别是看门狗初始化函数WDTInit 和喂狗操作函数WDTFeed。在WDTInit函数中只有一个赋值操作,就是要对WDT_CONTR 看门狗定时器特殊功能寄存器赋值位0x35,即启动看门狗、看门狗将重新计数、并且预分频值为64。当单片机工作在12MHz 频率下且看门狗定时器预分频值为64,这是看门狗定时器溢出时间为2.0971s,可以从以下公式计算得到。
溢出时间=(12 x 预分频x32768)/当前MCU 工作频率
=12x64x32768/12000000
=2.097152s
喂狗操作函数WDTFeed 实质就是将WDT_CONTR 初值重载,让看门狗定时器重新计数。这个重载操作类似于定时器/计数器重载初值的操作。
看门狗的使用,只是提供一种辅助,以防止单片机系统死机。在编写程序没有加进看门狗的情况下,确保程序稳定地执行,不能太依赖看门狗。
看门狗的喂狗操作要及时,否则会造成单片机复位。喂狗操作实质就是将 WDT_CONTR初值重载,让看门狗定时器重新计数。这个重载操作类似于定时器/计数器重载初值的操作。
造成单片机工作不稳定的原因有很多:如工作环境温度过冷、过热、电磁辐射干扰严重,程序不稳定等等。
在其他类型的单片机中,看门狗定时器能够作真正的定时器来使用,很显然,STC89C52RC单片机内部的看门狗的功能就显得有些单薄。