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)

RUNRTC:RTC 模块控制位
0:关闭RTC,RTC停止计数
1:使能RTC,并开始RTC计数
2.2 RTC配置寄存器(RTCCFRG)

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;
}
}四:实物演示如下所示:

我要赚赏金
