实验现象
利用DS1302实时时钟,在串口监视器实时显示秒、分、日、日期、月、年的信息。
理论学习
DS1302是美国 DALLAS 公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态 RAM,采用 SPI 三线接口与 CPU 进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和 RAM数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.5~5.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后背电源进行涓细电流充电的能力。DS1302的外部引脚分配如图1所示及内部结构如图2所示。DS1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录,因此广泛应用于测量系统中。
图1 DS1302的外部引脚分配
图2 DS1302的内部结构
实验准备
arduino主板-1
面包板-1
数据线-1
DS1302芯片-1
无源晶振-1
跳线若干
连接电路
引脚说明
接线说明
DS1302芯片 | Arduino主板 |
---|---|
1 | +5V |
2 | 晶振 |
3 | 晶振 |
4 | GND |
5 | 5 |
6 | 6 |
7 | 7 |
实验代码
#include <stdio.h>
#include <string.h>
#include <DS1302.h>
uint8_t CE_PIN = 5;
uint8_t IO_PIN = 6;
uint8_t SCLK_PIN = 7;
char buf[50];
char day[10];
String comdata = "";
int numdata[7] ={0}, j = 0, mark = 0;
DS1302 rtc(CE_PIN, IO_PIN, SCLK_PIN);
void print_time()
{
Time t = rtc.time();
memset(day, 0, sizeof(day));
switch (t.day)
{
case 1: strcpy(day, "Sunday"); break;
case 2: strcpy(day, "Monday"); break;
case 3: strcpy(day, "Tuesday"); break;
case 4: strcpy(day, "Wednesday"); break;
case 5: strcpy(day, "Thursday"); break;
case 6: strcpy(day, "Friday"); break;
case 7: strcpy(day, "Saturday"); break;
}
snprintf(buf, sizeof(buf), "%s %d-%d-%d %d:%d:%d", day, t.yr, t.mon, t.date, t.hr, t.min, t.sec);
Serial.println(buf);
}
void setup()
{
Serial.begin(9600);
rtc.write_protect(false);
rtc.halt(false);
}
void loop()
{
while (Serial.available() > 0)
{
comdata += char(Serial.read());
delay(2);
mark = 1;
}
if(mark == 1)
{
Serial.print("You inputed : ");
Serial.println(comdata);
for(int i = 0; i < comdata.length() ; i++)
{
if(comdata[i] == ',' || comdata[i] == 0x10 || comdata[i] == 0x13)
{
j++;
}
else
{
numdata[j] = numdata[j] * 10 + (comdata[i] - '0');
}
}
Time t(numdata[0], numdata[1], numdata[2], numdata[3], numdata[4], numdata[5], numdata[6]);
rtc.time(t);
mark = 0;j=0;
comdata = String("");
for(int i = 0; i < 7 ; i++) numdata[i]=0;
}
print_time();
delay(1000);
}
在串口监视器输入时间,输入格式如下图所示
实现效果
DS1302库文件分享
链接: https://pan.baidu.com/s/1kMqv6eS4fqBpjQUPlN7FRw 提取码: ekqp