找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 38860|回复: 47
收起左侧

Arduino学习8-连接DS1302时钟模块

  [复制链接]
ID:114115 发表于 2016-4-14 03:33 | 显示全部楼层 |阅读模式
DS1302是maxim美信生产的时钟模块,支持年、月、日、时、分、秒、星期显示。支持为后备电池涓流充电。可以。跟Arduino只需要3条数据连接线即可使用。
DS1302电路很简单,如果洞洞板自制的话,可以参考下图:

1225115sj4jjsphzos5cmp.gif 122502g870q8ziqga5qgq7.gif

连线方法:
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-0023libraries文件夹下面: DS1302.rar (4.53 KB, 下载次数: 297)
回复

使用道具 举报

ID:114115 发表于 2016-4-14 03:43 | 显示全部楼层
程序中午抽空已经写完先发个图给大家欣赏一下 再次谢谢 弘毅 大哥给的库  晚些时候整理一下吧程序和图纸发上来。
7.jpg

直接发代码好了,硬件连接已经写在里面了数码管是用595驱动的6级串联。
  1.     /*Arduino 连接 DS1302
  2.     增加了串口调整时间代码*/
  3.     #include <stdio.h>
  4.     #include <string.h>
  5.     #include <DS1302.h>
  6.     /* 接口定义
  7.     CE(DS1302 pin5) -> Arduino D5
  8.     IO(DS1302 pin6) -> Arduino D6
  9.     SCLK(DS1302 pin7) -> Arduino D7*/
  10.     uint8_t CE_PIN   = 5;
  11.     uint8_t IO_PIN   = 6;
  12.     uint8_t SCLK_PIN = 7;
  13.     /**************************************************************
  14.     GND(pin 8) to ground,
  15.     VCC(pin 16) to 5V
  16.     OE (pin 13) to ground
  17.     MR (pin 10) to 5V
  18.     latchPin = 13; to 595 pin 12
  19.     clockPin = 12; to 595 pin 11
  20.     dataPin = 11;  to 595 pin 14
  21.     ****************************************************************/
  22.     char latchPin = 13;//Pin connected to ST_CP of 74HC595
  23.     char clockPin = 12;//Pin connected to SH_CP of 74HC595
  24.     char dataPin = 11;//Pin connected to DS of 74HC595
  25.     int FIR,SEC,THI,FOR,FIF,SIX;
  26.     ///////////////////0////1///2////3/////4////5////6/////7////8///9////
  27.     byte segcode[10]={0X40,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X00,0X10};
  28.     /* 日期变量缓存 */
  29.     char buf[50];
  30.     char day[10];
  31.     /* 串口数据缓存 */
  32.     String comdata = "";
  33.     int numdata[7] ={0}, j = 0, mark = 0;
  34.     /* 创建 DS1302 对象 */
  35.     DS1302 rtc(CE_PIN, IO_PIN, SCLK_PIN);


  36.     void print_time()
  37.     {
  38.         /* 从 DS1302 获取当前时间 */
  39.         Time t = rtc.time();
  40.         /* 将星期从数字转换为名称 */
  41.         memset(day, 0, sizeof(day));
  42.         switch (t.day)
  43.         {
  44.         case 1: strcpy(day, "Sunday"); break;
  45.         case 2: strcpy(day, "Monday"); break;
  46.         case 3: strcpy(day, "Tuesday"); break;
  47.         case 4: strcpy(day, "Wednesday"); break;
  48.         case 5: strcpy(day, "Thursday"); break;
  49.         case 6: strcpy(day, "Friday"); break;
  50.         case 7: strcpy(day, "Saturday"); break;
  51.         }
  52.         FIR = t.hr/10;
  53.         SEC = t.hr%10;
  54.         THI = t.min/10;
  55.         FOR = t.min%10;
  56.         FIF = t.sec/10;
  57.         SIX = t.sec%10;
  58.         /* 将日期代码格式化凑成buf等待输出 */
  59.         snprintf(buf, sizeof(buf), "%s %04d-%02d-%02d %02d:%02d:%02d", day, t.yr, t.mon, t.date, t.hr, t.min, t.sec);
  60.         /* 输出日期到串口 */
  61.         Serial.println(buf);
  62.     }
  63.     void setup()
  64.     {
  65.         pinMode(latchPin, OUTPUT);
  66.         pinMode(clockPin, OUTPUT);
  67.         pinMode(dataPin, OUTPUT);
  68.         Serial.begin(9600);
  69.         rtc.write_protect(false);
  70.         rtc.halt(false);
  71.     }
  72.     void loop()
  73.     {
  74.         /* 当串口有数据的时候,将数据拼接到变量comdata */
  75.         while (Serial.available() > 0)
  76.         {
  77.             comdata += char(Serial.read());
  78.             delay(2);
  79.             mark = 1;
  80.         }
  81.         /* 以逗号分隔分解comdata的字符串,分解结果变成转换成数字到numdata[]数组 */
  82.         if(mark == 1)
  83.         {
  84.             Serial.print("You inputed : ");
  85.             Serial.println(comdata);
  86.             for(int i = 0; i < comdata.length() ; i++)
  87.             {
  88.                 if(comdata[i] == ',' || comdata[i] == 0x10 || comdata[i] == 0x13)
  89.                 {
  90.                     j++;
  91.                 }
  92.                 else
  93.                 {
  94.                     numdata[j] = numdata[j] * 10 + (comdata[i] - '0');
  95.                 }
  96.             }
  97.             /* 将转换好的numdata凑成时间格式,写入DS1302 */
  98.             Time t(numdata[0], numdata[1], numdata[2], numdata[3], numdata[4], numdata[5], numdata[6]);
  99.             rtc.time(t);
  100.             mark = 0;j=0;
  101.             /* 清空 comdata 变量,以便等待下一次输入 */
  102.             comdata = String("");
  103.             /* 清空 numdata */
  104.             for(int i = 0; i < 7 ; i++) numdata[i]=0;
  105.         }  
  106.               digitalWrite(latchPin, LOW);
  107.               shiftOut(dataPin, clockPin, MSBFIRST,segcode[FIR]);
  108.               shiftOut(dataPin, clockPin, MSBFIRST,segcode[SEC]);
  109.               shiftOut(dataPin, clockPin, MSBFIRST,segcode[THI]);
  110.               shiftOut(dataPin, clockPin, MSBFIRST,segcode[FOR]);
  111.               shiftOut(dataPin, clockPin, MSBFIRST,segcode[FIF]);
  112.               shiftOut(dataPin, clockPin, MSBFIRST,segcode[SIX]);
  113.               digitalWrite(latchPin, HIGH);
  114.         /* 打印当前时间 */
  115.         print_time();
  116.         delay(1000);//refresh time
  117.     }
