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
小弟是学生党,想学习更深入的知识,苦于没钱买更多材料,求赞助... 谢谢分享啦!
页:
[1]