当前位置:
文档之家› 8051单片机看门狗原理C语言演示程序(以STC89C52RC单片机为例包含最简单的程序只有三条)
8051单片机看门狗原理C语言演示程序(以STC89C52RC单片机为例包含最简单的程序只有三条)
***************************************************************************/
#include <Reg52.H>
sfr WDT_CONTR=0xE1;
//定义特殊功能寄存器:STC 单片机看门狗控制寄存器
#define uchar unsigned char
//初始化时两盏灯都熄灭 LED=1; LED_busy=1;
TMOD=0x21; 为串行口波特率发生器
TH0=0x4C; TL0=0x00; IE=0x82; TR0=1;
//定时器 0 工作在方式 1,作为 16 位定时器;定时器 1 工作在方式 2,作
//定时器 0 装初值:每隔 50ms 溢出一次
#define true 1
#define false 0
#define WEIGOU WDT_CONTR=0x34
//看门狗启动设置和“喂狗”操作
sbit LED=P1^6; sbit LED_busy=P1^7;
//信号灯,系统正常工作就一闪一闪的 //工作灯,上电灭一会儿(约 800ms),然后正常工作的时
注解:这里顺便说一下,一般教材上叫“看门狗定时器”,其实定时器原理 还是计数器,只是计的是时钟周期,所以我为了初学者好理解叫统一叫“计数 器”,这里阐明一下。
明白了上面的原理,我们在设计程序时,先根据看门狗计数器的位数和系统 的时钟周期算一下计数器计满数需要的时间,就是说在这个时间内“看门狗”计 数器是丌会装满的,然后在这个时间内告诉它重新开始计数,就是把计数器清零,
由于现在 AT89S52 用的很广泛,所以我先说说 ATMEL 的看门狗;再说说本次试验用的 STC89C52RC 的看 门狗;注意两个不一样!!!
★下面是关于 ATMEL-51 单片机看门狗的描述 【看门狗计数器】(watchdog timer)是一个 14 位的计数器,它以机器周期(晶振频率/12)增加,
~6~
关于实验的注意事项:
1. 本次试验使用的是 11.0592MHz 晶振,设置 WDT_CONTR=(0011 0100)B,32 预分频,单片机使用 12 指令周期模式。
计算看门狗溢出时间:[12*32*32768/(11059200)]≈1s。 2. 本次试验的硬件电路很简单,就是最小系统上增加两个 LED 灯,原理图见正文,用户可以很容易实现。
如果没有我们的实验板,请按照下面的硬件原理图自己在最小系统上搭建一 个实验环境也很容易。 硬件电路图:
图 1. STC89C52 最小单片机系统+两个指示灯
~4~
图 2. 串行口接口(用于下载程序和测试本次试验) 实验现象及解释: 1. 我们设置 32 分频,看门狗溢出时间约为 1s。 2. 如果系统正常运行:
STC89C5X 系 列 单 片 机 由 于 采 用 了 “ 预 分 频 技 术 ” , 它 的 溢 出 时 间 是 =(N*Prescale*32768)/晶振频率(不要问我为什么,他们就是这么设计的,我们就 这么用就行)。
其中 N 是单片机的时钟周期,STC89C5X 系列单片机提供 6 时钟周期和 12 时钟周期两种时钟周期,可以在烧写程序时修改;
当计数值计满(16383/0x3FFF)了就使单片机软复位; 当启动了【看门狗计数器】之后,我们需要在它计数没有满之前复位计数器强制它不能够溢出,这个
过程称作喂狗。
"看门狗"原理: 1. 系统上电并不启动看门狗计数器,通过设置【看门狗重置寄存器(WDTRST SFR)】启动【看门狗计 数器】,一般设置是给 WDTRST 写入 0x1E 和 0xE1 启动; 2. 【看门狗计数器】一旦启动不可停止,除非是硬件 RST 或者看门狗的软复位才能使其停止; 3. 设计程序在适当的时间喂狗一次,使其不能计满,程序就能不间断执行; 4. 如果程序中出现死循环或者执行某一步超时,看门狗计数器就会计满溢出,(这个时候我们认为程 序没有按照预定计划执行--程序跑飞),则复位系统。
很多人初次接触丌太理解怎么用,书上也讲的含含糊糊,故意说的很复杂很 玄妙(可能是现在写书人的通病,生怕写的简单的别人觉得他没水平)。其实要 是说明白点:“看门狗”就是一个计数器,由于位数有限计数器能够装的数值是有 限的(比如 8 位的最多装 256 个数、16 位的最多装 65536 个数),从开启“看门狗” 那刻起,它就开始丌停的数机器周期,数一个机器周期就计数器加1,加到计数 器盛丌下了(术语叫溢出)就就产生一个复位信号,重启系统。
unsigned x,y; for(x=xms; x>0; x--)
for(y=110; y>0; y--);********************************************/
/*************************************************************************/ //主程序初始化函数 void InitMain() {
★下面是关于 STC89C5XX-51 单片机看门狗的描述(详细请看 STC89C51RC-RD 单片机使用说明) WDT_CONTR 位置 0xE1; [-] [-] [EN_WDT] [CLR_WDT] [IDLE_WDT] [PS2] [PS1] [PS0] EN_WDT: 看门狗允许位,置 1 启动看门狗,看门狗不能自动启动,需要设置该位后启动,一旦启
候一直亮着;用于指示系统是否重启
uchar timer0_ctr,i;
const uchar str[]="I love MCU!"; //定义一句话,让他从串口输出,只有系统重启的时候才输 出一次,所以也是用于验证看门狗有没有重启系统
/*************************************************************************/ //延时函数,11.0592MHz 晶振下延时约 xms 毫秒 void delay_ms(unsigned xms) {
上电会通过串行口发送一次“I love MCU!”字符串,通过串口调试助手可 以查看;
同时信号灯每隔 1.5s 闪一下; 工作指示灯在上电约 800ms 会点亮,只要系统正常运行会一直亮着。 3. 我们通过设置 while 大循环中的延时时间来调节喂狗时间,如果在 1s 内喂狗, 系统会正常运行,如果超过 1s,比如 2 秒喂狗一次,那么看门狗就会复位系 统,表现的现象就是:通过串口不停地发送字符串,同时两盏灯都不亮。
//IE=(1000 0010)B, 使能定时器 0 中断 //启动定时器 0
看门狗定时器预分频器,下表中 Prescale 表示预分频数
PS0 Prescale
根据时间不同的需要选择分频系数
0
0
0
2
0
0
1
4
0
1
0
8
0
1
1
16
1
0
0
32
1
0
1
64
1
1
0
128
1
1
1
256
看门狗溢出时间:(N*Prescale*32768)/晶振频率,其中 N 表示指令周期数 N=12 表示 12 时钟周 期模式;N=6 表示 6 时钟周期模式
~1~
这个过程叫“喂狗”,这样隔一段时间喂一次狗,只要程序正常运行他就永远计 丌满,一旦出现死循环之类的故障,没有及时来清零计数器,就会导致装满了溢 出,他就重启系统,这就是看门狗的看门原理,其实想想傻傻的、笨笨的。
举个例子说:8051 单片机选用 12MHz 晶振,一个时钟周期为 1us,如果“看 门狗计数器”是 16 位的,最大计数 65536 个,那么从 0 开始计到 65535 需要约 65ms, 所以我们可以在程序的 50ms 左右清零一次计数器(“喂狗”),让他重新从 0 开始 计,再过 50ms,再清,……,这样下去只要程序正常运行,计数器永远不会计 满,也就永远不会被“看门狗”复位。当然这个喂狗的时间是大家自己选的,只要 不超过 65ms,你选多少都可以,一般不要喂得太勤,这样单片机运行时间浪费 了,比如你 1ms 喂一次就太勤了,也不要说那我 65ms 喂一次,这样太边缘,这 样抗干扰能力就下降了,最好是留一定的余量,这个就是设计者自己掌握了,我 一般是让计到 90%左右就清一次。
每种单片机的“看门狗”实现方法丌尽相同,但是原理都一样,而且“看门 狗”都是启动了之后就丌能被关闭,只能系统复位(重新断电在上电)才能关闭。 设置“看门狗”的一般步骤如下:
1. 设置“看门狗”相关寄存器, 启动“看门狗”; 2. 隔一段时间清零一次,“喂狗”; 3. 如果程序正常,一直运行;如果程序出错,没有按时“喂狗”,“看门狗”就 在溢出的时候复位系统。
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 系列单片机的看门狗更有优势一些。当 然这个也是个人的选择,如果对时间要求的丌苛刻的话,勤喂几次狗也没关系。
~5~