[活动专区] 【杰发科技AC7802x测评】+RTC电子时钟

[复制链接]
1970|13
 楼主| jinglixixi 发表于 2023-7-19 19:33 | 显示全部楼层 |阅读模式
本帖最后由 jinglixixi 于 2023-7-19 19:37 编辑

#申请原创#

AC7802x内置了RTC计数器,但它却是一个准RTC,即只有RTC计时功能,却没配置日期时间的计时处理功能。
为此,要以RTC来实现电子时钟功能,需要靠软件来自行补充日期与时间的计时处理功能。
要制作一个简单的电子时钟,在硬件方面就是为它配置一个显示器件,这里是选用I2C接口的OLED屏,见图1所示。
1.jpg
图1 硬件构成

在软件方面,就是利用RTC的秒计时功能,并添加相应的时间累计进制处理。
为了便于功能扩展,这里定义了一个数据结构来对时间进行处理,其定义为:
typedef struct
{
    uint8_t sec;
    uint8_t min;
    uint8_t hour;
} RTC_TimeTypeDef;

实现时间累计处理与显示的主程序为:
  1. int main(void)
  2. {
  3.       char ss,mm,hh;
  4.       RTC_TimeTypeDef time_s;
  5.       InitDelay();
  6.       InitDebug();
  7.       GPIO_LedInit();
  8.       RTC_Timeout1s();
  9.       GPIO_OLEDInit();
  10.       OLED_Init();
  11.       OLED_Clear();
  12.       OLED_ShowString(10,0,"AC7802x",16);
  13.       OLED_ShowString(10,2,"RTC Test",16);
  14.       OLED_ShowString(10,4,"  :  :",16);
  15.       OLED_ShowString(0,6,"jinglixixi",16);
  16.       time_s.hour=8;
  17.       time_s.min=30;
  18.       time_s.sec=0;
  19.       hh=time_s.hour;        
  20.       mm=time_s.min;
  21.       ss=time_s.sec;
  22.       while (1)
  23.       {
  24.         if(g_timeoutFlag)
  25.         {
  26.                   g_timeoutFlag = 0;
  27.                   ss=ss+1;
  28.                   if(ss==60)
  29.                    {
  30.                          ss=0;
  31.                          mm=mm+1;
  32.                    }
  33.                    OLED_ShowNum(58,4,ss,2,16);
  34.                    if(mm==60)
  35.                    {
  36.                          mm=0;
  37.                          hh=hh+1;
  38.                     }
  39.                     OLED_ShowNum(34,4,mm,2,16);
  40.                     if(hh==24)
  41.                      {
  42.                          hh=0;
  43.                      }
  44.                      OLED_ShowNum(10,4,hh,2,16);
  45.         }
  46.     }
  47. }

经程序的编译与下载,其执行效果如图2所示。
2.jpg
图2 计时效果

以此为基础,还可以为其添加日期的累计处理。
更新后的RTC时间结构定义为:
typedef struct
{
     uint8_t mday;
    uint8_t mon;
    uint8_t year;
    uint8_t weekday;
    uint8_t sec;
    uint8_t min;
    uint8_t hour;
}RTC_Date_TimeTypeDef;

相应的起始时间设置函数为:
  1. void Rtc_SetDateTime(void)
  2. {
  3.     dt.year = 23;
  4.     dt.mon = 7;
  5.     dt.mday = 20;
  6.     dt.hour = 8;
  7.     dt.min = 30;
  8.     dt.sec = 0;
  9. }

