圣源电子制作

 找回密码
 立即注册
查看: 12917|回复: 1
打印 上一主题 下一主题

Arduino 连接 DS1302 时钟模块

[复制链接]
跳转到指定楼层
楼主
发表于 2012-4-28 11:35:45 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
DS1302是maxim美信生产的时钟模块,支持年、月、日、时、分、秒、星期显示。支持为后备电池涓流充电。可以。跟Arduino只需要3条数据连接线即可使用。

DS1302数据手册可以看这里:DS1302 时钟芯片 涓流充电时钟保持芯片中文资料 芯片IC中文资料

DS1302电路很简单,如果洞洞板自制的话,可以参考下图:



DS1302 时钟模块购买地址:http://syyyd.taobao.com

连线方法:
CE(DS1302 pin5) -> Arduino D5
IO(DS1302 pin6) -> Arduino D6
SCLK(DS1302 pin7) -> Arduino D7
Vcc2(DS1302 pin1) -> Arduino +5v
GND(DS1302 pin4) -> Arduino GND

使用前,先将下面的库文件解压到arduino-0023\libraries文件夹下面

DS1302.rar (13.27 KB, 下载次数: 64)

例子代码如下:

  1. /*
  2. Arduino 连接 DS1302
  3. 代码来源:http://quadpoint.org/projects/arduino-ds1302
  4. 增加了串口调整时间代码
  5. */
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <DS1302.h>

  9. /* 接口定义
  10. CE(DS1302 pin5) -> Arduino D5
  11. IO(DS1302 pin6) -> Arduino D6
  12. SCLK(DS1302 pin7) -> Arduino D7
  13. */
  14. uint8_t CE_PIN = 5;
  15. uint8_t IO_PIN = 6;
  16. uint8_t SCLK_PIN = 7;

  17. /* 日期变量缓存 */
  18. char buf[50];
  19. char day[10];
  20. /* 串口数据缓存 */
  21. String comdata = "";
  22. int numdata[7] ={0}, j = 0, mark = 0;
  23. /* 创建 DS1302 对象 */
  24. DS1302 rtc(CE_PIN, IO_PIN, SCLK_PIN);


  25. void print_time()
  26. {
  27. /* 从 DS1302 获取当前时间 */
  28. Time t = rtc.time();
  29. /* 将星期从数字转换为名称 */
  30. memset(day, 0, sizeof(day));
  31. switch (t.day)
  32. {
  33. case 1: strcpy(day, "Sunday"); break;
  34. case 2: strcpy(day, "Monday"); break;
  35. case 3: strcpy(day, "Tuesday"); break;
  36. case 4: strcpy(day, "Wednesday"); break;
  37. case 5: strcpy(day, "Thursday"); break;
  38. case 6: strcpy(day, "Friday"); break;
  39. case 7: strcpy(day, "Saturday"); break;
  40. }
  41. /* 将日期代码格式化凑成buf等待输出 */
  42. snprintf(buf, sizeof(buf), "%s %04d-%02d-%02d %02d:%02d:%02d", day, t.yr, t.mon, t.date, t.hr, t.min, t.sec);
  43. /* 输出日期到串口 */
  44. Serial.println(buf);
  45. }


  46. void setup()
  47. {
  48. Serial.begin(9600);
  49. rtc.write_protect(false);
  50. rtc.halt(false);
  51. }

  52. void loop()
  53. {

  54. /* 当串口有数据的时候,将数据拼接到变量comdata */
  55. while (Serial.available() > 0)
  56. {
  57. comdata += char(Serial.read());
  58. delay(2);
  59. mark = 1;
  60. }
  61. /* 以逗号分隔分解comdata的字符串,分解结果变成转换成数字到numdata[]数组 */
  62. if(mark == 1)
  63. {
  64. Serial.print("You inputed : ");
  65. Serial.println(comdata);
  66. for(int i = 0; i < comdata.length() ; i++)
  67. {
  68. if(comdata[i] == ',' || comdata[i] == 0x10 || comdata[i] == 0x13)
  69. {
  70. j++;
  71. }
  72. else
  73. {
  74. numdata[j] = numdata[j] * 10 + (comdata[i] - '0');
  75. }
  76. }
  77. /* 将转换好的numdata凑成时间格式,写入DS1302 */
  78. Time t(numdata[0], numdata[1], numdata[2], numdata[3], numdata[4], numdata[5], numdata[6]);
  79. rtc.time(t);
  80. mark = 0;j=0;
  81. /* 清空 comdata 变量,以便等待下一次输入 */
  82. comdata = String("");
  83. /* 清空 numdata */
  84. for(int i = 0; i < 7 ; i++) numdata[i]=0;
  85. }

  86. /* 打印当前时间 */
  87. print_time();
  88. delay(1000);
  89. }
复制代码


使用方法:

打开Arduino串口调试器即可看到当前时间。如果需要调整时间的话,只需要在串口输入当前日期时间,以逗号分隔

格式为:

年,月,日,时,分,秒,星期

星期数:Sunday=1,MOnday=2,...Saturday=7
比如,今天是2011年11月17日11时23分40秒星期四
填入2011,11,17,11,22,40,5即可






回复

使用道具 举报

沙发
发表于 2013-1-10 10:46:38 | 只看该作者
这个在新的1、0以上有问题,因为库文件有变动
"WProgram.h"已经不存在了,改为使用 Arduino.h
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|手机版|联系我们|闽公网安备 35012102000020号|闽ICP备11020110号-1|圣源电子

GMT+8, 2024-12-18 10:28 , Processed in 0.046776 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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