那位大侠给一个51单片机汇编语言的看门狗程序,详细一点啊

作者&投稿:大季忽 (若有异议请与网页底部的电邮联系)
51单片机 c语言看门狗程序怎么写~

看门狗在51单片机电路里的作用是防止程序 “跑飞”、“死机”后,系统不动作,而采取复位的办法“唤醒”系统。

89S51、89S52系列单片机自带有看门狗功能,片内数据区A6H寄存器具有看门狗功能,使用很简单:

#include
...
sfr WDTRST = 0xA6;
...
void main()
{
WDTRST=0x1E;;//初始化看门狗
WDTRST=0xE1;//初始化看门狗
for(;;)
{
WDTRST=0x1E;;//喂狗指令

WDTRST=0xE1;//喂狗指令
}

}
可见,你只要在程序的大循环体内加一条喂狗指令就行。但这种看门狗功能有限,不是很可靠的,它依靠晶振工作,一旦晶振不起振,就无效了。

实践中多采用外部看门狗的方法,可以选用的芯片很多:MAX708、MAX813
、X25045.....具体编程就要看芯片的参考资料了。

例如:X25045是SPI总线的看门狗芯片,复位端和单片机复位端连接,SPI数据输入你可以选择合适的IO接口。

WREN 0x06 设置写允许位
WRDI 0x04 复位写允许位
RDSR 0x05 读状态寄存器
WRSR 0x01 写状态寄存器
READ 0x03/0x0b 读操作时内部EEPROM页地址
WRITE 0x02/0x0a 写操作时内部EEPROM页地址

#include
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=0;ucLoop<8;ucLoop++)
{
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=0;ucLoop<8;ucLoop++)
{
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都不带狗。

不是Keil的问题.
1、关于AD
C8051F330是带有ADC功能的,测试AD,建议要在实际外部电压输入情况下测试。因为Keil的调试是模拟真实环境的调试。对于数据“输入型”的调试,往往在仅有Keil“软”调试下得不到正确结果,而对于数据“输出型”的,仅Keil这样的“软”调试是非常能说明情况的。
2、看门狗
Keil的调试是模拟真实环境的调试,具体自己没有调试过,看门狗主要是用于怕程序跑飞而能够得到复位的一种情况。Keil调试中运行看门狗可能与实际有些差异,这个你就要和Keil开放的工程师交流了

Good Luck.

看门狗在51单片机电路里的作用是防止程序 “跑飞”、“死机”后,系统不动作,而采取复位的办法“唤醒”系统。

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接口。

WREN 0x06 设置写允许位
WRDI 0x04 复位写允许位
RDSR 0x05 读状态寄存器
WRSR 0x01 写状态寄存器
READ 0x03/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=0;ucLoop<8;ucLoop++)
{
SCK=1;
SCK=0;
bData=SO;
ucData<<=1;
if(bData)

}
return ucData;
}
void WriteByte(uchar ucData)//write a byte to device
{
uchar ucLoop;
for(ucLoop=0;ucLoop<8;ucLoop++)
{
if((ucData&0x80)==0) //the MSB send first

else

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)
//write the page addr
else

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)

else

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都不带狗。

好像HTC系列的单片机,内部都要看门狗了。不需要了。
如果非要,需要外部接硬件支持。你去翻本51的书都会有这个程序。

好多的51单片机本身没有看门狗的硬件,所以你想要,可能要考虑一个外部看门狗芯片。

求个51单片机 计数器 程序(增加按键防抖)
答:include "reg52.h"define u8 unsigned char define u16 unsigned int sbit sw1=P3^4;sbit sw2=P3^5;sbit sw3=P3^6;sbit e0=P2^0;sbit e1=P2^1;sbit e2=P2^2;sbit e3=P2^3;u8 ds[4]={0,0,0,0};u16 num=0;u8 code table[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07...

MC51单片机如何通过上电复位实现p01和p02做输入口?具体汇编程序应该怎 ...
答:51是准双向口,你要读哪个口的数据,在读之前简单的加个SBIT P0.x就可以了,或者直接MOV P0,0xff,然后再读进来的就是P0口的输入值,不过标准51的P0是不带上拉的,你需要在P0口外面加上一个10K的上拉电阻才能作为输入。

求:51单片机模拟i2c总线程序
答:求:51单片机模拟i2c总线程序有一定的说明,容易看懂的,希望各位大侠给一个... 求:51单片机模拟i2c总线程序有一定的说明,容易看懂的,希望各位大侠给一个 展开  我来答 2个回答 #热议# 生活中有哪些成瘾食物?Smart_wolf 2011-07-20 · TA获得超过1656个赞 知道小有建树答主 回答量:1467 采纳率:0% ...

51单片机制作一个由一个按钮控制的8盏流水灯程序,要求按下按钮后流水...
答:include<reg51.h> define uchar unsigned char sbit key=P1^0;uchar led;void delay(uchar x){ uchar i,j;for(i=0;i<x;i++)for(j=0;j<125;j++);} void disled(){ uchar i,j;led=0xfe;for(j=0;j<2;j++){ for(i=0;i<8;i++){ P0=led;delay(200);P0=0xff;delay(...

51单片机晶振频率为12MHz,利用中断在P1.1口输出50HZ的方波,C语言,哪...
答:include <reg51.h>sbit port=P1^1;void Timer0Init(void)//10毫秒@12.000MHz{TMOD &= 0xF0;//设置定时器模式TMOD |= 0x01;//设置定时器模式TL0 = 0xF0;//设置定时初值TH0 = 0xD8;//设置定时初值TF0 = 0;//清除TF0标志TR0 = 1;//定时器0开始计时}void main(){ Timer0Init()...

51单片机设计跑马灯的程序用(c语言)编写
答:|P1口接8个发光二极管共阳 include <AT89X51.H> unsigned char i;unsigned char temp;unsigned char a,b;void delay(void){ unsigned char m,n,s;for(m=20;m>0;m--)for(n=20;n>0;n--)for(s=248;s>0;s--);} void main(void){ while(1){ temp=0xfe;P1=temp;delay();for(...

求大侠给个51单片机(STC89C52)的数码管(共阳极的)电路图(共接6个数...
答:楼上的哥,共阳的会涉及到单片机的驱动能力么?共阳数码管单片机引脚是吸收电流的,怎么会涉及到引脚的驱动能力呢?应该是共阳的不要求单片机的驱动能力,共阴的要涉及到吧。电路图很简单,用共阳的数码管,数码管的段码脚接单片机的P0口,然后用P1口驱动PNP的三极管来驱动数码管的共阳极 ...

用51单片机汇编语音随机产生一个1~33的随机数, 或者不能重复,能显示...
答:一直用C51,汇编不大会,你可以这样:初始化一个8位的定时器,让它自己从0开始加,不用设置中断,每隔一定时间去就读一次定时器的值t,那么t是随机的(0<=t<=255),然后t=t mod 34,产生0~33的一个数,是0就放弃重新取值,就可以达到目的 ...

51单片机高手请进!!!
答:你的问题应该是数码管显示问题吧,不知你的数据管显示程序是如何实现的。在此做一个猜测:你送入数码管显示的是一个整数,即送给数码管显示的数据为10,然后数码管显示程序就会显示10,如果送入452,数码管就显示452。 如果是这样的话,那么按键程序就是用于处理这个送入显示的数值。 如此的话,按键...

单片机汇编代码希望哪位大侠能够给出每段代码的注释解释,感激不尽_百 ...
答:其实我也想帮你注释一下,问题太多了。在点懒了。主要的还是51那几条汇编命令,不如你自己去看看熟了,再回来看它的时候你就能明白了。在这里就把汇编各命令的含义发给你吧。符号定义表 符号 含义Rn R0~R7寄存器n=0~7Direct 直接地址,内部数据区的地址RAM(00H~7FH)SFR(80H~FFH) B,ACC,PSW,IP,P3,IE...