stc单片机看门狗喂狗程序

合集下载

C51单片机看门狗电路及程序设计方案

C51单片机看门狗电路及程序设计方案

C51单片机看门狗电路及程序设计案院系:信息工程学院年级:2010级电子一班禹豪电子一班训虎电子二班邓启新一、引言在由单片机构成的微型计算机系统中,程序的正常运行常常会因为来自外界的电磁场干扰等原因而被打断,从而造成程序的跑飞,而陷入死循环。

由此导致单片机控制的系统无法继续工作,造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的芯片或程序,俗称"看门狗"(watchdog)(1)看门狗电路基本原理看门狗电路的应用,使单片机可以在无人状态下实现连续工作,其工作原理是:看门狗芯片和单片机的一个I/O引脚相连**,该I/O引脚通过程序控制它定时地往看门狗的这个引脚上送入高电平(或低电平),这一程序语句是分散地放在单片机其他控制语句中间的,一旦单片机由于干扰造成程序跑飞后而陷入某一程序段进入死循环状态时,写看门狗引脚的程序便不能被执行,这个时候,看门狗电路就会由于得不到单片机送来的信号,便在它和单片机复位引脚相连的引脚上送出一个复位信号,使单片机发生复位,即程序从程序存储器的起始位置开始执行,这样便实现了单片机的自动复位。

*此处设计原理实际上为下文中硬件看门狗设计思路。

(2)看门狗电路一般设计式“看门狗”电路一般分为硬件看门狗与软件看门狗两种设计式。

硬件看门狗是利用了一个定时器,来监控主程序的运行,也就是说在主程序的运行过程中,我们要在定时时间到之前对定时器进行复位。

如果出现死循环,或者说PC指针不能回来,那么定时时间到后就会使单片机复位。

常用的WDT芯片如MAX813,5045,IMP 813等,价格4~10元不等.软件看门狗技术的原理和硬件看门狗类似,只不过是用软件的法实现(即利用单片机部定时器资源,通过编程模拟硬件看门狗工作式),以51系列为例:因在51单片机中有两个定时器,在利用部定时器资源来对主程序的运行进行监控时。

关于STC15F2KA60S2看门狗的应用

关于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+串口+看门狗

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单片机为例包含最简单的程序只有三条)

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单片机看门狗及其溢出时间计算公式

STC12C2052AD单片机看门狗及其溢出时间计算公式
MOV WDTCR, #Pre_scale_Word ;启动看门狗
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单片机看门狗功能的验证

STC单片机看门狗功能的验证
CLR IE0 ;清中断标志,读操作过程中有低电平脉冲
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 输入位数据

单片机看门狗程序

单片机看门狗程序
tips:感谢大家的阅读,本文由我司收集整编。仅供参阅!
门狗”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分钟给你发出信号来证明我没有事情,如果没有收到我的消息的话证明我在里面有所不测,那幺你
就冲进来营救我。

在嵌入式控制器里面的这只狗就称之为看门狗。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档