标题: 单片机DS1302时钟 求时钟秒点闪烁思路 [打印本页]

作者: dcc60    时间: 2025-6-6 14:05
标题: 单片机DS1302时钟 求时钟秒点闪烁思路
DS1302时钟,如何让秒点闪烁?不想用定时器,秒点亮时“秒”正好进位。按说可以判断秒进位,但如何让它熄灭0.5秒?
作者: xiaobendan001    时间: 2025-6-6 15:32
不用定时器用循环?
作者: xiaobendan001    时间: 2025-6-6 15:41
显示秒的情况下,秒点一直显示着就行吧。不显示秒的话,无所谓进位同步了
作者: powerdruy    时间: 2025-6-6 15:59
1302有没有秒中断输出?PCF8563是有秒中断输出引脚的
作者: zhuls    时间: 2025-6-6 16:04
直接更新显示秒读数就行了,何必多浪费2个秒点在那闪啊闪的?
如果没有显示秒读数,开个定时器,差个不多500ms就换个姿态,不就是秒点了?
作者: WL0123    时间: 2025-6-6 16:05
这个示例里有你想要的秒点闪烁 4位数码管DS1302单键调时时钟 DS18B20程序 仿真.rar (153.83 KB, 下载次数: 0)

作者: dcc60    时间: 2025-6-7 20:14
xiaobendan001 发表于 2025-6-6 15:32
不用定时器用循环?

用定时器不能与“秒”准确同步。
作者: dcc60    时间: 2025-6-7 20:15
powerdruy 发表于 2025-6-6 15:59
1302有没有秒中断输出?PCF8563是有秒中断输出引脚的

谢谢提醒,有秒中断的。没想起来
作者: dcc60    时间: 2025-6-7 20:17
zhuls 发表于 2025-6-6 16:04
直接更新显示秒读数就行了,何必多浪费2个秒点在那闪啊闪的?
如果没有显示秒读数,开个定时器,差个不多5 ...

没有秒闪,万一不走了都不知道。
用定时器不能与秒同步。

作者: dcc60    时间: 2025-6-7 20:17
WL0123 发表于 2025-6-6 16:05
这个示例里有你想要的秒点闪烁

谢谢,好好学习学习。
作者: zhuls    时间: 2025-6-7 21:01
dcc60 发表于 2025-6-7 20:17
没有秒闪,万一不走了都不知道。
用定时器不能与秒同步。

