一、前言
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闪烁
}