历史上的今天
返回首页

历史上的今天

今天是:2025年02月01日(星期六)

2018年02月01日 | STC89单片机看门狗的使用及应用程序

2018-02-01 来源:eefocus

“看门狗”概念及其应用在由 单片机 构成的系统中,由于单片机的工作有可能会受到来自外界电磁场的干扰,造成程序的跑飞,从而陷入死循环,程序的正常运行被打断,由单片机控制的系统便无法继续工作,这样会造成整个系统陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的芯片,俗称“看门狗”(watch dog)。


加入看门狗电路的目的是使 单片机 可以在无人状态下实现连续工作, 其工作过程如下:看门狗芯片和单片机的一个I/O引脚相连,该I/O引脚通过单片机的程序控制,使它定时地往看门狗芯片的这个引脚上送入高电平(或低电平),这一程序语句是分散地放在单片机其他控制语句中间的,一旦单片机由于干扰造成程序跑飞后而陷入某一程序段进入死循环状态时,给看门狗引脚送电平的程序便不能被执行到,这时,看门狗电路就会由于得不到单片机送来的信号,便将它和单片机复位引脚相连的引脚上送出一个复位信号,使单片机发生复位,从而单片机将从程序存储器的起始位置重新开始执行程序,这样便实现了单片机的自动复位。
通常看门狗电路需要一个专门的看门狗芯片连接 单片机 来实现,这在我们的单片机教程网 http://www.51hei.com 以前做过相关的电路介绍。不过这样会给电路设计带来复杂,STC单片机内部自带有看门狗,通过对相应特殊功能寄存器的设置就可实现看门狗的应用,STC89系列单片机内部有一个专门的看门狗定时器寄存器,Watch Dog Timer 寄存器,其相应功能见下个知识点。
看门狗定时器寄存器(WDT_CONTR)
STC 单片机 看门狗定时器寄存器在特殊功能寄存器中的字节地址为E1H,不能位寻址, 该寄存器用来管理STC单片机的看门狗控制部分,包括启停看门狗、设置看门狗溢出时间等。单片机复位时该寄存器不一定全部被清0,在STC下载程序软件界面上可设置复位关看门狗或只有停电关看门狗的选择,大家根据需要可做出适合自己设计系统的选择。其各位的定义如表4.2.1所示。


表1看门狗定时器寄存器(WDT_CONTR)

位序号

D7

D6

D5

D4

D3

D2

D1

D0

位符号

--

--

EN_WDT

CLR_WDT

IDLE_WDT

PS2

PS1

PS0


EN_WDT:看门狗允许位,当设置为“1”时,启动看门狗。
CLR_WDT :看门狗清“0”位,当设为“1”时,看门狗定时器将重新计数。硬件 自动清“0”此位。
IDLE_WDT:看门狗“IDLE”模式位,当设置为“1”时,看门狗定时器在 单片机 的“空闲模式”计数,当清“0”该位时, 看门狗定时器在单片机的“空闲模式” 时不计数。
PS2、PS1、PS0:看门狗定时器预分频值,不同值对应预分频数如表4.2.2所示。


表2 12M晶振看门狗定时器预分频值

PS2

ps1

ps0

预分频数

看门狗溢出时间

0

0

0

2

65.5ms

0

0

1

4

131.0ms

0

1

0

8

262.1ms

0

1

1

16

524.2ms

1

0

0

32

1.0485s

1

0

1

64

2.0971s

1

1

0

128

4.1943s

1

1

1

256

8.3886s

看门狗溢出时间与预分频数有直接的关系,公式如下:

看门狗溢出时间=(N×预分频数×32768)/晶振频率
上式中N表示STC 单片机 的时钟模式,STC单片机有两种时钟模式:单倍速,也就是12时钟模式,这种时钟模式下,STC单片机与其它公司51单片机具有相同的机器周期,即12个振荡周期为一个机器周期;另一种为双倍速,又被称为6时钟模式,在这种时钟模式下,STC单片机比其它公司的51单片机运行速度要快一倍,关于单倍速与双倍速的设置在下载程序软件界面上有设置选择,大家可自行下载测试程序运行速度。预分频数的值由PS2、PS1和PS0的组合确定,如表4.2.2所示。晶振频率即为当前系统的时钟频率。
下面我们通过两个例子来进一步讲解使用看门狗和不使用看门狗时程序运行的区别,由于STC 单片机 的高抗干扰特点,至今我还未曾遇到过程序跑飞的情况,因此我们也很难人为制造出使单片机程序跑乱的情况,下面的程序演示利用看门狗的溢出时间来使程序自动复位运行。
【例】:在TX-1C实验板上实现如下描述:程序启动后设定看门狗溢出时间为2秒左右,然后点亮第一个发光二极管,稍延时一会,然后熄灭发光二极管,使程序进入等待死循环状态,并且在死循环中大约每隔1秒喂狗一次,看程序运行是否正常。
新建文件part3.4.2.c,程序代码如下:

