极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10082|回复: 2

基于Microduino RTC 数码管时钟

[复制链接]
发表于 2013-12-23 21:34:48 | 显示全部楼层 |阅读模式
本帖最后由 wasdylb 于 2013-12-23 21:44 编辑

闲来没事,发现以往买了带时钟两点的4位数码管,于是用Microduino RTC做了个时钟显示,感觉挺好的,正符合Microduino小巧的特点。上个图:

这里就不详细介绍四位数码管,因为数码管引脚不确定,每个厂家生产的都不一样。只需测出其引脚,通过更改程序就行。讲讲如何测量:
1.确定四位数码管的位码(哪个引脚点亮哪位数码管);
2.确定数码管的段码(a,b,c,d,e,f,g,dp);

程序:
如果需要调试时间需要把代码 vosettime()取消注释(把//去掉),再在初始化设置时间函数void vosettime()里改时间参数后下载就行;如果要掉电后继续运行,必须把vosettime()注释掉,加上//。如果不注释,掉电后重启,时间是设置的初始值。

  1. #include <Wire.h>
  2. #include <Rtc_Pcf8563.h>

  3. Rtc_Pcf8563 rtc;//初始化实时时钟

  4. #define Duan1 0
  5. #define Duan2 3
  6. #define Duan3 4
  7. #define Duan4 8
  8. #define Colon1 6
  9. #define Colon2 7

  10. int timehourg,timehours,timeming,timemins;
  11. int timeyear1,timeyear2;
  12. int timemouth1,timemouth2;
  13. int timeday1,timeday2;

  14. long  data[10]=
  15. {
  16.   0xfc,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6
  17. };

  18. void setup()
  19. {
  20.   // Serial.begin(115200);
  21.   for(int x=0;x<14;x++)
  22.   {
  23.     pinMode(x,OUTPUT);//设置输出引脚
  24.   }  
  25.   //vosettime();
  26. }
  27. void loop()
  28. {
  29.   rtc.formatDate();
  30.   rtc.formatTime();

  31.   timehours=rtc.getHour()/10;
  32.   timehourg=rtc.getHour()%10;
  33.   timemins=rtc.getMinute()/10;
  34.   timeming=rtc.getMinute()%10;

  35.   timeyear1=rtc.getYear()/10;
  36.   timeyear2=rtc.getYear()%10;

  37.   timemouth1=rtc.getMonth()/10;
  38.   timemouth2=rtc.getMonth()%10;

  39.   timeday1=rtc.getDay()/10;
  40.   timeday2=rtc.getDay()%10;  

  41.   daytime();
  42. /*
  43.   for(int i=0;i<500;i++)
  44.     datetime();
  45.   for(int i=0;i<500;i++)
  46.     datatime();
  47. */
  48.   /*
  49.   Serial.print("TIME:");
  50.    Serial.print("20");
  51.    Serial.print(rtc.getYear());
  52.    Serial.print("/");
  53.    Serial.print(rtc.getMonth());
  54.    Serial.print("/");
  55.    Serial.println(rtc.getDay());
  56.    Serial.print(rtc.getHour());
  57.    Serial.print(":");
  58.    Serial.print(rtc.getMinute());
  59.    Serial.print(":");
  60.    Serial.println(rtc.getSecond());
  61.    delay(1000);
  62.    */
  63. }
  64. //显示时间
  65. void daytime()
  66. {
  67.   duanma(1);
  68.   leddisplay(data[timehours]);
  69.   delay(3);
  70.   duanma(2);
  71.   leddisplay(data[timehourg]);
  72.   delay(3);
  73.   duanma(3);
  74.   leddisplay(data[timemins]);
  75.   delay(3);
  76.   duanma(4);
  77.   leddisplay(data[timeming]);
  78.   delay(3);

  79.   if(rtc.getSecond()%2==0)
  80.   {
  81.     digitalWrite(Colon1, LOW);  
  82.     digitalWrite(Colon2, HIGH);
  83.   }
  84.   else
  85.   {
  86.     digitalWrite(Colon1, HIGH);  
  87.     digitalWrite(Colon2, LOW);
  88.   }
  89. }
  90. //显示月、日
  91. void datatime()
  92. {
  93.   duanma(1);
  94.   leddisplay(data[timemouth1]);
  95.   delay(3);
  96.   duanma(2);
  97.   leddisplay(data[timemouth2]);
  98.   delay(3);
  99.   duanma(3);
  100.   leddisplay(data[timeday1]);
  101.   delay(3);
  102.   duanma(4);
  103.   leddisplay(data[timeday2]);
  104.   delay(3);
  105. }
  106. //显示年
  107. void datetime()
  108. {
  109.   duanma(1);
  110.   leddisplay(data[2]);
  111.   delay(3);
  112.   duanma(2);
  113.   leddisplay(data[0]);
  114.   delay(3);
  115.   duanma(3);
  116.   leddisplay(data[timeyear1]);
  117.   delay(3);
  118.   duanma(4);
  119.   leddisplay(data[timeyear2]);
  120.   delay(3);
  121. }
  122. //=======================初始化设置时间函数===========================//
  123. void vosettime()
  124. {
  125.   rtc.initClock();
  126.   //day, weekday, month, century(1=1900, 0=2000), year(0-99)
  127.   rtc.setDate(21, 6, 12, 0, 13);
  128.   //hr, min, sec
  129.   rtc.setTime(20, 44, 50);
  130. }

  131. void leddisplay(int num)    // 数组数据移位输出
  132. {
  133.   /*=====================================================================
  134.    先将16进制数向右移x位(num>>x),x代表了microduinoI/O口对应16进制的某位,
  135.    0是最低位,7是最高位。再将移的数据与0x01按位与,就可以得到16进制数某位的
  136.    数据(0或1),再将其值赋值给microduino的I/O就行。
  137.    ======================================================================*/
  138.   digitalWrite(11, ((num>>0)&0x01));
  139.   digitalWrite(9, ((num>>1)&0x01));
  140.   digitalWrite(2, ((num>>2)&0x01));
  141.   digitalWrite(13, ((num>>3)&0x01));
  142.   digitalWrite(12, ((num>>4)&0x01));
  143.   digitalWrite(10, ((num>>5)&0x01));
  144.   digitalWrite(5, ((num>>6)&0x01));
  145.   digitalWrite(1,((num>>7)&0x01));
  146. }
  147. void duanma(int x)
  148. {
  149.   switch(x)
  150.   {
  151.   case 1:
  152.     {
  153.       digitalWrite(Duan1, LOW);  
  154.       digitalWrite(Duan2, HIGH);  
  155.       digitalWrite(Duan3, HIGH);  
  156.       digitalWrite(Duan4, HIGH);  
  157.     }
  158.     break;
  159.   case 2:
  160.     {
  161.       digitalWrite(Duan1, HIGH);  
  162.       digitalWrite(Duan2, LOW);  
  163.       digitalWrite(Duan3, HIGH);  
  164.       digitalWrite(Duan4, HIGH);  
  165.     }
  166.     break;
  167.   case 3:
  168.     {
  169.       digitalWrite(Duan1, HIGH);  
  170.       digitalWrite(Duan2, HIGH);  
  171.       digitalWrite(Duan3, LOW);  
  172.       digitalWrite(Duan4, HIGH);  
  173.     }
  174.     break;
  175.   case 4:
  176.     {
  177.       digitalWrite(Duan1, HIGH);  
  178.       digitalWrite(Duan2, HIGH);  
  179.       digitalWrite(Duan3, HIGH);  
  180.       digitalWrite(Duan4, LOW);  
  181.     }
  182.     break;
  183.   }
  184. }
复制代码

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2014-3-27 22:57:13 | 显示全部楼层
{:soso_e113:}怎么没有调节时间的口呢?
回复 支持 反对

使用道具 举报

发表于 2014-3-28 09:26:28 | 显示全部楼层
收藏备用,希望上多点照片,看清楚连接构造
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-18 15:34 , Processed in 0.049291 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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