当前位置:首页 > 技术学院 > 热搜器件
[导读]我们使用看门狗的目的就是当单片机程序跑飞时,通过看门狗复位重新使单片机正常工作。那么看门狗主要的功能就是复位,因此每一次看门狗复位就闪烁LED 灯一段时间。那么怎样令看门狗复位呢?很简单,只要初始化看门狗后不喂狗就是了。如果不想LED 闪烁即LED 状态保持不变,就必须在看门狗定时器溢出时间范围内喂狗,即通过按键外部中断进行喂狗操作。

我们使用看门狗的目的就是当单片机程序跑飞时,通过看门狗复位重新使单片机正常工作。那么看门狗主要的功能就是复位,因此每一次看门狗复位就闪烁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单片机内部的看门狗的功能就显得有些单薄。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读
关闭