主要特性

DS1307是Maxim的串行、I2C实时时钟芯片。主要特性有:

  • 工作电压:主电源电压4.5~5.5V,电池电压2.0~3.5V
  • 功耗:电池供电、备份模式时<500nA
  • 接口:I2C,最大速率100kbps
  • 可编程方波输出
  • 电源自动切换、失效检测
  • 内置56字节大小、支持电池备份的RAM
  • 封装:8-Pin SO/PDIP

管脚定义

  • X1、X2: 接32.768kHz晶体,要求晶体负载电容12.5pF
  • Vcc:主电源,范围4.5~5.5V。当需要对DS1307读写时,需要接Vcc。
  • VBAT:接电池,范围2.0~3.5V。
  • GND:地
  • SDA、SCL:I2C接口数据线、时钟线。
  • SQW/OUT:方波输出脚、通过写寄存器来使能。

与Arduino的连接

采用I2C接口与Arduino连接。SQW/OUT脚亦为开漏(open-drain)设计,需要接上拉电阻。

DS1307的VCC脚接Arduino UNO的5V;GND脚接Arduino UNO的GND;SDA脚接Arduino UNO的A4(SDA);SCL脚接Arduino UNO的A5(SCL)。

功能调试

1. 写寄存器时,先写入寄存器指针(Register pointer),之后依次写入寄存器内容。每写入一个字节,Register pointer都自动加一。

2. 读寄存器时,也是先写入Register pointer,之后发Sr(Repeated start),依次读出寄存器内容。同样的,每读出一个字节,Register pinter都自动加一。

测试代码

1. 首先设置DS1307时间。代码中timeDec数组保存的是当前时间,根据实际调整。

 /*
real time clock using DS1307
function: set the time
*/ #include <Wire.h> #define ADDRESS_DS1307 0x68 byte timeDec[] = {, , , , , , };
byte timeBcd[] = {, , , , , , };
//time = {year, month, date, day, hours, minutes, seconds}; void setup()
{
Wire.begin();
Serial.begin(); //convert decimal to BCD code
int i;
for (i = ; i < ; i++)
{
timeBcd[i] = DecToBcd(timeDec[i]);
} //set the time
Wire.beginTransmission(ADDRESS_DS1307);
Wire.write(0x00);
for (i = ; i < ; i++)
{
Wire.write(timeBcd[-i]);
}
Wire.endTransmission(); Serial.println("Time has been set."); } void loop()
{
delay();
} // Convert normal decimal numbers to binary coded decimal
byte DecToBcd(byte val)
{
byte res;
if ((val <= ) && (val >= ))
{
res = ((val/)<<) | (val%);
}
else
{
res = ;
Serial.println("Error");
}
return res;
}
// Convert binary coded decimal to normal decimal numbers
byte BcdToDec(byte val)
{
byte res;
if (val <= 0x99)
{
res = (val >> )* + (val & 0x0F);
}
else
{
res = ;
Serial.println("Error");
}
return res;
}

2. 之后可以向DS1307获取实时时间。

 /*
real time clock using DS1307
function: read the time
*/ #include <Wire.h> #define ADDRESS_DS1307 0x68 byte timeBcd[] = {, , , , , , };
//time = {year, month, date, day, hours, minutes, seconds}; void setup()
{
Wire.begin();
Serial.begin();
} void loop()
{
//read the time
Wire.beginTransmission(ADDRESS_DS1307);
Wire.write(0x00);
Wire.endTransmission();
Wire.requestFrom(ADDRESS_DS1307, );
if (Wire.available() >= )
{
for (int i = ; i < ; i++)
{
timeBcd[-i] = Wire.read();
}
} //print
Serial.print(""); Serial.print(timeBcd[], HEX); Serial.print("/");
Serial.print(timeBcd[], HEX); Serial.print("/"); Serial.print(timeBcd[], HEX);
Serial.print(" "); Serial.print(BcdToDay(timeBcd[])); Serial.print(" ");
Serial.print(timeBcd[], HEX); Serial.print(":");
Serial.print(timeBcd[], HEX); Serial.print(":");
Serial.print(timeBcd[], HEX); Serial.println(); delay();
} // Convert binary coded decimal to day
String BcdToDay(byte val)
{
String res;
switch(val)
{
case : res = "Sunday"; break;
case : res = "Monday"; break;
case : res = "Tuesday"; break;
case : res = "Wednesday"; break;
case : res = "Thursday"; break;
case : res = "Friday"; break;
case : res = "Saturday"; break;
default: res = "Error!";
}
return res;
}

程序运行后,通过串口打印当前时间如下图。

3. 通过设置控制寄存器,可以设置SQW/OUT管脚输出高电平、低电平或某个频率的方波。方波支持的频率有1Hz、4.096kHz、8.192kHz、32.768kHz。以下代码设置的频率为32.768kHz。

 /*
real time clock using DS1307
function: output the square-wave
*/ #include <Wire.h> #define ADDRESS_DS1307 0x68
#define CONTROL_REGISTER 0x07 void setup()
{
Wire.begin();
Serial.begin(); //set the time
Wire.beginTransmission(ADDRESS_DS1307);
Wire.write(CONTROL_REGISTER);
Wire.write(0b00010011); //frequency = 32.768kHz
Wire.endTransmission(); Serial.println("Square-wave output is enabled.");
} void loop()
{
delay();
}

