【官网例子分析系列】例子07--睡眠
概念介绍:定时器的相关寄存器
TCON 定时器控制寄存器
TMOD 定时器模式寄存器
TL0 定时器0低8位寄存器
TL1 定时器1低8位寄存器
TH0 定时器0高8位寄存器
TH1 定时器1高8位寄存器
AUXR 辅助寄存器1
INTCLKO 中断与时钟输出控制寄存器
WKTCL 掉电唤醒定时器低字节
WKTCH 掉电唤醒定时器高字节
T4T3M 定时器4/3 控制寄存器
T4H 定时器4 高字节
T4L 定时器4 低字节
T3H
T3L
T2H
T2L
TM0PS 定时器0 时钟预分频寄存器
TM1PS
TM2PS
TM3PS
TM4PS
---------------------------------------------------
例子分析:
WTST = 0;//设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
P0M1 = 0x30; P0M0 = 0x30; //设置P0.4、P0.5为漏极开路(实验箱加了上拉电阻到3.3V)
P1M1 = 0x30; P1M0 = 0x30; //设置P1.4、P1.5为漏极开路(实验箱加了上拉电阻到3.3V)
P2M1 = 0x3c; P2M0 = 0x3c; //设置P2.2~P2.5为漏极开路(实验箱加了上拉电阻到3.3V)
P3M1 = 0x50; P3M0 = 0x50; //设置P3.4、P3.6为漏极开路(实验箱加了上拉电阻到3.3V)
P4M1 = 0x3c; P4M0 = 0x3c; //设置P4.2~P4.5为漏极开路(实验箱加了上拉电阻到3.3V)
P5M1 = 0x0c; P5M0 = 0x0c; //设置P5.2、P5.3为漏极开路(实验箱加了上拉电阻到3.3V)
P6M1 = 0xff; P6M0 = 0xff; //设置为漏极开路(实验箱加了上拉电阻到3.3V)
P7M1 = 0x00; P7M0 = 0x00; //设置为准双向口
display_index = 0;
for(i=0; i<8; i++)LED8 = DIS_BLACK; //全部消隐
Test_cnt = 0; //秒计数范围为0~255
SleepDelay = 0;
LED8 = 0;
LED8 = 0;
LED8 = Test_cnt;
EA = 1; //允许总中断
while(1)
{
delay_ms(1); //延时1ms
DisplayScan();
if(++msecond >= 1000) //1秒到
{
msecond = 0; //清1000ms计数
Test_cnt++; //秒计数+1
LED8 = Test_cnt / 100;
LED8 = (Test_cnt % 100) / 10;
LED8 = Test_cnt % 10;
if(++SleepDelay >= 2) //2秒后睡眠
{
SleepDelay = 0;
P7 = 0xff; //先关闭显示,省电
SetWakeUpTime(2000); //2秒后醒来
PD = 1; //Sleep
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
-------------------------------------------
void SetWakeUpTime(u16 SetTime)
{
SetTime = (u16)((32768UL * (u32)SetTime) / 16000);//重装值 = Fwkt/16 * SetTime/1000 = Fwkt * SetTime / 16000
if(SetTime > 0) SetTime--;
WKTCL = (u8)SetTime; // 掉电唤醒定时器低字节
WKTCH = (u8)(SetTime >> 8) | 0x80; // 掉电唤醒定时器高字节
}
这个例子里的核心是:SetWakeUpTime
主要是操作了定时器的两个寄存器
WKTCL = (u8)SetTime; // 掉电唤醒定时器低字节
WKTCH = (u8)(SetTime >> 8) | 0x80; // 掉电唤醒定时器高字节
页:
[1]