#include
#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;//喂狗
}