stc单片机看门狗喂狗程序
C51单片机看门狗电路及程序设计方案
C51单片机看门狗电路及程序设计案院系:信息工程学院年级:2010级电子一班禹豪电子一班训虎电子二班邓启新一、引言在由单片机构成的微型计算机系统中,程序的正常运行常常会因为来自外界的电磁场干扰等原因而被打断,从而造成程序的跑飞,而陷入死循环。
由此导致单片机控制的系统无法继续工作,造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的芯片或程序,俗称"看门狗"(watchdog)(1)看门狗电路基本原理看门狗电路的应用,使单片机可以在无人状态下实现连续工作,其工作原理是:看门狗芯片和单片机的一个I/O引脚相连**,该I/O引脚通过程序控制它定时地往看门狗的这个引脚上送入高电平(或低电平),这一程序语句是分散地放在单片机其他控制语句中间的,一旦单片机由于干扰造成程序跑飞后而陷入某一程序段进入死循环状态时,写看门狗引脚的程序便不能被执行,这个时候,看门狗电路就会由于得不到单片机送来的信号,便在它和单片机复位引脚相连的引脚上送出一个复位信号,使单片机发生复位,即程序从程序存储器的起始位置开始执行,这样便实现了单片机的自动复位。
*此处设计原理实际上为下文中硬件看门狗设计思路。
(2)看门狗电路一般设计式“看门狗”电路一般分为硬件看门狗与软件看门狗两种设计式。
硬件看门狗是利用了一个定时器,来监控主程序的运行,也就是说在主程序的运行过程中,我们要在定时时间到之前对定时器进行复位。
如果出现死循环,或者说PC指针不能回来,那么定时时间到后就会使单片机复位。
常用的WDT芯片如MAX813,5045,IMP 813等,价格4~10元不等.软件看门狗技术的原理和硬件看门狗类似,只不过是用软件的法实现(即利用单片机部定时器资源,通过编程模拟硬件看门狗工作式),以51系列为例:因在51单片机中有两个定时器,在利用部定时器资源来对主程序的运行进行监控时。
关于STC15F2KA60S2看门狗的应用
关于STC15F2K60S2看门狗的应用1.STC15F2K60S2系列单片机的内部结构图STC15F2K60S2系列单片机的内部结构框图如下图所示,STC15F2K60S2系列单片机中包含中央处理器(CPU)、程序存储器(Flash)、数据存储器(SRAM)、定时器、IO口、高速A/D转换、看门狗、UART高速异步串行通信口1/串行通信口2,CCP/PWM/PCA,一组高速同步串行端口SPI,片内高精度R/C 时钟及高可靠复位等模块,STC15F2K60S2系列单片机几乎包含了数据采集和控制中的所有单元模块。
B寄存器AUX-RAM1792字节ADCRAM地址寄存器RAM256字节ACCTMP2TMP1ALU堆栈指针定时器/计数器/0/1定时器/计数器2看门狗(WDT)ISP/IAP串口1串口2程序存储器(Flash)8K~16K地址生成器控制单元P0,P2,P3,P4,P5锁存器P0,P2,P3,P4,P5驱动器Port1驱动器Port1锁存器掉电唤醒专用定时器CPP/PCA/PWM程序计数器(PC)PSWSPIP0,P2,P3,P4,P58/P1.0~P1.7P1.0~P1.7内部高可靠复位(8级可选复位门槛电压)内部高精度R/C时钟温飘常温下温飘STC15F2K60系列内部结构框图2.目的:在工业控制/汽车电子/航空航天等需要高可靠行的系统中,为了防止“系统在异常情况下,受到干扰,MCU/CPU程序跑飞,导致系统长时间异常工作”,通常是引进看门狗,如果MCU/CPU不在规定的时间内按要求访问看门狗,就认为MCU/CPU处于异常状态,看门狗就会强迫MCU/CPU复位,使系统重新从头开始按规律执行用户程序。
看门狗复位状态结束后,不影响特殊功能寄存器IAP_ONTR中SWBS/IAP_ONTR.6位的值,单片机根据复位前SWBS/IAP_ONTR.6的值选择是从用户应用程序区启动,还是从系统ISP监控程序区启动。
STC89C58RD+22.1184MHz晶振+外中断0+红外遥控解码+定时器0+定时器1+定时器2+串口+看门狗
STC89C58RD+22.1184MHz晶振+外中断0+红外遥控解码+定时器0+定时器1+定时器2+串口+看门狗本程序通过外中断0与定时器0实现红外遥控解码,并通115200波特率的串口将红外遥控的地址码和数据码发送到PC机上的串口助手,同时使用定时器1进行喂狗,防止程序出现异常。
本程序适用于STC系列的单片,ATMEL的单片机基本通用,就是在设置看门狗和定时器2时需要参考ATMEL单片机的手册才行。
//以下程序适用于STC89C58RD+ ,使用22.1184MHz晶振,用1838来对红外遥控器解码,1838的1脚接外中断0脚,即单片机P3.2脚//红外遥控器发出的红外信号经过1838处理后输出的是9.5ms低电平(也可能是4.5ms低电平)加4.5ms高电平的前导码,后面8位的地址码,8位的地址反码(也可能是地址码),8位的数据码,8位的数据反码,总共32位码//其中0码由O.56ms低电平和0.56ms高电平组合而成.脉冲宽度为1.12ms;1码由0.56ms低电平和1.69ms高电平组合而成,脉冲宽度为2.25ms//特别说明:当使用定时器1作为波特率发生器,而定时器2作为16位自动装载的定时器时,定时器2无法正常工作,必须是定时器2作为波特率发生器,定时器1作为定时器用#include<reg52.h>#include<stdio.h>//#include<string.h>unsigned char count;unsigned int Address_Part,Data_Part;unsigned char date;bit Rev_flag;bit Over_flag;sfr WDT_CONTR=0xe1;//STC的看门狗寄存器的地址,ATMEL的芯片看门狗地址不一样sfr T2MOD=0xc9;//定时器2的模式选择寄存器地址//unsigned int time_data[35];//unsigned char time_count;#define WDT_Time 22unsigned char Count_Num=0;void delay(unsigned int z)//延时函数,在22.1184M晶振下没有调试过,只是大概的使用,大概是1个毫秒{unsigned int x,y;for(x=z;x>0;x--)for(y=200;y>0;y--);}void init_config()//初始化函数{// PCON |=0x80;//SMOD=1,定时器1要产生115200波特率必须置位,定时器2则不需要REN=1;//启动串行接收数据SM0=0;SM1=1;//SM0,SM1设置串行口为工作方式1,10位异步收发器-->1位起始位,8位数据,1位停止位TI=1;//要使用printf()函数,就需要置位,后期不能置0T2MOD=0x00;//选择定时器2为向上定时计数器T2CON=0x34;//选择定时器2为16位自动重新装载模式下的波特率发生器,启动定时器2RCAP2H=0xff;//65536-(fosc/(32*baud));//22.1184MHz产生115200波特率,算法和用定时器1做波特率发生器的算法不一样RCAP2L=0xfa;//TMOD=0x11;//设置定时器0为工作方式1,定时器1为方式1TH1=(65536-65000)/256;//定时器初值,大概是35ms进一次定时器中断TL1=(65536-65000)%256;//TR1=1;//启动T1定时器TH0=0x00;TL0=0x00;//设置定时器0初值IT0=1;//设置外中断0为下降沿触发ET0=1;//开定时器0允许中断ET1=1;//开定时器1允许中断EX0=1;//开外中断0//TR0=1;ES=1;//开串口中断EA=1;//开总中断Rev_flag=0;Over_flag=0;printf("Initialization is OK!\n\r");WDT_CONTR=0x35;//看门狗启动,计数清零,晶振为22.1184MHz,64分频,溢出时间为1S}void main()init_config();while(1){// WDT_CONTR=0x35;//看门狗启动,计数清零,64分频,溢出时间为1Sif(Over_flag){Over_flag=0;printf("Address_Part:%x,Data_Part:%x\n\r",Address_Part,Data_Part);}if(Rev_flag)//判断串口接受到数据,只是把从串口调试助手发过来的数据发回去,测试收发用而已{ES=0;Rev_flag=0;SBUF=date;//发送数据while(!TI);//发送数据完毕才跳出死循环ES=1;// TI=0;}/* if(Count_Num>WDT_Time)//0.8秒左右喂狗{Count_Num=0;//WDT_CONTR=0x35;//看门狗启动,计数清零,64分频,溢出时间为1Sprintf("T1!\n\r");}*//* if(time_count==40)//把收到的时间th值传给串口打印出来{time_count=0;printf("time:\n\r");for(;time_count<35;time_count++){printf("%d \n\r",time_data[time_count]);}memset(time_data,0,sizeof(time_data));EX0=1;//开外中断0}*/}}void exter() interrupt 0{unsigned int th;unsigned char tl;bit ds;TR0=0;//关定时器0th=TH0;//提取出高8位tl=TL0;//提取出低8位th<<=8;//左移8位th=th|tl;//算出定时器总共的计数值TH0=0x00;//初始值TL0=0x00;/* time_data[time_count]=th;//这段代码的作用是在不知道th的数值是多少为前导码,为0,为1时,把收到的时间th给提取出来,方便传给串口打印出来,要使用这一功能要把下面判断前导码那些代码给屏蔽,并且开启主函数里面的那段代码time_count++;if(time_count==35){time_count=40;EX0=0;}TR0=1;*//*这段判断前导码和0、1的值是12M晶振下的if(th>950&&th<1225)ds=0;//判断0和1else if(th>2050&&th<2345)ds=1;else if(th>13325&&th<13600)//判断前导码*///这段判断前导码和0、1的值是22.1184M晶振下的if(th>1900&&th<2260)ds=0;//判断0和1else if(th>4000&&th<4300)ds=1;else if(th>24900&&th<25350)//判断前导码{Address_Part=0;Data_Part=0;count=0;Over_flag=0;TR0=1;return;}else{TR0=1;return;}//去除干扰,当接收的是准备进前导码时的下降沿和截止码时,该语句起作用,没有该语句,则只能接收一次count++;if(count<16){Address_Part=Address_Part|ds;Address_Part=Address_Part<<1;TR0=1;}else if(count==16){Address_Part=Address_Part|ds;TR0=1;}else if(count<32){Data_Part=Data_Part|ds;Data_Part=Data_Part<<1;TR0=1;}else if(count==32){Data_Part=Data_Part|ds;Over_flag=1;}//接收完32位,后面应该有连续码,但不需要,所以不作处理}void time0() interrupt 1//要是没有该函数,可能会因为溢出而导致解码不正确{TR0=0;}void ser() interrupt 4{if(RI)//一定要加该判断句,不然串口调试助手那里会一直收到数据{RI=0;date=SBUF;//提取数据Rev_flag=1;}}void timer1() interrupt 3{TH1=(65536-65000)/256;//定时器初值;TL1=(65536-65000)%256;//Count_Num++;// printf("T2!\n\r");if(Count_Num>WDT_Time)//0.8秒左右喂狗{Count_Num=0;WDT_CONTR=0x35;//看门狗启动,计数清零,64分频,溢出时间为1S}}。
8051单片机看门狗原理C语言演示程序(以STC89C52RC单片机为例包含最简单的程序只有三条)
***************************************************************************/
#include <Reg52.H>
sfr WDT_CONTR=0xE1;
//定义特殊功能寄存器:STC 单片机看门狗控制寄存器
#define uchar unsigned char
//初始化时两盏灯都熄灭 LED=1; LED_busy=1;
TMOD=0x21; 为串行口波特率发生器
TH0=0x4C; TL0=0x00; IE=0x82; TR0=1;
//定时器 0 工作在方式 1,作为 16 位定时器;定时器 1 工作在方式 2,作
//定时器 0 装初值:每隔 50ms 溢出一次
#define true 1
#define false 0
#define WEIGOU WDT_CONTR=0x34
//看门狗启动设置和“喂狗”操作
sbit LED=P1^6; sbit LED_busy=P1^7;
//信号灯,系统正常工作就一闪一闪的 //工作灯,上电灭一会儿(约 800ms),然后正常工作的时
注解:这里顺便说一下,一般教材上叫“看门狗定时器”,其实定时器原理 还是计数器,只是计的是时钟周期,所以我为了初学者好理解叫统一叫“计数 器”,这里阐明一下。
明白了上面的原理,我们在设计程序时,先根据看门狗计数器的位数和系统 的时钟周期算一下计数器计满数需要的时间,就是说在这个时间内“看门狗”计 数器是丌会装满的,然后在这个时间内告诉它重新开始计数,就是把计数器清零,
由于现在 AT89S52 用的很广泛,所以我先说说 ATMEL 的看门狗;再说说本次试验用的 STC89C52RC 的看 门狗;注意两个不一样!!!
STC12C2052AD单片机看门狗及其溢出时间计算公式
WAIT1:
SJMP WAIT1 ;循环执行本语句(停机),等待看门狗溢出复位
;看门狗复位, 热启动, RAM 单元内容不变, 为复位前的值
WDT_Reset: ;看门狗复位, 热启动
;上电复位, 冷启动, RAM 单元内容为随机值
SETB Last_WDT_Time_LED_Status ;上电复位,
;初始化看门狗溢出时间指示灯的状态位 = 1
CLR WDT_TIME_LED ;上电复位, 点亮看门狗溢出时间指示灯
Last_WDT_Time_LED_Status EQU 00H ;位变量, 存储看门狗溢出时间指示灯的上一次状态位
;WDT 复位时间(Oscillator frequency = 18.432MHz):
;Pre_scale_Word EQU 00111100B ;清0、启动看门狗,预分频数=32 0.68S
WAIT3:
SJMP WAIT3 ;循环执行本语句(停机),等待看门狗溢出复位
END
参考链接:/news/2009-08/643.htm
ORG 0000H
P MAIN
ORG 0100H
MAIN:
MOV A, WDTCR ;检测是否为看门狗复位
ANL A, #10000000B
JNZ WDT_Reset ;WDTCR.7 = 1, 看门狗复位, 跳转到看门狗复位程序
Pre_scale_Word EQU 00111101B ;清0、启动看门狗,预分频数=64 1.36S
;Pre_scale_Word EQU 00111110B ;清0、启动看门狗,预分频数=128 2.72S
STC单片机看门狗功能的验证
SETB EX0 ;允许键盘中断
RET
END
上电实物图:
6.出现的问题及解决方法
7.心得体会及建议
;子程序调用
;****************************************************************************
; 初始化子程序
CH451_INIT:
CLR CH451_DIN ;先低后高,输出上升沿通知 CH451 选择 4 线串行接口
SETB CH451_DCLK ;置为默认的高电平
SETB CH451_DIN
SETB CH451_LOAD
SETB CH451_DOUT ;置为输入
CLR IT0 ;置外部信号为低电平触发
SETB PX0 ;置高优先级或者低优先级
CLR IE0 ;清中断标志
SETB EX0 ;允许键盘中断
MOV B,#04H ;设置为键盘与显示开
MOV A,#03H
SUM DATA 7EH ;定义要用的变量
A1 DATA 7CH
A2 DATA 7BH
A3 DATA 7AH
A4 DATA 79H
DEDADATA 75H
SECDATA 74H
MINDATA 73H
WDT_CONTR EQU 0C1H;看门狗地址
;Pre_scale_Word EQU 00111111B ;清0,启动看门狗,预分频数=64, 1.1377S
CLR CH451_DCLK
MOV CH451_DIN,C ;送出一位数据
SETB CH451_DCLK ;产生时钟上升沿锁通知 CH451 输入位数据
单片机看门狗程序
门狗”WDT的功能;此单片机看门狗由51hei独家提供LISTP=18F458INCLUDE”
P18F458.INC”
DEYHEQU0X20DEYLEQUDEYH+1
ORG0X00GOTOMAINORG0X30
;*************初始化子程序*****************INITIALCLRFTRISD;D口
;************单片机看门狗主程序
****************************MAINNOPCALLINITIAL;系统初始化
MOVLW0X00MOVWFPORTD;D口送00H,发光二极管亮
CALLDELAYMOVLW0XFFMOVWFPORTD;D口送FFH,发光二极管灭
LOOPGOTOLOOP;死循环,等待看门狗复位END
/*主程序*/main(){initial();/*初始化,设定看门狗的相关寄存器*/PORTD=
0X00;/*D口送00H,发光二极管亮*/DELAY();/*给予一定时间的延时*/PORTD
=0XFF;/*D口送FFH,发光二极管灭*/while(1){;}/*死循环,等待看门狗溢出
复位*/}
-------------------汇编语言版本的单片机看门狗程序----------------;此程序实现”看
单片机看门狗程序
/*此程序实现单片机”看门狗”WDT的功能*/
#include”p18f458.h”
unsignedlongi;
/*系统初始化子程序*/voidinitial(){TRISD = 0X00;/*D口设为输出*/}
/*延时子程序*/voue;}
看门狗--喂狗
看门狗--喂狗
看门狗----喂狗
看门狗(watchingdog)本质上是一种定时器(timer).
定时器有软件定时器和硬件的定时器,软件定时器的一般的操作方法是在
一定的时间内向操作系统发送消息,一定时间一般又体现为时间递减的形式,例如时间在2000毫秒时向操作系统发送一个window消息,适合于window
这样的消息驱动的机制;硬件上的定时器是一个硬件的模块,在一定时间内发出中断,出发中断服务函数响应。
看门狗是一种硬件上的定时器,我们可以制定它在到达时间内reset控制器,它与普通定时器的不同之处就在于他可以reset。
使用看门狗功能的器件要定
时的向它发送消息,以用来表示自己在正常工作着,也就是我们所说的喂狗,当该器件不再喂狗时,看门狗则认为该器件发生了异常,从而在时间到达的
时候reset整个微控制器。
原理小故事:
向枪战片的清醒,人A带着狗B一起潜入一个地方,A进去,B在门口接应,A走的时候告诉B,如果我安全的话我会在每10分钟给你发出信号来证明我没有事情,如果没有收到我的消息的话证明我在里面有所不测,那幺你
就冲进来营救我。
在嵌入式控制器里面的这只狗就称之为看门狗。
STC89系列单片机看门狗的使用及应用程序
STC89 系列单片机看门狗的使用及应用程序
看门狗概念及其应用在由单片机构成的系统中,由于单片机的工作有可能会受到来自外界电磁场的干扰,造成程序的跑飞,从而陷入死循环,程序的正常运行被打断,由单片机控制的系统便无法继续工作,这样会造成整个系统陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的芯片,俗称看门狗(watch dog)。
加入看门狗电路的目的是使单片机可以在无人状态下实现连续工作,其工作过程如下:看门狗芯片和单片机的一个I/O 引脚相连,该I/O 引脚通过单
片机的程序控制,使它定时地往看门狗芯片的这个引脚上送入高电平(或低电平),这一程序语句是分散地放在单片机其他控制语句中间的,一旦单片机由于干扰造成程序跑飞后而陷入某一程序段进入死循环状态时,给看门狗引脚送电平的程序便不能被执行到,这时,看门狗电路就会由于得不到单片机送来的信号,便将它和单片机复位引脚相连的引脚上送出一个复位信号,使单片机发生复位,从而单片机将从程序存储器的起始位置重新开始执行程序,这样便实现了单片机的自动复位。
通常看门狗电路需要一个专门的看门狗芯片连接单片机来实现,这在我们的单片机教程网51hei 以前做过相关的电路介绍。
不过这样会给电路设计带
来复杂,STC 单片机内部自带有看门狗,通过对相应特殊功能寄存器的设置
就可实现看门狗的应用,STC89 系列单片机内部有一个专门的看门狗定时器
寄存器,Watch Dog Timer 寄存器,其相应功能见下个知识点。
单片机汇编语言实现看门狗
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
SCK=0; SCK=1; ucData<<=1; } } uchar ReadReg() { uchar ucData; CS=0; WriteByte(RDSR); ucData=ReadByte(); CS=1; return ucData; } uchar WriteReg(uchar ucData) { 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; //write register //read register
(完整word版)C51单片机看门狗电路及程序设计方案
常熟理工学院项目设计报告项目: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)一.引言在由单片机构成的微型计算机系统中,程序的正常运行常常会因为来自外界的电磁场干扰等原因而被打断,从而造成程序的跑飞,而陷入死循环.由此导致单片机控制的系统无法继续工作,造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的芯片或程序,俗称”看门狗"(watchdog)(1)看门狗电路基本原理看门狗电路的应用,使单片机可以在无人状态下实现连续工作,其工作原理是:看门狗芯片和单片机的一个I/O引脚相连,该I/O引脚通过程序控制它定时地往看门狗的这个引脚上送入高电平(或低电平),这一程序语句是分散地放在单片机其他控制语句中间的,一旦单片机由于干扰造成程序跑飞后而陷入某一程序段进入死循环状态时,写看门狗引脚的程序便不能被执行,这个时候,看门狗电路就会由于得不到单片机送来的信号,便在它和单片机复位引脚相连的引脚上送出一个复位信号,使单片机发生复位,即程序从程序存储器的起始位置开始执行,这样便实现了单片机的自动复位.(2)看门狗电路一般设计方式“看门狗”电路一般分为硬件看门狗与软件看门狗两种设计方式。
硬件看门狗是利用了一个定时器,来监控主程序的运行,也就是说在主程序的运行过程中,我们要在定时时间到之前对定时器进行复位。
针对单片机的看门狗
针对单片机的看门狗系统软件""的设计思路:1.看门狗定时器T0的设置。
在初始化程序块中设置T0的工作方式,并开启中断和计数功能。
系统Fosc=12 MHz,T0为16位计数器,最大计数值为(2的16次方)-1=65 535,T0输入计数频率是.Fosc/12,溢出周期为(65 535+1)/1=65 536(μs)。
2.计算主控程序循环一次的耗时。
考虑系统各功能模块及其循环次数,本系统主控制程序的运行时光约为16.6 ms。
系统设置"看门狗"定时器T0定时30 ms(T0的初值为65 536-30 000=35 536)。
主控程序的每次循环都将刷新T0的初值。
如程序进入"死循环"而T0的初值在30 ms 内未被刷新,这时"看门狗"定时器T0将溢出并申请中断。
3.设计T0溢出所对应的中断服务程序。
此子程序只须一条命令,即在T0对应的中断向量地址(000BH)写入"无条件转移"指令,把计算机拖回囫囵程序的第一行,对重新举行初始化并获得正确的执行挨次基本原理看门狗,又叫 watchdog timer,是一个定时器, 普通有一个输入,叫喂狗(kicking the dog or service the dog),一个输出到的RST端,MCU 正常工作的时候,每隔一段时光输出一个信号到喂狗端,给 WDT 清零,假如超过规定的时光不喂狗,(普通在程序跑飞时),WDT 定时超过,就会给出一个复位信号到MCU,使MCU复位. 防止MCU死机. 看门狗的作用就是可防止程序跑飞。
也可以防止程序在线运行时候浮现死循环。
工作原理:在系统运行以后也就启动了看门狗的计数器,看门狗就开头自动计数,假如到了一定的时光还不去清看门狗,那么看门狗计数器就会溢出从而引起看门狗中断,造成系统复位。
所以在用法有看门狗的芯片时要注重清看门狗。
看门狗应用
看门狗应用看门狗:看门狗是单片机的一种超时复位机制。
实际上看门狗是一个硬件的计时器,在到达一定的时间后令单片机复位,即程序从头开始重新运行。
在很多种单片机中都有看门狗,除了STC89系列单片机,还有凌阳等。
看门狗的功能:在工业应用中由于一些意外的原因,如电磁干扰、内部硬件错误等,造成单片机死机或陷入死循环中,这样可能会出现很严重的后果,这就需要一种自我检测复位的功能。
在对看门狗进行设置之后,它便开始计时。
在程序运行的过程中对计时器的值定时清零,这就是通常所说的“喂狗”。
如果程序运行正常,则看门狗由于可以及时得以清零,所以不会出溢出。
但是如果程序停滞或进行死循环,就使得看门狗不能清零(看门狗是硬件实现的,与程序的运行是无关的),从而在到达设定的时间后产生溢出,使单片机复位。
STC89系列单片机看门狗的应用:表2.1 STC89的看门狗定时器特殊功能寄存器如表2.1所示,要使用STC89的看门狗只需对寄存器进行设置即可。
WDT_CONTR中的各位的功能详述如下:EN_WDT:Enable Watch Dog Timer,使能看门狗定时器,允许看门狗工作,1允许,0禁止。
CLR_WDT:Clear Watch Dog Timer,看门狗定时器清零,1清零,随后会硬件置0。
IDLE_WDT:Idle Watch Dog Timer,看门狗定时器在空闲模式时是否计时,1为计时,0为停止。
PS2、PS1、PS0:看门狗定时器的预分频,设置成不同的值,会影响到溢出时间。
如果预分频为1(即1分频)的时候,溢出时间为1s,那么当预分频为2时,溢出时间就是2s。
STC89的预分频如表2.2所示:表2.2 STC89的预分频值综上规律,预分频值P=2^(PS+1)。
那么具体的溢出时间是怎么样算出来的呢?这个溢出时间与所用的晶体震荡器频率是有关的,下面介绍其计算方法。
T_WDT=(N • P• 32768)/F_Osc其中参数意义如下:T_WDT:溢出时间N:单片机的时钟数(所谓时钟数就是外部时钟的频率经过N分频后作为单片机工作的时钟,比如外部时钟频率是12M,如果单片机的时钟数N=12的话,那么单片机内部的工作时钟频率便为1M,STC89系列单片机有两种时钟数模式,6时钟与12时钟,当然不同的单片机可能有不同的时钟数,这在相应的芯片文档中会有所说明,如STC12系列单片机的时钟数为1时钟,即外部时钟频率就是工作频率,我们在这里对STC12单片机不作详述)P:就是上面所提到的看门狗定时器的预分频值。
单片机任务型软件_看门狗_原理及应用
借助单片机中的定时器中断机制, 每个任务分配计时单元 和运行标志位,由定时中断依据运行标志位状态独立计时, 任 务正常完成时, 运行标志位和计时单元均恢复到非运行状态描 述。在主程序循环中, 任务的限时判断模块独立于原任务处理 它只是对任务运行的时间进行判断, 如 模块之外, 如图 2 所示, 果服务时间超过了正常的运行时间, 则复位这个任务, 即将其 使用的有关资源, 恢复到任务开始前的初始状态, 供下一次任 务使用, 从而实现了任务型软件“ 看门狗” 的功能, 避免了相同 任务之间的干扰。
器的控制命令, 如重起操作系统等。 以下是统计管理程序和中央监控程序通信数据报的结构:
9:; 应 用 程 序 到 目 录 7 <=> 7 ?@AB? 7 C:;+ 后 , 在 文 件 7 :DA 7 :EF@>D=
中添加 一 行 7 <=> 7 ?@AB 7 C:;= ( , 这表明这个目录可以在装载 >C ) 并有读写权限。在每个真实服务 56+ 的任何远程系统上使用, 器上, 在其文件 7 :DA 7 G=DB; 中添加下面一行: &"$&&$3$’ : 7 <=> 7 ?@AB? 7 C:;= 7 <=> 7 ?@AB? 7 D@HABD 7 C:;BFF= 7 IJJK 7 CLMN=@GD, 将 C:;= 映射为本地目录 7 <=> 7 ?@AB? 7 D@HABD 7 C:;BFF= 7 IJJK 7
文章编号 &""!12%%&1( !""# ) %#1"&!!1"!
!"#$%#&’( )$* +&&’#%),#-$ -. /-.,01),%2*-3 4(%2$-’-35 .-" 6)%2 4)78 #$ 9:;
51单片机看门狗软件程序设计
51单片机看门狗软件设计一、设计原理单片机中有两个定时器,我们可以用这两个定时器来对主程序的运行进行监控。
可以对T1设定一定的定时时间,当产生定时中断的时候对一个变量进行赋值,而这个变量在主程序运行的开始已经有了一个初值,在这里我们要设定的定时值要小于主程序的运行时间,这样在主程序的尾部对变量的值进行判断,如果值发生了预期的变化,就说明T0中断正常,如果没有发生变化则使程序复位。
二、设计方案1、看门狗定时器T1的设置。
在初始化程序块中设置T1的工作方式,并开启中断和计数功能。
系统Fosc=12 MHz,T1为16位计数器,最大计数值为65 535,T1输入计数频率是.Fosc/12,溢出周期为(65 535+1)/1=65 536(μs)。
2、计算主控程序循环一次的耗时。
考虑系统各功能模块及其循环次数,系统设置"看门狗"定时器T1计时50 ms (T1的初值为65 536-50000=15 536=3CB0H)。
主控程序的每次循环都将刷新T1的初值。
如程序进入"死循环"而T1的初值在50 ms内未被刷新,这时"看门狗"定时器T1将溢出并申请中断。
溢出中断服务程序开始工作,将看门狗标志num加1。
当num 的值等于100时,说明看门狗定时器已经计时5s,此时,单片机I/O端口P1.0输出高电平,对程序进行复位。
3.、在此过程中,喂狗代码将被穿插于程序中循环体末尾。
当循环体结束时,喂狗代码执行,关闭定时器1、清空num并重新初始化定时器设置。
若循环体进入死循环,喂狗代码无法执行,num将一直累加至100,此时程序复位。
三、关键代码“看门狗“定时器设置程序代码如下:TMOD=0x10; //设置TMOD寄存器,定时器1设为方式1TL1=0xB0; //设置定时器初值低8位TH1=0x3C; //设置定时器初值高8位,设置为计时50msET1=1; //开定时器1溢出中断EA=1; //开总中断控制TF1=0; //定时器1溢出中断标志清零TR1=1; //开定时器1溢出中断服务程序代码如下:void int_T1() interrupt 3 using 3 //定时器1溢出中断服务程序{num++;//每溢出一次标志加1if (num==100)//当标志等于100时,即计时5s {P1=~(0x01); //P1.0输出1}}喂狗程序代码如下:TR1=0; //喂狗代码,关定时器1TL1=0xB0; //重新设置定时器初值TH1=0x3C;TF1=0;//定时器1溢出中断标志清零TR1=1; //开定时器1四、电路图。