CodeMonkey 发表于 2013-1-3 14:38:17

PD休眠实例

本帖最后由 CodeMonkey 于 2013-1-3 14:43 编辑

头文件STC89C58RD.h在STC-ISP里面.

LED在P0口.

带注释,新人发帖,多多捧场./*
* 使用定时器切片累加时间,5s无操作自动休眠
* 按钮唤醒
*/
#include <inc/STC89C58RD.h>
#include <intrins.h>

unsigned char RuneCount = 0;

void InterruptInit(){
      EA = 1;
}

void Timer2Init(void)                //1毫秒@11.0592MHz Rune定时器2 最低优先级定时器
{
      IPH = 0x10; //(1<<PT2H) 最低优先级
PT2=0; //降低优先级
      
      T2MOD = 0;                //初始化模式寄存器
      T2CON = 0;                //初始化控制寄存器
      TL2 = 0xCD;                //设置定时初值
      TH2 = 0xD4;                //设置定时初值
      RCAP2L = 0xCD;                //设置定时重载值
      RCAP2H = 0xD4;                //设置定时重载值
      ET2 = 1;    //允许ET2中断
      TR2 = 1;                //定时器2开始计时
}

void Int0Init(){
      EX0 = 1;
      IT0 = 1;
}

void main(){
      InterruptInit();
      Timer2Init();
      Int0Init();

      P0 = 0xfe;
      
      /*
          工作进行时,应停止TR2计数,并清零RuneCount;
      */
      
      while(1);
}

void Timer2Counter() interrupt 5{
      TR2 = 0;
      TF2 = 0; //定时器2 软件清0
      RuneCount++;
      if(RuneCount == 500){ //5sec Rune
                P0 = 0xff; //进入PD,关闭LED灯,节能
                PCON = 0x02;// 1<<1
                //PD 低功耗 外部中断唤醒
          P0 = 0x00; //因为已经PD,所以这一行不会被执行
      }
      TR2 = 1;
}

void WakeUp() interrupt 0{
      RuneCount = 0;//清空休眠标志位
      //1.系统已经从PD唤醒,继续工作
      //2.系统进行了操作,清RuneCount
      P0 = 0xfc;//恢复工作标记测试
}已同步到小弟博客:http://www.lijingquan.net/rune-pd.html

小弟是学生党,想学习更深入的知识,苦于没钱买更多材料,求赞助...

xinhoujue 发表于 2013-1-3 18:14:05

谢谢分享啦!
页: [1]
查看完整版本: PD休眠实例