durongze 发表于 2024-5-5 01:27:26

【官网例子分析系列】例子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;   // 掉电唤醒定时器高字节
}

durongze 发表于 2024-5-5 01:30:01

这个例子里的核心是:SetWakeUpTime

主要是操作了定时器的两个寄存器
    WKTCL = (u8)SetTime;                           // 掉电唤醒定时器低字节
    WKTCH = (u8)(SetTime >> 8) | 0x80;   // 掉电唤醒定时器高字节
页: [1]
查看完整版本: 【官网例子分析系列】例子07--睡眠