#include //52系列 单片机 头文件
#define uchar unsigned char
#define uint unsigned int 
sfr WDT_CONTR=0xe1;
sbit LED1=P1^0;
void delayms(uint xms) 
{
uint i,j;
for(i=xms;i>0;i--) //i=xms即延时约xms毫秒
for(j=110;j>0;j--);
}
void main()
{
WDT_CONTR=0x35;
led1=0;
delayms(500);
led1=1; 
while(1) 
{
delayms(1000);
WDT_CONTR=0x35; 
}
}
分析:
(1)“sfr WDT_CONTR=0xe1;”定义STC 单片机 中新加入的看门狗寄存器,因为reg52.h头文件中没有对该寄存器的定义,以后要定义其它新的寄存器时方法相同,当然也可以写在reg52.h头文件中。
(2)程序开始后,点亮发光二极管后延时约500ms后再熄灭,这里延时不可过长,若两次喂狗之间程序运行的总时间超过看门狗的溢出时间,看门狗将复位 单片机 ,大家可调节这个延时时间看实际演示效果。
(3)喂狗时使用和设定看门狗寄存器同样的语句,只要看门狗寄存器中的CLR_WDT位被置1,看门狗定时器将重新计数,CLR_WDT位被置1后,由硬件自动将其清零。
(4)演示结果表现为发光二极管点亮后,马上熄灭,再不会点亮,这说明程序没有被复位,始终停止在while(1)循环中,看门狗处于被正常喂狗的情况下。
【例】只需把while(1)循环中的“WDT_CONTR=0x35;”这句删掉,演示结果为小灯不停的闪烁,因为有了看门狗的作用,当看门狗定时器溢出时,使 单片机 复位从头重新执行程序,所以小灯闪烁。
在应用看门狗时,需要在整个大程序的不同位置喂狗,每两次喂狗之间的时间间隔一定不能小于看门狗定时器的溢出时间,否则程序将会不停的复位。

 


推荐阅读

史海拾趣

Chiefdom Electronic Co Ltd公司的发展小趣事

面对全球市场的日益开放和竞争,Chiefdom Electronic Co Ltd积极寻求与其他行业巨头的战略合作。通过与全球知名的电子产品制造商、芯片供应商等建立紧密的合作关系,公司不仅获得了更多的技术和市场资源,还进一步提升了自身的品牌影响力和市场份额。这些合作不仅帮助公司拓展了业务领域,还为其在全球电子行业中树立了良好的口碑。

EasySync公司的发展小趣事

经过几年的努力,EasySync公司在同步技术领域取得了重大突破,成功研发出一款高效、稳定的同步芯片。这款芯片不仅性能卓越,而且成本较低,受到了广大客户的青睐。随着产品销量的不断增加,公司开始拓展市场,将产品销售到全球各地,逐渐树立了品牌形象。

FORMOSA公司的发展小趣事

在台湾,一家名为“FORMOSA电子元件制造厂”的公司,起初是一家小型电阻器生产商,专注于为本地电子制造商提供基础元件。随着个人电脑和消费电子市场的蓬勃发展,该公司敏锐地捕捉到市场需求,开始投资研发高精度、低成本的电子元件。通过不断的技术创新和质量控制,FORMOSA电子元件逐渐在国际市场上获得认可,成为多家知名电子产品制造商的供应商。公司还积极拓展海外市场,在欧洲和北美设立分支机构,进一步巩固了其在全球电子元件市场的地位。

Daco Semiconductor Co Ltd公司的发展小趣事

在快速发展的同时,Daco也始终关注环保和可持续发展。公司采用了环保的生产工艺和材料,确保生产过程中的废弃物和排放物符合环保要求。同时,Daco也积极参与环保公益活动,推动半导体行业的绿色发展。这种关注环保和可持续发展的做法,不仅提升了Daco的品牌形象,也为公司的长远发展奠定了坚实的基础。

