Arduino开发实例-DS3231实时时钟+LCD显示

DS3231实时时钟+LCD显示

1、DS3231介绍

DS3231是低成本、高精度I2C实时时钟(RTC),具有集成的温补晶振(TCXO)和晶体。该器件包含电池输入端,断开主电源时仍可保持精确的计时。集成晶振提高了器件的长期精确度,并减少了生产线的元件数量。DS3231提供商用级和工业级温度范围,采用16引脚300mil的SO封装。

RTC保存秒、分、时、星期、日期、月和年信息。少于31天的月份,将自动调整月末的日期,包括闰年的修正。时钟的工作格式可以是24小时或带/AM/PM指示的12小时格式。提供两个可设置的日历闹钟和一个可设置的方波输出。地址与数据通过I2C双向总线串行传输。
精密的、经过温度补偿的电压基准和比较器电路用来监视VCC状态,检测电源故障,提供复位输出,并在必要时自动切换到备份电源。另外,/RST监视引脚可以作为产生μP复位的手动输入。

除计时精度高之外,DS3231还具有一些其它功能,这些功能扩展了系统主机的附加功能和选择范围。该器件内部集成了一个非常精确的数字温度传感器,可通过I2C*接口对其进行访问(如同时间一样)。这个温度传感器的精度为±3°C。片上控制电路可实现自动电源检测,并管理主电源和备用电源(即低压电池)之间的电源切换。如果主电源掉电,该器件仍可继续提供精确的计时和温度,性能不受影响。当主电源重新加电或电压值返回到容许范围内时,片上复位功能可用来重新启动系统微处理器

在这里插入图片描述

DS3231的引脚如下:

在这里插入图片描述

  • 32K:32K振荡器输出
  • SQW:方波输出引脚
  • SCL:串行时钟引脚(I2C 接口)
  • SDA:串行数据引脚(I2C 接口)
  • VCC:接电源正极
  • GND:接地

2、硬件准备

本次使用到的硬件如下:

序号 组件 描述 数量
1 Arduino Uno开发板 Arduino Uno Atmega328 开发板 1
2 DS3231模块 DS3231模块 1
3 LCD LCD1602 1
4 可调电阻 可调电阻(电位计) 1
5 连接线 杜邦线 15

3、硬件接线

在这里插入图片描述

各模块接线如下:

  • 将 RTC 模块的 SCL 连接到 Arduino A5
  • 将 RTC 模块的 SDA 连接到 Arduino A4
  • 将 VCC 连接到 5v,将 GND 连接到 GND
  • 将 LCD 的 RS 连接到 Arduino 的引脚 7
  • 将 LCD 的 E 连接到 Arduino 的引脚 6
  • 将 LCD 的 D7 连接到 Arduino 的引脚 2
  • 将 LCD 的 D6 连接到 Arduino 的引脚 3
  • 将 LCD 的 D5 连接到 Arduino 的引脚 4
  • 将 LCD 的 D4 连接到 Arduino 的引脚 5
  • 将 VSS、K、RW、D0、D1、D2、D3 连接到 GND
  • 将 VDD 和 A 连接到 5v
  • 将 VO 连接到电位器输出引脚(用于控制文本的对比度)

在前面的文章中,对LCD1602的驱动做了详细的介绍,请参考:

4、驱动实现

本次实例使用如下开源库:

示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <Wire.h>
#include <LiquidCrystal.h>
#include <RTClib.h>
DateTime now;
RTC_DS3231 rtc;
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // (rs, e, d4, d5, d6, d7)
void displayDate(void);
void displayTime(void);
void setup ()
{
Serial.begin(9600);
lcd.begin(16,2);
if (! rtc.begin())
{
Serial.println(" RTC Module not Present");
while (1);
}
if (rtc.lostPower())
{
Serial.println("RTC power failure, reset the time!");
rtc.adjust(DateTime(F(\_\_DATE\_\_), F(\_\_TIME\_\_)));
}
}


void loop ()
{
now = rtc.now();
displayDate();
displayTime();
}

void displayDate()
{
lcd.setCursor(0,0);
lcd.print("Date:");
lcd.print(now.day());
lcd.print('/');
lcd.print(now.month());
lcd.print('/');
lcd.print(now.year());
}


void displayTime()
{
lcd.setCursor(0,1);
lcd.print("Time:");
lcd.print(now.hour());
lcd.print(':');
lcd.print(now.minute());
lcd.print(':');
lcd.print(now.second());
lcd.print(" ");
}

文章来源: https://iotsmart.blog.csdn.net/article/details/128032411