一、前言:
STC单片机加入电源管理功能,当其用作便携式设备时,有限的电池供电,此时节能成为单片机必备的功能。单片机的休眠分两种模式,一种是掉电模式,即CPU与外设全部停止工作,另一种是IDLE模式,即CPU停止工作外设正常运行。不管是哪种模式区别在于节能省电程度不一,对于电池容量有限又需长时待机的需求理想的情况下最好是待机不耗能,实际上最低也有0.4uA的电流。单片机进入休眠模式后,可通过多种方式来唤醒,一种方式是计时唤醒,另一种方式是触发中断唤醒,此种方式只要发出中断请求立马唤醒系统,比如说发出一个外部中断、一个串口中断、一个定时器中断等均可用作唤醒系统,无需在中断服务中做出一定的处理。以下的案例一个简单的休眠程序,当系统进入休眠状态按下INT0后中断产生唤醒系统,LED灯变换状态,或系统大约每2s唤醒休眠中的系统,LED灯变换状态。
二、知识简介:
PCON是电源管理寄存器,其中的PD位,当置位1时,系统当即进入掉电模式。IDL位为空闲模式,当置位1时,系统当即进入空闲模式。
WKTCH和WKTCL是一个15位的掉电唤醒定时器,当设定的设时到位后,休眠被唤醒,其中的WKTCH.WKTEN位必须置1。以下是WKTCH、WKTCHL定时参考表。
三、实验平台搭建:
1、MCU:STC-打狗棒系列核心实验板 V2.3
2、实验板平台:德飞莱LY-51s
3、硬件连接表:
K1------>P20 停止休眠
LED----->P00 指示灯
四、测试源代码:
#include <STC8H.h>
#include "intrins.h"
sbit Led=P0^0;
#define RSTFLAG (*(unsigned char volatile xdata *)0xfe99) //声明复位标志寄存器
void Delay1ms(unsigned char x);//当主时钟频率为12M,1ms延时为基准
void init_IO();//初始化IO
void main()
{
P_SW2 |= 0x80; //扩展寄存器XFR访问使能
init_IO();
EX0=1;//外部中断唤醒
EA=1;
Led=0;
WKTCH=0x8F;//定时2秒唤醒
WKTCL=0xFF;
while(1)
{
PCON|=0x02;//进入休眠
Led=~Led;
}
}
void init_IO()
{
RSTCFG=0x50; //开启RST键进入ISP模式
P0M1 = 0x00; P0M0 = 0x00; //设置P0口为准双向口
P1M1 = 0x00; P1M0 = 0x00; //设置P1口为准双向口
P5M1 = 0x00; P5M0 = 0x00; //设置P5口为准双向口
}
void Delay1ms(unsigned char x) //@12.000MHz
{
unsigned char i, j;
i = 16;
j = 147;
while(x--)
{
do
{
while (--j);
} while (--i);
}
}