DS1302秒闪烁

lpmrzx   2012-11-4 20:52 楼主
不知道有没有用DS1302做过时钟的,用两个发光二极管的闪烁来代表秒的变化,这些天一直在思考,要怎么做,想过通过编写程序,判断存放时间的数组的秒发生改变,发光二级管就亮一次,但是行不通,都是乱的,有做过的可以指教指教,没做过的也可以尝试去做。

回复评论 (12)

要想这么判断那么你必须实时判断,如果只做一个时钟的话可以循环的判断,否则可能需要定时器去判断,比如每100ms。如果发现当前秒的数值变了就点亮LED一定时间,这样的话你得把当前的秒的值存起来,以便下一次判断时使用,再一个LED亮的时间不能超过1s,最好是半秒。
没有做过,不过做过比这个复杂的类似的控制,你可以把代码发出来给我你看一下
点赞  2012-11-6 22:32

回复 楼主 lpmrzx 的帖子

好东西
点赞  2012-11-6 22:37

回复 沙发 jishuaihu 的帖子

感谢版主的解惑,下面是我的循环判断
                 //for(i=0;i<9;i++)
                 //{
                         I=Pro_dat[0];
                // }        
                //        for(j=0;j<9;j++)
                 //        {
                        if(I!=Pro_dat[i+1])
                        led0=0;
                        else
                        led0=1;
                //        }


ledo=0代表灯亮,for的循环都被注释掉了,也就是说没得循环,加上循环灯一直亮着的,现在注释掉循环的情况是这样的:秒的个位第一次从0-9期间为1时灭,第二次0-9期间为2灭,其余时间都为亮,且时间为1s。Dat_Pro[0]是存储被处理后的秒的个位的数组,I用来存放0-9秒的变化。
好纠结,感觉这样太简单了点,但是也不对,版主给点拨点拨吧!

[ 本帖最后由 lpmrzx 于 2012-11-7 08:49 编辑 ]
点赞  2012-11-7 08:47
你的问题一直描述的不清楚,led闪烁的写法这样:
uint8 sec=0;
if (sec & 1)  led^=1;
这一段要放在sec变化的后面,要保证sec变化时执行一次,否则=1时翻转好多次

现在你的秒数据是从芯片中读出来的,所以肯定需要一个全局量留存上次读取值,依据差值判断是否翻转led,这是编程的思路.led翻转时间的误差取决于刷新的时间,比如你0.5秒刷一次秒计时变量则每次闪烁可能有0.5秒偏差,另外计时超过一秒要考虑秒计时变量过0时的处理.
uint8 sec,secstorage;
if (abs(sec-sectorage)>n) {
   led^=1;
  sectorage=sec;
}   
n是秒单位时间小于127
点赞  2012-11-7 10:40
要是一秒一翻就没有那么麻烦了
if (sec &1)
    led=1;
else
   led=0;
两秒一翻
if (sec & 2)
    led=1;
else
   led=0;
四秒一翻
if (sec & 4)
    led=1;
else
   led=0;
程序写多了你就会很喜欢2的倍数,简单又省
点赞  2012-11-7 11:05

回复 5楼 huo_hu 的帖子

非常感谢您的点拨,以前也这么写过程序,但是就不知为何在此没想到要这样写,我现在这么写的
uchar sec=0;
uchar stor;
sec=Pro_dat[0];
if(abs(sec-stor)>0.5)
{
     led0^=1;
     stor=sec;
}
现在正常了,间替亮灭1s。
点赞  2012-11-7 11:23

回复 6楼 huo_hu 的帖子

那么1s两翻呢?是不是就是
if (sec &0.5)
    led=1;
else
   led=0
点赞  2012-11-7 11:25

回复 8楼 lpmrzx 的帖子

0.5不是整数啊
芯片读的出秒后的单位吗?读不出就做不到
点赞  2012-11-7 14:17

回复 9楼 huo_hu 的帖子

貌似不行,刚刚试了,编译出错!那我要一秒翻转两次怎么办呢?您的
if (sec &1)
    led=1;
else
   led=0;
这个很神奇,之前没用过,真是受益匪浅啦,感激!
点赞  2012-11-7 14:34
两翻麻烦啦,刚看了看芯片资料,最小计数就是一秒.
一定要的话也可以,大概得思路是:首先要一个变量计数V1,以固定时间间隔计数,整秒时计数值清0,另一个变量V2保存清0前的数值,也就是一秒时间定时间隔的计数值.程序中检查V1如果大于V2的一半就翻转led.
要实现整秒的判断还需要一个位用于存储之前的sec用于比较sec的整秒条件
点赞  2012-11-7 15:16
.程序中检查V1如果大于V2的一半就翻转led.
这句有问题,大于时会一直翻,还是大于置1小于置0好了
点赞  2012-11-7 15:26

回复 12楼 huo_hu 的帖子

复杂了,呵呵,就这样吧,有时间再去尝试!感谢您的解答!
点赞  2012-11-7 18:12
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复