都显示“23:59:32”了,中间两组“:”闪不闪有什么意义?
如果是显示“23:59”,那可以闪的。
开个定时器计数器会不?
你的定时器开个1ms,计满500就改变“:”的状态,不需要太准,前500“;”亮起,500后“;”灭,会不?
同时你肯定还会在大循环中时不时去读RTC的秒计数,当读到的秒计数是新内容时,不管这个500ms增量到什么值,直接清0,同时“;”亮起,这样算不算“同步”?至于500ms后就由它去,多几10个计数都无所谓,因为是灭了。。当下一个秒读数更新时,又清0了,重头来过。。
不完整代码给你参考:
定时器计数:
  1. //tim0中断
  2. void tim0_Isr() interrupt 1           //
  3. {
  4.         tms++;    //这个计满500就灭秒点
复制代码

更新秒点状态:
  1. //显示秒点         
  2.         if (tms<=500)      //上半秒?
  3.         {
  4.          //秒点亮
  5.         }
  6.         else  
  7.         {
  8.           //秒点灭
  9.         }
复制代码

所谓的同步:
  1.           if(oldsec!=sec) //秒读数有变
  2.           {
  3.             tms=0;
  4.             oldsec=sec;
复制代码

作者: hhdsdy    时间: 2025-6-7 22:22
dcc60 发表于 2025-6-7 20:14
用定时器不能与“秒”准确同步。

你这脑子不行啊,当1302秒中断时,显示秒500ms,然后熄灭,这个熄灭不计时,管它是400ms还是700ms,等到下一次秒中断继续显示,你会揪着这一点冒号显示的误差吗?
作者: vscos    时间: 2025-6-8 06:02
dcc60 发表于 2025-6-7 20:14
用定时器不能与“秒”准确同步。

1302没有秒输出,要做到秒同步不太可能吧
作者: man1234567    时间: 2025-6-8 12:08
dcc60 发表于 2025-6-7 20:15
谢谢提醒,有秒中断的。没想起来

秒中断每秒发生一次,还是得结合用系统中断才能做到半秒亮半秒灭的闪。
作者: man1234567    时间: 2025-6-8 12:13
vscos 发表于 2025-6-8 06:02
1302没有秒输出,要做到秒同步不太可能吧

完全精准同步没必要,毕竟是给肉眼看的。
用1个1MS中断计数,当秒位数字发生变化时清零,计数大于500时关秒点显示否则开。
调整这个数值可以调整肉眼的观看效果,且对系统运行无影响。
在数码管的两个秒点可分开控制的,还可以做到上午闪上点下午闪下点。
作者: cy009    时间: 2025-6-8 16:17
WL0123 发表于 2025-6-6 16:05
这个示例里有你想要的秒点闪烁

你的答案不符合楼主的要求,楼主的秒点闪烁是亮0.5秒,灭0.5秒。你提供的案例是亮1秒,灭1秒。
作者: dcc60    时间: 2025-6-8 19:28
zhuls 发表于 2025-6-7 21:01
都显示“23:59:32”了,中间两组“:”闪不闪有什么意义?
如果是显示“23:59”,那可以闪的。
开个定 ...

很好的思路。
实验阶段,有6位、有4位的,6位的自然不用闪,4位的要搞一下。之前已经用定时器“闪”了,想更准确一点。
作者: dcc60    时间: 2025-6-8 19:29
hhdsdy 发表于 2025-6-7 22:22
你这脑子不行啊,当1302秒中断时,显示秒500ms,然后熄灭,这个熄灭不计时,管它是400ms还是700ms ...

有道理!!!
作者: dcc60    时间: 2025-6-8 19:31
vscos 发表于 2025-6-8 06:02
1302没有秒输出,要做到秒同步不太可能吧

是这样的,目前看来只能精确到1秒内亮灭一次,500ms有点困难。
作者: dcc60    时间: 2025-6-8 19:33
man1234567 发表于 2025-6-8 12:08
秒中断每秒发生一次,还是得结合用系统中断才能做到半秒亮半秒灭的闪。

目前用定时器延时大概0.5秒。
作者: dcc60    时间: 2025-6-8 19:37
man1234567 发表于 2025-6-8 12:13
完全精准同步没必要,毕竟是给肉眼看的。
用1个1MS中断计数,当秒位数字发生变化时清零,计数大于500时 ...

目前用定时器作秒闪。
很久以前,秒点是做成上下跳动闪烁的。
作者: WL0123    时间: 2025-6-8 20:14
cy009 发表于 2025-6-8 16:17
你的答案不符合楼主的要求,楼主的秒点闪烁是亮0.5秒,灭0.5秒。你提供的案例是亮1秒,灭1秒。

是你没有看懂
作者: zhuls    时间: 2025-6-8 21:21
dcc60 发表于 2025-6-8 19:28
很好的思路。
实验阶段,有6位、有4位的,6位的自然不用闪,4位的要搞一下。之前已经用定时器“闪”了, ...

想要“更准确”,就用测周期的方法:
在系统上电初始化后,先单任务方式测一下前后两次秒读数更新之间的计数差,就是完整的1秒内要有多少个计数?然后这个计数再对半开,就是你想要有“更准确”的亮灭秒点的时间,即500ms了 。
作者: cy009    时间: 2025-6-9 08:37
本帖最后由 cy009 于 2025-6-9 18:45 编辑
WL0123 发表于 2025-6-8 20:14
是你没有看懂
同步的问题依然有误差
作者: xianfajushi    时间: 2025-6-9 09:13
吓我一跳,还以为1302真的有秒引脚!如果有秒引脚之前我就写错了,冒汗!更新显示时,可以比较秒值,不同时点亮,并设法半秒熄灭,简单延时亦可,定时器计数亦可,当然定时器可设法精准。
作者: dcc60    时间: 2025-6-9 09:58
zhuls 发表于 2025-6-8 21:21
想要“更准确”,就用测周期的方法:
在系统上电初始化后,先单任务方式测一下前后两次秒读数更新之间的 ...

想到一块了。
我的想法是上电后一定时间(等待系统稳定)然后用计数方法取半作为计时器的亮灭值。
作者: lxm41577    时间: 2025-6-9 10:50
这个问题我在制作时钟时也是苦恼过,我处理方式是有二,一是改定时器的参数,改到同步为止,二是60秒读一次DS1302时间,这样秒数和闪点是同步的,我现在的制作好的时钟看着很满意
作者: hi等你    时间: 2025-6-9 13:15
这个和主程序结构有关系的,我的是这样设计的,主程序一直在查按键,查1302的秒数据是否有变化,
按键和秒都没变化就会往固定的寄存器加1,如果秒和按键都没有变化数据满200就会灭掉秒点,这个
时间段半秒不到,接下来的半秒多时间就是熄灭状态,等到1302秒数据变化了就去处理显示和寄存器
归零,反正我用的是计数器方法,没有用中断和定时这些资源
作者: dcc60    时间: 2025-6-9 20:01
xianfajushi 发表于 2025-6-9 09:13
吓我一跳,还以为1302真的有秒引脚!如果有秒引脚之前我就写错了,冒汗!更新显示时,可以比较秒值,不同时 ...

定时器有累积误差,只能是个大概。
作者: dcc60    时间: 2025-6-9 20:03
lxm41577 发表于 2025-6-9 10:50
这个问题我在制作时钟时也是苦恼过,我处理方式是有二,一是改定时器的参数,改到同步为止,二是60秒读一次 ...

定时器有累积误差。
60秒读一次是什么意思?
作者: dcc60    时间: 2025-6-9 20:06
hi等你 发表于 2025-6-9 13:15
这个和主程序结构有关系的,我的是这样设计的,主程序一直在查按键,查1302的秒数据是否有变化,
按键和秒 ...

目前能想到最精确的就是秒变化时“:”亮,然后熄灭大概0.5秒。
作者: cy009    时间: 2025-6-9 22:04
完美解决秒点同步的问题:
1.定义两个变量,存储相邻两次读取秒的值。unsigned char sec_temp1,sec_temp2;
2.定义定时器计数变量。unsigned int cnt;
3.定时器定时5ms,计数200次即1秒,取一半值(0.5秒)显示秒点,另一半不显示。
4.秒点同步:判断相邻两次读取秒的值,若不相等即为秒有进位,执行cnt=0。
作者: xianfajushi    时间: 2025-6-10 10:30
dcc60 发表于 2025-6-9 20:01
定时器有累积误差,只能是个大概。

理解差了,每秒同步是较精准的。
作者: dcc60    时间: 2025-6-10 20:50
cy009 发表于 2025-6-9 22:04
完美解决秒点同步的问题:
1.定义两个变量,存储相邻两次读取秒的值。unsigned char sec_temp1,sec_temp2; ...

抽时间试试。感谢支持。
作者: dcc60    时间: 2025-6-10 20:51
xianfajushi 发表于 2025-6-10 10:30
理解差了,每秒同步是较精准的。

可否把相关代码发出来学习学习?




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1