百度空间 | 百度首页 
 
查看文章
 
AT89S51单片机看门狗定时器的使用
2008-09-07 12:28

AT89S51 看门狗定时器由一个14位定时器及WDTRST(地址为6AH)寄存器构成。开启看门狗定时器后,14位定时器会自动计数,每16384214)个机器周期溢出一次,并产生一个高电平复位信号,使系统复位。对于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 <reg51.h>

Sfr   WDTRST=0xa6;

Main()

{     ……;

WDTRST=0x1e;

WDTRST=0xe1;

While(1)

       {     WDTRST=0x1e;

              WDTRST=0xe1;

              ……;

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

}

}

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

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

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

              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      0A6H,#0E1H   ;3         1us

              DJNZ      R7,DV           ;12   2us

              RET                             ;13   2us

              END                            ;14   2us

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

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

程序执行顺序: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

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

      


类别:原创天地 | 添加到搜藏 | 浏览() | 评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu