单片机的看门狗_第1页
单片机的看门狗_第2页
单片机的看门狗_第3页
单片机的看门狗_第4页
单片机的看门狗_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机的看门狗-S51及STC89系列为什么要看门狗?你家的看门狗是做什么的?“看门狗定时器”是这样一种东西,从功能上说它可以让微控制器在意外状况下(比如软件陷入死循环或跑飞)重新回复到系统上电状态,以保证系统出问题的时候重启一次。就跟我们现在用电脑一样,死机了你就按一下reset键重启一次电脑,看门狗就是负责干这个事儿的。它是52单片机增加的一个功能,以前Intel8031、……、AT89C51时代单片机片内都没有“看门狗”功能,需要我们外扩看门狗芯片,比如X5045。“看门狗”就是一个计数器,由于位数有限计数器能够装的数值是有限的(比如8位的最多装256个数、16位的最多装65536个数),从开启“看门狗”那刻起,它就开始不停的数机器周期,数一个机器周期就计数器加1,加到计数器盛不下了(术语叫溢出)就就产生一个复位信号,重启系统。注解:这里顺便说一下,一般教材上叫“看门狗定时器”,其实定时器原理还是计数器,只是计的是时钟周期,所以我为了初学者好理解叫统一叫“计数器”,这里阐明一下。看门狗的看门原理我们在设计程序时,先根据看门狗计数器的位数和系统的时钟周期算一下计满数需要的时间,就是说在这个时间内“看门狗”计数器是不会装满的,然后在这个时间内告诉它重新开始计数,就是把计数器清零,这个过程叫“喂狗”,这样隔一段时间喂一次狗,只要程序正常运行他就永远计不满,一旦出现死循环之类的故障,没有及时来清零计数器,就会导致装满了溢出,他就重启系统,这就是举个例子说:8051单片机选用12MHz晶振,一个时钟周期为1us,如果“看门狗计数器”是16位的,最大计数65536个,那么从0开始计到65535需要约65ms,所以我们可以在程序的50ms左右清零一次计数器(“喂狗”),让他重新从0开始计,再过50ms,再清,……,这样下去只要程序正常运行,计数器永远不会计满,也就永远不会被“看门狗”复位。当然这个喂狗的时间是大家自己选的,只要不超过65ms,你选多少都可以,一般不要喂得太勤,这样单片机运行时间浪费了,比如你1ms喂一次就太勤了,也不要说那我65ms喂一次,这样太边缘,这样抗干扰能力就下降了,最好是留一定的余量,这个就是设计者自己掌握了,我一般是让计到90%左右就清一次。每种单片机的“看门狗”实现方法不尽相同,但是原理都一样,而且“看门狗”都是启动了之后就不能被关闭,只能系统复位(重新断电在上电)才能关闭。设置“看门狗”的一般步骤如下:

1.设置“看门狗”相关寄存器,

启动“看门狗”;

2.

隔一段时间清零一次,“喂狗”;

3.如果程序正常,一直运行;如果程序出错,没有按时“喂狗”,“看门狗”就在溢出的时候复位系统。S51的看门狗AT89S52单片机看门狗定时器是14位的,最大计数214=16384个数,每计16384个时钟周期就溢出一次。也就是说如果使用12M晶振的话,至少应该在16.384ms内喂一次狗。STC89STC89C5X系列单片机由于采用了“预分频技术”,它的溢出时间是=(N*Prescale*32768)/晶振频率(不要问我为什么,他们就是这么设计的,我们就这么用就行)。其中N是单片机的时钟周期,STC89C5X系列单片机提供6时钟周期和12时钟周期两种时钟周期,可以在烧写程序时修改;Prescale是预分频数,通过设置【看门狗控制寄存器】可以设置为2、4、8、16、32、64、128、256;怎么设置演示程序中有介绍;晶振频率就是系统选用的晶振。所以如果同样选择12MHz晶振,使用传统的12时钟周期,它最小的溢出时间是(12*2*32768)/(12*106)=65.536ms,最大溢出时间是(12*256*32768)/(12*106)≈8.38s。如果选择256分频,也就是说只要在8.38秒之内喂一次狗就可以了。对于我们用户来说,看门狗的时间是越长越好,这样可以节省更多的单片机资源,尤其是对时间要求精准的系统,如果执行过程中我们不停地“喂狗”,那么是比较浪费时间的。所以STC89C5X系列单片机的看门狗更有优势一些。当然这个也是个人的选择,如果对时间要求的不苛刻的话,勤喂几次狗也没关系。STC看门狗应用举例STC89C52最小单片机系统+两个指示灯串行口接口(用于下载程序和测试本次试验关于实验的注意事项:1. 本次试验使用的是11.0592MHz晶振,设置WDT_CONTR=(00110100)B,32预分频,单片机使用12指令周期模式。 计算看门狗溢出时间:[12*32*32768/(11059200)]≈1s。2. 本次试验的硬件电路很简单,就是最小系统上增加两个LED灯,原理图见正文,用户可以很容易实现。***************************************************************************/#include<Reg52.H>sfrWDT_CONTR=0xE1; //定义特殊功能寄存器:STC单片机看门狗控制寄存器#defineucharunsignedchar#definetrue1#definefalse0#defineWEIGOUWDT_CONTR=0x34 //看门狗启动设置和“喂狗”操作sbitLED=P1^6; //信号灯,系统正常工作就一闪一闪的sbitLED_busy=P1^7; //工作灯,上电灭一会儿(约800ms),然后正常工作的时候一直亮着;用于指示系统是否重启uchartimer0_ctr,i;constucharstr[]="IloveMCU!"; //定义一句话,让他从串口输出,只有系统重启的时候才输出一次,所以也是用于验证看门狗有没有重启系统//延时函数,11.0592MHz晶振下延时约xms毫秒voiddelay_ms(unsignedxms){ unsignedx,y; for(x=xms;x>0;x--) for(y=110;y>0;y--);}//主程序初始化函数voidInitMain(){ //初始化时两盏灯都熄灭 LED=1; LED_busy=1; TMOD=0x21; //定时器0工作在方式1,作为16位定时器;定时器1工作在方式2,作为串行口波特率发生器 TH0=0x4C; //定时器0装初值:每隔50ms溢出一次 TL0=0x00; IE=0x82; //IE=(10000010)B,使能定时器0中断 TR0=1; //启动定时器0}//串行口初始化程序voidInitCOM(){ SCON=0x50; //SCON=(01010000)B,波特率不加倍,允许接收 TH1=0xFD; //设置波特率=9600bps TL1=TH1; TR1=1; //启动定时器1}/定时器0中断服务程序程序,控制信号灯闪烁。如果系统正常运行,信号灯1.5秒闪一次voidTimer0_isr()interrupt1{ TH0=0x4C;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论