合封芯片

ds1302时钟芯片 轻松吃透实时时钟芯片DS1302软硬件设计

小编 2024-10-09 合封芯片 23 0

轻松吃透实时时钟芯片DS1302软硬件设计

今天我们来讨论一款老掉牙的实时时钟芯片DS1302 。什么是实时时钟(RealTime Clock, RTC)呢?为什么我们需要它呢?假设你使用单片机实现万年历应用,一般的做法是这样的:设置中断后判断1秒是否到来,如果到来就将秒数加1,然后再考虑一些进位处理,例如,每60秒则分钟加1,每60分则小时加1, 24小时或12小时制也要区分对待,每12个月则年加1,还要考虑闰月闰年。虽然考虑的事情好像有些多,但是在资讯非常发达的今天,从网络上搜索出现成的代码也绝不是难事。

当然,利用代码来实现这些算法并不是惟一途径,你也可以使用实时时钟芯片来减轻编程负担,只要我们把芯片内的年月日时分秒等参数设置为当前时间,启动后内部会自动开始计数,理论上 芯片记录的时间将与我们的时间实时同步 ,进位的问题也由芯片自行处理,我们只需要在必要的时候从芯片中读取一些时间值即可,实在不要太简单。

DS1302就是一款使用广泛的RTC芯片,我们来看看与时间相关的寄存器有哪些,如下图所示(DS1302内部另外还有31个字节的RAM,本文不涉及):

首先我们关注一下地址,可能不少人会想:这些地址怎么这么怪呢?你这个厂家设计芯片时就不能靠谱点吗?地址从0x00开始连续增加会死呀?竟然还分为不同的读写地址,我看这个芯片设计者是闲得“淡”疼,简单的问题复杂化!

然而实际上,这9个寄存器地址的确是0x0~0x8 ,并且读写的也确实是同一个地址的数据,只不过数据手册在标记这些地址时,把发送串行数据中的其它一些位也考虑进来了。我们来看看如何往DS1302中写入一个字节的数据,相应的时序如下图所示:

可以看到,单个字节数据写入到DS1302需要两个字节,前一个字节用来确定写数据的目的地址。后一个字节就是需要写入的数据。请注意:两个字节都是以低位先行的方式发送 ,正常情况下确定地址的前一个字节如下图所示

读写数据时最高位(第7位)必须为1,最低位用来表示读(RD=1)还是写(WR=0 )数据。我们刚刚提过,DS1302内部额外还有31个字节的RAM,可作为通用的RAM使用,第6位表示往RAM(RAM=1)还是RTC(CK=0 )中写入(或读取)数据,前面表格中标注的写或读地址就是把这8位都考虑进来了

如果你往RTC写入 数据,第7位总是1,第6位与第0位总是0,所以写的地址总是偶数,读的地址总是奇数。是不是闲得“淡”疼呢?还真不是,因为从本质上来讲,读写信号以及访问区域(RAM/CK)选择位也可以算是地址线。例如,以前讨论的HD44780有一个RS引脚表示写入的是数据还是指令,但是你也可以认为它是一条地址线,它决定你将代码写入数据寄存器还是指令寄存器。

好吧!地址的事情已经谈妥了,咱们来一一介绍DS1302内部与时间有关的寄存器:

(1)【地址0x80】秒钟寄存器(Seconds) :DS1302中RTC寄存器都是以BCD码来保存的,也就是说,个位与十位分别占用一些位。在8位秒钟寄存器中,BIT3~0用来保存秒钟的个位,BIT6~4用保存秒钟的十位,因为秒数是不可能大于5的,所以用3位已然足够,而最高位BIT7表示时钟挂起位(ClockHalt, CH) ,当CH=1时,时钟暂时处于挂起状态(暂停计数),当CH=0时,计数才会开始运行。这个寄存器的设计还是很巧妙的 ,也就是说,只要我们往秒寄存器写入实际的秒钟数时,CH位都会被清零。换句话说,一般情况下,我们都会先初始化年月日时分等其它寄存器,而秒钟寄存器留待最后设置,同时也开启了芯片计数。

(2)【地址0x82】分钟寄存器(Minutes) :与秒钟寄存器一样,BIT3~0用来保存分钟的个数 ,BIT6~4用保存分钟的十位 ,最高位是无效的。

(3)【地址0x84】小时寄存器(Hour) :该寄存器的低4位保存小时的个位,而小时的十位则取决于时间是24还是12小时制。BIT7=1时为12小时制,那么小时的十位不可能大于1(1~12 ),它只需要一位(BIT4)表示即可,只是还多了一个BIT5用来表示下午(PM=1)还是上午(AM=0);而BIT7=0时为24小时制,十位数最大值可能为2(0~23 ),所以用BIT5~BIT4表示小时的十位。

(4)【地址0x86】日期寄存器(Date) :日期表示一个月份有多少天,其范围为1~31,十位最大值为3,所以用BIT5~4表示十位,BIT3~0表示个位。

(5)【地址0x88】月份寄存器(Month) :月份范围是1~12,所以用BIT4表示十位,BIT3~0表示个位。

(6)【地址0x8A】星期寄存器(Day) :星期的范围是1~7,所以用BIT2~BIT0表示即可。可能有些人在想:为什么星期数用Day而不用Week之类的呢?我还以为是天数呢!因为英文的星期1~7都是以Day结尾,例如,Monday,Sunday, Friday等等。英文询问今天星期几即“What day is today?”

(7)【地址0x8C】年份寄存器(Year) :DS1302的年份范围是00~99,所以分别用高4位与低4位分别表示十位与个位。

(8)【地址0x8E】写保护寄存器(Write Protect, WP) : 该寄存器只有最高位有效,为1表示开启写保护,为0表示解除写保护。在往RTC(或RAM)中写入数据前,必须将该位清0。

(9)【地址0x90】充电寄存器 :与时间计数无关,咱们最后讨论。

我们使用VisualCom软件平台来仿真一下,相应的仿真效果如下图所示:

调出的DS1302器件有一个能够方便我们观察RTC内部状态的屏幕,其实就是一块能够显示4行20个字符的液晶显示模组(LCM2004),从屏幕上看到信息就是从DS1302中读取出来并写入到LCM2004中的。当然,一些特殊的寄存器状态还是得观察“内存”窗口,相应的预置数据如下图所示:

VisualCom软件平台中的预置数据格式均按照正常位序定义,共16位有效,高8位设置访问地址,低8位则是写入的数据,如下图所示:

首先我们解除了写保护。因为无论你写什么、往哪里写,写保护都需要解除(将WP位清零),所以需要写入的数据为“0b10001110_0000000(0x8E00) ”,如下图所示

写保护解锁后,咱们就可以为所欲为了,在依次写入年份、星期、月份、日期、小时、分钟后,我们才设置了秒钟 ,也就同时启动了芯片的计数,简单吧!

最后我们谈谈充电寄存器 ,它是用来做什么的呢?有电脑使用经验的读者都知道,当我们将电脑彻底关机(电)后再开机,时间仍然还在继续跑的,对不对?因为电脑的处理器也有RTC功能,当电脑处于开机时,RTC由外部电源供电,而在断电状态下,RTC则由主板上的电池(最常见的是钮扣电池CR2032 )供电。换句话说,RTC单元的供电总是不会断开的,所以计数功能也从来没有停止过,类似的供电电路如下图所示:

图中RTC_VDD是RTC单元的供电电源,电路系统上电后VCC是有电的,同时也给RTC单元供电,断电后则由电池供电,两个二极管可以防止VCC与电池之间出现漏电状态。

DS1302有两个电源供电引脚,VCC2为主电源供电(相当于上图的VCC ),VCC1为辅助电源供电。当VCC2没有电源供电时,挂在VCC1引脚的电池将给RTC供电,如图所示:

如果电池是可充电型的,当VCC2主电源有供电时,我们就可以使用充电寄存器来控制充电参数,我们来看看VCC2与VCC1之间的内部电路,如下图所示:

