目录
- 硬知识
- 测试程序
- main.c
- 现象
普中51-单核-A2
STC89C52
Keil uVision V5.29.0.0
PK51 Prof.Developers Kit Version:9.60.0.0
硬知识
摘自《STC89C52系列单片机器件手册》
适用型号:
STC89C51,STC89C52,STC89C53,STC89C14,STC89LE51,STC89LE52,STC89LE53,STC89LE14,STC89C54,STC89C58,STC89C516,STC89C510,STC89C512,STC89C514,STC89LE54,STC89LE58,STC89LE516,STC89LE510,STC89LE512,STC89LE514
在工业控制/ 汽车电子/ 航空航天等需要高可靠性的系统中,为了防止“系统在异常情况下,受到干扰,MCU/CPU程序跑飞,导致系统长时间异常工作”,通常是引进看门狗,如果MCU/CPU 不在规定的时间内按要求访问看门狗,就认为MCU/CPU处于异常状态,看门狗就会强迫MCU/CPU复位,使系统重新从头开始按规律执行用户程序。
STC89C52系列单片机内部也引进了此看门狗功能, 使单片机系统可靠性设计变得更加方便/简洁。为此功能,我们增加如下特殊功能寄存器WDT_CONTR:
WDT_CONTR: 看门狗(Watch-Dog-Timer)控制寄存器
EN_WDT :
看门狗允许位, 当设置为“1 ”时,看门狗启动。
CLR_WDT :
看门狗清“0”位,当设为“1”时,看门狗将重新计数。硬件将自动清“0 ”此位。
IDLE_WDT :
看门狗“IDLE ”模式位, 当设置为“1”时, 看门狗定时器在“空闲模式”计数
当清“0”该位时, 看门狗定时器在“空闲模式”时不计数
PS2,PS1,PS0 :
看门狗定时器预分频值,如下表所示
看门狗溢出时间 =(12×=(12×=(12×Pre-scale×32768)/×32768)/×32768)/Oscillator frequency
可视为16位的定时器:
看门狗溢出时间 =12/=12/=12/Oscillator frequency × 65536 × 2[PS2:PS0]2^{[PS2:PS0]}2[PS2:PS0]
测试程序
main.c
初始化看门狗,[PS2:PS0] = 0,晶振频率为11.0592MHz,则看门狗溢出时间 =12/=12/=12/ 11.0592M × 65536 × 2[PS2:PS0]=2^{[PS2:PS0]}=2[PS2:PS0]= 0.0711s = 71.1ms
#include <STC89C5xRC.H>#define WDT_EN 0x20
#define WDT_DIS 0x00
#define WDT_CLR 0x10
#define WDT_IDLE_EN 0x08
#define WDT_IDLE_DIS 0x00void main(void)
{WDT_CONTR = 0;WDT_CONTR = WDT_EN|WDT_CLR|WDT_IDLE_EN|0;P20 = 0;while(1){ }
}