找回密码
 立即注册
查看: 4653|回复: 25

关于ISP的“RTC对时”功能详解

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:135
  • 最近打卡:2024-12-25 10:15:05

47

主题

1350

回帖

8058

积分

荣誉版主

冲哥视频教程和各种开源资料QQ交流群884047237,可群

积分
8058
QQ
发表于 2023-5-4 10:37:54 | 显示全部楼层 |阅读模式
本帖最后由 32位8051-STCAI 于 2023-5-4 11:27 编辑


可以看到从STC-ISP V6.91N的版本开始,软件增加了RTC对时的功能,有需要做实时时钟的应用的话(手表啊,闹钟等等),这个功能就非常的实用。但是前两天看到有小伙伴这个功能还是不会用,这里发个帖子简单描述一下使用方法。


关于ISP的“RTC对时”功能详解-1.png


首先第一步,得了解软件上这个功能的一些注意事项:(RTC对时界面如下图所示)

关于ISP的“RTC对时”功能详解-2.png

1.在串口选择的那一行里,必须选择COMx的选项,用LINK1D的小伙伴一定要选择对应的串口的那一行,切勿选择LINK1的那行,否则会导致对时失败

关于ISP的“RTC对时”功能详解-3.png


2.软件中的串口助手那一页不能同时打开这个需要对时的串口,否则会提示串口打开失败(这里需要先把右边的串口助手里的串口先关闭)

关于ISP的“RTC对时”功能详解-4.png


3.RTC发送时间的命令格式不知道的话,只要鼠标左键碰着那个按钮就可以自动提示,如下图所示:

关于ISP的“RTC对时”功能详解-5.png


4.由于RTC对时这个是用户功能,所以单片机端需要编写用户程序才能正常的接收时间的数据!!!切记。


上面是一些基础知识,那我们现在来编写个程序演示一下,这里使用屠龙刀+LINK1D来进行试验!

1.首先在STC32G的试验箱里复制出这个文件和他对应的头文件:(当然如果使用别的单片机的话自行准备好一个串口通信的代码即可)

关于ISP的“RTC对时”功能详解-6.png


2.修改下这个工程的头文件路径等,然后编译通过:

关于ISP的“RTC对时”功能详解-7.png


3.准备编写用户代码来接收串口发过来的这个数据,先获取一下这个时间的命令是否正确,这里我喜欢给这种没有命令长度和校验和的数据加个命令头“@STCRTC#”,接收到这个命令就开始保存数据:

关于ISP的“RTC对时”功能详解-8.png

可以看到这里串口发出的数据是:40 53 54 43 52 54 43 23 14 17 05 04 04 09 24 13 03 01 F8

对照着我们这个命令行看一下,其中16进制数 和 内容换算对应下表

HEX数据 含义
40 53 54 43 52 54 43 23 命令头,这里就是@STCRTC#的意思
14 10进制数20
17
10进制数23,和上面的组合在一起就是2023年
05 10进制数5,代表5月
04 10进制数4,代表4日
04
10进制数4,代表星期4
09
10进制数9,代表9时
24
10进制数36,代表36分
13 10进制数19,代表19秒
03
10进制数3,代表3/128秒
01 F8
10进制数504,代表504毫秒


4.这样数据就和命令对上了,开始正式编写代码

  1. char code *STCRTC  = "@STCRTC#";  //= "@STCRTC#";  命令头   
复制代码
先添加这个命令头,串口接收到这数据就开始保存时间数据


  1. char indexrtc=0;                    //当前的命令头索引
  2. char length =0;                     //长度
  3. char rtctime[12] ;               //rtc时间数据
  4. bit  Rec_OK = 0;                    //rtc时间获取完成标志
