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

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

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:224
  • 最近打卡:2025-05-07 08:02:46

79

主题

631

回帖

1148

积分

金牌会员

积分
1148
发表于 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;   // 掉电唤醒定时器高字节
}

回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:224
  • 最近打卡:2025-05-07 08:02:46

79

主题

631

回帖

1148

积分

金牌会员

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

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

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-7 19:22 , Processed in 0.176864 second(s), 51 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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