STC89C5X单片机“看门狗”原理详解

发布者:daasddla最新更新时间:2015-10-29 来源: eefocus关键字:STC89C5X  单片机  看门狗 手机看文章 扫描二维码
随时随地手机看文章
“看门狗定时器”是这样一种东西,从功能上说它可以让微控制器在意外状况下(比如软件陷入死循环)重新回复到系统上电状态,以保证系统出问题的时候重启一次。就跟我们现在用电脑一样,死机了你就按一下reset键重启一次电脑,看门狗就是负责干这个事儿的。它是52单片机增加的一个功能,以前Intel 8031、……、AT 89C51时代单片机片内都没有“看门狗”功能,需要我们外扩看门狗芯片,比如X5045。

  很多人初次接触不太理解怎么用,书上也讲的含含糊糊,故意说的很复杂很玄妙(可能是现在写书人的通病,生怕写的简单的别人觉得他没水平)。其实要是说明白点:“看门狗”就是一个计数器,由于位数有限计数器能够装的数值是有限的(比如8位的最多装256个数、16位的最多装65536个数),从开启“看门狗”那刻起,它就开始不停的数机器周期,数一个机器周期就计数器加1,加到计数器盛不下了(术语叫溢出)就就产生一个复位信号,重启系统。

  注解:这里顺便说一下,一般教材上叫“看门狗定时器”,其实定时器原理还是计数器,只是计的是时钟周期,所以我为了初学者好理解叫统一叫“计数器”,这里阐明一下。

  明白了上面的原理,我们在设计程序时,先根据看门狗计数器的位数和系统的时钟周期算一下计满数需要的时间,就是说在这个时间内“看门狗”计数器是不会装满的,然后在这个时间内告诉它重新开始计数,就是把计数器清零,这个过程叫“喂狗”,这样隔一段时间喂一次狗,只要程序正常运行他就永远计不满,一旦出现死循环之类的故障,没有及时来清零计数器,就会导致装满了溢出,他就重启系统,这就是看门狗的看门原理,其实想想傻傻的、笨笨的。

  举个例子说:8051 单片机选用12MHz晶振,一个时钟周期为1us,如果“看门狗计数器”是16位的,最大计数65536个,那么从0开始计到65535需要约65ms,所以我们可以在程序的50ms左右清零一次计数器(“喂狗”),让他重新从0开始计,再过50ms,再清,……,这样下去只要程序正常运行,计数器永远不会计满,也就永远不会被“看门狗”复位。当然这个喂狗的时间是大家自己选的,只要不超过65ms,你选多少都可以,一般不要喂得太勤,这样单片机运行时间浪费了,比如你1ms喂一次就太勤了,也不要说那我65ms喂一次,这样太边缘,这样抗干扰能力就下降了,最好是留一定的余量,这个就是设计者自己掌握了,我一般是让计到90%左右就清一次。

  每种单片机的“看门狗”实现方法不尽相同,但是原理都一样,而且“看门狗”都是启动了之后就不能被关闭,只能系统复位(重新断电在上电)才能关闭。设置“看门狗”的一般步骤如下:
  1. 设置“看门狗”相关寄存器, 启动“看门狗”;
  2.  隔一段时间清零一次,“喂狗”;
  3. 如果程序正常,一直运行;如果程序出错,没有按时“喂狗”,“看门狗”就在溢出的时候复位系统。

值得提一下:

  由于现在AT89S52应用比较广泛,所以我先说说ATMEL的看门狗;再说说本次试验用的STC89C52RC的看门狗;注意两个不一样!!!

  AT89S52单片机看门狗定时器是14位的,最大计数214=16384个数,每计16384个时钟周期就溢出一次。也就是说如果使用12M晶振的话,至少应该在16.384ms内喂一次狗。

  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秒之内喂一次狗就可以了。戏谑的说:这只狗比较抗饿,J~~

  对于我们用户来说,看门狗的时间是越长越好,这样可以节省更多的单片机资源,尤其是对时间要求精准的系统,如果执行过程中我们不停地“喂狗”,那么是比较浪费时间的。所以STC89C5X系列单片机的看门狗更有优势一些。当然这个也是个人的选择,如果对时间要求的不苛刻的话,勤喂几次狗也没关系。

  下面我就以STC89C52RC单片机为例说说典型的51单片机的看门狗程序如何写,关于STC89C52RC单片机的“看门狗”定义请看STC89C51RC-RD单片机使用说明。以下程序在Keil 2和Keil 3下调时通过,下载在本校的实验板上达到预期效果。STC89C52RC/54RD+/58RD+/516RD+单片机上测试正常运行。

  如果没有我们的实验板,请按照下面的硬件原理图自己在最小系统上搭建一个实验环境也很容易。

图1. STC89C52最小单片机系统+两个指示灯

