Arduino提高篇(二十二)实时时钟DS1302

很多电子爱好者都热衷制作电子时钟来练手,这些时钟会使用数码管、点阵屏、LCD液晶屏、OLED屏、TFT屏等显示模块,所使用的RTC时钟芯片也各不相同,DS1302、DS3231、DS12C887等。通过单片机等MCU驱动RTC模块,读取时间数据并交给显示模块进行展示,还可以加入按键来调节时钟,可以说是一个非常全面的练手项目。

本篇我们来学习DS1302的使用,通过库函数来驱动DS1302获取时间数据。

1. DS1302介绍
DS1302是使用非常广泛的RTC芯片,它是DALLAS公司推出的涓流充电时钟芯片,内部含有一个实时时钟/日历和31字节静态RAM ,通过简单的串行接口与单片机进行通信。

主要特性:
实时时钟具有能计算 2100 年之前的秒 分 时 日 日期 星期 月 年的能力 还有闰年调整的能力。
31X8 位暂存数据存储 RAM。
串行 I/O 口方式使得管脚数量最少。
宽范围工作电压 2.0-5.5V。
读/写时钟或RAM 数据时有两种传送方式单字节传送和多字节传送字符组方式。
双电源管用于主电源和备份电源供应。
管脚排列及描述
X1,X2:32.768KHz晶振引脚
GND:地
#RST:复位引脚
I/O:数据输入/输出引脚
SCLK:串行时钟引脚
Vcc1:备用电源引脚,一般接纽扣电池
Vcc2:主电源引脚

我们使用的DS1302模块已经将DS1302时钟芯片和晶振及纽扣电池集中在一块小板子上:

2. 安装驱动库
本篇使用DS1302库来驱动DS1302,无需关心DS1302的读写时序及内部寄存器相关信息。DS1302的驱动库也非常多,这里使用msparks提供的库,可以从GitHub上下载。

将下载到的库进行解压,然后拷贝到Arduino IDE安装目录下的libraries文件夹下。

3. 实验材料
Uno R3开发板
配套USB数据线
公对母杜邦线
DS1302模块
4. 实验步骤
1. 根据原理图搭建电路图。
DS1302模块的VCC和GND连接Uno开发板的3.3V和GND。DS1302模块的CLK、DAT、RST对应连接Uno开发板的4、3、2引脚。

实验原理图如下图所示:


实物连接图如下图所示:

2. 新建sketch,拷贝如下代码替换自动生成的代码并进行保存。
#include <DS1302.h>

DS1302 rtc(2, 3, 4); //对应DS1302的RST,DAT,CLK

void initRTCTime(void)//初始化RTC时钟
{
  rtc.writeProtect(false); //关闭写保护
  rtc.halt(false); //清除时钟停止标志
  Time t(2020, 4, 25, 21, 50, 50, 7); //新建时间对象 最后参数位星期数据,周日为1,周一为2以此类推
  rtc.time(t);//向DS1302设置时间数据
}

void printTime()//打印时间数据
{
  Time tim = rtc.time(); //从DS1302获取时间数据
  char buf[50];
  snprintf(buf, sizeof(buf), "%04d-%02d-%02d %02d:%02d:%02d",
           tim.yr, tim.mon, tim.date,
           tim.hr, tim.min, tim.sec);

  Serial.println(buf);
}

void setup() {
  Serial.begin(9600);

  //新模块上电需要设置一次当前时间,
  //下载完成后需屏蔽此函数再次下载,否则每次上电都会初始化时间数据
  initRTCTime();

}

void loop() {
  printTime();
  delay(1000);
}
3. 连接开发板,设置好对应端口号和开发板类型,进行程序下载。

5. 实验现象

打开串口监视器,波特率设置成与程序中一致的9600,会看到输出时间数据。

由于我们的DS1302模块带有纽扣电池来作为备用电池,当模块主供电Vcc掉电后,走时也不会停止。你可以将开发板断电等待一些时间重新上电,再次打开串口监视器可以看到时间并没有停止。


Arduino学习交流群:672088578

更多内容,欢迎关注我的公众号。 微信扫一扫下方二维码即可关注:

DS1302是一款常用的实时时钟模块,它是一个带闰年补偿、日历和时间的功能强大的CMOS时钟芯片。在Arduino项目中使用DS1302,你可以为你的电子设备提供准确的时间信息,即使在无电源状态下也能保持计时。 以下是一个简单的Arduino程序示例,用于设置和读取DS1302的日期和时间: ```cpp #include <Wire.h> #include "RTClib.h" // 引入RTC库 RTC_DS1302 rtc; // 创建RTC DS1302实例 void setup() { Serial.begin(9600); // 初始化串口通信 if (!rtc.begin()) { // 检查连接是否成功 Serial.println("Failed to initialize RTC"); return; } // 设置默认时间和日期(这里只是一个示例) Date now = rtc.now(); now.day = 1; // 例如,新年第一天 now.month = 1; now.year = 2000 + rtc.datetime().year(); // 当前年份加2000 rtc.datetime(now); Serial.print("Current date and time: "); Serial.print(now.day); Serial.print("/"); Serial.print(now.month); Serial.print("/"); Serial.print(now.year); Serial.print(" "); Serial.print(now.hour); Serial.print(":"); Serial.print(now.minute); Serial.print(":"); Serial.println(now.second); } void loop() { // 更新并打印当前时间每秒 Date currentTime = rtc.now(); Serial.print("Updated time: "); Serial.print(currentTime.day); Serial.print("/"); Serial.print(currentTime.month); Serial.print("/"); Serial.print(currentTime.year); Serial.print(" "); Serial.print(currentTime.hour); Serial.print(":"); Serial.print(currentTime.minute); Serial.print(":"); Serial.println(currentTime.second); delay(1000); // 程序等待1秒 } ``` 在这个程序中,`setup()`函数用于初始化DS1302并与Arduino连接,然后设置一个固定的日期作为示例。`loop()`函数会不断更新并打印当前时间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值