lxf 发表于 2021-5-18 13:51:00

基于Arduino使用DS1307高精度时钟模块

本帖最后由 lxf 于 2021-5-18 14:32 编辑

基于Arduino使用DS1307高精度时钟模块
产品介绍
DS1307 是一款低功耗,具有56字节非失性RAM的全BCD码时钟日历实时时钟芯片,地址和数据通过两线双向的串行总线的传输,芯片可以提供秒,分,小时等信息,每一个月的天数能自动调整。并且有闰年补偿功能。AM/PM 标志位决定时钟工作于24小时或12小时模式,芯片有一个内置的电源感应电路,具有掉电检测和电池切换功能。

产品参数
1、产品尺寸:27*28*8.4mm2、DS1307 I2C实时时钟芯片(RTC)3、 24C32 32K I2C EEPROM储存器4、 采用CR2032电池,解决带备电池不能读写的问题,可计时一年5、引出DS1307的时钟引脚,为单片机提供时钟信号,可以级联其他I2C设备6、控制接口为12C接口,控制接口点评为5V或3.3V,电源建议为5VD7、产品重量:7.5g
产品特点
1、可对秒/时/分,每月的天数、月份,每周的天数进行记数,并具有闰年补偿功能,记年上限21002、56字节非失性的RAM3、两线串行接口4、可编程方波输出5、自动掉电检测和切换电路6、在电池备份模式下,功耗小于500nA
接线方式(DS1307高精度时钟模块 )
DS1307高精度时钟模块   <------>   Arduino UNO               VCC                  <------>            5V            GND                  <------>          GND               SCL                   <------>            A5               SDA                  <------>            A4
基础案例——DS1307高精度时钟模块读取系统时间使用显示器显示
OLED显示屏接线方式Arduino UNO      <------>   OLED显示屏      3V3/5V         <------>          VCC         GND            <------>          GND         D13             <------>          SCL         D11             <------>          SDA          D8            <------>          RES          D9            <------>         DC          D10            <------>         CS
Mixly图形化编程程序
第一次上传以下程序,DS1307高精度时钟模块读取上传程序时的系统时间,并在显示屏上显示。

第二次上传以下程序,删除了“RTC设置时日期/时间”模块,DS1307高精度时钟模块在重启后不读取程序上传时的系统时间,读取的是当前的系统时间。
Arduino IDE编程
需要使用到OLED显示屏及DS1307高精度时钟模块的第三方库文件
OLED显示屏第三方库文件链接:下载链接:https://pan.baidu.com/s/1UmkRt5VJpM6IjK56jekbdg 提取码:syr7
DS1307高精度时钟模块第三方库文件链接:链接:https://pan.baidu.com/s/10iaQotIFxTtJIbr4Jky8yA 提取码:2aqd
下载后解压,把解压后的三个文件夹“U8g2”、“SoftwareWire”和“RTC”,复制放到Arduino安装包的“libraries”文件夹里面。



实现这个案例需要上传两次程序,第一次上传以下程序,DS1307高精度时钟模块读取上传程序时的系统时间,并在显示屏上显示。
第一次程序实现代码
#include <RtcDS1307.h>
#include <SoftwareWire.h>
#include <U8g2lib.h>
#include <SPI.h>
SoftwareWire myWire(A4,A5);
RtcDS1307<SoftwareWire> Rtc(myWire);
U8G2_SSD1306_128X64_NONAME_1_4W_HW_SPI u8g2(U8G2_R0, 10, 9, 8);
void page1() {
u8g2.setFont(u8g2_font_timR08_tf);
u8g2.setFontPosTop();
u8g2.setCursor(0,20);
u8g2.print(String(String(Rtc.GetDateTime().Year()) + String("-")) + String(String(Rtc.GetDateTime().Month()) + String("-")) + String(Rtc.GetDateTime().Day()));
u8g2.setCursor(0,40);
u8g2.print(String(String(Rtc.GetDateTime().Hour()) + String(":")) + String(String(Rtc.GetDateTime().Minute()) + String(":")) + String(Rtc.GetDateTime().Second()));
}
void setup(){
Rtc.Begin();
Rtc.SetDateTime(RtcDateTime(__DATE__, __TIME__));//读取上传程序的系统时间
u8g2.begin();
u8g2.enableUTF8Print();
}
void loop(){
u8g2.firstPage();
do
{
    page1();
}while(u8g2.nextPage());
}
第二次上传以下程序,删除了“ Rtc.SetDateTime(RtcDateTime(__DATE__, __TIME__))”代码,DS1307高精度时钟模块在重启后不读取程序上传时的系统时间,读取的是当前的系统时间。
第二次程序实现代码
#include <RtcDS1307.h>
#include <SoftwareWire.h>
#include <U8g2lib.h>
#include <SPI.h>
SoftwareWire myWire(A4,A5);
RtcDS1307<SoftwareWire> Rtc(myWire);
U8G2_SSD1306_128X64_NONAME_1_4W_HW_SPI u8g2(U8G2_R0, 10, 9, 8);
void page1() {
u8g2.setFont(u8g2_font_timR08_tf);
u8g2.setFontPosTop();
u8g2.setCursor(0,20);
u8g2.print(String(String(Rtc.GetDateTime().Year()) + String("-")) + String(String(Rtc.GetDateTime().Month()) + String("-")) + String(Rtc.GetDateTime().Day()));
u8g2.setCursor(0,40);
u8g2.print(String(String(Rtc.GetDateTime().Hour()) + String(":")) + String(String(Rtc.GetDateTime().Minute()) + String(":")) + String(Rtc.GetDateTime().Second()));
}
void setup(){
Rtc.Begin();
u8g2.begin();
u8g2.enableUTF8Print();
}
void loop(){
u8g2.firstPage();
do
{
    page1();
}while(u8g2.nextPage());
}
页: [1]
查看完整版本: 基于Arduino使用DS1307高精度时钟模块