一、硬件购买
1.时钟模块
DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.0V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。
结构
DS1302的引脚排列,其中Vcc2为主电源,VCC1为后备电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。
二、接线方式
ESP8266 | DS1302 |
---|---|
VCC | VCC |
GND | GND |
IO14 | RST |
IO12 | DAT |
IO13 | CLK |
三、代码
#include <DS1302.h>
#include <stdio.h>
//时钟模块管脚定义
#define kCePin 14 // 复位引脚 RST
#define kIoPin 12 // 数据引脚 DAT
#define kSclkPin 13 // 时钟引脚 CLK
DS1302 rtc(kCePin, kIoPin, kSclkPin);
// 时间分隔符闪烁标识
bool ShowPoint = true;
//时间和日期交替显示
int showCount = 0;
namespace {
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)";
}
} // namespace
void printTime() {
// 从模块获得当前时间
Time t = rtc.time();
// 星期几
const String day = dayAsString(t.day);
// 格式化时间数据
char buf[50];
// snprintf 所需头文件 #include <stdio.h> 函数返回值
// snprintf(char *str, size_t size, const char *format, ...)
//将可变参数 “…” 按照format的格式格式化为字符串,然后再将其拷贝至str中。
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);
Serial.println(buf);
}
void showTime() {
// 从模块获得当前时间
Time t = rtc.time();
int h = t.hr;
int mn = t.min;
int b0 = h / 10;
int b1 = h % 10;
int b2 = mn / 10;
int b3 = mn % 10;
ShowPoint = !ShowPoint;
}
void showData() {
// 从模块获得当前时间
Time t = rtc.time();
int m = t.mon;
int d = t.date;
int m0 = m / 10;
int m1 = m % 10;
int d2 = d / 10;
int d3 = d % 10;
} // namespace
void setTime() {
// 设置初始时间为 2018-1-18,17:28:00 星期五
Time t(2022, 11, 11, 11, 50, 59, Time::kFriday);
rtc.time(t);
}
void setup() {
Serial.begin(115200);
rtc.writeProtect(false);
rtc.halt(false);
// setTime();
// printTime();
}
void loop() {
printTime();
delay(1000);
//每隔10s显示一次日期
// if (showCount <= 10) {
// showTime();
// showCount++;
// delay(1000);
// } else {
// showData();
// showCount = 0;
// delay(2000);
// }
}
四、结果展示