8051单片机“看门狗”原理、详解和C语言演示程序
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
★下面是关于 STC89C5XX-51 单片机看门狗的描述(详细请看 STC89C51RC-RD 单片机使用说明)
WDT_CONTR 位置 0xE1; [-] [-] [EN_WDT] [CLR_WDT] [IDLE_WDT] [PS2] [PS1] [PS0]
EN_WDT: 看门狗允许位,置 1 启动看门狗,看门狗不能自动启动,需要设置该位后启动,一旦启
~6~
关于实验的注意事项:
1. 本次试验使用的是 11.0592MHz 晶振,设置 WDT_CONTR=(0011 0100)B,32 预分频,单片机使用 12 指令周期模式。
计算看门狗溢出时间:[12*32*32768/(11059200)]≈1s。 2. 本次试验的硬件电路很简单,就是最小系统上增加两个 LED 灯,原理图见正文,用户可以很容易实现。
上电会通过串行口发送一次“I love MCU!”字符串,通过串口调试助手可 以查看;
同时信号灯每隔 1.5s 闪一下; 工作指示灯在上电约 800ms 会点亮,只要系统正常运行会一直亮着。 3. 我们通过设置 while 大循环中的延时时间来调节喂狗时间,如果在 1s 内喂狗, 系统会正常运行,如果超过 1s,比如 2 秒喂狗一次,那么看门狗就会复位系 统,表现的现象就是:通过串口不停地发送字符串,同时两盏灯都不亮。
看门狗定时器预分频器,下表中 Prescale 表示预分频数
PS2 PS1 PS0 Prescale
0
0
0
2
0
0
1
4
0
1
0
8
0
1
1
16
1
0
0Leabharlann Baidu
32
1
0
1
64
1
1
0
128
1
1
1
256
看门狗溢出时间:(N*Prescale*32768)/晶振频率,其中 N 表示指令周期数 N=12 表示 12 时钟周 期模式;N=6 表示 6 时钟周期模式
动不能关闭(只能系统重新上电和看门狗复位可以关闭)
CLR_WDT: 看门狗计数器清零位,置 1 清零看门狗计数器,当计数器开始重新计数,硬件清零该位。
IDLE_WDT: 单片机 IDLE 模式看门狗允许位,当 IDLE_WDT=1 时,单片机在 IDLE 模式(空闲模式)
依然启用看门狗
PS2~PS0:
注解:这里顺便说一下,一般教材上叫“看门狗定时器”,其实定时器原理 还是计数器,只是计的是时钟周期,所以我为了初学者好理解叫统一叫“计数 器”,这里阐明一下。
明白了上面的原理,我们在设计程序时,先根据看门狗计数器的位数和系统 的时钟周期算一下计数器计满数需要的时间,就是说在这个时间内“看门狗”计 数器是丌会装满的,然后在这个时间内告诉它重新开始计数,就是把计数器清零,
unsigned x,y; for(x=xms; x>0; x--)
for(y=110; y>0; y--); } /*************************************************************************/
/*************************************************************************/ //主程序初始化函数 void InitMain() {
文章:STC89C5X 单片机“看门狗”原理、详细说明和演示程序 作者:老鲁
原文地址:http://www.shuihan.com/article/45 (附 C 语言源程序)
“看门狗定时器”是这样一种东西,从功能上说它可以让微控制器在意外状 况下(比如程序陷入死循环)重新回复到系统上电状态,以保证系统出问题的时 候重启一次。就跟我们用电脑一样,死机了你就按一下 reset 键重启一次电脑, 看门狗就是负责干这个事儿的。它是 52 单片机增加的一个功能,以前 Intel 8031、……、AT 89C51 时代单片机片内都没有“看门狗”功能,需要我们外扩看门 狗芯片,比如 X5045。
//初始化时两盏灯都熄灭 LED=1; LED_busy=1;
TMOD=0x21; 为串行口波特率发生器
TH0=0x4C; TL0=0x00; IE=0x82; TR0=1;
//定时器 0 工作在方式 1,作为 16 位定时器;定时器 1 工作在方式 2,作
//定时器 0 装初值:每隔 50ms 溢出一次
由于现在 AT89S52 用的很广泛,所以我先说说 ATMEL 的看门狗;再说说本次试验用的 STC89C52RC 的看 门狗;注意两个不一样!!!
★下面是关于 ATMEL-51 单片机看门狗的描述 【看门狗计数器】(watchdog timer)是一个 14 位的计数器,它以机器周期(晶振频率/12)增加,
#define true 1
#define false 0
#define WEIGOU WDT_CONTR=0x34
//看门狗启动设置和“喂狗”操作
sbit LED=P1^6; sbit LED_busy=P1^7;
//信号灯,系统正常工作就一闪一闪的 //工作灯,上电灭一会儿(约 800ms),然后正常工作的时
~2~
值得提一下: 由于现在 AT89S52 应用比较广泛,所以我先说说 ATMEL 的看门狗;再说
说本次试验用的 STC89C52RC 的看门狗;注意两个丌一样!!! AT89S52 单片机看门狗定时器是 14 位的,最大计数 214=16384 个数,每计
16384 个时钟周期就溢出一次。也就是说如果使用 12M 晶振的话,至少应该在 16.384ms 内喂一次狗。
~3~
下面我就以 STC89C52RC 单片机为例说说典型的 51 单片机的看门狗程序如 何写,关于 STC89C52RC 单片机的“看门狗”定义请看 STC89C51RC-RD 单片机使 用说明。以下程序在 Keil 2 和 Keil 3 下调时通过,下载在本校的实验板上达到预 期效果。STC89C52RC/54RD+/58RD+/516RD+单片机上测试正常运行。
当计数值计满(16383/0x3FFF)了就使单片机软复位; 当启动了【看门狗计数器】之后,我们需要在它计数没有满之前复位计数器强制它不能够溢出,这个
过程称作喂狗。
"看门狗"原理: 1. 系统上电并不启动看门狗计数器,通过设置【看门狗重置寄存器(WDTRST SFR)】启动【看门狗计 数器】,一般设置是给 WDTRST 写入 0x1E 和 0xE1 启动; 2. 【看门狗计数器】一旦启动不可停止,除非是硬件 RST 或者看门狗的软复位才能使其停止; 3. 设计程序在适当的时间喂狗一次,使其不能计满,程序就能不间断执行; 4. 如果程序中出现死循环或者执行某一步超时,看门狗计数器就会计满溢出,(这个时候我们认为程 序没有按照预定计划执行--程序跑飞),则复位系统。
***************************************************************************/
#include <Reg52.H>
sfr WDT_CONTR=0xE1;
//定义特殊功能寄存器:STC 单片机看门狗控制寄存器
#define uchar unsigned char
很多人初次接触丌太理解怎么用,书上也讲的含含糊糊,故意说的很复杂很 玄妙(可能是现在写书人的通病,生怕写的简单的别人觉得他没水平)。其实要 是说明白点:“看门狗”就是一个计数器,由于位数有限计数器能够装的数值是有 限的(比如 8 位的最多装 256 个数、16 位的最多装 65536 个数),从开启“看门狗” 那刻起,它就开始丌停的数机器周期,数一个机器周期就计数器加1,加到计数 器盛丌下了(术语叫溢出)就就产生一个复位信号,重启系统。
候一直亮着;用于指示系统是否重启
uchar timer0_ctr,i;
const uchar str[]="I love MCU!"; //定义一句话,让他从串口输出,只有系统重启的时候才输 出一次,所以也是用于验证看门狗有没有重启系统
/*************************************************************************/ //延时函数,11.0592MHz 晶振下延时约 xms 毫秒 void delay_ms(unsigned xms) {
STC89C5X 系 列 单 片 机 由 于 采 用 了 “ 预 分 频 技 术 ” , 它 的 溢 出 时 间 是 =(N*Prescale*32768)/晶振频率(不要问我为什么,他们就是这么设计的,我们就 这么用就行)。
其中 N 是单片机的时钟周期,STC89C5X 系列单片机提供 6 时钟周期和 12 时钟周期两种时钟周期,可以在烧写程序时修改;
Prescale 是预分频数,通过设置【看门狗控制寄存器】可以设置为 2、4、 8、16、32、64、128、256;
晶振频率就是系统选用的晶振。 所以如果同样选择 12MHz 晶振,使用传统的 12 时钟周期,它最小的溢出时 间是 (12*2*32768 ) /(12*106)=65.536ms , 最大 溢出时间是 (12*256*32768 ) /(12*106)≈8.38s。如果选择 256 分频,也就是说只要在 8.38 秒之内喂一次狗就可 以了。戏谑的说:这只狗比较抗饿,~~ 对于我们用户来说,看门狗的时间是越长越好,这样可以节省更多的单片机 资源,尤其是对时间要求精准的系统,如果执行过程中我们丌停地“喂狗”,那 么是比较浪费时间的。所以 STC89C5X 系列单片机的看门狗更有优势一些。当 然这个也是个人的选择,如果对时间要求的丌苛刻的话,勤喂几次狗也没关系。
每种单片机的“看门狗”实现方法丌尽相同,但是原理都一样,而且“看门 狗”都是启动了之后就丌能被关闭,只能系统复位(重新断电在上电)才能关闭。 设置“看门狗”的一般步骤如下:
1. 设置“看门狗”相关寄存器, 启动“看门狗”; 2. 隔一段时间清零一次,“喂狗”; 3. 如果程序正常,一直运行;如果程序出错,没有按时“喂狗”,“看门狗”就 在溢出的时候复位系统。
如果没有我们的实验板,请按照下面的硬件原理图自己在最小系统上搭建一 个实验环境也很容易。 硬件电路图:
图 1. STC89C52 最小单片机系统+两个指示灯
~4~
图 2. 串行口接口(用于下载程序和测试本次试验) 实验现象及解释: 1. 我们设置 32 分频,看门狗溢出时间约为 1s。 2. 如果系统正常运行:
//IE=(1000 0010)B, 使能定时器 0 中断 //启动定时器 0
~7~
} /*************************************************************************/
~5~
程序代码:
/*************************************************************************** 程序功能:本程序演示 STC51 单片机看门狗程序 程序设计:燕山大学 鲁信琼 晶振选择:11.0592MHz, 如果晶振不匹配,请修改延时函数参数
~1~
这个过程叫“喂狗”,这样隔一段时间喂一次狗,只要程序正常运行他就永远计 丌满,一旦出现死循环之类的故障,没有及时来清零计数器,就会导致装满了溢 出,他就重启系统,这就是看门狗的看门原理,其实想想傻傻的、笨笨的。
举个例子说:8051 单片机选用 12MHz 晶振,一个时钟周期为 1us,如果“看 门狗计数器”是 16 位的,最大计数 65536 个,那么从 0 开始计到 65535 需要约 65ms, 所以我们可以在程序的 50ms 左右清零一次计数器(“喂狗”),让他重新从 0 开始 计,再过 50ms,再清,……,这样下去只要程序正常运行,计数器永远不会计 满,也就永远不会被“看门狗”复位。当然这个喂狗的时间是大家自己选的,只要 不超过 65ms,你选多少都可以,一般不要喂得太勤,这样单片机运行时间浪费 了,比如你 1ms 喂一次就太勤了,也不要说那我 65ms 喂一次,这样太边缘,这 样抗干扰能力就下降了,最好是留一定的余量,这个就是设计者自己掌握了,我 一般是让计到 90%左右就清一次。