使用DS1302时钟模块搭配TM1637四位数码管制作简易电子
材料准备
① Arduino UNO R3主板(仅供参考)
② DS1302时钟模块
③ TM1637四位数码管
④ 面包板
⑤ 杜邦线若干
DS1302时钟模块
DS1302芯片简介
DS1302可以对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等多种功能。
[tr]引脚说明[/tr]
Vcc2 | 主电源(2.0V ~ 5.5V),当电压比Vcc1高0.2V时使用主电源 |
Vcc1 | 备用电源,当主电源切断或电压比Vcc2高时使用备用电源供电 |
GND | 接地 |
SCLK | 输入引脚,时钟信号输入 |
I/O | 双向通信引脚,内置有40kΩ的下拉电阻 |
CE | 输入引脚,芯片进行读写时必须保持高电平,内置有40kΩ的下拉电阻 |
X1、 X2 | 需要用一个标准的32.768kHz石英晶体相连 |
DS1302时钟模块简介
当然,如果我们使用集成有DS1302 芯片的时钟模块,那就变得简便了不少。本次使用的模块已经用32.768kHz的石英晶体把X1、X2相连,并使用CR2032纽扣电池作备用电源。
当主电源被切断使用并备用电源后,若重新接通主电源,时钟信息会被刷新
[tr]引脚说明[/tr]
Vcc | 主电源,接+5V电源 |
GND | 接地 |
CLK | 与DS1302的SCLK相连,时钟信号输入 |
DAT | 与DS1302的I/0相连,双向数据引脚 |
RST | 与DS1302的CE相连,读写需保持高电平 |
TM1637四位数码管简介
[tr]引脚说明[/tr]
CLK | 时钟信号输入 |
DIO | 数据输入/输出 |
VCC | 接+5V电源 |
GND | 接地 |
部分接线图
Arduino IDE代码
代码调用了 Rtc_by_Makuna 和 TM1637_Driver 两个库
两者皆可在Arduino IDE的管理库中搜索添加
参考库的示例程序,编写代码
#include
#include
#include
// configurations
// TM1637 DIO Pin 3
// TM1637 CLK Pin 2
// DS1302 CLK/SCLK 4
// DS1302 DAT/IO 5
// DS1302 RST/CE 6
// DS1302 VCC 5v
// DS1302 GND GND
TM1637 tm(2,3); //定义针脚
ThreeWire myWire(5,4,6); // DAT, CLK, RST
RtcDS1302 Rtc(myWire);
void setup() {
tm.init(); //初始化tm1637
tm.setBrightness(1); //设置亮度为 1
Serial.begin(9600);
Serial.print("已获取系统时间并设定为: ");
Serial.print(__DATE__);
Serial.print(" ");
Serial.println(__TIME__);
Rtc.Begin();
RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__);
printDateTime(compiled);
Serial.println();
RtcDateTime now = Rtc.GetDateTime();
if (now < compiled)
{
Rtc.SetDateTime(compiled);
}
else if (now > compiled)
{
Rtc.SetDateTime(compiled);
}
else if (now == compiled)
{
Serial.println("当前时间和编译时相同");
}
}
void loop() {
tm.switchColon(); //TM1637中间的点闪烁
RtcDateTime now = Rtc.GetDateTime();
String Timestr = printDateTime(now);
Serial.println();
if (!now.IsValid()) //若now没有被实例化
{
Serial.println("获取时间失败,检查RTC是否连接");
}
int c0 = Timestr[15]-48; //ASCII码转数字
int c1 = Timestr[14]-48;
int c2 = Timestr[12]-48;
int c3 = Timestr[11]-48;
tm.display(c3, false, false, 3);
tm.display(c2, false, false, 2);
tm.display(c1, false, false, 1);
tm.display(c0, false, false, 0);
delay(1000);
}
#define countof(a) (sizeof(a) / sizeof(a[0]))
String printDateTime(const RtcDateTime& dt)
{
char datestring[20];
snprintf_P(datestring,
countof(datestring),
PSTR("%02u/%02u/%04u %02u:%02u:%02u"),
dt.Month(),
dt.Day(),
dt.Year(),
dt.Hour(),
dt.Minute(),
dt.Second() );
Serial.print(datestring);
return (datestring);
}
完成效果
注意事项
需要注意的是,校准电子钟会调用电脑的系统时间,因此要确保电脑系统时间已校准;若需重新校准电子钟只能重新上传程序,不能通过Arduino上的重新执行程序按钮校准;当主电源被切断并使用备用电源后,若重新接通主电源,时钟信息会被刷新。
使用DS1302时钟模块搭配TM1637四位数码管制作简易电子
材料准备
① Arduino UNO R3主板(仅供参考)
② DS1302时钟模块
③ TM1637四位数码管
④ 面包板
⑤ 杜邦线若干
DS1302时钟模块
DS1302芯片简介
DS1302可以对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等多种功能。
[tr]引脚说明[/tr]
Vcc2 | 主电源(2.0V ~ 5.5V),当电压比Vcc1高0.2V时使用主电源 |
Vcc1 | 备用电源,当主电源切断或电压比Vcc2高时使用备用电源供电 |
GND | 接地 |
SCLK | 输入引脚,时钟信号输入 |
I/O | 双向通信引脚,内置有40kΩ的下拉电阻 |
CE | 输入引脚,芯片进行读写时必须保持高电平,内置有40kΩ的下拉电阻 |
X1、 X2 | 需要用一个标准的32.768kHz石英晶体相连 |
DS1302时钟模块简介
当然,如果我们使用集成有DS1302 芯片的时钟模块,那就变得简便了不少。本次使用的模块已经用32.768kHz的石英晶体把X1、X2相连,并使用CR2032纽扣电池作备用电源。
当主电源被切断使用并备用电源后,若重新接通主电源,时钟信息会被刷新
[tr]引脚说明[/tr]
Vcc | 主电源,接+5V电源 |
GND | 接地 |
CLK | 与DS1302的SCLK相连,时钟信号输入 |
DAT | 与DS1302的I/0相连,双向数据引脚 |
RST | 与DS1302的CE相连,读写需保持高电平 |
TM1637四位数码管简介
[tr]引脚说明[/tr]
CLK | 时钟信号输入 |
DIO | 数据输入/输出 |
VCC | 接+5V电源 |
GND | 接地 |
部分接线图
Arduino IDE代码
代码调用了 Rtc_by_Makuna 和 TM1637_Driver 两个库
两者皆可在Arduino IDE的管理库中搜索添加
参考库的示例程序,编写代码
#include
#include
#include
// configurations
// TM1637 DIO Pin 3
// TM1637 CLK Pin 2
// DS1302 CLK/SCLK 4
// DS1302 DAT/IO 5
// DS1302 RST/CE 6
// DS1302 VCC 5v
// DS1302 GND GND
TM1637 tm(2,3); //定义针脚
ThreeWire myWire(5,4,6); // DAT, CLK, RST
RtcDS1302 Rtc(myWire);
void setup() {
tm.init(); //初始化tm1637
tm.setBrightness(1); //设置亮度为 1
Serial.begin(9600);
Serial.print("已获取系统时间并设定为: ");
Serial.print(__DATE__);
Serial.print(" ");
Serial.println(__TIME__);
Rtc.Begin();
RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__);
printDateTime(compiled);
Serial.println();
RtcDateTime now = Rtc.GetDateTime();
if (now < compiled)
{
Rtc.SetDateTime(compiled);
}
else if (now > compiled)
{
Rtc.SetDateTime(compiled);
}
else if (now == compiled)
{
Serial.println("当前时间和编译时相同");
}
}
void loop() {
tm.switchColon(); //TM1637中间的点闪烁
RtcDateTime now = Rtc.GetDateTime();
String Timestr = printDateTime(now);
Serial.println();
if (!now.IsValid()) //若now没有被实例化
{
Serial.println("获取时间失败,检查RTC是否连接");
}
int c0 = Timestr[15]-48; //ASCII码转数字
int c1 = Timestr[14]-48;
int c2 = Timestr[12]-48;
int c3 = Timestr[11]-48;
tm.display(c3, false, false, 3);
tm.display(c2, false, false, 2);
tm.display(c1, false, false, 1);
tm.display(c0, false, false, 0);
delay(1000);
}
#define countof(a) (sizeof(a) / sizeof(a[0]))
String printDateTime(const RtcDateTime& dt)
{
char datestring[20];
snprintf_P(datestring,
countof(datestring),
PSTR("%02u/%02u/%04u %02u:%02u:%02u"),
dt.Month(),
dt.Day(),
dt.Year(),
dt.Hour(),
dt.Minute(),
dt.Second() );
Serial.print(datestring);
return (datestring);
}
完成效果
注意事项
需要注意的是,校准电子钟会调用电脑的系统时间,因此要确保电脑系统时间已校准;若需重新校准电子钟只能重新上传程序,不能通过Arduino上的重新执行程序按钮校准;当主电源被切断并使用备用电源后,若重新接通主电源,时钟信息会被刷新。
举报