可以看到,VCC2与VCC1之间有三级开关,TCS3~TCS0控制主电源是否往辅助电源供电,DS1~DS0控制串联的二极管个数,ROUT1~ROUT0控制串联的电阻值,数据手册有下表所示的功能表:

如果你使用可充电电池,并且决定使用充电功能,应该通过选择合适的二极管数量与阻值来限制最大充电电流 。假设供电电源为5V,并且使用1个二极管与2K欧姆电阻串联方式,则最大充电电流为IMAX=(5V-0.7V)/2K≈2.2mA。

带温度显示闹钟教程:DS1302时钟芯片应用

1、概述:

现在流行的串行时钟电路很多,如DS1302、DS1307、PCF8485等。这些电路的接口简单、价格低廉、使用方便,被广泛地采用。本文介绍的实时时钟电路DS1302是DALLAS公司的一种具有涓细电流充电能力的电路,主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。采用普通32.768kHz晶振。是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。

2、硬件分析

DS1302的时钟基准来源于芯片外部接的32.768MHz的晶振,和单片机共3个引脚连接,分别为SCK、DO以及RST,接口非常简单。

DS1302原理图

DS1302模块

3、驱动软件编写

DS1302 的控制字如图2所示。控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。

3.1 数据输入输出(I/O)

在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。

3.2 DS1302的寄存器

DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见表1。

此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。 DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。

4、时钟实物

DS1302时钟实物图

相关问答

英语翻译本课题使用51单片机,DS1302时钟芯片,DS18B20温度芯...

[最佳回答]Thisprojectistouse51Single-ChipMicrocomputer,DS1302clockCMOSchip,DS18B20temperatureCMOS...

DS12C887,DS1302,DS3231时钟芯片那个精度比较高?

DS12C887里面有内部晶振,还带有闹钟设置,内部自带锂电池,但体积大,DS1302没有闹钟设置功能,闹钟程序要自己写,DS3231没用过。时钟模块的精度应该不能调吧,...

ds1302时钟芯片输出的是什么信号?

DS1302时钟芯片输出的是数字信号。它提供了秒、分、时、日、月、星期和年等时间信息的二进制编码。此外,它还提供了时钟和日历的控制信号,如时钟使能、写使能...

51单片机简单电子时钟程序,通过按钮设置时间,并且通过DS1302...

那DS1302不是寄存时间,就是一片时钟芯片,它就完成时钟计时的,有时间和日期的。但都需要写程序读出时间和日期。有用(0)回复px1203只给出按键调整时、分...

电子万年历里面都有什么电子元件?

应该有很多不同的方案,元件都不一样!用51单片机+DS1302时钟模块+数码管,就可以做成万年历。还有专用芯片等……应该有很多不同的方案,元件都不一样!用51...

单片机数字钟毕业中期检查表中的一个问题-沈禾欣子的回答...

详细2113点???你问什么问题??淮安信息职5261业技术学院综合毕业实践说明4102书(论文1653)2009-2010学年系专业摘要:数字电子时钟电路设计系统,以AT8...

DS1302的介绍和引脚图-ZOL问答

DS1302是时钟芯片,有计时的作用,和日常接触的电子表差不多,可以对年月日、时分秒、星期计时。可以用单片机往DS1302里面写入时间进行时间设置,也可...

固态硬盘工作过程中可以随意移动吗?-ZOL问答

ds1302时钟芯片是内部自带晶振,并且内部已经有年月日时分秒星期当前时间的值,在用的时候就只需要将内部数据读出就可以了,段选位选是在板上用的,需要自己看电路...

用ds1302做时钟电路VCC上5v电源加的电阻有什么作用?

vcc电路上增加电阻的作用?1、为三极管提供偏置电压2、降低电路中某一点电压3、将电路中的两部分子电路隔离4、将电流转换成电压5、分压作用6、分流作用7...

如何修改DS1302的时间?

根据DS1302的命令表,先取消写保护,在写入数据前先用0x80命令暂停时钟,再写命令修改时间,像修改分钟就是,先发送0x80暂停DS1302,再发送0x82写分钟寄存器命令...

猜你喜欢