图2. 串行口接口(用于下载程序和测试本次试验)

001 /***************************************************************************
002 程序功能:本程序演示STC51单片机看门狗程序
003 程序设计:燕山大学 鲁信琼
004 晶振选择:11.0592MHz, 如果晶振不匹配,请修改延时函数参数
005 承接51单片机、PIC单片机程序、VB/VC++上位机程序、电子产品软硬件设计开发工作
006 EMail: xqlu(at)ysu.net.cn  QQ: 9790335 
007  
008 由于现在AT89S52很流行,所以我先说说ATMEL的看门狗;再说说本次试验用的STC89C52RC的看门狗;注意两个不一样!!!
009  
010 ★下面是关于ATMEL-51单片机看门狗的描述
011     【看门狗计数器】(watchdog timer)是一个14位的计数器,它以机器周期(晶振频率/12)增加,当计数值计满(16383/0x3FFF)了就使单片机软复位;
012     当启动了【看门狗计数器】之后,我们需要在它计数没有满之前复位计数器强制它不能够溢出,这个过程称作喂狗。
013  
014     "看门狗"原理:
015     1. 系统上电并不启动看门狗计数器,通过设置【看门狗重置寄存器(WDTRST SFR)】启动【看门狗计数器】,一般设置是给WDTRST写入0x1E和0xE1启动;
016     2. 【看门狗计数器】一旦启动不可停止,除非是硬件RST或者看门狗的软复位才能使其停止;
017     3. 设计程序在适当的时间喂狗一次,使其不能计满,程序就能不间断执行;
018     4. 如果程序中出现死循环或者执行某一步超时,看门狗计数器就会计满溢出,(这个时候我们认为程序没有按照预定计划执行--程序跑飞),则复位系统。
019  
020 ★下面是关于STC89C5XX-51单片机看门狗的描述
021     WDT_CONTR位置0xE1; [-] [-] [EN_WDT] [CLR_WDT] [IDLE_WDT] [PS2] [PS1] [PS0]
022     EN_WDT: 看门狗允许位,置1启动看门狗,看门狗不能自动启动,需要设置该位后启动,一旦启动不能关闭(只能系统重新上电和看门狗复位可以关闭)
023     CLR_WDT:    看门狗计数器清零位,置1清零看门狗计数器,当计数器开始重新计数,硬件清零该位。
024     IDLE_WDT:   单片机IDLE模式看门狗允许位,当IDLE_WDT=1时,单片机在IDLE模式(空闲模式)依然启用看门狗
025     PS2~PS0:        看门狗定时器预分频器,下表中Prescale表示预分频数
026     PS2     PS1     PS0     Prescale
027     0       0       0       2
028     0       0       1       4
029     0       1       0       8
030     0       1       1       16
031     1       0       0       32
032     1       0       1       64
033     1       1       0       128
034     1       1       1       256
035  
036     看门狗溢出时间:(N*Prescale*32768)/晶振频率,其中N表示指令周期数N=12表示12时钟周期模式;N=6表示6时钟周期模式
037  
038 关于实验的注意事项:
039 1.  本次试验使用的是11.0592MHz晶振,设置WDT_CONTR=(0011 0100)B,32预分频,单片机使用12指令周期模式。
040     计算看门狗溢出时间:[12*32*32768/(11059200)]≈1s。
041 2.  本次试验的硬件电路很简单,就是最小系统上增加两个LED灯,原理图见正文,用户可以很容易实现。
042 ***************************************************************************/
043 #include
044 sfr WDT_CONTR=0xE1;                 //定义特殊功能寄存器:STC单片机看门狗控制寄存器
045 #define uchar unsigned char
046 #define true 1
047 #define false 0
048 #define WEIGOU WDT_CONTR=0x34       //看门狗启动设置和“喂狗”操作
049 sbit LED=P1^6;                      //信号灯,系统正常工作就一闪一闪的
050 sbit LED_busy=P1^7;                 //工作灯,上电灭一会儿(约800ms),然后正常工作的时候一直亮着;用于指示系统是否重启
051 uchar timer0_ctr,i;
052 const uchar str[]="I love MCU!";    //定义一句话,让他从串口输出,只有系统重启的时候才输出一次,所以也是用于验证看门狗有没有重启系统
053  
054 /*************************************************************************/
055 //延时函数,11.0592MHz晶振下延时约xms毫秒
056 void delay_ms(unsigned xms)
057 {
058     unsigned x,y;
059     for(x=xms; x>0; x--)
060         for(y=110; y>0; y--);
061 }
062 /*************************************************************************/
063  
064 /*************************************************************************/
065 //主程序初始化函数
066 void InitMain()
067 {
068     //初始化时两盏灯都熄灭
069     LED=1;
070     LED_busy=1;
071  
072     TMOD=0x21;              //定时器0工作在方式1,作为16位定时器;定时器1工作在方式2,作为串行口波特率发生器
073     TH0=0x4C;               //定时器0装初值:每隔50ms溢出一次
074     TL0=0x00;
075     IE=0x82;                //IE=(1000 0010)B, 使能定时器0中断
076     TR0=1;                  //启动定时器0
077 }
078 /*************************************************************************/
079  
080 /*************************************************************************/
081 //串行口初始化程序
082 void InitCOM()
083 {
084     SCON=0x50;          //SCON=(0101 0000)B,波特率不加倍,允许接收
085     TH1=0xFD;           //设置波特率=9600bps
086     TL1=TH1;
087     TR1=1;              //启动定时器1
088 }
089 /*************************************************************************/
090  
091 /*************************************************************************/
092 //定时器0中断服务程序程序,控制信号灯闪烁。如果系统正常运行,信号灯1.5秒闪一次
093 void Timer0_isr() interrupt 1
094 {
095     TH0=0x4C;
096     TL0=0x00;
097     timer0_ctr++;
098  
099     if(timer0_ctr>=30)
100     {
101         TR0=0;      //定时器0暂停,否则再次来中断会冲断程序
102         timer0_ctr=0;
103         LED=0;
104         delay_ms(100);
105         LED=1;
106         TR0=1;      //定时器0重新启动
107     }
108 }
109 /*************************************************************************/
110  
111 void main()
112 {
113     WEIGOU;                 //上来第一步设置看门狗定时器,并且启动
114     InitMain();
115     InitCOM();
116  
117     //开机通过串口发送一次“I love MCU!”,使用串口调试助手可以查看
118     //由于在while大循环外边,所以只要系统不重新启动,则上电后只会发送一次,用于判断系统是否重启
119     i=0;
120     while(str[i]!='')
121     {
122         SBUF=str[i];
123         while(TI==0);
124         TI=0;
125         i++;
126     }
127  
128     //while大循环
129     while(true)
130     {
131         //约每隔800ms喂一次狗,可以通过调整这里的喂狗时间来验证看门狗是否有效
132         //我们设置的看门狗约1秒。所以可以用800和2000分别做一次试验,看是否会被看门狗复位
133         delay_ms(2000);
134         LED_busy=0;         //第一次上电约延时800ms工作灯点亮,如果系统不重启,他将一直亮着,用于指示系统是否重启
135         WEIGOU;
136     }
137 }

