查看文章 |
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 <reg51.h> 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 MOV START: MOV A,#0FEH ;4 1us CALL DELAY ;6 2us RL A ;7 2us JMP
DELAY: MOV R7,#200 ;9 1us DV: MOV R6,#250 ;10 1us DJNZ R6,$ ;11 2us MOV MOV 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之间会是什么效果。
|