51单片机看门狗定时唤醒低功
程序流程:
1.检测到符合睡眠条件,进入到睡眠程序。
2.初始化看门狗,设置定时唤醒时间,关闭其它外设中断。
3.开总中断,只开看门狗中断
4.进入睡眠模式
5.发生看门狗唤醒中断,清除看门狗定时器,复位看门狗标志,防止复位。
6.退出睡眠模式,初始化单片机外设寄存器,打开外设中断。
7.执行主程序,检测是否符合睡眠条件,循环1-7步。
不符合睡眠条件,清除看门狗设置,关闭看门狗。
1.看门狗中断处理
void WDTF_ISR(void) interrupt 15
{
uint8_t tmp;
tmp = RSTCON;//喂狗,不让复位
RSTCON &=~BIT0; //清除看门狗复位标识,防止系统复位
WDTCON &= ~BIT4; //看门狗中断标志清零
SleepFlag = 0;
}
2.设置看门狗,并进入睡眠模式
if((Pho == 0)||(LpdFlg)) //光敏高于1.2V,或者电压低于2.7V
//if(pho)
{
RSTCON &= 0xef; //清除LPD低电压标志
WdtInit(WDT_4S_INT); //看门狗初始化,开中断
ie0tmp=IE0; //中断使能暂存
ie1tmp=IE1;
IE0=0; //关闭所有中断
IE1=0;
//GPIO_BeforeSleep_Set(); //睡眠前GPIO设置
//P02 = 0; //关闭IO
//P26 = 0;
Pwm0Init(1000,0); //关闭PWM输出
Pwm1Init(1000,0);
Pwm2Init(1000,0);
//PrfSleep(); //设置2.4g模块进入sleep
//Delay_100_us(1); //待稳定
EA = 1; //总中断打开
SleepFlag = 1;
while(SleepFlag) //没有进外部中断就一直执行睡眠
{
TA = 0xAA;
TA = 0x55;
PCON = 0x06;
_nop_();
_nop_();
_nop_();
}
Timer0Init(250); //定时器初始化
GpioInit(); //GPIO初始化
//PrfWakeup(); //2.4g模块唤醒
//PrfInit(); //2.4g模块初始化
//PrfSetRx(Prf.ch[0]); //初始化后必须重新设置发射状态和信道,不然无法接收。
//I2cSlaInit(); //I2C初始化
Pwm0Init(1000,0); //关闭PWM输出
Pwm1Init(1000,0);
Pwm2Init(1000,0);
AdcInit(); //
Adc_Channal_Set(BIT1); //AD1通道
IE0=ie0tmp;
IE1=ie1tmp; //复原原先中断设置
for(SampCnt=0; SampCnt<=2; SampCnt++)
{
TKCON1 |= BIT7; //Start ADC
while(TKCON1&BIT7); //等待START位清零
}

浙公网安备 33010602011771号