关键字:STC89C5X  单片机  看门狗 引用地址:STC89C5X单片机“看门狗”原理详解

上一篇:基于51单片机的直流电机驱动(L298)
下一篇:51单片机中断寄存器组选择

推荐阅读最新更新时间:2024-03-16 14:37

用PIC单片机实现50Hz锁相信号发生器
    摘要: 在UPS不间断电源系统的设计中,与外部交流电压锁相的50Hz正弦信号发生器是十分关键的一部分,本文介绍了一种利用数字信号处理技术通过PIC单片机实现此电路的方法。     关键词: 单片机 信号发生器 数字信号处理 引言 不间断电源(UPS)通过逆变向用电设备提供纯净、稳定的电能,保证设备的正常运行,50Hz锁相正弦信号发生器则是其中的关键部分,作为系统输出电压的基准,不但要求它的输出信号频率和幅度稳定,还要与外部交流电的电压相位同步。 传统的交流信号发生方式采用反馈振荡电路,利用电路的自激振荡和选频作用输出正弦波,但是低频模拟振荡器有一个缺点:受电压和温度影响大,输出信号的频率和幅度
[工业控制]
单片机应用系统的问与答
为什么必须考虑单片机的选型问题? 答:单片机的的选型是一件重要而费心的事情,如果单片机型号选择得合适,单片机应用系统就会得经济,工作可靠;如果选择得不合适,就会造成经济浪费,影响单片机应用系统的正常运行,甚至根本就达不到预先设计的功能。 单片机选型不当时会带来什么危害? 答:对于一个已经设计好的单片机应用系统来说,它的技术要求和系统功能都应当十分明确.如果选择功能过于少的单片机,这个单片机应用系统就无法完成控制任务;但是如果选择的单片机功能过于强大,这不但没有必要,还会造成资源浪费,不降性能价格比。 单片机正确选型会带来什么益处? 答:只要掌握和运用单片机正确选型的原则,就可以选择出最能适用于应用系统的单片
[单片机]
1-wire系统中TM卡的单片机等效替换
1 TM卡简介   TM(Touch Memory)卡是美国Dallas公司的专利产品。它采用单线协议通信,通过瞬间碰触完成数据读写,既具有非接触式IC卡的易操作性,又具有接触式IC卡的廉价性,是当前性价比最优秀的IC卡之一。它的外形类似于一个钮扣(button)电池,可镶嵌于卡片、钥匙扣等物体上。   TM卡通过一个多功能器将数据线、地址线、控制线和电源线合并为1根线,实现单线通信。当主机加电时,TM卡通过500 kΩ和50 Ω阻抗之间的切换来响应主机,用信号被拉低的时长(长或短)来表示数字逻辑(长为1,短为0)。由于阻抗切换的幅度为10 000∶1,因此,触点的接触电阻不会影响数字信号的辨识。 2 1wire通信协议
[单片机]
1-wire系统中TM卡的<font color='red'>单片机</font>等效替换
ARM 单片机新手入门问答
Q: ARM 是什么? A:ARM(Advanced RISC Machines),既可以认为是一个公司的名字,也可以认为是对一类微处理器的通称,还可以认为是一种技术的名字。 1991年ARM公司成立于英国剑桥,主要出售芯片设计技术的授权。目前,采用ARM技术知识产权(IP)核的微处理器,即我们通常所说的ARM微处理器,已遍及工业控制、消费类电子产品、通信系统、网络系统、无线系统等各类产品市场,基于ARM技术的微处理器应用约占据了32位RISC微处理器75%以上的市场份额,ARM技术正在逐步渗入到我们生活的各个方面。 ARM公司是专门从事基于RISC技术芯片设计开发的公司,作为知识产权供应商,本身不直接从事芯片生产,靠转让
[单片机]
ARM <font color='red'>单片机</font>新手入门问答
C语言和汇编语言在开发单片机时各有哪些优缺点?
汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言。其主要优点是占用资源少、程序执行效率高。但是不同的CPU,其汇编语言可能有所差异,所以不易移植。 C语言是一种结构化的高级语言。其优点是可读性好,移植容易,是普遍使用的一种计算机语言。缺点是占用资源较多,执行效率没有汇编高。 对于目前普遍使用的RISC架构的8bit MCU来说,其内部ROM、RAM、STACK等资源都有限,如果使用C语言编写,一条C语言指令编译后,会变成很多条机器码,很容易出现ROM空间不够、堆栈溢出等问题。而且一些单片机厂家也不一定能提供C编译器。而汇编语言,一条指令就对应一个机器码,每一步执行什幺动作都很清楚,并且程序大小和堆
[单片机]
AVR单片机学习基础篇
简介:AVR单片机的性价比远高于51单片机一、高速 、RISC、主频最高可达20MHZ.二、低功耗、宽电压(1.8V---5.5V)。最低全速运行功耗 300uA三、I/O驱动能力强、推拉电流能力均达30mA ,可以直接驱动继电器、蜂鸣器等,四、片内资源丰富.尤其值得一提的是AVR的定时器功能也是非常强的能够实现PWM功能或输入捕获功能、PWM功能是非常强的可以用于电机的控制。 一、基础篇 单片机的基本要素 CPU核(如:51核 AVR核 M430核) ROM(READ ONLY Memory 绕母) RAM(random accessMemory随机访问寄存器 ) 片上外设 总线 CPU核:相当于电脑的CPU吧、就是执行
[单片机]
AVR<font color='red'>单片机</font>学习基础篇
51单片机(AT89C52)一键多功能(短按、长按)
短按(按下持续时间小于3s)一次数码管显示加1,同时流水灯计数加1。 长按(按下持续时间大于3s)时,数码管显示每500ms加1,同时流水灯每500ms计数加1。 #include reg52.h typedef unsigned char uchar; typedef unsigned int uint; #define NOKEY 0 #define KEYDOWN 1 #define KEYUP 2 uchar keystate; sbit key=P2^7; void keyscan(void); uchar timeflag; uchar code table = { 0x80,0xf2,0x48,0x60,
[单片机]
51<font color='red'>单片机</font>(AT89C52)一键多功能(短按、长按)
单片机接口的彩色TFT控制器RA8870的应用
1 概述 TFT因为轻薄,辐射少,数位化,已广泛应用在工业自动化,电力,电信,环保,医疗,金融等领域。 相对黑白模块,TFT液晶显示模块有它的复杂之处,它有显示接口多样,外围电路复杂,没有成熟的统一的驱动控制芯片,因此对客户来说,选择液晶屏、驱动控制方案、配件、以及应用调试都需要相当专业的人员来进行。所以对很多想用TFT的单片机用户来说,这是一座很高的门槛,一担心单片机系统要升级,二怕速度不够,效果不好,三怕成本过高,四怕编程麻烦。      内部方块图   系统方块图 3 RA8870应用接口 3.1应用接口图(一)   3.2应用接口图(二)   4. RA8870与数字屏模拟屏接口图   在使用模拟 TFT 屏时必
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved