前言
目前有许多流行的串行时钟电路,例如 DS1302,DS3231,DS1307,PCF8485 等。它们由于其简单的接口,低成本和易用性而被广泛使用。在本实验中,我们将使用 DS1302 实时时钟模块,DS1302 是一种高性能、低功耗、带 RAM 的实时时钟电路,它可以对 年、月、日、周、时、分、秒进行计时,具有闰年补偿功能。
电气参数
宽范围工作电压 | 2.0 -5.5V |
---|
工作电流 | 2.0V 时,小于 300nA |
字符组方式 | 单字节传送和多字节传送 |
工作温度 | -40℃~+85℃ |
经典应用电路
DS1302采用三线接口与 CPU 进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或 RAM 数据。DS1302 内部有一个 31×8 的用于临时性存放数据的 RAM 寄存器。DS1302 是 DS1202 的升级产品,与 DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。
接线
Arduino | LCD1602 | DS1302 |
---|
5V | VCC | VCC |
A4 | SDA | - |
A5 | SCL | - |
5 | - | RST |
6 | - | DAT |
7 | - | CLK |
GND | GND | GND |
程序
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <stdio.h>
#include <DS1302.h>
LiquidCrystal_I2C lcd(0x27,16,2);
namespace {
const int kCePin = 5;
const int kIoPin = 6;
const int kSclkPin = 7;
DS1302 rtc(kCePin, kIoPin, kSclkPin);
String dayAsString(const Time::Day day) {
switch (day) {
case Time::kSunday: return "Sunday";
case Time::kMonday: return "Monday";
case Time::kTuesday: return "Tuesday";
case Time::kWednesday: return "Wednesday";
case Time::kThursday: return "Thursday";
case Time::kFriday: return "Friday";
case Time::kSaturday: return "Saturday";
}
return "(unknown day)";
}
void printTime() {
Time t = rtc.time();
const String day = dayAsString(t.day);
char buf[50];
char DateBuf[12];
char TimeBuf[10];
snprintf(buf, sizeof(buf), "%s %04d-%02d-%02d %02d:%02d:%02d",day.c_str(),t.yr, t.mon, t.date,t.hr, t.min, t.sec);
snprintf(DateBuf,sizeof(DateBuf),"%04d-%02d-%02d",t.yr, t.mon, t.date);
snprintf(TimeBuf,sizeof(TimeBuf),"%02d:%02d:%02d",t.hr, t.min, t.sec);
Serial.println(buf);
lcd.setCursor(2,0);
lcd.print(DateBuf);
lcd.setCursor(3,1);
lcd.print(TimeBuf);
}
}
void setup() {
lcd.init();
lcd.backlight();
Serial.begin(9600);
rtc.writeProtect(false);
rtc.halt(false);
Time t(2023, 3, 2, 16, 49, 46, Time::kWednesday);
rtc.time(t);
}
void loop() {
printTime();
delay(1000);
}
实验结果
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)