主要特性

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

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

管脚定义

Arduino I2C + DS1307实时时钟

  • 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)设计,需要接上拉电阻。

Arduino I2C + DS1307实时时钟

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数组保存的是当前时间,根据实际调整。

 1 /*
 2 real time clock using DS1307
 3 function: set the time
 4 */
 5 
 6 #include <Wire.h>
 7 
 8 #define ADDRESS_DS1307 0x68
 9 
10 byte timeDec[] = {15, 1, 15, 5, 19, 20, 0};
11 byte timeBcd[] = {0, 0, 0, 0, 0, 0, 0};
12 //time = {year, month, date, day, hours, minutes, seconds};
13 
14 void setup()
15 {
16     Wire.begin();
17     Serial.begin(9600);
18 
19     //convert decimal to BCD code
20     int i;
21     for (i = 0; i < 7; i++)
22     {
23         timeBcd[i] = DecToBcd(timeDec[i]);
24     }
25 
26     //set the time
27     Wire.beginTransmission(ADDRESS_DS1307);
28     Wire.write(0x00);
29     for (i = 0; i < 7; i++)
30     {
31         Wire.write(timeBcd[6-i]);
32     }
33     Wire.endTransmission();
34 
35     Serial.println("Time has been set.");
36 
37 }
38 
39 void loop()
40 {
41     delay(4000);
42 }
43 
44 // Convert normal decimal numbers to binary coded decimal
45 byte DecToBcd(byte val)
46 {
47     byte res;
48     if ((val <= 99) && (val >= 0))
49     {
50         res = ((val/10)<<4) | (val%10);
51     }
52     else
53     {
54         res = 0;
55         Serial.println("Error");
56     }
57     return res;
58 }
59 // Convert binary coded decimal to normal decimal numbers
60 byte BcdToDec(byte val)
61 {
62     byte res;
63     if (val <= 0x99)
64     {
65         res = (val >> 4)*10 + (val & 0x0F);
66     }
67     else
68     {
69         res = 0;
70         Serial.println("Error");
71     }
72     return res;
73 }
View Code

相关文章:

  • 2021-09-01
  • 2022-01-08
  • 2021-12-25
  • 2021-08-25
  • 2021-03-30
  • 2022-02-25
  • 2021-08-08
  • 2022-12-23
猜你喜欢
  • 2021-12-28
  • 2021-12-18
  • 2022-12-23
  • 2021-05-22
  • 2022-12-23
  • 2021-08-08
  • 2022-12-23
相关资源
相似解决方案