极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 300736|回复: 155

Arduino学习笔记A8 - Arduino 连接 DS1302时钟模块

  [复制链接]
发表于 2011-11-17 12:28:06 | 显示全部楼层 |阅读模式
Arduino 连接 DS1302时钟模块


注:6楼有阉割DS1302库,只显示时钟,没有日期。可以减小体积。

DS1302是maxim美信生产的时钟模块,支持年、月、日、时、分、秒、星期显示。支持为后备电池涓流充电。可以。跟Arduino只需要3条数据连接线即可使用。

DS1302数据手册可以看这里:http://www.maxim-ic.com/datasheet/index.mvp/id/2685/t/al

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



连线方法:
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文件夹下面



例子代码如下:

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

/* 接口定义
CE(DS1302 pin5) -> Arduino D5
IO(DS1302 pin6) -> Arduino D6
SCLK(DS1302 pin7) -> Arduino D7
*/
uint8_t CE_PIN   = 5;
uint8_t IO_PIN   = 6;
uint8_t SCLK_PIN = 7;

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


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


void setup()
{
   
Serial.begin(9600);
   
rtc.write_protect(false);
   
rtc.halt(false);
}

void loop()
{

   
/* 当串口有数据的时候,将数据拼接到变量comdata */
   
while (Serial.available() > 0)
    {
        
comdata += char(Serial.read());
        
delay(2);
        
mark = 1;
    }
   
/* 以逗号分隔分解comdata的字符串,分解结果变成转换成数字到numdata[]数组 */
   
if(mark == 1)
    {
        
Serial.print("You inputed : ");
        
Serial.println(comdata);
        
for(int i = 0; i < comdata.length() ; i++)
        {
            
if(comdata[i] == ',' || comdata[i] == 0x10 || comdata[i] == 0x13)
            {
               
j++;
            }
            
else
            
{
               
numdata[j] = numdata[j] * 10 + (comdata[i] - '0');
            }
        }
        
/* 将转换好的numdata凑成时间格式,写入DS1302 */
        
Time t(numdata[0], numdata[1], numdata[2], numdata[3], numdata[4], numdata[5], numdata[6]);
        
rtc.time(t);
        
mark = 0;j=0;
        
/* 清空 comdata 变量,以便等待下一次输入 */
        
comdata = String("");
        
/* 清空 numdata */
        
for(int i = 0; i < 7 ; i++) numdata[i]=0;
    }
   
   
/* 打印当前时间 */
   
print_time();
   
delay(1000);
}



使用方法:

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

格式为:

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

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





附上1.0 IDE可以使用的库

本帖子中包含更多资源

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

x

评分

参与人数 1 +3 收起 理由
弘毅 + 3 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2011-11-17 12:45:03 | 显示全部楼层
感谢啊,对我这样的硬件小白非常有帮助!{:soso_e179:}
回复 支持 反对

使用道具 举报

发表于 2011-11-18 18:30:25 | 显示全部楼层
1302似乎很挑晶振,我买了2种32.768K的 晶振,一种不能起振,只有6PF的那种才能用。
回复 支持 反对

使用道具 举报

发表于 2011-11-18 18:32:37 | 显示全部楼层
要全功能的库,编译下来占好大的空间,{:soso_e130:}我只需要显示时分秒,把库文件里的年月日星期的部分阉了,果然苗条了好多。
回复 支持 反对

使用道具 举报

发表于 2011-11-18 19:26:29 | 显示全部楼层
赞,文章写得浅显易懂,实用的很。
回复 支持 反对

使用道具 举报

发表于 2011-11-19 12:56:43 | 显示全部楼层
去掉了年月日部分

本帖子中包含更多资源

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

x

评分

参与人数 1 +27 收起 理由
Ansifa + 27 立即试试看

查看全部评分

回复 支持 反对

使用道具 举报

发表于 2011-11-21 15:44:25 | 显示全部楼层
简洁明了,非常实用
回复 支持 反对

使用道具 举报

发表于 2011-11-22 19:16:38 | 显示全部楼层
有没有闹钟的程序参考学习一下呢?自己写了一个方法比较麻烦。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-11-22 20:48:00 | 显示全部楼层
悠然小调 发表于 2011-11-22 19:16
有没有闹钟的程序参考学习一下呢?自己写了一个方法比较麻烦。

有空补全一个,哈哈。。
回复 支持 反对

使用道具 举报

发表于 2011-11-23 18:13:25 | 显示全部楼层
这个好.... 哈哈哈哈··· 很不错哦··
回复 支持 反对

使用道具 举报

发表于 2011-12-6 09:13:55 | 显示全部楼层
不错啊,正好需要使用。多谢共享。
图片上这个小的是单片机吗?什么型号?这么娇小!我也想找个娇小型的用用!
回复 支持 反对

使用道具 举报

发表于 2011-12-6 09:51:02 | 显示全部楼层
shyjdn 发表于 2011-12-6 09:13
不错啊,正好需要使用。多谢共享。
图片上这个小的是单片机吗?什么型号?这么娇小!我也想找个娇小型的用 ...

图片的是arduino nano~
回复 支持 反对

使用道具 举报

发表于 2011-12-6 21:18:46 | 显示全部楼层
请问t.min得到的是什么类型的数值?
回复 支持 反对

使用道具 举报

发表于 2011-12-7 09:33:33 | 显示全部楼层
這個時鐘IC是外接晶振的,有沒有內置晶振的案例可供參考。我想找一個時鐘準確度較高的,應用在工作中。但不好找。期待。
回复 支持 反对

使用道具 举报

发表于 2011-12-27 15:37:44 | 显示全部楼层
我买了一个DS1307时钟模块,用了ARDUINO IDE 里面配的库,用了两根线实现了串口显示时钟,请问高手有什么方法让它在液晶上显示吗?
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-4-26 15:45 , Processed in 0.048745 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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