复制代码
在添加几个关键的变量,用来保存和记录当前的串口数据


  1. void UART1_int (void) interrupt 4
  2. {
  3.     u8 dat;
  4.     if(RI)
  5.     {
  6.         RI = 0;
  7. <font color="#ff0000">        dat = SBUF;</font>
  8. //        RX1_Buffer[RX1_Cnt] = SBUF;
  9. //        if(++RX1_Cnt >= UART1_BUF_LENGTH)   RX1_Cnt = 0;
  10. //-------------------------------串口RTC对时 -------------------------------   
  11. <font color="#ff0000">        if( length>0 )</font>
  12. <font color="#ff0000">        {     </font>
  13. <font color="#ff0000">            rtctime[length-1]=dat;</font>
  14. <font color="#ff0000">            length++;</font>
  15. <font color="#ff0000">            if( length>=12 )</font>
  16. <font color="#ff0000">            {</font>
  17. <font color="#ff0000">                length = 0;</font>
  18. <font color="#ff0000">                Rec_OK = 1;</font>
  19. <font color="#ff0000">                indexrtc=0;</font>
  20. <font color="#ff0000">            }</font>
  21. <font color="#ff0000">        }        </font>
  22. <font color="#ff0000">        if (dat == STCRTC[ indexrtc])</font>
  23. <font color="#ff0000">        {</font>
  24. <font color="#ff0000">            indexrtc++;</font>
  25. <font color="#ff0000">            if(STCRTC[indexrtc] == '\0')</font>
  26. <font color="#ff0000">            {</font>
  27. <font color="#ff0000">                length = 1;   //开启接收</font>
  28. <font color="#ff0000">                indexrtc=0;</font>
  29. <font color="#ff0000">            }</font>
  30. <font color="#ff0000">        }</font>
  31. <font color="#ff0000">        else</font>
  32. <font color="#ff0000">        {</font>
  33. <font color="#ff0000">            indexrtc = 0;</font>
  34. <font color="#ff0000">            if (dat ==STCRTC[ indexrtc])</font>
  35. <font color="#ff0000">                indexrtc++;</font>
  36. <font color="#ff0000">        }         </font>
  37. <font color="#000000">    }</font>
  38.     if(TI)
  39.     {
  40.         TI = 0;
  41.         B_TX1_Busy = 0;
  42.     }
  43. }
复制代码
在上述外部中断中添加如上红色部分的代码,就可把接收到的时间数据保存到数组里。这里需要留意一下串口初始化里的端口是不是选择在了3.0和3.1引脚,因为我现在的串口接在了这两个引脚上,所以引脚要对上。

关于ISP的“RTC对时”功能详解-9.png


其次为了使用printf打印出我们的时间数据进行验证,这里增加一个printf的重定向函数

  1. char putchar(char dat)
  2. {
  3.         B_TX1_Busy = 1;                        //标志发送忙
  4.         SBUF = dat;                                        //发一个字节
  5.         while(B_TX1_Busy);        //等待发送完成
  6.     return dat;
  7. }   
复制代码


最后在我们的while循环里编写如下代码,就可以把接收到的时间书库打印出来了,如果使用了单片机内部的RTC功能,可以使用绿色的部分直接把时间数据写入RTC的寄存器!

  1.     while (1)
  2.     {
  3. //        if((TX1_Cnt != RX1_Cnt) && (!B_TX1_Busy))   //收到数据, 发送空闲
  4. //        {
  5. //            SBUF = RX1_Buffer[TX1_Cnt];
  6. //            B_TX1_Busy = 1;
  7. //            if(++TX1_Cnt >= UART1_BUF_LENGTH)   TX1_Cnt = 0;
  8. //        }
  9.         if( Rec_OK==1 )
  10.         {
  11. <font color="#00ff00">//            INIYEAR = rtctime[1];     //Y:2021            //单片机内部rtc时钟初始化的办法
  12. //            INIMONTH = rtctime[2];    //M:12
  13. //            INIDAY = rtctime[3];      //D:31
  14. //            INIHOUR = rtctime[5];     //H:23
  15. //            INIMIN =rtctime[6];      //M:59
  16. //            INISEC = rtctime[7];      //S:50
  17. //            INISSEC = rtctime[8];      //S/128:0
  18. //            RTCCFG |= 0x01;   //触发RTC寄存器初始化</font>
  19.             
  20.             Rec_OK = 0;
  21.             printf("%02d%02d年%d月%d日\t",(int)rtctime[0],(int)rtctime[1],(int)rtctime[2],(int)rtctime[3]);
  22.             printf("%d:%d:%d.%d\t",(int)rtctime[5],(int)rtctime[6],(int)rtctime[7],(int)((u16)(rtctime[9]*256)|(u8)rtctime[10]));
  23.             printf("%d\r\n",(int)rtctime[8]);
  24.             
  25.         }        
  26.     }
