常熟理工学院
项目设计报告
项目:C51单片机看门狗电路及程序设计方案
专 业电气工程及其自动化 学生姓名 ____________
班 级________ 学 号________
指导教师 完成日期
(完整word版)C51单片机看门狗电路及程序设计方案
目录
1.引言…………………………………………………………………………1 1.1看门狗电路基本原理………………………………………………2 1. 2看门狗电路一般设计方式………………………………………………3 1.3知识点应用………………………………………………………………4 2。 看门狗电路整体设计思路………………………………………………5 2。1硬件设计原理………………………………………………6 2.2软件设计原理………………………………………………7 1.1设计思路:
1。2软件设计流程图:
1.3“看门狗“定时器设置程序: 1。4溢出中断服务程序: 1.5喂狗代码:
1.6完整测试程序清单:
3。作品调试……………………………………………………………………8 4。结语………………………………………………………………………………17 5.参考文献…………………………………………………………………………18
(完整word版)C51单片机看门狗电路及程序设计方案
一.引言
在由单片机构成的微型计算机系统中,程序的正常运行常常会因为来自外界的电磁场干扰等原因而被打断,从而造成程序的跑飞,而陷入死循环.由此导致单片机控制的系统无法继续工作,造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的芯片或程序,俗称”看门狗\"(watchdog)
(1)看门狗电路基本原理
看门狗电路的应用,使单片机可以在无人状态下实现连续工作,其工作原理是:看门狗芯片和单片机的一个I/O引脚相连,该I/O引脚通过程序控制它定时地往看门狗的这个引脚上送入高电平(或低电平),这一程序语句是分散地放在单片机其他控制语句中间的,一旦单片机由于干扰造成程序跑飞后而陷入某一程序段 进入死循环状态时,写看门狗引脚的程序便不能被执行,这个时候,看门狗电路就会由于得不到单片机送来的信号,便在它和单片机复位引脚相连的引脚上送出一个复位信号,使单片机发生复位,即程序从程序存储器的起始位置开始执行,这样便实现了单片机的自动复位.
(2)看门狗电路一般设计方式
“看门狗”电路一般分为硬件看门狗与软件看门狗两种设计方式。
硬件看门狗是利用了一个定时器,来监控主程序的运行,也就是说在主程序的运行过程中,我们要在定时时间到之前对定时器进行复位。如果出现死循环,或者说PC指针不能回来,那么定时时间到后就会使单片机复位。常用的WDT芯片如MAX813,5045,IMP 813等,价格4~10元不等.
软件看门狗技术的原理和硬件看门狗类似,只不过是用软件的方法实现(即利用单片机内部定时器资源,
(完整word版)C51单片机看门狗电路及程序设计方案
通过编程模拟硬件看门狗工作方式),以51系列为例:因在51单片机中有两个定时器,在利用内部定时器资源来对主程序的运行进行监控时.可以对T1(或T0)设定一定的定时时间(设定的定时值要小于主程序的运行时间),当产生定时中断的时候对一个变量进行赋值(此变量在主程序运行的开始已有一个初值)。当主程序运行至最后时对此变量的值进行判断,如果值发生了预期的变化,就说明T0中断正常,如果没有发生变化则使程序复位。
考虑到设计要求,本设计采用软件看门狗设计思路。
(3)知识点的应用
延时、中断、寄存器、定时器、数码管
二.看门狗电路整体设计思路
根据设计要求,本设计利用C51单片机内部自带的定时器1进行编程,并配合少量电路实现“看门狗“电路功能。整个设计分为硬件部分与软件部分,如下:
(1)硬件部分设计原理
因C51单片机复位端RST接收到一正脉冲时,单片机复位,所以P1。0引脚的复位信号(输出由低电平变为高电平)应通过一电容与电阻组成的微分电路,将方波转化为脉冲波。整个复位电路包括上电复位、手动复位和看门狗复位三部分,如图:
(完整word版)C51单片机看门狗电路及程序设计方案
(2)软件部分设计原理:
软件设计分为三部分:“看门狗“定时器设置程序、溢出中断服务程序和喂狗代码。
1.1设计思路:
1)在主程序开头,“看门狗“定时器设置程序设置定时器1计时50ms。
2)当定时达50ms时,定时器1产生溢出中断,溢出中断服务程序开始工作,将看门狗标志num加1。当num的值等于100时,说明看门狗定时器已经计时5s,此时,单片机I/O端口P1.0输出高电平,对程序进行复位。
3)在此过程中,喂狗代码将被穿插于程序中循环体末尾。当循环体结束时,喂狗代码执行,关闭定时器1、清空num并重新初始化定时器设置。若循环体进入死循环,喂狗代码无法执行,num将一直累加至100,此时程序复位。
注:喂狗代码放置位置可根据num预计数值进行调整:当num门限值较小,即看门狗计数时间较短时,喂狗代码可放于程序中各循环体之后或均匀分布于整个主程序中。当num门限值较大,即看门狗计数时间较长时,喂狗代码可放于程序主循环体末尾。但是需注意看门狗计数时间必须长于正常工作时间,以免非正常复位。
(完整word版)C51单片机看门狗电路及程序设计方案
1。2软件设计流程图:
START
主程序
定时器1设置
开定时器1
循环
喂狗代码
以下为三部分详细程序设计
定时器寄存器累加 溢出中断 中断服务程序 num+1 No num=10num=100? Yes 复位 (完整word版)C51单片机看门狗电路及程序设计方案
1。3“看门狗“定时器设置程序:
“看门狗“定时器设置程序对定时器1进行设置。设定时器1为工作方式1。设M为工作方式1下,定时器最大计数值,可知M=65536.所以,设定时器1的初值为X,则初值X与机器周期I机及定时时间T的关系为:
(M—X)T机 = T (1)
其中:T机 =12个时钟周期 =12 /fosc。所以,定时器1的初值为: X = M-T/ T机 (2)
因此,当T1工作于方式1,定时时间为50ms,时钟频率fosc=12MHz时,可知: X=M- T/ T机 = 65536—50000/1 =15536=3CB0H 所以,“看门狗“定时器设置程序清单(c语言)如下:
TMOD=0x10; //设置TMOD寄存器,定时器1设为方式1 TL1=0xB0; //设置定时器初值低8位
TH1=0x3C; //设置定时器初值高8位,设置为计时50ms ET1=1; //开定时器1溢出中断 EA=1; //开总中断控制
TF1=0; //定时器1溢出中断标志清零 TR1=1; //开定时器1
(完整word版)C51单片机看门狗电路及程序设计方案
1.4溢出中断服务程序:
溢出中断服务程序为定时器1溢出中断服务程序,每执行一次,num加1,并判断num是否达到100,即计时5s。若已达到5s,I/O口P1.0输出复位信号. 溢出中断服务程序清单(c语言)如下:
void int_T1() interrupt 3 using 3 //定时器1溢出中断服务程序 {
num++; //每溢出一次标志加1
if (num==100) //当标志等于100时,即计时5s {
P1=~(0x01); //P1.0输出1 } }
1.5喂狗代码:
喂狗代码主要功能为暂时关定时器1,定时器1寄存器清零,看门狗标志num清零和重新开启定时器1. 喂狗代码程序清单(c语言)如下:
TR1=0; //喂狗代码,关定时器1 TL1=0xB0; //重新设置定时器初值
(完整word版)C51单片机看门狗电路及程序设计方案
TH1=0x3C;
TF1=0; //定时器1溢出中断标志清零 TR1=1; //开定时器1
1。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; //看门狗复位标志
(完整word版)C51单片机看门狗电路及程序设计方案
P1=~(0x00); //将P1口赋值为0
TMOD=0x10; //设置TMOD寄存器,定时器1设为方式1 TL1=0xB0; //设置定时器初值低8位
TH1=0x3C; ET1=1; EA=1; TF1=0; TR1=1;
temp=0x01; for(i=0;i<8;i++) {
P0=~temp; delay(100);
temp<〈=1; }
TR1=0; //设置定时器初值高8位,设置为计时50ms //开定时器1溢出中断 //开总中断控制
//定时器1溢出中断标志清零 //开定时器1
//流水灯状态标志 //流水灯程序(1) //点亮P0口对应的LED //点亮的LED灯前移一位 //喂狗代码,关定时器1
(完整word版)C51单片机看门狗电路及程序设计方案
TL1=0xB0; //重新设置定时器初值 TH1=0x3C;
TF1=0; //定时器1溢出中断标志清零 TR1=1;
while(1) { temp=0x80; for(i=0;i<8;i++) {
P0=~temp; delay(100); temp>〉=1; } }
TR1=0; TL1=0xB0;
//开定时器1
//流水灯程序(2) //倒序,无限循环 //喂狗代码 (完整word版)C51单片机看门狗电路及程序设计方案
TH1=0x3C; 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溢出中断服务程序 {
(完整word版)C51单片机看门狗电路及程序设计方案
num++; //每溢出一次标志加1
if (num==100) //当标志等于100时,即计时5s {
P1=~(0x01); //P1.0输出1 } }
完整测试程序清单(c语言反汇编版)如下:
Q0000: LJMP Q00AB Q0003: PUSH ACC INC 0AH MOV A,0AH JNZ Q000D INC 09H Q000D: XRL A,#H ORL A,09H JNZ Q0016 MOV P1,#0FEH
(完整word版)C51单片机看门狗电路及程序设计方案
Q0016: POP ACC RETI NOP Q001E: NOP LJMP Q0003 CLR A MOV 09H,A MOV 0AH,A MOV P1,#0FFH MOV TMOD,#10H MOV TL1,#0B0H MOV TH1,#3CH SETB ET1 SETB EA CLR TF1 SETB TR1 MOV 08H,#01H
(完整word版)C51单片机看门狗电路及程序设计方案
MOV 0BH,A MOV 0CH,A Q003E: LCALL Q00 Q004F: MOV A,08H ADD A,ACC MOV 08H,A INC 0CH MOV A,0CH JNZ Q004F INC 0BH CLR C SUBB A,#08H MOV A,0BH SUBB A,#00H JC Q003E CLR TR1 MOV TL1,#0B0H
(完整word版)C51单片机看门狗电路及程序设计方案
MOV TH1,#3CH CLR TF1 SETB TR1 Q00: Q006C: Q007D: MOV 08H,#80H CLR A MOV 0BH,A MOV 0CH,A LCALL Q00 MOV A,08H CLR C
RRC A MOV 08H,A INC 0CH MOV A,0CH JNZ Q007D INC 0BH CLR C
(完整word版)C51单片机看门狗电路及程序设计方案
SUBB A,#08H MOV A,0BH SUBB A,#00H Q00: Q0092: JC Q006C SJMP Q00 RET MOV A,08H CPL A MOV P0,A MOV R7,#H MOV R6,#00H MOV A,R7 ORL A,R6 JZ Q00AA CLR A MOV R5,A MOV R4,A
(完整word版)C51单片机看门狗电路及程序设计方案
Q0099: INC R5 CJNE R5,#00H,Q009E INC R4 Q009E: Q00AA: Q00AB: Q00AE: A,R5 CPL A ORL A,R4 JNZ Q0099 MOV A,R7 DEC R7 JNZ Q0092 DEC R6 SJMP Q0092 RET MOV R0,#7FH CLR A MOV @R0,A DJNZ R0,Q00AE
MOV (完整word版)C51单片机看门狗电路及程序设计方案
MOV SP,#0CH LJMP Q001E
因篇幅问题不能全部显示,请点此查看更多更全内容