ds1302模块 树莓派_【完整记录】DS1302实时时钟模块实验

一、介绍

  现在有很多流行的串行时钟芯片,如DS1302,DS1307,PCF8485等,由于简单的接口,低成本和易用性,他们被广泛应用于电话、传真、便携式仪器等产品领域。在本实验中,我们将使用DS1302实时时钟(RTC)模块获取当前日期和时间。

  DS1302可以用于数据记录,特别是对某些具有特殊意义的数据点的记录,能实现数据与出现该数据的时间同时记录。这种记录对长时间的连续测控系统结果的分析,及对异常数据出现的原因的查找具有重要意义。

  传统的数据记录方式是隔时采样或定时采样,没有具体的时间记录,因此,只能记录数据而无法准确记录其出现的时间;若采用单片机计时,一方面需要采用计数器,占用硬件资源,另一方面需要设置中断、查询等,同样耗费单片机的资源,而且,某些测控系统可能不允许。但是,如果在系统中采用时钟芯片DS1302,则能很好地解决这个问题。

二、组件

★Raspberry Pi 3主板*1

★树莓派电源*1

★40P软排线*1

★DS1302实时时钟模块*1

★面包板*1

★跳线若干

三、实验原理

23e673e0a6359e74aefe2e9689bfca92.png

9c7e9a9aae65414863907246c44f5f93.png

1. DS1302的特点

  DS1302是DALLAS(达拉斯)公司出的一款涓流充电时钟芯片,2001年DALLAS被MAXIM(美信)收购。
  DS1302实时时钟芯片广泛应用于电话、传真、便携式仪器等产品领域,他的主要性能指标如下:
  1、DS1302是一个实时时钟芯片,可以提供秒、分、小时、日期、月、年等信息,并且还有软年自动调整的能力,可以通过配置AM/PM来决定采用24小时格式还是12小时格式。
  2、拥有31字节数据存储RAM。
  3、串行I/O通信方式,相对并行来说比较节省IO口的使用。
  4、DS1302的工作电压比较宽,大概是2.0V~5.5V都可以正常工作。
  5、DS1302这种时钟芯片功耗一般都很低,它在工作电压2.0V的时候,工作电流小于300nA。
  6、DS1302共有8个引脚,有两种封装形式,一种是DIP-8封装,芯片宽度(不含引脚)是300mil,一种是SOP-8封装,有两       种宽度,一种是150mil,一种是208mil。我们看一下DS1302的引脚封装图:

e99edb61cbf5adcadb265f8b8db66462.png

  7、当供电电压是5V的时候,兼容标准的TTL电平标准,这里的意思是,可以完美的和单片机进行通信。
   8、由于DS1302是DS1202的升级版本,所以所有的功能都兼容DS1202。此外DS1302有两个电源输入,一个是主电源, 另外一个是备用电源,比如可以用电池或者大电容,这样是为了保证系统掉电的情况下,我们的时钟还会继续走。如果使用的是充电电池,还可以在正常工作时,设置充

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是MSP430单片机DS1302模块实时时钟代码设计,供参考: ```c #include <msp430g2553.h> #include <intrinsics.h> #define DS1302_PORT P1OUT #define DS1302_DDR P1DIR #define DS1302_CLK BIT5 #define DS1302_DAT BIT7 #define DS1302_RST BIT6 #define DS1302_SEC 0x80 #define DS1302_MIN 0x82 #define DS1302_HOUR 0x84 #define DS1302_DATE 0x86 #define DS1302_MONTH 0x88 #define DS1302_DAY 0x8A #define DS1302_YEAR 0x8C #define DS1302_CONTROL 0x8E #define DS1302_CHARGER 0x90 #define DS1302_CLKBURST 0xBE #define DS1302_RAMSTART 0xC0 #define DS1302_RAMEND 0xFC void DS1302_Init(void) { DS1302_DDR |= DS1302_RST | DS1302_DAT | DS1302_CLK; DS1302_PORT &= ~(DS1302_RST | DS1302_DAT | DS1302_CLK); } void DS1302_WriteByte(unsigned char dat) { unsigned char i; DS1302_DDR |= DS1302_DAT; for (i = 0; i < 8; i++) { DS1302_PORT &= ~DS1302_CLK; if (dat & 0x01) { DS1302_PORT |= DS1302_DAT; } else { DS1302_PORT &= ~DS1302_DAT; } DS1302_PORT |= DS1302_CLK; dat >>= 1; } DS1302_PORT &= ~DS1302_CLK; } unsigned char DS1302_ReadByte(void) { unsigned char i, dat = 0; DS1302_DDR &= ~DS1302_DAT; for (i = 0; i < 8; i++) { DS1302_PORT &= ~DS1302_CLK; DS1302_PORT |= DS1302_CLK; dat >>= 1; if (DS1302_PORT & DS1302_DAT) { dat |= 0x80; } } DS1302_PORT &= ~DS1302_CLK; return dat; } void DS1302_Write(unsigned char reg, unsigned char dat) { DS1302_PORT &= ~DS1302_RST; DS1302_PORT &= ~DS1302_CLK; DS1302_PORT |= DS1302_RST; DS1302_WriteByte(reg); DS1302_WriteByte(dat); DS1302_PORT &= ~DS1302_RST; } unsigned char DS1302_Read(unsigned char reg) { unsigned char dat; DS1302_PORT &= ~DS1302_RST; DS1302_PORT &= ~DS1302_CLK; DS1302_PORT |= DS1302_RST; DS1302_WriteByte(reg); dat = DS1302_ReadByte(); DS1302_PORT &= ~DS1302_RST; return dat; } void DS1302_SetTime(unsigned char year, unsigned char month, unsigned char day, unsigned char week, unsigned char hour, unsigned char min, unsigned char sec) { DS1302_Write(DS1302_CONTROL, 0x00); DS1302_Write(DS1302_YEAR, year); DS1302_Write(DS1302_MONTH, month); DS1302_Write(DS1302_DATE, day); DS1302_Write(DS1302_DAY, week); DS1302_Write(DS1302_HOUR, hour); DS1302_Write(DS1302_MIN, min); DS1302_Write(DS1302_SEC, sec); DS1302_Write(DS1302_CONTROL, 0x80); } void DS1302_GetTime(unsigned char *year, unsigned char *month, unsigned char *day, unsigned char *week, unsigned char *hour, unsigned char *min, unsigned char *sec) { *year = DS1302_Read(DS1302_YEAR); *month = DS1302_Read(DS1302_MONTH); *day = DS1302_Read(DS1302_DATE); *week = DS1302_Read(DS1302_DAY); *hour = DS1302_Read(DS1302_HOUR); *min = DS1302_Read(DS1302_MIN); *sec = DS1302_Read(DS1302_SEC); } void main(void) { unsigned char year, month, day, week, hour, min, sec; WDTCTL = WDTPW + WDTHOLD; DS1302_Init(); DS1302_SetTime(0x20, 0x10, 0x11, 0x01, 0x12, 0x30, 0x00); while (1) { __delay_cycles(10000); DS1302_GetTime(&year, &month, &day, &week, &hour, &min, &sec); //在这里可以将年月日时分秒输出到LCD等外设上 __no_operation(); } } ``` 代码中使用了DS1302模块的读写函数,通过设置和获取时间来实现实时时钟功能。在主函数中不断获取时间并输出到外设上,可以实现实时更新的效果。需要注意的是,DS1302模块的引脚连接需要根据具体情况进行修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值