极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 24216|回复: 7

【求助】关于使用 arduino制作LED数字时钟的几个问题

[复制链接]
发表于 2013-4-3 14:21:13 | 显示全部楼层 |阅读模式
额,本人新手小白,从没接触过电子电路,最近计划研究一下 arduino,打算用四位共阳数码管DIY一个小时钟

据说, 需要DS1302,但是再加上4位数码管IO就不够了,所以打算用74HC595x2来做

已经成功的点亮数码管,可是看了不少关于 DS1302的帖子,还没有理解程序应该怎么设计

比如DS1302怎么把返回的例如 12-59-59 这个时间交给数码管呢? MCU又怎么把12-59-59这个数字直接换成驱动LED的电压信号呢?(一个一个定义貌似很麻烦,有没有简单的方法呢?)

目前已经做到用74HC595成功的让4位数码管同时显示不同的数字,接下来求指导.......

不包含DS1302的设计图如下:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2013-4-3 16:55:27 | 显示全部楼层
你看的教程太少了。。。。 MCU就是要从很底层做起的。。。 多看些教程熟悉下吧。  DS1302的库把时间返回给你已经是省事很多了。 你要自己拆开小时和分的个位和十位,再把数字拆成数码管的横与竖。。。然后对应595的针脚。。。 自己继续思考吧。
回复 支持 反对

使用道具 举报

发表于 2013-4-3 16:57:33 | 显示全部楼层
最关键的还是数码管是共阳极,需要一位一位的扫描。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-4-3 17:20:43 | 显示全部楼层
lyili 发表于 2013-4-3 16:57
最关键的还是数码管是共阳极,需要一位一位的扫描。

原理已经知道了,就是程序有点儿摸不到头脑,不知该怎么弄好......

看来要Google一下了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-4-3 17:26:50 | 显示全部楼层
lyili 发表于 2013-4-3 16:55
你看的教程太少了。。。。 MCU就是要从很底层做起的。。。 多看些教程熟悉下吧。  DS1302的库把时间返回给你 ...

而且中文资料不多,大多数资料都是英语的,这也就忍了,更让人无法忍受的是,不少网站是被墙住的.....
回复 支持 反对

使用道具 举报

发表于 2013-4-3 18:07:43 | 显示全部楼层
本帖最后由 lyili 于 2013-4-3 18:09 编辑

这里的就有,还舍近求远?好好看下精华贴和wiki。。。 这个玩意我就做了,程序也没多少。。。
回复 支持 反对

使用道具 举报

发表于 2014-12-11 21:38:42 | 显示全部楼层
不需要DS1302,直接设置循环点亮程序,个位数每秒0-9循环,十位数每分钟0-5循环等等。
回复 支持 反对

使用道具 举报

发表于 2015-2-5 15:16:35 | 显示全部楼层
#include <DS1302.h>
uint8_t CE_PIN   = 14;
uint8_t IO_PIN   = 15;
uint8_t SCLK_PIN = 16;
DS1302 rtc(CE_PIN, IO_PIN, SCLK_PIN);

//设置数码管阴极接口
int a = 1;
int b = 2;
int c = 3;
int d = 4;
int e = 5;
int f = 6;
int g = 7;
//设置各位数码管位选通引脚COM引脚
int com1 = 8;
int com2 = 9;
int com3 = 10;
int com4 = 11;
int com5 = 12;
int com6 = 13;

