找回密码
 立即注册
查看: 47|回复: 1

【官网例子分析系列】例子07--睡眠

[复制链接]
  • TA的每日心情
    开心
    4 小时前
  • 签到天数: 47 天

    [LV.5]常住居民I

    43

    主题

    307

    回帖

    686

    积分

    高级会员

    积分
    686
    发表于 2024-5-5 01:27:26 | 显示全部楼层 |阅读模式
    概念介绍:

          定时器的相关寄存器


    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[5] = 0;
        LED8[6] = 0;
        LED8[7] = Test_cnt;
       
        EA = 1;     //允许总中断

        while(1)
        {
            delay_ms(1);    //延时1ms
            DisplayScan();
            
            if(++msecond >= 1000)   //1秒到
            {
                msecond = 0;        //清1000ms计数
                Test_cnt++;         //秒计数+1
                LED8[5] = Test_cnt / 100;
                LED8[6] = (Test_cnt % 100) / 10;
                LED8[7] = 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;   // 掉电唤醒定时器高字节
    }

    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    4 小时前
  • 签到天数: 47 天

    [LV.5]常住居民I

    43

    主题

    307

    回帖

    686

    积分

    高级会员

    积分
    686
     楼主| 发表于 2024-5-5 01:30:01 | 显示全部楼层
    这个例子里的核心是:SetWakeUpTime

      主要是操作了定时器的两个寄存器
        WKTCL = (u8)SetTime;                             // 掉电唤醒定时器低字节
        WKTCH = (u8)(SetTime >> 8) | 0x80;   // 掉电唤醒定时器高字节
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-6-14 06:34 , Processed in 0.052002 second(s), 32 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表