第三十一篇、基于Arduino uno,获取ds1302时钟模块的年、月、日、时、分、秒信息——结果导向

0、结果

说明:先来看看串口调试助手显示的结果,包含了年月日和时分秒,如果是你想要的,可以接着往下看。


1、外观

说明:虽然ds1302时钟模块形态各异,但是原理和代码都是适用的。


2、连线

说明:只需要连接五根线。

  • uno————ds1302时钟模块
  • 5V--------------VCC
  • GND--------------GND
  •  5--------------CLK
  • 4--------------DAT
  • 3--------------RST

3、源程序

说明:采用非阻塞方式编写,一定时间检测一次时间和日期信息,并将对应功能进行函数化,方便移植。

/*
  接线:
  VCC------VCC
  GND------GND
    5------CLK
    4------DAT
    3------RST
*/
/****************************************ds1302 part****************************************/
#include <stdio.h>                                  //调用库文件  
#include <DS1302.h>                                 //调用库文件  
#define  ds1302ResetPin   3                         //复位引脚
#define  ds1302DataPin    4                         //数据引脚
#define  ds1302ClockPin   5                         //时钟引脚

DS1302 rtc(ds1302ResetPin, ds1302DataPin, ds1302ClockPin);

#define ds1302TimeInterval 1000                     //检测一次的时间间隔   
unsigned long  ds1302Times = 0;                     //记录设备运行时间

int yearss = 0;                                     //年
int monthss = 0;                                    //月
int dayss = 0;                                      //日
int hourss = 0;                                     //小时
int minutess = 0;                                   //分钟
int secondss = 0;                                   //秒
/****************************************set up and loop part*********************************/
void setup() {
  Serial.begin(9600);                               //设置串口波特率为9600
  rtc.writeProtect(false);                          //传感器初始化
  rtc.halt(false);                                  //传感器初始化

  Time t(2023, 5, 10, 0, 0, 0, Time::kThursday);    //设置初始时间 
  rtc.time(t);
}
void loop() {
  getds1302Data();                                  //获取时间数据
}
/****************************************ds1302 part****************************************/
/*获取时间数据*/
void getds1302Data() {
  if (millis() - ds1302Times >= ds1302TimeInterval) {//一定时间执行一次 
    ds1302Times = millis();

    Time t = rtc.time();                             //将时间赋值
    yearss = t.yr;
    monthss = t.mon;                                 //将时间赋值
    dayss = t.date;
    hourss = t.hr;
    minutess = t.min;                                //将时间赋值
    secondss = t.sec;

    Serial.print("日期:");                           //串口打印对应的值
    Serial.print(yearss);
    Serial.print("/");
    Serial.print(monthss);                           //串口打印对应的值
    Serial.print("/");
    Serial.print(dayss);  
    Serial.print(" , 时间:");                         //串口打印对应的值
    Serial.print(hourss);
    Serial.print(":");
    Serial.print(minutess);
    Serial.print(":");
    Serial.println(secondss);
  }
}

4、注意事项

说明:需要在线下载对应的库文件才不会编译报错,可以在管理库中很方便的搜到,如果搜不到可以评论@我,我将私发给你。程序不能获取系统时间,但是可以自己更改任意时间,更改完之后,需要将更改时间的程序注释掉,例如改好时间之后,需要将下面的程序注释掉,也就是33、34行注释掉,不然程序重新运行的时候会重新计时,而不会累计计时。

 5、基本原理

        DS1302时钟模块内置了一个非常简单的时钟电路,使用的是低频晶体振荡器。该振荡器与DS1302的时钟电路通过外部电容相连,从而可以产生稳定的振荡信号。
        DS1302时钟模块内部的时钟电路可以对其内部计数器进行不间断地计数,并且进行闰秒的调整和时间的更新。
        为了保证DS1302时钟模块在外部电源不稳定或被干扰的情况下能够正常工作,它还配备了电源管理电路。当检测到主电源电压异常时,DS1302时钟模块会自动切换到备用电池供电。
        DS1302时钟模块内部具有静态RAM存储器,可以存储时间和日期等数据信息。同时,它还配备了写保护电路,能够防止外部电路误写入数据或者将数据强制修改。
        DS1302时钟模块采用三线数字接口,可以与半导体芯片、单片机和数字电路等设备进行通信。
        总之,DS1302时钟模块是一种操作简单、价格便宜、易于与其他设备集成的实时时钟模块。它适用于需要进行时间测量、计时、记录等任务的场合,并且能够在外部电源或者信号不稳定的情况下依然保持良好的工作性能。由于其内部的时钟电路和计数器比较简单,因此其精度和稳定性相对较低。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值