void digital_0(  ) //显示数字0
{
  digitalWrite(a,LOW);
  digitalWrite(b,LOW);
  digitalWrite(c,LOW);
  digitalWrite(d,LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, HIGH);

}
void digital_1(  ) //显示数字1
{
  digitalWrite(a,HIGH);  
  digitalWrite(b,LOW);
  digitalWrite(c,LOW);
  digitalWrite(e,HIGH);
  digitalWrite(d,HIGH);
  digitalWrite(f,HIGH);
  digitalWrite(g,HIGH);

}
void digital_2(  ) //显示数字2
{
  digitalWrite(a,LOW);
  digitalWrite(b,LOW);
  digitalWrite(c,HIGH);
  digitalWrite(d,LOW);
  digitalWrite(e,LOW);
  digitalWrite(f,HIGH);
  digitalWrite(g,LOW);

}
void digital_3(  ) //显示数字3
{
  digitalWrite(a,LOW);
  digitalWrite(b,LOW);
  digitalWrite(c,LOW);
  digitalWrite(d,LOW);
  digitalWrite(e,HIGH);
  digitalWrite(f,HIGH);
  digitalWrite(g,LOW);

}
void digital_4(  ) //显示数字4
{
  digitalWrite(a,HIGH);
  digitalWrite(b,LOW);
  digitalWrite(c,LOW);
  digitalWrite(d,HIGH);
  digitalWrite(e,HIGH);
  digitalWrite(f,LOW);
  digitalWrite(g,LOW);

}
void digital_5(   ) //显示数字5
{
  digitalWrite(a,LOW);
  digitalWrite(b,HIGH);
  digitalWrite(c,LOW);
  digitalWrite(d,LOW);
  digitalWrite(e,HIGH);
  digitalWrite(f,LOW);
  digitalWrite(g,LOW);

}
void digital_6(  ) //显示数字6
{
  digitalWrite(a, HIGH );
  digitalWrite(b, HIGH);
  digitalWrite(c, LOW);
  digitalWrite(d,LOW);
  digitalWrite(e,LOW);
  digitalWrite(f,LOW);
  digitalWrite(g, LOW);

}
void digital_7 (  ) //显示数字7
{
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c,LOW);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);

}
void digital_8(   ) //显示数字8
{
  digitalWrite(a,LOW);
  digitalWrite(b,LOW);
  digitalWrite(c,LOW);
  digitalWrite(d,LOW);
  digitalWrite(e,LOW);
  digitalWrite(f,LOW);
  digitalWrite(g,LOW);

}
void digital_9(   ) //显示数字9
{
  digitalWrite(a, LOW );
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d,LOW);
  digitalWrite(e, HIGH);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);

}

void digital_off(   )//全灭
{
  digitalWrite(a,HIGH);
  digitalWrite(b,HIGH);
  digitalWrite(c,HIGH);
  digitalWrite(d,HIGH);
  digitalWrite(e,HIGH);
  digitalWrite(f,HIGH);
  digitalWrite(g,HIGH);
}

void pickDcom(int x)  //导通指定COM阳极引脚
{
  digitalWrite(com1, LOW);
  digitalWrite(com2, LOW);
  digitalWrite(com3, LOW);
  digitalWrite(com4, LOW);
  digitalWrite(com4, LOW);
  digitalWrite(com6, LOW);
  switch(x)
  {
  case 1:
    digitalWrite(com1, HIGH); //导通第一位数码管的位选通引脚
    break;
  case 2:
    digitalWrite(com2, HIGH); //导通第二位数码管的位选通引脚
    break;
  case 3:
    digitalWrite(com3, HIGH); //导通第三位数码管的位选通引脚
    break;
  default:
    digitalWrite(com4, HIGH); //导通第四位数码管的位选通引脚
    break;
  }
}
  
void setup()
{  for(int i=1;i<16;i++)
  {  pinMode(i, OUTPUT); }
  rtc.write_protect(false);//解除1302芯片写保护
  rtc.halt(false);//关闭涓流充电
  Time t(2009, 5, 19, 21, 16, 37, 3);//设置芯片时间:Tuesday, May 19, 2009 at 21:16:37.
  rtc.time(t);//将时间写入芯片
}

void loop()
{  digital_off(   );
   Time t = rtc.time(); /* 从 DS1302 获取当前时间 */
   pickDcom(1);//选通第一位数码管的COM脚,显示小时的第一位
   switch (t.hr/10)
    {
    case 1: digital_1(  ); break;
    case 2: digital_2(  ); break;
    }
   digital_off(   );  
  switch (t.hr%10)
   {
    case 1: digital_1(  ); break;
    case 2: digital_2(  ); break;
    case 3: digital_3(  ); break;
    case 4: digital_4; break;
    }
   delay(1000);
}


不知道这样可以不?
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-17 14:28 , Processed in 0.062777 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表