Andon Electronics公司的发展小趣事

随着技术的不断成熟,Daco开始积极寻求市场拓展。公司首先与几家知名的电子设备制造商建立了合作关系,为其提供定制的半导体解决方案。同时,Daco也积极参与国际半导体展览和交流活动,与全球的行业同仁建立了广泛的联系。通过不断的市场拓展和战略合作,Daco的产品逐渐进入了全球市场,公司的知名度和影响力也得到了显著提升。

Helicomm公司的发展小趣事

在快速发展的同时,Daco也始终关注环保和可持续发展。公司采用了环保的生产工艺和材料,确保生产过程中的废弃物和排放物符合环保要求。同时,Daco也积极参与环保公益活动,推动半导体行业的绿色发展。这种关注环保和可持续发展的做法,不仅提升了Daco的品牌形象,也为公司的长远发展奠定了坚实的基础。

问答坊 | AI 解惑

BOOTLOADER程序有高手能指点么?

把外部flash里的程序放到ARM内部ROM,谁有代码啊?…

查看全部问答>

Linus步入不惑之年

2009年12月28日是Linux创始人Linus的40岁生日。 19年前,在圣诞节后赫尔辛基商店开业的第一天“,Linus冲向电脑商店,用圣诞节和生日礼金购买了他的第一台PC:一台DX33 80386计算机,4 Megs RAM,40 Megabyte硬盘,没有协同处理器。Linus之所以选 ...…

查看全部问答>

心情沮丧啊。。。

刚刚了看,里面有句话很让我沮丧啊:卖包子的都比工程师强! 研发:产业链的源头,资金链的末尾; 销售:产业链的末尾,资金链的源头; 研发人员是那里面最累的,钱拿的是最少的(指回报率),在一个行业坚持下去的没几人,还劝说周围的年轻人除 ...…

查看全部问答>

BIOS设计是否可以跨硬件

在自学汇编的过程中,遇到一个问题: 我写的BIOS调用是否可以跨硬件平台 换句话说,就是不同的板子上的BIOS设计是否是一样的?…

查看全部问答>

在WinCE环境下对.txt文件的读写

编写一个基于MFC的应用程序,读取.txt文件 文件内容的结构如下 书名1;价格1 书名2;价格2 书名3;价格3 。。。。。。 要求分别提取出书名和价格,分别放到string类型变量中 要就用VC++实现 各位高手帮帮忙,最好能有代码…

查看全部问答>

一个USB设备二台电脑

一个USB扩展槽上插了一个U盘,用USB连接线插了二台电脑。这两台电脑不同时操作U盘的情况下(任何情况下只有一台电脑对U盘操作),这样使用会有问题吗?…

查看全部问答>

请教版主,为什么我的程序进不了硬中断(已解决)

问高手个问题,为什么我的程序进了不硬中断? BIOS设置: HWI_INT11属性: interrupt source: MCSP_0_Receiver function: _receiver use Dispatcher interrupt Mash: self 程序 void main() {} void receiver() {...} 用轮询方式可以收 ...…

查看全部问答>

基于高吞吐率WLR测试的 ACS集成测试系统(二)

多器件TDDB和NBTI 图4示出了多器件TDDB测试结构的共用 SMU和SMU-per-pin配置。在开关(共用SMU) 情况下,SMU1提供连续应力至测试序列的全 部结构,SMU2顺序测量每个器件。在顺序分 析结构的过程中,开关延时和有限的测量速 度合在一起会限制每 ...…

查看全部问答>

C2000 Launchpad发热很大??!!

今天刚拿到快递~~~好欢乐~~~(不得不吐槽的是,圆通就是慢,虽然路上不慢,但是总在终点站耽误一天!!尼玛啊!!) 迫不及待插上电,试试内置的例程. led闪了会,一摸芯片,明显有点烫啊!! 后来用ccs5少了个led boosterpack的程序进去..(虽然没达到演示效果 ...…

查看全部问答>

【Nucleo心得】+ (EX06) 旋转编码器使用

本帖最后由 slotg 于 2014-10-19 09:37 编辑 本次实验编写了一个旋转编码器的驱动,顺时钟旋转时计数器增加,逆时钟旋转时计数器减少,压下中间开关时计数器清除。 旋转编码器的接脚与输出波形: 旋转编码器是输出2个相位差90度的波形,由 ...…

查看全部问答>