6569|12

151

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

DS1302秒闪烁 [复制链接]

不知道有没有用DS1302做过时钟的,用两个发光二极管的闪烁来代表秒的变化,这些天一直在思考,要怎么做,想过通过编写程序,判断存放时间的数组的秒发生改变,发光二级管就亮一次,但是行不通,都是乱的,有做过的可以指教指教,没做过的也可以尝试去做。
此帖出自51单片机论坛

最新回复

.程序中检查V1如果大于V2的一半就翻转led. 这句有问题,大于时会一直翻,还是大于置1小于置0好了  详情 回复 发表于 2012-11-7 15:26

点评

好东西  详情 回复 发表于 2012-11-6 22:37
点赞 关注(1)
 

回复
举报

3404

帖子

6

TA的资源

裸片初长成(初级)

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

点评

感谢版主的解惑,下面是我的循环判断 //for(i=0;i  详情 回复 发表于 2012-11-7 08:47
 
 
 

回复

34

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

回复 楼主 lpmrzx 的帖子

好东西
此帖出自51单片机论坛
 
 
 

回复

151

帖子

0

TA的资源

纯净的硅(初级)

4
 

回复 沙发 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 编辑 ]
此帖出自51单片机论坛
 
 
 

回复

4008

帖子

0

TA的资源

版主

5
 
你的问题一直描述的不清楚,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
此帖出自51单片机论坛

点评

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

回复

4008

帖子

0

TA的资源

版主

6
 
要是一秒一翻就没有那么麻烦了
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的倍数,简单又省
此帖出自51单片机论坛

点评

那么1s两翻呢?是不是就是 if (sec &0.5) led=1; else led=0  详情 回复 发表于 2012-11-7 11:25
 
 
 

回复

151

帖子

0

TA的资源

纯净的硅(初级)

7
 

回复 5楼 huo_hu 的帖子

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

回复

151

帖子

0

TA的资源

纯净的硅(初级)

8
 

回复 6楼 huo_hu 的帖子

那么1s两翻呢?是不是就是
if (sec &0.5)
    led=1;
else
   led=0
此帖出自51单片机论坛

点评

:funk: 0.5不是整数啊 芯片读的出秒后的单位吗?读不出就做不到  详情 回复 发表于 2012-11-7 14:17
 
 
 

回复

4008

帖子

0

TA的资源

版主

9
 

回复 8楼 lpmrzx 的帖子

0.5不是整数啊
芯片读的出秒后的单位吗?读不出就做不到
此帖出自51单片机论坛

点评

貌似不行,刚刚试了,编译出错!那我要一秒翻转两次怎么办呢?您的 if (sec &1) led=1; else led=0; 这个很神奇,之前没用过,真是受益匪浅啦,感激!:handshake  详情 回复 发表于 2012-11-7 14:34
 
 
 

回复

151

帖子

0

TA的资源

纯净的硅(初级)

10
 

回复 9楼 huo_hu 的帖子

貌似不行,刚刚试了,编译出错!那我要一秒翻转两次怎么办呢?您的
if (sec &1)
    led=1;
else
   led=0;
这个很神奇,之前没用过,真是受益匪浅啦,感激!
此帖出自51单片机论坛
 
 
 

回复

4008

帖子

0

TA的资源

版主

11
 
两翻麻烦啦,刚看了看芯片资料,最小计数就是一秒.
一定要的话也可以,大概得思路是:首先要一个变量计数V1,以固定时间间隔计数,整秒时计数值清0,另一个变量V2保存清0前的数值,也就是一秒时间定时间隔的计数值.程序中检查V1如果大于V2的一半就翻转led.
要实现整秒的判断还需要一个位用于存储之前的sec用于比较sec的整秒条件
此帖出自51单片机论坛
 
 
 

回复

4008

帖子

0

TA的资源

版主

12
 
.程序中检查V1如果大于V2的一半就翻转led.
这句有问题,大于时会一直翻,还是大于置1小于置0好了
此帖出自51单片机论坛

点评

复杂了,呵呵,就这样吧,有时间再去尝试!感谢您的解答!  详情 回复 发表于 2012-11-7 18:12
 
 
 

回复

151

帖子

0

TA的资源

纯净的硅(初级)

13
 

回复 12楼 huo_hu 的帖子

复杂了,呵呵,就这样吧,有时间再去尝试!感谢您的解答!
此帖出自51单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表