
C51单片机看门狗电路及程序方案与对策.doc
7页C51单片机看门狗电路及程序设计案院系:信息工程学院年级:电子一班 禹豪电子一班 训虎电子二班 邓启新一、 引言在由单片机构成的微型计算机系统中,程序的正常运行常常会因为来自外界的电磁场干扰等原因而被打断,从而造成程序的跑飞,而陷入死循环由此导致单片机控制的系统无法继续工作,造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进展实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的芯片或程序,俗称"看门狗"(watchdog) 〔1〕看门狗电路根本原理看门狗电路的应用,使单片机可以在无人状态下实现连续工作,其工作原理是:看门狗芯片和单片机的一个I/O引脚相连 此处设计原理实际上为下文中硬件看门狗设计思路该I/O引脚通过程序控制它定时地往看门狗的这个引脚上送入高电平〔或低电平〕,这一程序语句是分散地放在单片机其他控制语句中间的,一旦单片机由于干扰造成程序跑飞后而陷入*一程序段 进入死循环状态时,写看门狗引脚的程序便不能被执行,这个时候,看门狗电路就会由于得不到单片机送来的信号,便在它和单片机复位引脚相连的引脚上送出一个复位信号,使单片机发生复位,即程序从程序存储器的起始位置开场执行,这样便实现了单片机的自动复位。
〔2〕看门狗电路一般设计式"看门狗〞电路一般分为硬件看门狗与软件看门狗两种设计式硬件看门狗是利用了一个定时器,来监控主程序的运行,也就是说在主程序的运行过程中,我们要在定时时间到之前对定时器进展复位如果出现死循环,或者说PC指针不能回来,则定时时间到后就会使单片机复位常用的WDT芯片如MA*813,5045,IMP 813等,价格4~10元不等.软件看门狗技术的原理和硬件看门狗类似,只不过是用软件的法实现〔即利用单片机部定时器资源,通过编程模拟硬件看门狗工作式〕,以51系列为例:因在51单片机中有两个定时器,在利用部定时器资源来对主程序的运行进展监控时可以对T1〔或T0〕设定一定的定时时间〔设定的定时值要小于主程序的运行时间〕,当产生定时中断的时候对一个变量进展赋值〔此变量在主程序运行的开场已有一个初值〕当主程序运行至最后时对此变量的值进展判断,如果值发生了预期的变化,就说明T0中断正常,如果没有发生变化则使程序复位考虑到设计要求,本设计采用软件看门狗设计思路二、 看门狗电路整体设计思路根据设计要求,本设计利用C51单片机部自带的定时器1进展编程,并配合少量电路实现"看门狗"电路功能整个设计分为软件局部与硬件局部,如下:(1) 软件局部设计原理:软件设计分为三局部:"看门狗"定时器设置程序、溢出中断效劳程序和喂狗代码。
1.1设计思路:1〕在主程序开头,"看门狗"定时器设置程序设置定时器1计时50ms2〕当定时达50ms时,定时器1产生溢出中断,溢出中断效劳程序开场工作,将看门狗标志num加1当num的值等于100时,说明看门狗定时器已经计时5s,此时,单片机I/O端口P1.0输出高电平,对程序进展复位3〕在此过程中,喂狗代码将被穿插于程序中循环体末尾当循环体完毕时,喂狗代码执行,关闭定时器1、清空num并重新初始化定时器设置假设循环体进入死循环,喂狗代码无法执行,num将一直累加至100,此时程序复位注:喂狗代码放置位置可根据num预计数值进展调整:当num门限值较小,即看门狗计数时间较短时,喂狗代码可放于程序中各循环体之后或均匀分布于整个主程序中当num门限值较大,即看门狗计数时间较长时,喂狗代码可放于程序主循环体末尾但是需注意看门狗计数时间必须长于正常工作时间,以免非正常复位1.2软件设计流程图:START定时器1主程序存放器累加定时器1设置溢出中断开定时器1循环中断效劳程序喂狗代码num+1Nonum=100.Yes复位以下为三局部详细程序设计1.3"看门狗"定时器设置程序:"看门狗"定时器设置程序对定时器1进展设置。
设定时器1为工作式1设M为工作式1下,定时器最大计数值,可知M=65536所以,设定时器1的初值为*,则初值*与机器期I机及定时时间T的关系为:(M-*)T机 = T (1)其中:T机 =12个时钟期 =12 /fosc所以,定时器1的初值为:* = M-T/ T机 (2)因此,当T1工作于式1,定时时间为50ms,时钟频率fosc=12MHz时,可知:*=M- T/ T机 = 65536-50000/1 =15536=3CB0H所以,"看门狗"定时器设置程序清单〔c语言〕如下:TMOD=0*10; //设置TMOD存放器,定时器1设为式1 TL1=0*B0; //设置定时器初值低8位 TH1=0*3C; //设置定时器初值高8位,设置为计时50ms ET1=1; //开定时器1溢出中断 EA=1; //开总中断控制 TF1=0; //定时器1溢出中断标志清零 TR1=1; //开定时器11.4溢出中断效劳程序:溢出中断效劳程序为定时器1溢出中断效劳程序,每执行一次,num加1,并判断num是否到达100,即计时5s。
假设已到达5s,I/O口P1.0输出复位信号溢出中断效劳程序清单〔c语言〕如下:void int_T1() interrupt 3 using 3 //定时器1溢出中断效劳程序{num++; //每溢出一次标志加1if (num==100) //当标志等于100时,即计时5s{ P1=~(0*01); //P1.0输出1}}1.5喂狗代码:喂狗代码主要功能为暂时关定时器1,定时器1存放器清零,看门狗标志num清零和重新开启定时器1.喂狗代码程序清单〔c语言〕如下:TR1=0; //喂狗代码,关定时器1 TL1=0*B0; //重新设置定时器初值 TH1=0*3C; TF1=0; //定时器1溢出中断标志清零 TR1=1; //开定时器11.6完整测试程序清单完整测设程序分为两局部,以一个正向运行一次的流水灯程序和逆向无限循环流水灯程序组成。
在正向进展一次流水灯程序时,看门狗代码不会复位单片机;逆向无限循环流水灯程序时,延时5s,看门狗复位单片机完整测试程序清单〔c语言〕如下:*include "reg51.h"*include "stdio.h"unsigned int i,num; //设置变量unsigned char temp;void delay(unsigned int t); //声明delay函数int main(){ num=0; //看门狗复位标志 P1=~(0*00); //将P1口赋值为0 TMOD=0*10; //设置TMOD存放器,定时器1设为式1 TL1=0*B0; //设置定时器初值低8位 TH1=0*3C; //设置定时器初值高8位,设置为计时50ms ET1=1; //开定时器1溢出中断 EA=1; //开总中断控制 TF1=0; //定时器1溢出中断标志清零 TR1=1; //开定时器1 temp=0*01; //流水灯状态标志 for(i=0;i<8;i++) //流水灯程序〔1〕 { P0=~temp; //点亮P0口对应的LED delay(100); temp<<=1; //点亮的LED灯前移一位 } TR1=0; //喂狗代码,关定时器1 TL1=0*B0; //重新设置定时器初值 TH1=0*3C; TF1=0; //定时器1溢出中断标志清零 TR1=1; //开定时器1 while(1) //流水灯程序〔2〕 { //倒序,无限循环 temp=0*80; for(i=0;i<8;i++) { P0=~temp; delay(100); temp>>=1; } } TR1=0; //喂狗代码 TL1=0*B0; TH1=0*3C; TF1=0; TR1=1; num=0; return 0;}void delay(unsigned int t) //延时子程序{ register unsigned int bt; for(;t;t--) for(bt=0;bt<255;bt++); }void int_T1() interrupt 3 using 3 //定时器1溢出中断效劳程序{ num++; //每溢出一次标志加1 if (num==100) //当标志等于100时,即计时5s { P1=~(0*01); //P1.0输出1 }}完整测试程序清单〔c语言反汇编版〕如下:Q0000: LJMP Q00AB Q0003: PUSH ACC INC 0AH MOV A,0AH JNZ Q000D INC 09H Q000D: *RL A,*64H ORL A,09H JNZ Q0016 MOV P1,*0FEH Q0016: POP 。
