在先前探讨如何运用单片机开发电子产品时,我们提及了时钟芯片DS1302,它作为我们DIY时钟的核心时间数据来源,发挥着关键作用。现在,我们将深入剖析DS1302芯片的工作原理,揭示其如何为我们提供准确的时间数据。
对于初学者而言,DS1302时钟电路无疑是最具吸引力的部分,因为它仅需结合单片机最小系统,便能实现一个实用度极高的设计。然而,在实际应用中,这一过程并非易事,许多同学会遇到各种挑战。接下来,我们将详细阐述DS1302的使用方法。
1、DS1302的核心特性
DS1302是由DALLAS公司研发的涓流充电时钟芯片,内部集成实时时钟/日历功能以及31字节的静态RAM,能够通过串行接口与单片机进行高效通信。该芯片的实时时钟/日历部分能够提供秒、分、时、日、星期、月、年等时间信息,且自动调整每月天数和闰年天数。时钟操作模式可通过AM/PM标志位选择,支持24小时或12小时制。
通俗而言,DS1302作为时钟芯片,其基本功能是计时。它类似于我们日常佩戴的电子表,能够精确记录年月日、时分秒、星期。我们可以利用单片机向DS1302写入时间进行设置,也可以从DS1302读取时间数据,并将这些数据显示出来,从而实现电子时钟的完整功能。
2、DS1302的封装形式
DS1302主要提供两种封装形式:DIP8双列直插式和SOP8贴片式。从封装名称即可推断,该芯片拥有8个引脚,其引脚分布情况如图1所示:
图1
3、DS1302引脚详解
引脚号 功能说明
1 VCC2 主电源输入
2、3 X1、X2 32.768K晶振连接端
4 GND 电源地
5 CE(注1) 复位控制
6 I/O 数据输入输出
7 SCLK 串行时钟信号
8 VCC1 备用电源输入
1-VCC2,主电源引脚,当Vcc2比Vcc1高0.2V以上时,DS1302由VCC2供电;当Vcc2低于Vcc1时,则由Vcc1供电。
2、3-X1、X2,这两个引脚需连接一个32.768K的晶振,为DS1302提供稳定的时钟基准。特别需要注意的是,晶振的引脚负载电容必须为6pF,而非额外添加6pF的电容。若使用有源晶振,可直接连接到X1端,X2端悬空。
4-GND,电源地线。
5-CE(部分资料中标注为RST),DS1302的复位引脚。在进行读写操作时,该引脚必须保持高电平;低电平状态则表示芯片不工作。
6-I/O,DS1302的数据输入输出口,作为双向通信通道,所有读写数据均通过此引脚完成。
7-SCLK,串行时钟信号线,用于同步通信过程中的数据传输。
8-VCC1,备用电源引脚。
DS1302电路设计的核心在于时钟电路,其使用的晶振为32.768k赫兹,晶振外部无需额外添加其他电容或电阻。晶振引脚的负载电容必须为6pF。时钟的精度主要取决于晶振的精度和负载电容的大小。若晶振不准确或负载电容值偏差过大,将导致时钟误差显著。在所有条件均满足后,还需考虑晶振的温漂问题。温度变化会影响晶振的精度,因此,在实际系统中,常采用定期校准的方法来补偿这一影响。
4、寄存器结构说明
DS1302的寄存器(读时范围为81h~8Dh,写时范围为80h~8Ch)用于存储秒、分、时、日、月、年、星期等时间数据,数据格式为BCD码。其内部时间寄存器结构如下表所示:
上表展示了DS1302内部7个与时间、日期相关的寄存器以及一个写保护寄存器。我们的目标是将初始设置的时间、日期数据写入这些寄存器,并通过持续读取这些寄存器来获取实时时间信息。以下是这些寄存器的详细说明:
①、秒寄存器(81h、80h)的位7定义为时钟暂停标志(CH)。初始上电时,该位置为1,表示时钟振荡器停止,DS1302处于低功耗状态;只有将该位改写为0,时钟才能开始运行。通常,在设置时间完成后,我们将秒寄存器的该位置改为0,从而启动芯片的计时功能。
②、小时寄存器(85h、84h)的位7用于选择DS1302的工作模式,即12小时制或24小时制。当该位为1时,选择12小时模式;为0时,选择24小时模式。在12小时模式下,位5作为标志位,0表示AM,1表示PM。在24小时模式下,位5则作为第二个10小时位。
③、控制寄存器(8Fh、8Eh)的位7是写保护位(WP),其余7位均置为0。在进行任何对时钟和RAM的写操作前,WP位必须为0。当WP位为1时,写保护机制将阻止对任何寄存器的写操作。也就是说,在电路上电的初始状态下,WP位为1,此时无法修改上述时间寄存器。只有首先将WP位改写为0,才能进行其他寄存器的写操作。
其余寄存器无特殊说明。此外,DS1302芯片还有一个控制字,用于控制芯片的读写操作。具体内容如下表所示:
如上表所示,位0为读写位,当位0为1时,表示进行读操作;位0为0时,表示进行写操作。位0~位5指定要操作的DS1302寄存器地址。位6用于选择操作对象,0表示对时间寄存器操作,通常我们都是对时间寄存器进行操作。位7固定为1。
通过以上说明,我们可以理解为何控制字80H用于写秒寄存器,而81H用于读秒寄存器。80H转换为二进制为10000000,而81H的二进制为10000001,分别对应写操作和读操作。
现在,我们来总结一下如何操作DS1302:
1)首先通过8eH将写保护解除,这样我们才能将日期、时间的初值写入各个寄存器。
2)然后就可以对80H、82H、84H、86H、88H、8AH、8CH进行初值写入。同时也通过秒寄存器将位7的CH值改写为0,这样DS1302就开始走时运行了
3)将写保护寄存器再写为80H,防止误改写寄存器的值
4)不断读取80H-8CH的值,将他们转换为十进制后显示出来就可以啦,之前我们说过,DS1302读出的数据是BCD码,所以需要转换一下
5、读写时序
前面提到的寄存器、控制字,最终都需要单片机来控制DS1302的数据读取和写入。现在,我们就来详细说明这一读写的时序问题。
从物理结构上讲,DS1302的通讯接口由三个口线组成,即CE(RST)、SCLK、I/O。其中CE(RST)从低电平变为高电平,将启动一次数据传输过程;SCLK是时钟线,I/O是数据线。具体的读写时序参考下图,但请注意,无论是哪种同步通讯类型的串行接口,都是对时钟信号非常敏感的。而且,一般数据写入有效是在上升沿,读出有效是在下降沿(DS1302正是如此,但在芯片手册中可能没有明确说明)。如果不是特别确定,则可以将程序设计成这样:平时SCLK保持低电平,在时钟变动前设置数据,在时钟变动后读取数据,即数据操作总是在SCLK保持为低电平的时候,相邻的操作之间间隔有一个上升沿和一个下降沿。
DS1302的数据读写是通过I/O串行进行的。进行一次读写操作时,最少需要读写两个字节,第一个字节是控制字节,即命令,告诉DS1302是进行读操作还是写操作,是对RAM还是对时钟寄存器操作,以及操作的地址。第二个字节就是要读或写的数据。
我们先看单字节写:在进行操作之前,需要将CE(RST)置为高电平,然后单片机将控制字的位0放到I/O上,当I/O的数据稳定后,将SCLK置为高电平,DS1302检测到SCLK的上升沿后就将I/O上的数据读取,然后单片机将SCLK置为低电平,再将控制字的位1放到I/O上,如此反复,将一个字节控制字的8个位传给DS1302。接下来就是传一个字节的数据给DS1302,当传完数据后,单片机将CE置为低电平,操作结束。
单字节读操作的一开始写控制字的过程和上面的单字节写操作是一样的,但单字节读操作在写控制字的最后一个位,SCLK还在高电平时,DS1302就将数据放到I/O上,单片机将SCLK置为低电平后数据锁存,单片机就可以读取I/O上的数据。如此反复,将一个字节的数据读入单片机。读与写操作的不同之处在于,写操作是在SCLK低电平时单片机将数据放到IO上,当SCLK上升沿时,DS1302读取。而读操作是在SCLK高电平时DS1302放数据到IO上,将SCLK置为低电平后,单片机就可从IO上读取数据。

在单字节读操作时,在写控制字的最后一个位也就是位7时,DS1302已将它的寄存器数据位0放到IO上了,要是控制字的位7是0的话,DS1302就无法将它的随后的数据放到IO上了,所以控制字的7位为固定的1,原因就在这里哦。
6、典型应用电路