询问大家一个关于时间点范围,时刻区间的算法代码
本帖最后由 zcllom 于 2023-6-16 17:13 编辑用单片机做了一个关于闹钟提醒的程序,用了stc的内部实时时钟,配合外部32.768晶振,时间点很准,一天大约设置8个闹钟,到点提醒很好做。
但现在需要在时间点区间范围之内都能提醒。比如设置8个闹钟(都是随机的),
例如:8:10,10:20,12:35,13:00,15:10,22:10,23:00,00:05, 要求在它们每个时间点范围的正负15分钟都有效,比如15:10,在14:55~15:25 都能触发; 而00:05,在23:50~00:20都有效触发。
这个有什么简略实现方法? GPT给你五秒钟来一个{:biggrin:}
要实现在时间点区间范围内都能提醒的功能,你可以按照以下步骤进行操作:
1. 首先,获取当前的时间和日期,以便与设置的闹钟进行比较。
2. 对于每个闹钟时间点,计算出其正负15分钟的时间范围。例如,对于闹钟时间点15:10,时间范围为14:55~15:25。
3. 检查当前时间是否在任何一个闹钟的时间范围内。如果是,则触发提醒。
4. 为了确保程序能够持续运行并及时检查时间,你可以使用一个循环来不断检查当前时间,并与闹钟时间进行比较。
下面是一个示例代码,使用C语言编写,基于STC单片机:
```c
#include <reg52.h>
// 定义闹钟时间点数组
unsigned char alarmTimes = {
{8, 10},
{10, 20},
{12, 35},
{13, 0},
{15, 10},
{22, 10},
{23, 0},
{0, 5}
};
// 定义闹钟时间范围偏移量(正负15分钟)
unsigned char alarmOffset = 15;
// 获取当前时间和日期
void getCurrentTime(unsigned char *hour, unsigned char *minute) {
// 使用STC内部实时时钟获取当前时间和日期
// 将当前小时和分钟存储到hour和minute变量中
}
// 检查当前时间是否在闹钟时间范围内
bit isTimeInRange(unsigned char alarmHour, unsigned char alarmMinute, unsigned char currentHour, unsigned char currentMinute) {
// 计算闹钟时间范围的起始时间和结束时间
unsigned char startHour = alarmHour;
unsigned char startMinute = alarmMinute - alarmOffset;
unsigned char endHour = alarmHour;
unsigned char endMinute = alarmMinute + alarmOffset;
// 处理时间范围跨越小时的情况
if (startMinute < 0) {
startHour -= 1;
startMinute += 60;
}
if (endMinute >= 60) {
endHour += 1;
endMinute -= 60;
}
// 检查当前时间是否在时间范围内
if ((currentHour > startHour || (currentHour == startHour && currentMinute >= startMinute)) &&
(currentHour < endHour || (currentHour == endHour && currentMinute <= endMinute))) {
return 1; // 在时间范围内
} else {
return 0; // 不在时间范围内
}
}
void main() {
unsigned char currentHour, currentMinute;
unsigned char i;
while (1) {
// 获取当前时间
getCurrentTime(¤tHour, ¤tMinute);
// 检查每个闹钟时间是否在范围内
for (i = 0; i < 8; i++) {
if (isTimeInRange(alarmTimes, alarmTimes, currentHour, currentMinute)) {
// 触发提醒
// 在这里执行你的提醒操作,例如发出蜂鸣声或显示提醒信息
}
}
}
}
```
请注意,以上代码只是一个示例,你需要根据自己的具体需求进行适当的修改和调整。例如,你可能需要根据你的硬件平台和编程语言的要求进行相应的更改。 不期望百分百但是思路发现是对的 lb0857 发表于 2023-6-16 16:56
GPT给你五秒钟来一个
(引用自2楼)
拥有GPT是件幸福的事{:biggrin:} zcllom 发表于 2023-6-16 17:05
拥有GPT是件幸福的事
(引用自4楼)
验证起来结果也反馈一下 gpt居然主动 生成基于stc ? 还是指定的 lb0857 发表于 2023-6-16 17:06
验证起来结果也反馈一下
(引用自5楼)
我先仔细看看它给出的代码。
最关键的是 零点左右的时刻 比如 00:05,它在转钟前是23点多。 本帖最后由 zcllom 于 2023-6-16 17:27 编辑
lb0857 发表于 2023-6-16 17:06
验证起来结果也反馈一下
(引用自5楼)
// 处理时间范围跨越小时的情况
if (startMinute < 0) {
startHour -= 1;
startMinute += 60;
}
if (endMinute >= 60) {
endHour += 1;
endMinute -= 60;
}
这里的处理不妥当,假如时钟在零点附近,会出现0-1的小时时间,或者会出现23+1的小时时间
只考虑了跨小时,而没有考虑跨天。 简单直接粗暴的方法,把时间换算成一个秒的计数器,这样就省了跨小时跨天的计算。 把时间转成时间戳,直接计算就行了 用时间戳,按秒加减计算,不用考虑跨小时或跨天问题。 把一天的时间转成秒数,你就好算了 unsigned char startMinute = alarmMinute - alarmOffset;
unsigned char endHour = alarmHour;
unsigned char endMinute = alarmMinute + alarmOffset;
都是unsigned char。不可能有负数的吧。 2avr 发表于 2023-6-21 22:06
unsigned char startMinute = alarmMinute - alarmOffset;
unsigned char endHour = alarmHour;
...
(引用自13楼)
是的,肉眼可见的 bug.
页:
[1]