51 单片机 看门狗 测试
在由单片机构成的系统中由于单片机的工作有可能受到外界电磁场的干扰造成程序的跑飞从而陷入死循环程序的正常运行被打断单片机控制的系统便无法继续工作这样会造成整个系统陷入停滞状态发生不可预测的后果所以出于对单片机运行状态进行实时监测的考虑便产生了一种专门用于监测单片机程序运行状态的芯片俗称“看门狗Watch Dog”。加入看门狗电路的目的是使单片机可以在无人状态下实现连续工作其工作过程为看门狗芯片和单片机的一个I/O引脚相连该I/O引脚通过单片机的程序控制使它定时地往看门狗芯片的这个引脚上送入高电平或低电平这一程序语句是分散地放在单片机其它控制语句中间的一旦单片机由于干扰造成程序跑飞而陷入某一程序段进入死循环状态时给看门狗引脚送电平的程序便不能被执行到这时看门狗电路就会由于得不到单片机送来的信号便对它与单片机复位引脚相连的引脚送出一个复位信号使单片机复位从而使单片机从程序存储器的起始位置重新开始执行程序这样便实现了单片机的自动复位。通常看门狗电路是通过将一个专门的看门狗芯片连接到单片机来实现的不过这样会给电路设计带来复杂性STC系列单片机内部自带了看门狗看门狗有一个15位的计数器在缺省状态下看门狗计数器不计数看门狗功能禁止。如果使能了看门狗功能则计数器由0开始计数计数到最大值32767时则单片机便产生复位。因此程序要定时对看门狗计数器进行清零以避免计数器溢出而引起系统复位这称之为“喂狗”。如果程序跑飞陷入死循环则无法喂狗看门狗就可以迫使单片机复位。通过对相应的特殊功能寄存器的设置就可实现看门狗的应用。STC89系列单片机内部有一个专门的看门狗定时器寄存器WDT_CONTR这个寄存器的定义如下这个寄存器中各位的定义分别为EN_WDT看门狗允许位当这一位设置为1时使能看门狗。CLR_WDT看门狗清0位当这一位设置为1时将看门狗的计数器清0。IDLE_WDT看门狗空闲模式位当这一位置1时看门狗计数器在空闲模式下计数当这一位清0时看门狗计数器在空闲模式下不计数。PS2~PS0看门狗计数器预分频系数。这三位用来设置看门狗计数器的计数周期。当采用12MHz的晶振并采用12时钟模式时PS2~PS0对预分频值和看门狗的溢出时间的设置如下表所示。溢出时间是如何计算的呢这需要对单片机的时钟模式进行一定了解。单片机的厂家不同单片机的时钟系统也会有些差别。我们只介绍STC单片机的时钟。单片机有一下几个周期概念1时钟周期也称为震荡周期它定义为时钟频率的倒数例如单片机的外部晶振为12MHz则它的时钟周期就是1/12us时钟周期是单片机中最基本、最小的时间单位在一个时钟周期内CPU仅完成一个最基本的动作。时钟脉冲是单片机最基本的工作脉冲它控制着单片机的工作节奏。对于一个单片机来讲时钟频率越高单片机的工作速度就越快但是由于不同的单片机内部硬件电路和电器结构不同所以需要的时钟频率范围也不一定相同我们使用的STC89C系列单片机的时钟范围约为1MHz~40MHz。2状态周期它是时钟周期的两倍。3机器周期单片机基本操作周期在一个操作周期内单片机完成一项基本的操作如取指令、存储器读写等。4指令周期它是CPU执行一条指令所需要的时间一般一个指令周期含有1~4个机器周期。STC单片机有两种时钟模式一种是单倍速也就是12时钟模式在该时钟模式下12个时钟周期为一个机器周期另一种是双倍速又称为6时钟模式在该时钟模式下6个时钟器为一个机器周期比12时钟模式快1倍。两种时钟模式可以通过烧写软件进行设置。如下图所示。一般情况我们用12时钟模式就可以了。看门狗计数器的时钟源为机器周期采用12MHz晶振则时钟源的频率为1MHz时钟源的周期为1us。若PS2~PS0设置为100则分频系数为32那么看门狗计数器的计数周期为32us计数器由0计数到32767的时间长度为32us*327681048576us。即溢出时间为1.0485秒。#include reg52.h sfr WDT_CONTR 0xE1; // 看门狗寄存器定义 sbit LED P1^0; // 测试LED sbit LED1 P1^7; // 测试LED // 简单延时 void Delay_ms(unsigned int t) { unsigned int i,j; for(it; i0; i--) for(j110; j0; j--); } // 开启看门狗 设置分频 void WDT_Init(void) { // EN_WDT1 开启PS2 PS1 PS0 110 分频128溢出2.56s WDT_CONTR 0x36; } // 喂狗函数清零看门狗计数器 void FeedDog(void) { WDT_CONTR | 0x40; // CLR_WDT置1自动清零. LED1~LED1; LED 0; } /* 四、两种测试现象 测试 1开启喂狗正常运行 LED 每隔 1 秒翻转一次持续闪烁 看门狗不断被清零不会产生复位程序稳定运行 测试 2屏蔽喂狗模拟程序死机 注释 FeedDog(); LED 正常闪烁大约 2~2.5 秒 看门狗计数溢出 → 单片机自动上电复位 LED 重新从头执行开机初始化反复重启肉眼可见频繁重启 */ void main(void) { WDT_Init(); LED 1; LED11; Delay_ms(500); LED10; LED 0; while(1) { LED ~LED; Delay_ms(1000); // 测试切换点 // 【正常模式】打开喂狗程序永不复位 FeedDog(); // 【死机测试】注释上面FeedDog(); 停止喂狗2.56s左右自动复位 } }仿真电路图测试现象1 【正常模式】打开喂狗程序永不复位喂狗时绿灯被点亮测试现象2 【正常模式】关闭喂狗程序复位不喂狗时绿灯不被点亮看门狗计数器没有清理一直复位关闭喂狗代码//FeedDog();效果图