要实现的功能:
当设备开机后启动一次模块,在这个过程中会收到当前准确时间及后续要启动模块的两个时间;
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)
复制代码
|