文档库 最新最全的文档下载
当前位置:文档库 › AT89S51单片机看门狗定时器的使用

AT89S51单片机看门狗定时器的使用

AT89S51单片机看门狗定时器的使用.txt只要你要,只要我有,你还外边转什么阿老实在我身边待着就行了。 听我的就是,问那么多干嘛,我在你身边,你还走错路!跟着我!不能给你幸福是我的错,但谁让你不幸福,我TMD去砍了他 
AT89S51 看门狗定时器由一个14位定时器及WDTRST(地址为6AH)寄存器构成。开启看门狗定时器后,14位定时器会自动计数,每16384(214)个机器周期溢出一次,并产生一个高电平复位信号,使系统复位。对于12MHZ的时钟脉冲每16384us(约0.016s)产生一个复位信号。

如果启动看门狗定时器,当系统超过0.016s没有动作(程序跑飞),看门狗定时器自动复位,让系统归复于正常运作状态。为了系统既能正常工作又不会出现死机(程序跑飞),在0.016s内必须喂狗一次,即对看门狗定时器进行复位,看门狗的启动和复位的方法是一样的。

在汇编语言中启动或复位看门狗定时器的命令如下。

MOV 6AH, #1EH

MOV 6AH, #0E1H

若要在C语言中使用看门狗定时器功能,由于reg51.h中并没有声明WDTRST寄存器,所以必须先声明WDTRST寄存器。

Sfr WDTRST=0xa6;

进行声明以后可以用一下命令启用或复位看门狗定时器。

WDTRST=0x1e;

WDTRST=0xe1;

下面用一个C语言进行说明

#include

Sfr WDTRST=0xa6;

Main()

{ ……;

WDTRST=0x1e;

WDTRST=0xe1;

While(1)

{ WDTRST=0x1e;

WDTRST=0xe1;

……;

……; 这部分执行时间必须少于0.016s

}

}

以上程序中系统在做一个无限循环的动作,通过看门狗定时器可以防止程序在执行过程中跑飞。因为只要程序一跑出while()循环,看门狗定时器溢出以后得不到复位,所以自动复位系统,让程序从mian()开始重新运行。

但是在C语言应用看门狗定时器也特别小心,一定要在看门狗定时器启动后的0.016s内喂一次狗。

注:在汇编语言中每条指令的执行时间都是可以准确算出来,下面是一个汇编语言编写的8路led向左移程序应用看门狗定时器的实例。

ORG 00H ;1 1us

MOV 0A6H,#1EH ;2 1us

MOV 0A6H,#0E1H ;3 1us

START: MOV A,#0FEH ;4 1us

LOOP: MOV P2,A ;5 1us

CALL DELAY ;6 2us

RL A ;7 2us

JMP LOOP ;8 2us

DELAY: MOV R7,#200 ;9 1us

DV: MOV R6,#250 ;10 1us

DJNZ R6,$ ;11 2us

MOV 0A6H,#1EH ;2 1us

MOV 0

A6H,#0E1H ;3 1us

DJNZ R7,DV ;12 2us

RET ;13 2us

END ;14 2us

在程序的每个行标号后面是12MHZ时钟脉冲下的指令执行时间,为了让系统正常工作且不死机将看门狗定时器启动指令放在1和2之间,将看门狗定时器复位指令放在11和12之间。

现在一起通过执行时间来计算看门狗定时器复位指令放在那里比较合适。

程序执行顺序:1 2 3 4 5 6 9 10 11 12 9 10 ……

运行时间: 1us 1 1 1 1 2 1 1 2*250 us (1+250*2+2)*199

程序运行到11的时候用的时间是2*250+6=506us<16384us

程序运行到12的时候用的时间是506+(1+250*2+2)*199=10063us>16384us

从比较结果可以看出,看门狗定时器的喂狗指令必须放在11和12之间。可以想一下放在12和13之间会是什么效果。


相关文档
相关文档 最新文档