复制代码



回复

使用道具 举报

ID:114115 发表于 2016-4-14 03:46 | 显示全部楼层
我的也安装楼主的方法搞定了 ,说一下 关于时间乱跳和改不了时间的问题,
首先,我的晶振是从废旧电脑主板上拆下来的,所以肯定不会有 不是6pf 的问题吧 ;
其次,我的线太长,没办法,自己焊接的模块接口是针式的  ,arduino uno R3上都是插座,没有一头针一头座的排线吧,开始是用两根线接在一起转换的,最后找了几个插针直接插在uno 的插座上转换的,取消一根线;先换了三根数据线(5、6、7),还是不能修改时间,不过时间显示已经稳定了,有戏。最后将电源线也改过来,一切OK。

回复

使用道具 举报

ID:114115 发表于 2016-4-14 03:50 | 显示全部楼层
哈哈......我做了个LCD时钟带温度显示、星期显示。晒下代码:先发下3个库文件:

DallasTemperature.rar (16.4 KB, 下载次数: 39)
回复

使用道具 举报

ID:114115 发表于 2016-4-14 03:50 | 显示全部楼层
在arduino IDE 1.0 及后续版本,WProgram.h已经改名为 Arduino.h,你把相应的.h和.cpp改名就行。
就是说 把 D:\用户目录\我的文档\00\libraries\DS1302/ 用文本编辑器打开 DS1302.cpp和DS1302.h文件,将文件中有 WProgram.h已经改名为 Arduino.h,就OK了!
这是在1.0.X版里编译更老的程序时的通病,一个更完美的解决方案是,在老的程序前加这几行就新老IDE通吃:

#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
回复

使用道具 举报

ID:114115 发表于 2016-4-14 03:51 | 显示全部楼层


7.jpg


淘宝上买的DS1302带电池的模块,用面包板搭建的电路,开始也出现秒信号乱跳,年份不可设置,不能修改时间的情况。后将模块信号引脚紧贴Nano管脚,电源使用3.3V,问题都解决了。信号线长了,干扰了。
回复

使用道具 举报

ID:10075 发表于 2016-5-18 17:41 | 显示全部楼层
好东东一定要顶一下!
回复

使用道具 举报

ID:124160 发表于 2016-6-4 16:10 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:124160 发表于 2016-6-4 16:11 | 显示全部楼层
谢谢分享,分享代码
回复

使用道具 举报

ID:134281 发表于 2016-7-19 19:14 | 显示全部楼层
很不错,正好用到,谢谢
回复

使用道具 举报

ID:136551 发表于 2016-8-11 20:11 | 显示全部楼层
非常好
回复

使用道具 举报

