单片机C语言实例:13、看门狗

一、看门狗溢出测试

程序实例1:

cpp 复制代码
#include<reg52.h>

sfr  WDTRST  =   0xA6;			 	

sbit key = P3^1;		 

/*------------------------------------------------
                    喂狗
------------------------------------------------*/
void Rst_Watchdog( void )
{
	WDTRST  = 0x1E; //先赋值1E 然后赋值E1
    WDTRST  = 0xE1;
}

/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main( void )
{
	int i;
	                            // 设置看门狗时间为1个时钟循环后
	Rst_Watchdog();
	     	                    //关看门狗一个时钟循环
	for( i = 0; i < 500; i++)
	{
		Rst_Watchdog();                
	}
    P1=0x00;
	while(!key)                 //按下按键不松开,表示程序一直在按键处循环,并用LED显示0x55
	{
		P1=0x55; 	                //模拟出错 正常情况应该一直显示LED,
                                //但是加看门狗之后不间断复位,倒是LED闪烁
	}
}

二、按键喂狗

程序实例2:

cpp 复制代码
#include <reg52.h>

sfr WDTRST = 0xA6;

sbit  K1 = P3^0; 
sbit  K2 = P3^1;
sbit  LED1=P1^1;
sbit  LED2=P1^2;

void DelayUs2x(unsigned char t);//us级延时函数声明 
void DelayMs(unsigned char t); //ms级延时
/*------------------------------------------------
                    主函数
------------------------------------------------*/
main()
{
   LED1=0;
   DelayMs(100);
   LED1=1;
   DelayMs(100);

   TMOD=0x01;
   TH0=0xc6;      //定时16ms
   TL0=0x66;
   EA=1;
   ET0=1;

   WDTRST=0x1e;   //在程序初始化中激活看门狗。
   WDTRST=0xe1;   //先送1E,后送E1

   if(K1==0)
   {
     TR0=1;
   }

   while(1)
   {    
     if(K2==0)
     {
       TR0=0;
     }
	 LED2=1;
	 LED1=1;
	 DelayMs(100);
	 LED2=0;
	 DelayMs(100);
   }
}
/*------------------------------------------------
              定时器中断函数
------------------------------------------------*/
void Time0(void) interrupt 1
{
   TH0=0xc6;      //定时16ms
   TL0=0x66;

   WDTRST=0x1e;   //喂狗指令
   WDTRST=0xe1;
}

/*------------------------------------------------
 uS延时函数,含有输入参数 unsigned char t,无返回值
 unsigned char 是定义无符号字符变量,其值的范围是
 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
 长度如下 T=tx2+5 uS 
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   
	while(--t);
}
/*------------------------------------------------
 mS延时函数,含有输入参数 unsigned char t,无返回值
 unsigned char 是定义无符号字符变量,其值的范围是
 0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{
     
	while(t--)
	{
		//大致延时1mS
		DelayUs2x(245);
		DelayUs2x(245);
	}
}
相关推荐
Ronin-Lotus2 小时前
嵌入式硬件篇---晶体管的分类
嵌入式硬件·晶体管·bjt(双级结性晶体管)·fet(场效应晶体管)
koooo~3 小时前
JavaScript 与 C语言基础知识差别
c语言·开发语言·javascript
mit6.8244 小时前
[Nagios Core] 通知系统 | 事件代理 | NEB模块,事件,回调
c语言·开发语言
mit6.8244 小时前
[Nagios Core] 事件调度 | 检查执行 | 插件与进程
c语言·开发语言·性能优化
刃神太酷啦5 小时前
C++ 多态详解:从概念到实现原理----《Hello C++ Wrold!》(14)--(C/C++)
java·c语言·c++·qt·算法·leetcode·面试
弱冠少年6 小时前
ESP-Timer入门(基于ESP-IDF-5.4)
c语言
mit6.8246 小时前
[Nagios Core] struct监控对象 | 配置.cfg加载为内存模型
c语言·开发语言
会编程的小孩15 小时前
STM32用PWM驱动步进电机
stm32·单片机·嵌入式硬件
努力做小白16 小时前
Linux驱动11 --- buildroot&杂项驱动开发方法
linux·运维·驱动开发·单片机·嵌入式硬件
小眼睛FPGA18 小时前
【RK3568+PG2L50H开发板实验例程】FPGA部分 | 以太网传输实验例程
科技·单片机·嵌入式硬件·ai·fpga开发·fpga