实现日期与时间显示的主程序为:
  1. int main(void)
  2. {
  3.           char v;
  4.           InitDelay();
  5.           InitDebug();
  6.           GPIO_LedInit();
  7.           RTC_Timeout1s();
  8.           GPIO_OLEDInit();
  9.           OLED_Init();
  10.           OLED_Clear();
  11.           OLED_ShowString(20,0,"RTC Test",16);
  12.           OLED_ShowString(20,4,"  :  :",16);
  13.           OLED_ShowString(20,6,"  -  -",16);
  14.           Rtc_SetDateTime();
  15.           while (1)
  16.           {
  17.              if(g_timeoutFlag)
  18.              {
  19.                         g_timeoutFlag = 0;
  20.                         dt.sec=dt.sec+1;
  21.                         if(dt.sec==60)
  22.                         {
  23.                                 dt.sec=0;
  24.                                 dt.min=dt.min+1;
  25.                         }
  26.                         OLED_ShowNum(68,4,dt.sec,2,16);
  27.                         if(dt.min==60)
  28.                         {
  29.                                 dt.min=0;
  30.                                 dt.hour=dt.hour+1;
  31.                         }
  32.                         OLED_ShowNum(44,4,dt.min,2,16);
  33.                         if(dt.hour==24)
  34.                         {
  35.                                  dt.hour=0;
  36.                                  dt.mday=dt.mday+1;
  37.                         }
  38.                         OLED_ShowNum(20,4,dt.hour,2,16);
  39.                         if(dt.mon==2)
  40.                         {
  41.                                  v=(Rtc_IsLeapYear(dt.year) == 1) ? (29U) : (28U);
  42.                         }
  43.                         else
  44.                         {
  45.                                  v=month_day_num[dt.mon];
  46.                         }
  47.                         if(dt.mday>v)
  48.                         {
  49.                                  dt.mday=1;
  50.                                 dt.mon=dt.mon+1;
  51.                         }
  52.                          if(dt.mon>12)
  53.                         {
  54.                                 dt.mon=1;
  55.                                 dt.year=dt.year+1;
  56.                         }
  57.                         OLED_ShowNum(20,6,dt.year,2,16);
  58.                         OLED_ShowNum(44,6,dt.mon,2,16);
  59.                         OLED_ShowNum(68,6,dt.mday,2,16);
  60.                         OLED_ShowString(20,2,week[Rtc_Week()],16);
  61.         }
  62.     }
  63. }

经程序的编译与下载,其执行效果如图3所示。
3.jpg
图3 计时效果


tpgf 发表于 2023-8-12 15:08 | 显示全部楼层
我们做的这种rtc的时钟平时是如何校准的呢
wowu 发表于 2023-8-12 15:26 | 显示全部楼层
一般像是这种应用是不是都不能断电 要使用电池进行不间断的供电啊
木木guainv 发表于 2023-8-12 15:44 | 显示全部楼层
这样的话  单片机需要随时和上位机进行通讯吗
磨砂 发表于 2023-8-12 19:19 | 显示全部楼层
这种计时 遇到不同的月份的话 会自动多一天少一天吗
xiaoqizi 发表于 2023-8-12 20:01 | 显示全部楼层
如果能有几个按钮来设置时间就不怕断电了
wakayi 发表于 2023-8-12 21:00 | 显示全部楼层
断电之后再上电 显示的是什么时间呢
 楼主| jinglixixi 发表于 2023-8-13 10:21 | 显示全部楼层
wakayi 发表于 2023-8-12 21:00
断电之后再上电 显示的是什么时间呢

没后备电源的情况下,自然是初始设置时间。
 楼主| jinglixixi 发表于 2023-8-13 10:23 | 显示全部楼层
xiaoqizi 发表于 2023-8-12 20:01
如果能有几个按钮来设置时间就不怕断电了

是的,可以自行添加该处理,还是比较简单的。
 楼主| jinglixixi 发表于 2023-8-13 10:24 | 显示全部楼层
磨砂 发表于 2023-8-12 19:19
这种计时 遇到不同的月份的话 会自动多一天少一天吗

有闰年处理
 楼主| jinglixixi 发表于 2023-8-13 10:24 | 显示全部楼层
wowu 发表于 2023-8-12 15:26
一般像是这种应用是不是都不能断电 要使用电池进行不间断的供电啊

是的
 楼主| jinglixixi 发表于 2023-8-13 10:25 | 显示全部楼层
木木guainv 发表于 2023-8-12 15:44
这样的话  单片机需要随时和上位机进行通讯吗

无需
jiajs 发表于 2023-8-14 21:13 | 显示全部楼层
对时间处理的这个数据结构不错
 楼主| jinglixixi 发表于 2023-8-15 17:34 | 显示全部楼层
jiajs 发表于 2023-8-14 21:13
对时间处理的这个数据结构不错

相对看起来比较方便些
您需要登录后才可以回帖 登录 | 注册

本版积分规则

521

主题

2949

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部