这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 国产MCU » 学习AI8051开发板例程:21AI8051的RTC实时时钟

共1条 1/1 1 跳转至

学习AI8051开发板例程:21AI8051的RTC实时时钟

高工
2026-01-19 19:15:55     打赏

    Ai8051U 系列部分单片机内部集成一个实时时钟控制电路,主要有如下特性:

低功耗:RTC模块工作电流低至2uA@VCC=3.3V、3uA@VCC=5.0V(典型值)

长时间跨度:支持2000年~2099年,并自动判断闰年

闹钟:支持一组闹钟设置

支持多个中断:

    一组闹钟中断(每天中断一次,中断的时间点为闹钟寄存器所设置的任意时/分/秒)

    日中断(每天中断一次,中断的时间点为每天的0时0分0秒)

    小时中断(每小时中断一次,中断的时间点为分/秒均为0,即整点时)

    分钟中断(每分钟中断一次,中断的时间点为秒为0,即分钟寄存器发生变化时)

    秒中断(每秒中断一次,中断的时间点为秒寄存器发生变化时)

    1/2秒中断(每 1/2秒中断一次)

    1/8秒中断(每1/8秒中断一次)

    1/32秒中断(每1/32秒中断一次)

支持掉电唤醒;

二:RTC的相关寄存器

2.1  RTC控制寄存器(RTCCR)

0119-4.png

    RUNRTC:RTC 模块控制位

    0:关闭RTC,RTC停止计数

    1:使能RTC,并开始RTC计数

2.2  RTC配置寄存器(RTCCFRG)

0119-5.png

RTCCKS:RTC 时钟源选择

    0:选择外部32.768KHz时钟源(需先软件启动外部 32K晶振)

    1:选择内部32K时钟源(需先软件启动内部 32K振荡器)SETRTC:设置RTC 初始值

    写0:无意义

    写1:触发RIC寄存器初始化。当 SETRIC设置为1时,硬件会自动将寄存器INIYEAR、INIMONTH、INIDAY、INIWEEK、INIHOUR、INIMIN、INISEC、INISSEC 中的值复制到寄存器 YEAR、MONTH、DAY、WEEK、HOUR、MIN、SEC、SSEC 中。初始完成后,硬件会自动将 SETRTC位清0。读0:设置RTC相关时间寄存器已完成读1:硬件正在进行设置RTC,还未完成

    注:等待初始化完成,需要在"RTC使能"之后判断。设置RTC时间需要32768Hz的1个周期时间,大约30.5us。由于同步,所以实际等待时间是 0~30.5us,如果不等待设置完成就睡眠,则 RIC会由于设置没完成,停止计数,唤醒后才继续完成设置并继续计数,如果此时设置的是使用 RTC中断进行唤醒,则会出现无法唤醒MCU 的情况。

三:软件代码:

3.1 RTC的初始化函数:

void RTC_config(void)
{
    INIYEAR = 24;     //Y:2024
    INIMONTH = 12;    //M:12
    INIDAY = 31;      //D:31
    INIHOUR = 23;     //H:23
    INIMIN = 59;      //M:59
    INISEC = 50;      //S:50
    INISSEC = 0;      //S/128:0

    ALAHOUR = 0;    //闹钟小时
    ALAMIN  = 0;    //闹钟分钟
    ALASEC  = 0;    //闹钟秒
    ALASSEC = 0;    //闹钟1/128秒

//    IRC32KCR = 0x80;   //启动内部32K晶振.
//    while (!(IRC32KCR & 1));  //等待时钟稳定
//    RTCCFG = 0x03;    //选择内部32K时钟源,触发RTC寄存器初始化

    X32KCR = 0x80 + 0x40;   //启动外部32K晶振, 低增益+0x00, 高增益+0x40.
    while (!(X32KCR & 1));  //等待时钟稳定
    RTCCFG = 0x01;    //选择外部32K时钟源,触发RTC寄存器初始化

    RTCIF = 0x00;     //清中断标志
    RTCIEN = 0x88;    //中断使能, 0x80:闹钟中断, 0x40:日中断, 0x20:小时中断, 0x10:分钟中断, 0x08:秒中断, 0x04:1/2秒中断, 0x02:1/8秒中断, 0x01:1/32秒中断
    RTCCR = 0x01;     //RTC使能

    while(RTCCFG & 0x01);    //等待初始化完成,需要在 "RTC使能" 之后判断. 
    //设置RTC时间需要32768Hz的1个周期时间,大约30.5us. 由于同步, 所以实际等待时间是0~30.5us.
    //如果不等待设置完成就睡眠, 则RTC会由于设置没完成, 停止计数, 唤醒后才继续完成设置并继续计数.
}

3.2   RTC的写入函数:

void WriteRTC(void)
{
    INIYEAR = YEAR;   //继承当前年月日
    INIMONTH = MONTH;
    INIDAY = DAY;

    INIHOUR = hour;   //修改时分秒
    INIMIN = minute;
    INISEC = 0;
    INISSEC = 0;
    RTCCFG |= 0x01;   //触发RTC寄存器初始化
}

3.3  RTC中断函数

void RTC_Isr() interrupt 13
{
    if(RTCIF & 0x80)    //闹钟中断
    {
//        P01 = !P01;
        RTCIF &= ~0x80;
        B_Alarm = 1;
    }

    if(RTCIF & 0x08)    //秒中断
    {
//        P00 = !P00;
        RTCIF &= ~0x08;
        B_1s = 1;
    }
}

四:实物演示如下所示:

0119-6.png





关键词: AI8051     RTC    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]