多语言网站模板,南通住房和城乡建设部网站首页,互联网推广属于什么行业,网站网站制作公司哪家好在 STC89C52 单片机中#xff0c;看门狗控制寄存器的固定地址为 0xE1。此地址由芯片厂商在硬件设计时确定#xff0c;但是它在头文件中并未给出#xff0c;因此在使用看门狗系统时需要声明下这个特殊功能寄存器
sfr WDT_CONTR 0xE1;
本案将用一个小灯的工作状况来展示看门…
在 STC89C52 单片机中看门狗控制寄存器的固定地址为 0xE1。此地址由芯片厂商在硬件设计时确定但是它在头文件中并未给出因此在使用看门狗系统时需要声明下这个特殊功能寄存器
sfr WDT_CONTR 0xE1;
本案将用一个小灯的工作状况来展示看门狗工作性质。
首先看下看门狗的工作性质 在由单片机构成的微型计算机系统中由于单片机的工作常常会受到来自外界电磁场的干扰造成各种寄存器和内存的数据混乱会导致程序指针错误不在程序区取出错误的程序指令等都有可能会陷入死循环程序的正常运行被打断由单片机控制的系统无法继续正常工作导致整个系统的陷入停滞状态发生不可预料的后果。 看门狗又叫 watchdog从本质上来说就是一个定时器电路一般有一个输入和一个输出其中输入叫做喂狗输出一般连接到另外一个部分的复位端一般是连接到单片机。 看门狗的功能是定期的查看芯片内部的情况一旦发生错误就向芯片发出重启信号。看门狗命令在程序的中断中拥有最高的优先级。来自百科 1. 看门狗复位机制 内部自动复位 当看门狗超时计数器溢出时芯片内部会自动触发复位信号直接重启单片机内核和所有外设。 无需RST引脚动作复位由内部逻辑完成不依赖外部RST引脚电平变化。 RST引脚状态复位期间RST引脚可能保持高电平需外部上拉电阻维持但复位动作本身由内部完成。 2. WDT_CONTR 寄存器的作用 功能 WDT_CONTR 是 看门狗控制寄存器用于配置看门狗定时器Watchdog Timer, WDT的工作模式、分频系数和喂狗操作。 关键功能位以 STC89C52 为例 位名称功能描述5EN_WDT看门狗使能位1启用0关闭4CLR_WDT喂狗位写 1 清除计数器3IDLE_WDT空闲模式看门狗控制1计数0暂停2-0PS[2:0]分频系数选择位控制溢出时间 看门狗寄存器设置WDT_CONTR 0x35; //延时2.27S
4. 为何需要这样设置 目的 通过 sfr WDT_CONTR 0xE1; 将看门狗控制寄存器绑定到 C 语言变量使得程序员可以通过操作变量直接配置看门狗例如 WDT_CONTR 0x35; // 二进制 0011 0101 详细配置解析以 0x35 为例 EN_WDT1启用看门狗。 CLR_WDT1喂狗操作需周期性执行。 IDLE_WDT0空闲模式下看门狗暂停计数。 PS[2:0]101分频系数为 2^(51)64决定溢出时间。 2. 计算示例PS5, Fosc11.0592MHz T溢出12×64×32768/11,059,200≈2.275秒
设计一个简单程序验证下看门狗系统
#includereg52.h
#include macro_and_const.hsfr WDT_CONTR 0xE1;
sbit ENLED P1^4; // 使能引脚P1.4 这几个部分是38译码器是笔者硬件电路方面的要求
sbit ADDR0 P1^0; // 地址线0
sbit ADDR1 P1^1; // 地址线1
sbit ADDR2 P1^2; // 地址线2
sbit ADDR3 P1^3; // 地址线3E3使能sbit led P0^0;/*******************************************
延时一毫秒函数
*******************************************/
void Timer0_Init() {TMOD | 0x01; // 模式116位定时器TH0 0xFC; // 初值定时1ms11.0592MHzTL0 0x66;TR0 1; // 启动定时器
}void delay(uint ms) {uint i;for (i 0; i ms; i) {TH0 0xFC; TL0 0x66; // 重载初值while (!TF0); // 等待溢出TF0 0; // 清除标志}
}void main(void){Timer0_Init();WDT_CONTR 0x35;//设置看门狗时间2.27sADDR3 1; // E31使能ADDR2 1; // A21ADDR1 1; // A11ADDR0 0; // A00 → Y6有效ENLED 0; // E1E2使能低电平led 0;delay(200);led 1; delay(200); //LED闪烁3下led 0; delay(200);led 1; delay(200);led 0;WDT_CONTR 0x35; while(1){led 0;delay(2000);//延时2sWDT_CONTR 0x35; //喂狗}}
/*--------------------------------------------------------------------------
MACROANDCONST.H--------------------------------------------------------------------------*/
#ifndef _MACRO_AND_CONST_H_
#define _MACRO_AND_CONST_H_
/*无符号整形*/
typedef unsigned int uint16;
typedef unsigned int UINT;
typedef unsigned int uint;
typedef unsigned int UINT16;
typedef unsigned int WORD;
typedef unsigned int word;/*有符号整形*/
typedef int int16;
typedef int INT16; /*无符号长整形*/
typedef unsigned long uint32;
typedef unsigned long UINT32;
typedef unsigned long DWORD;
typedef unsigned long dword; /*有符号长整形*/
typedef long int32;
typedef long INT32; /*有符号字符形*/
typedef signed char int8;
typedef signed char INT8; /*无符号字整形*/
typedef unsigned char boolean;
typedef unsigned char BOOLEAN;
typedef unsigned char uchar;
typedef unsigned char UCHAR;
typedef unsigned char UINT8;
typedef unsigned char uint8;
typedef unsigned char BOOL;
typedef unsigned char bool;/*C51编译器的扩展类型*/
typedef bit byte;
typedef bit BYTE;#ifndef EOF#define EOF -1
#endif#ifndef NULL#define NULL ((void *) 0)
#endif#ifndef enable
#define enable 1
#endif#ifndef disable
#define disable 0
#endif#ifndef true
#define true 1
#endif#ifndef false
#define false 0
#endif#endif
这个是头文件
这个程序的现象是闪3下然后LED一直点亮因为看门狗触发的时间是2.27S延时是2S及时喂了狗因此程序一直在while循环里跑。
看一下视频及时喂狗程序一直运行_哔哩哔哩_bilibili 如果把循环里的延时语句修改一下改成3s即 while(1){led 0;delay(3000);//延时3sWDT_CONTR 0x35; //喂狗}
延时过长未能及时喂狗因此单片系统复位了。所以现在的现象是闪烁3下然后延时2.27S这时LED灯是常亮的系统复位后马上又闪烁三下接着延时2.27S一直这么循环。
看一下视频
看门狗溢出一直复位_哔哩哔哩_bilibili
可以看到LED闪烁3下后延迟一段时间又开始闪烁这个延迟时间就是看门狗设置的时间2.27S。无论这个延时语句是多少秒要超过2.27S它的延时时间都是保持在2.27S。
不过存在一个问题复位后LED只闪了一下好奇怪不知道为什么。。。。