- 打卡等级:常住居民III
- 打卡总天数:139
- 最近打卡:2026-03-16 08:00:45
已绑定手机
中级会员
- 积分
- 299
|
现在我的程序需要长时间进入空闲模式,通过RTC的闹钟模式 10分钟 中断一次 退出空闲 然后查询一次ADC
查询完成处理好数据以后再次进入空闲
还有一个是记录工作时间 最大不超过12小时 中途工作结束则12小时计时清零,再次工作从零计时
用ADC来判断是否需要工作结束,需要的时候清零就可以了
但是问题是,是否一定要使用外部32K晶振 ,还是说内部低速晶振也可以,只要像我这样 不工作的时候及时清零误差就不会累计太大
因为我这个差一两秒没关系
RTC的例程下面这个程序吗?
- #include "STC8Hxxx.h"
-
- bit B_Alarm; // 闹钟触发标志
-
- void RTC_config(void); // RTC 初始化函数声明
-
- void main(void)
- {
- P_SW2 |= 0x80; // 使能扩展寄存器(XFR)访问
-
- RTC_config(); // 配置并启动 RTC
- EA = 1; // 开启总中断
-
- while(1)
- {
- if(B_Alarm) // 检测到闹钟中断
- {
- B_Alarm = 0; // 清标志
- // 可在此添加蜂鸣器、LED、继电器等闹钟动作
- }
- }
- }
-
- void RTC_Isr() interrupt 13 // RTC 中断服务函数(中断向量13)
- {
- if(RTCIF & 0x80) // 闹钟中断标志(bit7 = ALAIF)
- {
- RTCIF &= ~0x80; // 软件清中断标志
- B_Alarm = 1; // 置闹钟处理标志
- }
- }
-
- void RTC_config(void) // RTC 初始化函数
- {
- INIYEAR = 21; // 初始化年:2021
- INIMONTH = 12; // 月:12
- INIDAY = 31; // 日:31
- INIHOUR = 23; // 时:23
- INIMIN = 59; // 分:59
- INISEC = 50; // 秒:50
- INISSEC = 0; // 亚秒(1/128秒):0
-
- ALAHOUR = 0; // 闹钟小时:0
- ALAMIN = 0; // 闹钟分钟:0
- ALASEC = 0; // 闹钟秒:0
- ALASSEC = 0; // 闹钟亚秒:0
-
- IRC32KCR = 0x80; // 启动内部 32K RC 振荡器
- while(!(IRC32KCR & 1)); // 等待内部 32K 时钟稳定
-
- RTCCFG = 0x03; // 选内部 32K 时钟源 + 触发 RTC 寄存器初始化
-
- RTCIF = 0x00; // 清所有 RTC 中断标志
- RTCIEN = 0x88; // 使能闹钟中断(0x80) + 秒中断(0x08)
- RTCCR = 0x01; // RTC 模块使能
-
- while(RTCCFG & 0x01); // 等待 RTC 初始化完成(约 30μs)
- }
复制代码
|
|