复制代码


最后实物演示:

关于ISP的“RTC对时”功能详解-10.png

因为这里为了最快的验证,直接用串口模拟了我们下发的命令,这样我们就可以用串口直接获取到接收到的命令了,因为下发的命令和串口模拟的命令格式是一样的,这里这样测试比较方便,可以看到下发的事件数据就是:

40 53 54 43 52 54 43 23 14 17 05 04 04 09 24 13 03 01 F8

这串命令的时间我们刚刚解析过了,可以看到串口发出来的数据和我们解析的时间是一样的,然后就可以把这些关键数据写入能掉电走时的设备里了。

关于ISP的“RTC对时”功能详解-11.png

所以这个就没有问题了!是不是使用起来非常简单,祝大家使用愉快!



本帖被以下淘专辑推荐:

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:412
  • 最近打卡:2025-05-01 03:39:21

2

主题

144

回帖

3012

积分

论坛元老

积分
3012
发表于 2023-5-4 10:58:25 | 显示全部楼层
有意思的实验
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15609
发表于 2023-5-5 15:43:12 | 显示全部楼层
冲哥威武,学习
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:390
  • 最近打卡:2025-05-01 01:05:35

0

主题

12

回帖

1959

积分

金牌会员

积分
1959
发表于 2023-5-18 12:47:53 | 显示全部楼层
STC功能和应用越来越强了!谢谢!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:484
  • 最近打卡:2025-05-01 08:52:01
已绑定手机

23

主题

589

回帖

2813

积分

金牌会员

积分
2813
发表于 2023-5-18 13:19:21 | 显示全部楼层
太厉害了,学习学习,感谢!
不停地学习
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:440
  • 最近打卡:2025-05-01 08:46:19

45

主题

176

回帖

1721

积分

金牌会员

积分
1721
发表于 2023-6-5 20:08:20 | 显示全部楼层
有用的功能&详细的讲解,多谢!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-04-23 01:47:00

1

主题

13

回帖

319

积分

中级会员

积分
319
发表于 2023-6-27 22:16:10 | 显示全部楼层
楼主威武!非常感谢!如果能提供一下完整的例程供小白下载学习就更好了

点评

群文件自行下载哈~  详情 回复 发表于 2023-6-28 01:49
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:135
  • 最近打卡:2024-12-25 10:15:05

47

主题

1350

回帖

8058

积分

荣誉版主

冲哥视频教程和各种开源资料QQ交流群884047237,可群

积分
8058
QQ
发表于 2023-6-28 01:49:45 | 显示全部楼层
wind*** 发表于 2023-6-27 22:16
楼主威武!非常感谢!如果能提供一下完整的例程供小白下载学习就更好了 ...

群文件自行下载哈~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:522
  • 最近打卡:2025-05-01 06:03:55
已绑定手机

34

主题

459

回帖

2215

积分

金牌会员

积分
2215
发表于 2024-2-15 17:03:11 | 显示全部楼层
非常感谢!
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:522
  • 最近打卡:2025-05-01 06:03:55
已绑定手机

34

主题

459

回帖

2215

积分

金牌会员

积分
2215
发表于 2024-2-15 18:03:21 | 显示全部楼层
请帮我看看问题怎么解决?谢谢
截图202402151802287595.jpg
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-1 19:35 , Processed in 0.136715 second(s), 117 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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