作者:广东在线游戏网日期:
返回目录:游戏解答
你要先明白看门狗的用途
看门狗其实就是一个百定时器
这个定时器溢出是会产生一个中断响应
中断服务就是跳会程序开头,即复位
看门狗常用在程序很容易跑飞的度情况下(如等待超时,意外进入死循环等)
启动看门狗后要定时在程序中把看门狗的计数值清0,就是防止它进入中断然后复,这种常称为喂狗
如果在一般简单的程序中是不太可能会跑飞的话多数会关闭看门狗,因为引入了看门狗就多了定时计数值处理的一些代码,增加了程序的复杂性
但是看样子楼主的原因并非以上几个方面, 关闭看门狗的目的是内让他先暂停再设置,而之后打开,就是那个kickdog()
在程序中的应用,会表现在为计数器的值赋0,可能你没有留意
再者,正如楼上所说,你用的不纯粹是单片机,而是DSP
DSP具体和单片机有什么区别容, 你可以暂时理解为专门为乘法和存储优化使其速度加快以适用于通信领域的单片机
那得看你在看门狗复位之前,是否发生中断,如果你发生中断的频率大于看门狗复位频率,那么必定会复位,
在程序初始化中向看门狗e799bee5baa6e79fa5e98193e4b893e5b19e333寄存器(WDTRST地址是0A6H)中先写入01EH,再写入0E1H。即可激 活看门狗。
ORG 0000H
LJMP begin
Begin:
MOV 0A6H,#01EH ;先送1E
MOV 0A6H,#0E1H ;后送E1
;在程序初始化中激活看门狗。
……
……
For:
……
MOV 0A6H,#01EH ;先送1E
MOV 0A6H,#0E1H ;后送E1
;喂狗指令
……
LJMP For
在C语言中要增加一个声明语句。 在AT89X51.h声明文件中增加一行 sfr WDTRST = 0xA6;
Main()
{
WDTRST=0x1E;
WDTRST=0xE1;//初始化看门狗。
While (1)
{
WDTRST=0x1E;
WDTRST=0xE1;//喂狗指令
}
}
其他参考代码:
AJMP MAIN ;汇编
MAIN:
;启动看门狗
Mov 0A6H,#01EH ;先送1E
Mov 0A6H,#0E1H ;后送E1
;主程序
START:
ACALL WDT ;调用复位看门狗子程序
AJMP START
;主程序
;复位看门狗子程序
WDT:
Mov 0A6H,#01EH ;先送1E
Mov 0A6H,#0E1H ;后送E1
RET
END
注意事项:
1. 89S51的看门狗必须由程序激活后才开始工作。所以必须保证CPU有可靠的上电复位。否则看门狗也无法工作。
2. 看门狗使用的是CPU的晶振。在晶振停振的时候看门狗也无效。
3. 89S51只有14位计数器。在16383个机器周期内必须至少喂狗一次。而且这个时间是固定的,无法更改。当晶振为12M时每16个毫秒需喂狗一次。还可利用定时器把看门狗的喂狗时间延长几秒至几分钟。
你不往寄存器写值,默认是没有开看门狗的,你就不用管了
以上回答你满意么?
看门狗清百零语句绝对不能放在中断语句中!因为中断服务程序的执行是有条件度的,如果一定时间内不满足条件,中断就不会发生,而看门狗就会超时,引起不必要的复位知。如果程序跑飞了死循环在道某处,但中断条件还有效,那么如果中断条件专一直满足,中断程序就会被执行,如果这个执行间隔小于看门狗计时周期,看门狗就属失去作用了。