xianfajushi 发表于 2023-1-31 11:00 自己回复自己的帖子有意思吗? 一个DS1302再怎么搞,它也就那样,并不能体现一个程序员的代码水平 你搞个无刷电机FOC试一下,你就会知道,DS1302是多么的低端 再说,你整几个月,都还没有搞明白,DS1302的精度跟程序一点关系都没有 "我修改了程序抛开时钟芯片用定时期替代秒计时,运行十几个小时结果和电脑时钟一样精准" 自以为是找到新世界的大门,实际上是连DS1302的门都没有找到 DS1302的精度取决晶振,如果你用的无源晶振,那就得用晶振机(或者叫石英精度测试仪之类的)不断的调试,更改匹配电容来达到高精度的效果如果用的是有源晶振,DS1302的精度主取决有源晶振的误差了,但这一点意义都没有,因为一个有源晶振的价格可以买一个RX8025T了,如果你不知道什么叫RX8025T,那就先去百度一下吧 |
xianfajushi 发表于 2023-1-31 11:00 就单纯做时钟而言本来就是用单片机远比1302精准。理论精度达10ns级。采用计时专用芯片的好处是掉电不停止走时,做万年历还可省去繁琐的大小月、润月、闰年、世纪年的计算。如果算成本,批量定制电子钟专用的邦定封装芯片比单片机成本还低。 |
对了有一点需要补充就是程序里面写的定时期频率仿真电路芯片的时钟频率需要保持一致否则会偏差,比如程序写11.0592Mhz那么仿真电路图中的单片机属性里面的时钟频率也要修改为11.0592Mhz保持相同,如果是12Mhz则走快了,反过来如果程序写12Mhz而仿真是11.0592Mhz则会走慢。 |
突发奇想,用数码管显示每周的值:一二三四五六日。64,64,9,9,73,73,63,63,9,61,81,69,121,79 |
wulin 发表于 2023-1-28 20:56 如果能够把程序打造得轻便即可用计时器中断实现比较精准的计时抛却时钟芯片目标,毕竟兆赫兹的精度比千赫兹提高了一个数量级别。 |
wulin 发表于 2023-1-28 20:56 只有了然于胸才能驾轻就熟 |
wulin 发表于 2023-1-28 20:56 不断优化就是对逻辑思维的验证,从而实现卖油翁的过程. 其实不然我认为频繁读取对精度有所影响,就好比开定时器中断应该说没什么影响,然而实践告诉人们,轻便的程序对定时器计时精度没多大影响,而复杂的程序对定时器计时精度就有影响,中断也要获得响应时间的,电路也是一样的总要拨点时间去处理其他事件. |
xianfajushi 发表于 2023-1-28 17:08 所谓合理是相对的,在不影响其它功能的前提下频繁读1302也并无不可,单片机也累不死。只能说在现有硬件条件下,满足所有功能预期,互相不发生冲突是需要一定的编程技巧。刻意追求主函数周期减小到十几微秒又有多少实际意义。 |
xianfajushi 发表于 2023-1-28 10:27 频繁读取1302全部数据不会影响其计时精度,但对于你刻意精打细算主循环时间肯定有影响。比如蜂鸣器音调会不稳。 |
wulin 发表于 2023-1-28 09:13 那么怎样才合理?之上已经说了,寻求合理的安排,目前把读秒压缩在每秒4次左右,在不开定时期情况下;若开定时器按每秒读取然而定时器未必就能精确每秒夜有不精确时候就会造成漏读秒的情况发生. |
wulin 发表于 2023-1-28 09:13 频繁读取1302全部数据是否会影响其计时精度?目前猜测而已没什么证据。 |
xianfajushi 发表于 2023-1-10 17:13 这个限制条件不完善,在Mbcd=0的1秒时间内会多次读1302,如果是跨年的那1秒内,则重复多次读全部数据。当然这属吹毛求疵,未必影响其它程序正常运行。何况是在半夜,谁还会去计较。 |
wulin 发表于 2023-1-9 17:17 中断+计数的1毫秒间隔或200微妙能做多少事还真的没什么案例,本案例旨在说明询问式计数延时相比独占计数延时的优越且灵活调节和设置,属于高级分析思维模式,而非入门级别独占计数延时一直套用引发种种疑难。 |
经过几次试验目前把读秒信号压缩到每秒4次左右基本察觉不到太大差别可以接受的程度,调整后蜂鸣器音调频率也发生变化能听出区别来。 |
人中狼 发表于 2023-1-12 08:39 其它都不用说,有好的程序拿来看看。 我家一台旭日红外热水器无线控制器每周都快1小时多,比如时间是6点看它屏幕走时已经是7点多了,每次都要去调整时间,否则计算峰谷的时间就不准确了!非常麻烦,是很差劲的产品质量,可以断定是很差劲的程序代码,所以莫要小看简单的程序提高效率问题,所谓见微知著,简单的功能都不能注重效率的话,可知复杂功能是很有问题的。 |
这个就是纯粹的强调所谓的效率两个字而已,但实际应用中效率到底又指什么呢 |
188610329 发表于 2023-1-11 00:20 从主程序中看到,这就是一个1302时钟,其它什么事都没干,压根就不需要节约什么时间,效率什么的都是没有什么意义的 1秒钟读取一次,延时直接用delay(); 按键一样的直接延时去抖动,没必要折腾那么多东西 或者是说用读取的时间来作为数码管的延时,都比楼主折腾这个好 我也不知道,把单片机时间节约成这样子,是为了什么? 是怕单片机累坏了?还是怕单片机长时间延时会闹情绪 我看了半天,都不知道“独占时间”是个什么玩意 |
xianfajushi 发表于 2023-1-10 16:50 ds1302来说,你真要节约宝贵的系统资源,就用硬件读写。不管用spi读写,还是串口1读写,都比你IO读写,占用系统时钟少。 |
在不开定时器情况下也可以比较精准控制只读一次秒信息精度控制在毫秒以下,因为上述说过了的6毫秒和40毫秒周期,因此可以比较精准控制去读秒信息一次足够,而不需要无谓的多次读取,同样道理读天月年也可以按条件读取,只是不开定时器情况下按我的思路是实现所有功能代码后再进行比较精准的控制读秒信息,因为不同功能的程序周期也不同,就比如6毫秒和40毫秒周期一般道理。 |
wulin 发表于 2023-1-9 17:17 限制条件的读是最合理的时间安排 Mbcd=Du_1302(0x81); if(Mbcd==0)Fbcd=Du_1302(0x83); if(Mbcd==0&&Fbcd==0)Sbcd=Du_1302(0x85); |
wulin 发表于 2023-1-9 17:17 之前代码是秒分时频繁都去读取,其实没必要,因此修改后的代码就是按条件限制的读取 Mbcd=Du_1302(0x81); if(Mbcd==0)Fbcd=Du_1302(0x83); if(Fbcd==0)Sbcd=Du_1302(0x85); |
wulin 发表于 2023-1-9 17:17 优化的读取是秒=0则读分,分=0则读时,不需要频繁读分和时信息,这样就可以节省很多宝贵的时间资源. |
xianfajushi 发表于 2023-1-5 07:29 用定时器的目的是控制主函数循环周期,以便轻松处理按键消抖和按键长短按计数以及数码管动态扫描。如果在主函数中加无源蜂鸣器驱动就得缩短定时周期也就是主函数循环周期。大约200us。因为无源蜂鸣器有特定的驱动频率要求,常见的廉价无源蜂鸣器约2KHz声压最大。若主函数循环周期不稳定蜂鸣器音量声调也不会稳定。这不是仿真就可以搞定的。通常情况下200us可以干很多很多事。对于某些在一个主循环周期内做不完的事可以拆分。单片机玩的就是时间和逻辑。说白了就是在什么时间点干什么事。 |
通过我提供的测试图片一看就知道单片机的时间都到哪去了,也就知道优化该从何处下手了,我之所以说我的程序还能进一步优化,指的是读取芯片的频次可以进一步减少而不会明显影响显示精度,按目前图片的时间约50毫秒的频次显然有很多次去读取是不必要的,因此是可以继续优化的,至于多少次或说多少时间去读取一次合理,就值得探讨了,各位高手不妨畅言高论。 |
wulin 发表于 2023-1-4 20:42 今早想起来要补充说明不开定时器的情况下,就用简单的功能来测试,蜂鸣器一定要的,若要其它功能不是不会提出来,我自己代码也是不开定时器,不使用额外循环计数延时,我的测试周期还可以优化再减小。 |
wulin 发表于 2023-1-4 20:42 不错,通篇没用到计数延时。 |
wulin 发表于 2023-1-4 20:42 实在是抱歉,我忘记了说明是不开定时器的情况下,就用简单的功能做测试,不要看表面功能简单,练就的是功夫。 |
xianfajushi 发表于 2023-1-4 07:12 这种要求的程序很简单,也用不着138、573,给你一个示例参考,另加闹钟也是轻而易举的事。黑币你就自己留着吧。 ![]()
|
xianfajushi 发表于 2023-1-4 07:12 我这几年编程白学了?我怎么看了几次都看不明白这段文字表达了什么........... |
没看懂楼主的目的,楼主用的是138解码逐个点亮数码管的扫描方式,读取1302数据和bcd转换十进制再查表只需要在点亮一个数码管周期内完成,其余时间只能等待延时,不延时还能干嘛呢,还有啊,这程序太简单了,很多功能都没实现,操作不用按钮,使用旋转编码器,年月日和闹钟都没实现呢,这些都实现了,再找优化方案和程序精简 |