基于C8051F340单片机的可编程技术阵列——看门狗定时器的应用C程序

一、前言

C8051F340单片机的可编程技术阵列PCA的的模块 4 可以实现可编程看门狗定时器(WDT)功能。如果连续两次对 WDT更新寄存器的写操作间隔时间超过规定的值,看门狗定时器将产生一次复位。可以根据需要用软件配置和使能/禁止 看门狗。
本文通过P2.2输出LED闪烁(10Hz),P2.0读取按钮状态,当按钮按下并保持,超过一定的时间,单片机将因为看门超时触发系统复位,LED闪烁频率加快(100Hz)。

二、程序展示

1、头文件部分

#include <c8051f340.h>
sfr16 TMR2RL   = 0xca;  // 定时器2重载值
sfr16 TMR2     = 0xcc;  //定时器2计数器
#define SYSCLK  12000000 //系统内部时钟12M
sbit LED = P2^2;    // LED
sbit SW2 = P2^0;    // 连接按钮  
void OSCILLATOR_Init (void);
void PORT_Init (void);
void PCA_Init (void);
void Timer2_Init (int counts);
void Timer2_ISR (void);

2、主程序部分

void main (void) 
{
   PCA0MD &= ~0x40;   //关闭看门狗
   OSCILLATOR_Init ();  // 振荡器初始化,系统时钟的12/8 MHz
   PCA_Init();          //PCA初始化
   PORT_Init();        //端口初始化
      
   if ((RSTSRC & 0x02) == 0x00)  // 第一次检测PORSF位,如果PORSF置位,所有RSTSRC标志位有效
   {       
   	   // 检查上一次复位是不是因为看门狗引起的
   	   if (RSTSRC == 0x08)                    	
   	   { 
	      Timer2_Init (SYSCLK / 12 / 100);  // 允许定时器2
       	  EA = 1;            // 打开中断

          while(1); 
   	   }	
   	   else 
   	   {
	      Timer2_Init (SYSCLK / 12 / 10); // 初始化定时器2
	   }                                   
   }
	   	
   PCA0MD  &= ~0x40;  //清看门狗
   PCA0L    = 0x00;   // 设置低位为 0  
   PCA0H    = 0x00;   // 设置高位为 0
   PCA0CPL4 = 0xFF;   // 喂看门狗 
   PCA0MD  |= 0x40;    //允许看门狗模式
   EA = 1;				//允许中断
	
   while (1) 
   {                              
      while(!SW2);   //当按钮被按下               	   
	  PCA0CPH4 = 0x00;      // 给高位喂0值                               
    }
}

3、振荡器初始化程序

void OSCILLATOR_Init (void)
{ 
   OSCICN = 0x80;    // 配置振荡器低频模式
   RSTSRC = 0x04;   //允许时钟丢失检测
}

4、PCA初始化程序

void PCA_Init()
{
    PCA0CN     =  0x40;     // PCA计数器允许
    PCA0MD    &= ~0x40 ;     // 关看门狗
    PCA0MD    &=  0xF1;      //时基选择,系统时钟 / 12
    PCA0CPL4   =  0xFF;      //偏离值
}

5、端口初始化程序

void PORT_Init (void)
{
   XBR0     = 0x00;
   XBR1     = 0x40;      
   P2MDOUT |= 0x04;
}

6、定时器2初始化程序

void Timer2_Init (int counts)
{
   TMR2CN  = 0x00;     
   CKCON  &= ~0x60;  
   TMR2RL  = -counts;       // 初始哈重载值
   TMR2    = 0xffff;         //设置重载值
   ET2     = 1;              //允许T2中断
   TR2     = 1;              //启动定时器2
}

7、定时器2中断程序

void Timer2_ISR (void) interrupt 5
{
   TF2H = 0;        //清T2中断标志
   LED = ~LED;      //LED闪烁
}
  • 11
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xll_007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值