接口/总线/驱动
很多电子爱好者都热衷制作电子时钟来练手,这些时钟会使用数码管、点阵屏、LCD液晶屏、OLED屏、TFT屏等显示模块,所使用的RTC时钟芯片也各不相同,DS1302、DS3231、DS12C887等。通过单片机等MCU驱动RTC模块,读取时间数据并交给显示模块进行展示,还可以加入按键来调节时钟,可以说是一个非常全面的练手项目。
本篇我们来学习DS1302的使用,通过库函数来驱动DS1302获取时间数据。
1
DS1302介绍
DS1302是使用非常广泛的RTC芯片,它是DALLAS公司推出的涓流充电时钟芯片,内部含有一个实时时钟/日历和31字节静态RAM ,通过简单的串行接口与单片机进行通信。
主要特性
管脚排列及描述
管脚配置
我们使用的DS1302模块已经将DS1302时钟芯片和晶振及纽扣电池集中在一块小板子上
DS1302模块
2
安装驱动库
本篇使用DS1302库来驱动DS1302,无需关心DS1302的读写时序及内部寄存器相关信息。DS1302的驱动库也非常多,这里使用msparks提供的库。
将下载到的库进行解压,然后拷贝到Arduino IDE安装目录下的libraries文件夹下。
安装库
3
实验材料
4
实验步骤
DS1302模块的VCC和GND连接Uno开发板的3.3V和GND。DS1302模块的CLK、DAT、RST对应连接Uno开发板的4、3、2引脚。
实验原理图如下图所示:
实验原理图
#include < DS1302.h >
DS1302 rtc(2, 3, 4); //对应DS1302的RST,DAT,CLK
void initRTCTime(void)//初始化RTC时钟
{
rtc.writeProtect(false); //关闭写保护
rtc.halt(false); //清除时钟停止标志
Time t(2020, 4, 25, 21, 50, 50, 7); //新建时间对象 最后参数位星期数据,周日为1,周一为2以此类推
rtc.time(t);//向DS1302设置时间数据
}
void printTime()//打印时间数据
{
Time tim = rtc.time(); //从DS1302获取时间数据
char buf[50];
snprintf(buf, sizeof(buf), "%04d-%02d-%02d %02d:%02d:%02d",
tim.yr, tim.mon, tim.date,
tim.hr, tim.min, tim.sec);
Serial.println(buf);
}
void setup() {
Serial.begin(9600);
//新模块上电需要设置一次当前时间,
//下载完成后需屏蔽此函数再次下载,否则每次上电都会初始化时间数据
initRTCTime();
}
void loop() {
printTime();
delay(1000);
}
程序下载
5
实验现象
打开串口监视器,波特率设置成与程序中一致的9600,会看到输出时间数据。
实验现象
由于我们的DS1302模块带有纽扣电池来作为备用电池,当模块主供电Vcc掉电后,走时也不会停止。你可以将开发板断电等待一些时间重新上电,再次打开串口监视器可以看到时间并没有停止。
全部0条评论
快来发表一下你的评论吧 !