看门狗定时器(WDT)是单片机的一个组成部分,在单片机程序的调试和运行中都有着重要的意义。WDT实际上是一个计数器,一般给看门狗一个大数,程序开始运行后看门狗开始倒计数。如果程序运行正常,过一段时间CPU应发出指令让看门狗复位,重新开始倒计数。如果看门狗减到0就认为程序没有正常工作,强制整个系统复位。
AT89S51 WDT由一个14位定时器及WDTRST(地址为6AH)寄存器构成。外部复位时,WDT默认为关闭状态,要打开WDT,用户必须按顺序将01EH和0E1H写到WDTRST寄存器(SFR地址为0A6H),启动WDT,它会随晶体振荡器在每个机器周期计数,除硬件复位或WDT溢出复位外,没有其他方法关闭WDT。开启WDT后,14位定时器会自动计数,每16384个机器周期溢出一次,并产生一个高电平复位信号,使系统复位。对于12MHz的时钟脉冲,每16384μs(约0.016s)产生一个复位信号。WDT打开时,它会随晶体振荡器在每个机器周期计数,这意味着用户必须在小于每个16384机器周期内复位WDT,也即写01EH和0E1H到WDTRST寄存器,WDTRST为只写寄存器。WDT计数器既不可读也不可写,当WDT溢出时,通常将使RST引脚输出高电平的复位脉冲。复位脉冲持续时间为98Tosc,而Tosc=1/fosc(晶体振荡频率)。为使WDT工作最优化,必须在合适的程序代码时间段周期地复位WDT防止WDT溢出。
如果启动WDT,系统超过0.016s没有动作(程序“跑飞”),则看门狗定时器自动复位,系统归复正常运作状态。为了系统既能正常工作又不会出现死机(程序“跑飞”),在0.016s内必须“喂狗”一次,即对WDT进行复位,WDT的启动和复位的方法是一样的。
MOV 06AH, #1EH(www.xing528.com)
MOV 06AH, #0E1H
若要在C语言中使用WDT功能,由于reg51.h中并没有声明WDTRST寄存器,所以必须先声明WDTRST寄存器。
以上程序中系统在做一个无限循环的动作,通过WDT可以防止程序在执行过程中“跑飞”。因为只要程序一跑出“While()”循环,WDT溢出以后得不到复位,所以自动复位系统,让程序从“mian()”开始重新运行。
但是在C语言应用WDT要特别小心,一定要在WDT启动后的0.016s内“喂狗”一次。在汇编语言中每条指令的执行时间都是可以准确算出来。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。