RTC失效或是误差特别大
要实现的功能:
当设备开机后启动一次模块,在这个过程中会收到当前准确时间及后续要启动模块的两个时间;
1.把接收到的当前准确时间更新到RTC也就是void ParseAndUpdateRTC(char *time_str)
2.设置两个时间:比如一个是上午12点,一个是晚上21点,也就是void Parse_NNMO_Data(char *time_str) 接收到的时间,
3.分钟中断也就是void RTC_Isr() interrupt 36 这里设置的是满足5分钟后也就是当B_1m = 1时执行一次Result_Check(),但每次分钟中断时把B_Sleep = 1也就是每分钟都做一次其它检测,其它 时间处于掉电模式。
问题:
1.设置的两个时间有时会失效,不失效的话误差也会特别大,比如15分钟可能有5分钟左右或者4个小时左右大概会延后90分钟左右(这个值不确定有时更多有时更少),是设置错误还是程序问题 请大家指点!感谢!
2.不加外部晶振的解决办法。
说明:
1.设备用电池供电,电压在2.5-3.0V
2.型号为STC8H8K64U,丝印的第三行最后两个字母是HD
3.使用STC内部晶振,因为时间精度没有太大要求,12小时内误差10分钟到30分钟都可以接受,后续每次模块启动后都可以更新RTC的值为当前准确时间
4.烧录程序时:输入用户程序运行时的IRC频率为11.0592,允许低压复位没有勾选
<blockquote>xdata int t1_hou, t1_min; // 时间段1/* 中断函数 */void RTC_Isr() interrupt 36
{
if(RTCIF & 0x10) //分钟中断
{
RTCIF &= ~0x10;
rtc_1min_counter++; // 每分钟中断计数增加1
if (rtc_1min_counter >= 5) // 满足5分钟
{
rtc_1min_counter = 0; // 清零重新计数/* 接收到的模块启动时间 */这里是两个时间段,比如12:00启动一次模块,21:00启动一次模块void Parse_NNMO_Data(char *time_str)
{
// 检查数据是否以 "NNMO:" 开头
if (strncmp(time_str, "NNMO:", 5) != 0)
{
return; // 不是时间数据,直接返回
}
// 跳过 "NNMO:" 解析时间数据
if (sscanf(time_str + 5, "%d,%d,%d,%d", &mt1, &mt2, &mt3, &mt4) == 4)
{
// 数据有效性校验
f (mt1 < 24 && mt2 < 60 && mt3 < 24 && mt4 < 60)
下面还有代码为何会显示不完整? RTC的话 不使用外部32K晶振的话,15分钟差个5、6分钟很正常。
_奶咖君_ 发表于 2025-8-5 09:39
RTC的话 不使用外部32K晶振的话,15分钟差个5、6分钟很正常。
用人来计时,15分钟也不会差5,6分? xpz127 发表于 2025-8-5 10:18
用人来计时,15分钟也不会差5,6分?
那你就帮它计时吧{:touxiao:} desperado1 发表于 2025-8-5 09:16
下面还有代码为何会显示不完整?
代码显示不全的话,编辑时最好在“高级”下勾选“纯文本”
然后在格式符外面插入代码,避免代码结构里面混入其它格式符,或者复制的代码内容里包含格式符导致显示不正常:
页:
[1]