专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
STC系列单片机 看门狗一旦启动,就无法关闭
2020-01-18 18:46
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
12556
11
11
由于做个设备 ,要添加看门狗做个保险,最后测试发现看门狗一旦开启,就无法关闭,除非断电。
以下是我设置的程序功能:
程序开始的时候 让LED3常亮3秒,然后熄灭,表明程序初始化完成,进入while循环,之后LED3不会再亮。
程序初始化时候,开始定期器1,让其每秒钟改变LED2的状态,也就是1秒钟亮一下,1秒钟灭一下,表明程序正常在跑。
然后利用按键K1来控制看门狗,K1按下1次,LED1会亮,同时初始化看门狗和把开启看门狗标志置1。再按下一次LED1灭,把看门狗标志置0。
在定时器中断里面,只要看门狗标志为1,则每秒钟都喂狗一次。
把看门狗设置为256分频,也就是大概5秒钟的喂狗周期,过了这个时间没喂狗的话,系统就会重启。
下面是我的测试方法和显现:
给单片机上电,LED3开始亮3秒,然后熄灭,
然后只有LED2开始正常闪烁。
按下按键K1,LED1亮起,表明开启看门狗。此时LED2也正常闪烁。
再次按下K1,LED1熄灭,表明看门狗标志位置0,定时器中断里面不会再喂狗。
此时LED2再闪烁几次后,由于没有喂狗,LED3常亮3秒然后熄灭,表明系统重启了,LED2再闪烁几秒,LED3由常亮3秒后熄灭,表明系统又重启,LED2再闪烁几秒,如此循环。
问题的关键是我在程序的开头,就定义了这样一句:“WDT_CONTR = 0x07; //把看门狗寄存器设置为关闭状态” ,视图把看门狗关闭,但是结果并没有什么用。最后总结出,看门狗一旦开启,就无法关闭,如果没在规定的时间内喂狗,那么就会无限重启。
以下是程序代码
#include<intrins.h>
#include"STC12C5AXX.h"
#define TM_BASE 100
sbit K1=P2^0;
sbit K2=P2^1;
sbit LED1=P1^0;
sbit LED2=P1^1;
sbit LED3=P1^2;
unsigned char T_BASE=100; //1s基准
unsigned char WDT_TAG=0;
void Delay10ms( ); //延时10ms
void Timer0Init(void); //10毫秒@12.000MHz
void WDTInit(void); //看门狗初始化
void WDTFeed(void); //喂狗函数
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main(void)
{
unsigned int i,j;
EA=1;
i=0;
j=0;
WDT_TAG=0;
LED1=0;
LED2=0;
WDT_CONTR = 0x07; //把看门狗寄存器设置为关闭状态
/////////////////
//让LED3亮3秒,表示程序开始启动
LED3=1;
for(i=0;i<300;i++)
{
Delay10ms();
}
LED3=0;
i=0;
////////////
LED3=0;
K1=1; //把按键的电平先拉高,之后再去判断是否按下
Timer0Init();
while(1)
{
if(K1==0) //检测按键K1是否按下
{
Delay10ms(); //消除抖动
Delay10ms(); //消除抖动
Delay10ms(); //消除抖动
if(K1==0)
{
if(LED1==0)
{
LED1=1;
WDTInit(); //开启看门狗
WDT_TAG=1; //看门狗标志置1,表示在定时器里面开始喂狗
}
else
{
LED1=0;
WDT_TAG=0; //看门狗标志置0,表示在定时器里面不喂狗
}
while((i<50)&&(K1==0)) //检测按键是否松开
{
Delay10ms();
i++;
}
i=0;
}
}
}
}
void Delay10ms() //@12.000MHz 延时10ms
{
unsigned char i, j;
_nop_();
_nop_();
i = 117;
j = 183;
do
{
while (--j);
} while (--i);
}
void Timer0Init(void) //10毫秒@12.000MHz 定时器0初始化
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0xF0; //设置定时初值
TH0 = 0xD8; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1;
}
void tm0_isr() interrupt 1 using 1 //定时器0中断
{
TL0 = 0xF0; //设置定时初值
TH0 = 0xD8; //设置定时初值
T_BASE--;
if(T_BASE==0) //到1秒后才执行以下操作
{
T_BASE=TM_BASE;
LED2=!LED2;
if(1==WDT_TAG) //看门狗标志为1则喂狗
{
WDTFeed(); //喂狗
}
}
}
void WDTInit(void)
{
WDT_CONTR = 0x37;//使能看门狗,预分频256 理论上喂狗周期为5秒钟以内
}
void WDTFeed(void)
{
WDT_CONTR = 0x37;//喂狗
}
复制代码
以下是程序文件,在KEIL 4下面编译通过。
看门狗测试.rar
(26.96 KB, 下载次数: 4)
2016-1-21 16:19 上传 点击文件名下载附件
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
11条回答
Squall001
2020-01-19 15:46
bailangcn 发表于 2016-1-21 16:44
居然定时器喂狗~
在主循环里面,我不知道什么时候喂,因为说不清楚主循环里面耽搁的时间是多少 ,即使我选择256分频 5秒钟喂一次,那么也会存在有时候主循环里面函数执行超时而没有喂狗。。
加载中...
查看其它11个回答
一周热门
更多
>
相关问题
【东软载波ESF0654 PDS开发板活动】开箱
1 个回答
东软载波ESF0654 PDS开发板外部中断
1 个回答
东软载波ESF0654 PDS开发板高级控制定时器AD16C4T
1 个回答
用串口调试助手为什么只能在hex模式接收发送而在文本模式不行
9 个回答
触摸芯片SC02B/SC04B在地砖灯的设计方案
1 个回答
相关文章
51单片机与蓝牙模块连接
0个评论
51单片机的硬件结构
0个评论
基于51单片机的无线遥控器制作
0个评论
51单片机 AD转换
0个评论
51单片机数码管递增显示
0个评论
如何实现对单片机寄存器的访问
0个评论
基于51单片机的指纹密码锁
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
51单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
在主循环里面,我不知道什么时候喂,因为说不清楚主循环里面耽搁的时间是多少 ,即使我选择256分频 5秒钟喂一次,那么也会存在有时候主循环里面函数执行超时而没有喂狗。。
一周热门 更多>