Arduino驱动DS1302显示时钟

Arduino驱动DS1302显示时钟

  • 前言
  • 电气参数
  • 经典应用电路
  • 接线
  • 程序
  • 实验结果

前言

目前有许多流行的串行时钟电路,例如 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兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。

接线

ArduinoLCD1602DS1302
5VVCCVCC
A4SDA-
A5SCL-
5-RST
6-DAT
7-CLK
GNDGNDGND

程序

#include  
#include 
#include 
#include LiquidCrystal_I2C lcd(0x27,16,2);  // 将LCD地址设置为0x27,用于16个字符和2行显示namespace {const int kCePin   = 5;  
const int kIoPin   = 6; 
const int kSclkPin = 7;   
// Create a DS1302 object.
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);// Format the time and date and insert into the temporary buffer. //格式化时间和日期并插入临时缓冲区。char buf[50];   //定义一个字符型数组用来存放日期数据(用于串口打印)char DateBuf[12];  //定义一个字符型数组用来存放日期数据(由于1602每行只能打印16个字符,所以日期和时间分两个数组存)char TimeBuf[10];//定义一个字符型数组用来存放时间数据(由于1602每行只能打印16个字符,所以日期和时间分两个数组存)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);   //设置1602的光标到第0行第2个字符处lcd.print(DateBuf);   //在LCD光标所在处打印DateBuf数组里的数据lcd.setCursor(3,1);   //设置1602的光标到第1行第3个字符处lcd.print(TimeBuf);   //在LCD光标所在处打印TimeBuf数组里的数据
}}  
void setup() {lcd.init(); //初始化LCDlcd.backlight();  //打开LCD背光Serial.begin(9600); //初始化串口rtc.writeProtect(false);rtc.halt(false);// Make a new time object to set the date and time.// Wednesday, March 2, 2023 at 16:49:46.Time t(2023, 3, 2, 16, 49, 46, Time::kWednesday);// Set the time and date on the chip.rtc.time(t);
}// 每秒钟循环并打印一次时间。
void loop() {printTime();delay(1000);
}

实验结果

在这里插入图片描述


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部