【Arduino基础】DS1302实时时钟实验

实验现象
利用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晶振
4GND
55
66
77

实验代码

#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

  • 5
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏小泡泡#

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值