ID:136551 发表于 2016-8-11 20:16 | 显示全部楼层
非常不错,棒棒棒
回复

使用道具 举报

ID:137173 发表于 2016-8-19 23:32 | 显示全部楼层
51黑学者 发表于 2016-4-14 03:51
淘宝上买的DS1302带电池的模块,用面包板搭建的电路,开始也出现秒信号乱跳,年份不可设置,不能 ...

最近在做一个项目,能把这程序源码给我吗,能指导我吗?可以的话可以加我QQ号:956582782  邮箱956582782@qq.com
回复

使用道具 举报

ID:137244 发表于 2016-8-21 14:57 | 显示全部楼层
很不错,正好用到,谢谢
回复

使用道具 举报

ID:137244 发表于 2016-8-21 14:58 | 显示全部楼层

非常不错,棒棒棒
回复

使用道具 举报

ID:140118 发表于 2016-9-22 14:30 | 显示全部楼层
学习了
回复

使用道具 举报

ID:142305 发表于 2016-10-11 12:15 | 显示全部楼层
谢谢分享!
回复

使用道具 举报

ID:157737 发表于 2016-12-27 11:28 | 显示全部楼层
谢谢分享 楼主辛苦了
回复

使用道具 举报

ID:25178 发表于 2017-1-4 19:52 | 显示全部楼层
如何用oled显示呢,楼主厉害
回复

使用道具 举报

ID:168678 发表于 2017-3-6 21:22 | 显示全部楼层
感谢楼主分享!
回复

使用道具 举报

ID:169049 发表于 2017-3-8 11:04 | 显示全部楼层
为什么下载都的需要B啊
回复

使用道具 举报

ID:169881 发表于 2017-3-13 20:15 | 显示全部楼层
为什么显示不对呢,一直显示2165-85-85........而且不能修改时间
回复

使用道具 举报

ID:170568 发表于 2017-3-14 23:40 | 显示全部楼层
初学者,学习学习,不错
回复

使用道具 举报

ID:169810 发表于 2017-3-17 17:16 | 显示全部楼层
s试了一下,分秒乱跳 不准确呀
回复

使用道具 举报

ID:189951 发表于 2017-4-16 14:28 | 显示全部楼层
问一下stdio.h是什么文件
回复

使用道具 举报

ID:189951 发表于 2017-4-16 14:28 | 显示全部楼层
问一下stdio.h是什么文件
回复

使用道具 举报

ID:190177 发表于 2017-4-16 17:44 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:207287 发表于 2017-6-15 18:09 来自手机 | 显示全部楼层
51黑学者 发表于 2016-4-14 03:51
淘宝上买的DS1302带电池的模块,用面包板搭建的电路,开始也出现秒信号乱跳,年份不可设置,不能 ...

找不到12864的例子,楼主有例子吗?求例子程序
回复

使用道具 举报

ID:223740 发表于 2017-8-1 10:20 | 显示全部楼层
我按照上图的方法试了,不能修改时间,是什么问题
回复

使用道具 举报

ID:215984 发表于 2017-8-6 20:42 | 显示全部楼层
我也遇到了这种情况,用了好多种方法都不能正确设定时间。不过我发现设置2009年的日期还行,可就是不能设置2017年的日期,怀疑是模块的问题。
回复

使用道具 举报

ID:164646 发表于 2017-9-4 08:17 | 显示全部楼层
多谢楼主分享。
回复

使用道具 举报

ID:99665 发表于 2017-10-29 11:29 | 显示全部楼层
我的能设置2017  就是设置不了10月   设置10月 就显示9月
回复

使用道具 举报

ID:249231 发表于 2017-11-14 11:02 | 显示全部楼层
可以下载吗
回复

使用道具 举报

ID:257414 发表于 2017-12-11 22:32 | 显示全部楼层
求库文件
回复

使用道具 举报

ID:223788 发表于 2018-4-17 22:06 | 显示全部楼层
初学者,学习学习,不错
回复

使用道具 举报

ID:158654 发表于 2018-5-3 15:26 | 显示全部楼层
我这始终不能显示正常日期
回复

使用道具 举报

ID:284606 发表于 2018-5-4 20:57 | 显示全部楼层
李xx 发表于 2017-4-16 14:28
问一下stdio.h是什么文件

stdio.h是C的标准库文件,standard input & output.
回复

使用道具 举报

ID:338826 发表于 2018-5-26 17:59 | 显示全部楼层
厉害,学习了
回复

使用道具 举报

ID:338826 发表于 2018-5-26 17:59 | 显示全部楼层
请问我另外一个1302的库为什么编译失败了?
回复

使用道具 举报

ID:380646 发表于 2018-7-29 22:23 | 显示全部楼层
之前ds1302会断电不走时不知道什么操作
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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