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位清零      
  }
posted @ 2023-04-10 14:50  steven_lg  阅读(672)  评论(0)    收藏  举报