与示波器测试的信号图形相符。

参考资料

Maxim - DS1307 64x8、串行、I²C实时时钟
Tutorial – Using DS1307 and DS3231 Real-time Clock Modules with Arduino
Digital Clock with Arduino and DS1307
Assemble an Adafruit DS1307 Real Time Clock Kit

Arduino I2C + DS1307实时时钟的更多相关文章

  1. 基于at91rm9200的i2c分析(DS1307实时时钟芯片)

    board-ek.c 构造i2c_board_info结构体 static struct i2c_board_info __initdata ek_i2c_devices[] = {     {    ...

  2. STC8H开发(十四): I2C驱动RX8025T高精度实时时钟芯片

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

  3. I2C实时时钟rx-8025板卡实际应用

    rx-8025是片外I2C实时时钟,其应用于9260板卡方法如下.总体思想是配置内核添加驱动(I2C驱动,内核已提供的很完备),板级文件添加设备,添加设备文件以应用程序操作. 1. 配置内核 1)I2 ...

  4. STC8H开发(十三): I2C驱动DS3231高精度实时时钟芯片

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

  5. 教你在树莓派使用上RTC实时时钟,不用再担心断电后时间归零的问题,开机后自动同步RTC时钟!!!

    准备工作:1.系统建议使用官方最新的镜像文件 2.RTC时钟模块板(I2C接口)建议使用DS1307时钟模块,或者RTC时钟模块RTC时钟模块: 大家知道arduino的电平是5V,树莓派是3.3V, ...

  6. Maxim实时时钟芯片设计指南5791-关于编写健壮的实时时钟控制代码的提示

    用DS12C887设计一个万年历,虽然反复查看说明书,还是出各种的错误. 因此,从美信官网查询资料,翻译的不太通,凑合着对照看. 原文链接 Tips for Writing Bulletproof R ...

  7. linux 实时时钟(RTC)驱动【转】

    转自:http://blog.csdn.net/yaozhenguo2006/article/details/6820218 这个是linux内核文档关于rtc实时时钟部分的说明,此文档主要描述了rt ...

  8. ASM:《X86汇编语言-从实模式到保护模式》第9章:实模式下中断机制和实时时钟

    中断是处理器一个非常重要的工作机制.第9章是讲中断在实模式下如何工作,第17章是讲中断在保护模式下如何工作. ★PART1:外部硬件中断 外部硬件中断是通过两个信号线引入处理器内部的,这两条线分别叫N ...

  9. RTC实时时钟

    作者:宋老师,华清远见嵌入式学院讲师. 1.1 RTC介绍 在 一个嵌入式系统中,通常采用RTC 来提供可靠的系统时间,包括时分秒和年月日等,而且要求在系统处于关机状态下它也能够正常工作(通常采用后备 ...

随机推荐

  1. 位数问题(dp 递推)

    位数问题 时间限制: 1 Sec  内存限制: 128 MB提交: 35  解决: 19[提交][状态][讨论版][命题人:quanxing] 题目描述 在所有的N位数中,有多少个数中有偶数个数字3? ...

  2. Java-Runoob:Java 循环结构

    ylbtech-Java-Runoob:Java 循环结构 - for, while 及 do...while 1.返回顶部 1. Java 循环结构 - for, while 及 do...whil ...

  3. elasticsearch5.6.8中文分词器

    安装分词器,务必确保版本一致! 下载地址:https://github.com/medcl/elasticsearch-analysis-ik 为了保证一致,我特地将elasticsearch进行降级 ...

  4. sublime text3 自动编译php 适合用于简单的php文件执行

    1.将php路径放入环境变量中 2. 点击 sublime_text的“工具”->"编译系统"->"编译新系统" { "cmd" ...

  5. Python中常见的异常处理

    异常和错误 part1:程序中难免出现错误,而错误分成两种 1. 语法错误(这种错误,根本过不了Python解释器的语法检测,必须在程序执行前就改正) # 语法错误示范一 if # 语法错误示范二 d ...

  6. TreeView的异步延时加载

    TreeView的延时加载 在使用TreeView控件的时候,如果数据量太大,这个TreeView控件加载会很慢,有时甚至加载失败, 为了更好的使用TreeView控件加载大量的数据,采用异步延迟加载 ...

  7. html5调用本机摄像头兼容谷歌浏览器高版本,谷歌浏览器低版本,火狐浏览器

    做这个功能的时候在网上查了一些资料,代码如下,在这个代码在谷歌浏览器46版本是没问题的,在火狐浏览器也行,但是在谷歌浏览器高版本下是不兼容的 <div id="body"&g ...

  8. 玩转angularJs——通过自定义ng-model,不仅仅只是input可以实现双向数据绑定

    体验更优排版请移步原文:http://blog.kwin.wang/programming/angularJs-user-defined-ngmodel.html angularJs双向绑定特性在开发 ...

  9. java之多态性

    多态性(Polymorphism):一个东西,在不同的情况下,呈现出不同的行为两类:静态多态性:函数重载void add(int a,int b){}void add(int a,int b,int ...

  10. 【原创】基于UDP广播的局域网Web Window Service日志跟踪小工具

           一直感觉Web开发或者windows服务的日志跟踪调试不是很方便          特别是在生产环境服务器上面          目前一般的解决方案是通过各种日志工具把错误信息和调试信息 ...