89S51、89S52系列单片机自带有看门狗功能和穗,片内数据区A6H寄存器具有看门狗功能,使用很简单:
#include<reg51.h>
...
sfr WDTRST = 0xA6
...
void main()
{
WDTRST=0x1E//初始化看门狗
WDTRST=0xE1//初始化看门狗
for()
{
WDTRST=0x1E//喂狗指令
WDTRST=0xE1//喂狗指令
}
}
可见,你只要在程序的大循环体内加一条喂狗指令就行。但这种看门狗功能有限,不是很可靠的,它依靠晶振工作,一旦晶振不起振,就无效了。
实践中多采用握雹外部看门狗的方法,可以选用的芯片很多:MAX708、MAX813
、X25045.....具体编程就要看芯片的参考资料了。
例如:X25045是SPI总线的看门狗芯片,复位端和单片段棚帆机复位端连接,SPI数据输入你可以选择合适的IO接口。
WREN0x06 设置写允许位
WRDI 0x04 复位写允许位
RDSR0x05 读状态寄存器
WRSR 0x01写状态寄存器
READ0x03/0x0b 读 *** 作时内部EEPROM页地址
WRITE 0x02/0x0a 写 *** 作时内部EEPROM页地址
#include <reg51.h>
sbit CS= P2^7
sbit SO= P2^6
sbit SCK= P2^5
sbit SI= P2^4
#define WREN 0x06 //
#define WRDI 0x04 //
#define RDSR 0x05 //
#define WRSR 0x01//
#define READ0 0x03 //
#define READ1 0x0b //
#define WRITE0 0x02 //
#define WRITE1 0x0a //
#define uchar unsigned char
uchar ReadByte() //read a byte from device
{
bit bData
uchar ucLoop
uchar ucData
for(ucLoop=0ucLoop<8ucLoop++)
{
SCK=1
SCK=0
bData=SO
ucData<<=1
if(bData)
{ ucData|=0x01}
}
return ucData
}
void WriteByte(uchar ucData)//write a byte to device
{
uchar ucLoop
for(ucLoop=0ucLoop<8ucLoop++)
{
if((ucData&0x80)==0)//the MSB send first
{SI=0}
else
{SI=1}
SCK=0
SCK=1
ucData<<=1
}
}
uchar ReadReg() //read register
{
uchar ucData
CS=0
WriteByte(RDSR)
ucData=ReadByte()
CS=1
return ucData
}
uchar WriteReg(uchar ucData) //write register
{
uchar ucTemp
ucTemp=ReadReg()
if((ucTemp&0x01)==1) //the device is busy
return 0
CS=0
WriteByte(WREN)//when write the WREN, the cs must have a high level
CS=1
CS=0
WriteByte(WRSR)
WriteByte(ucData)
CS=1
return 1
}
void WriteEpm(uchar cData,uchar cAddress,bit bRegion)
/* 写入一个字节,cData为写入的数,cAddress为写入地址,bRegion为页 */
{
while((ReadReg()&0x01)==1) //the device is busy
CS=0
WriteByte(WREN)//when write the wren , the cs must have a high level
CS=1
CS=0
if(bRegion==0)
{ WriteByte(WRITE0)} //write the page addr
else
{WriteByte(WRITE1)}
WriteByte(cAddress)
WriteByte(cData)
SCK=0 //
CS=1
}
uchar ReadEpm(uchar cAddress,bit bRegion)
/* 读入一个字节,cAddress为读入地址,bRegion为页 */
{
uchar cData
while((ReadReg()&0x01)==1)//the device is busy
CS=0
if(bRegion==0)
{WriteByte(READ0)}
else
{WriteByte(READ1)}
WriteByte(cAddress)
cData=ReadByte()
CS=1
return cData
}
main()
{
WriteReg(0x00)//set the watchdog time as 1.4s
CS=1
CS=0 //reset the watchdog
}
回复: xuzhimin9514
所有的89S系列都带狗,所有的80C系列都不带狗。
所以89S51 89S52都带狗,80C51、80C52都不带狗。
一些重要的程序,必须让它一直跑着;而且还要时时关心它的碰唤状态——不能让它出现死锁现象。当然,如果一个主程序会出现死锁,肯定是设计或者编程上的失误。我们晌乱首要做的事是,把这个Bug揪出来。但如果时间紧迫,这个Bug又“飘忽不定”,那么,我们还是先写一个软件“看门笑谨凯狗”,暂时应一下急吧。“看门狗”的需求描述:“看门狗”的运行不出现界面窗口,具有一定的隐蔽性;定时判断目标进程是否运行在当前系统中,如果没有则启动目标进程;判断目标进程是否“没有响应”,如果是则终止目标进程;如果目标进程“没有响应”的次数超过一定的数量,则将计算机系统重启。
这是windows的。
如果是单片机的看门狗,实际上就是一个自动复位程序,一定时间内主程序不给这个自动复位程序发送信号的话,这个程序就使单片机自动复位。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)