手把手教你使用PIC单片机做DS1302数字钟实验(C语言版)——站长原创,如需引用请注明出处
在很多单片机系统中都要求带有实时时钟电路,如最常见的数字钟、钟控设备、数据记录仪表,这些仪表往往需要采集带时标的数据,同时一般它们也会有一些需要保存起来的重要数据,有了这些数据,便于用户后期对数据进行观察、分析。本小节就介绍市面上常见的时钟芯片DS1302的应用。DS1302是美国DALLAS公司推出的一款高性能、低功耗、带内部RAM的实时时钟芯片(RTC),也就是一种能够为单片机系统提供日期和时间的芯片。通过本小节的学习,我们将会把RTC相关的一些技术粗略介绍一下,然后介绍DS1302与单片机之间的软硬件应用。
1、实时时钟(RTC)简介
实时时钟芯片的主要功能是完成年、月、周、日、时、分、秒的计时,通过外部接口为单片机系统提供日历和时钟,所以一个最基本的实时时钟芯片通常会具有如下的一些部件:电源电路、时钟信号产生电路、实时时钟、数据存储器、通讯接口电路、控制逻辑电路等,同时大部分的RTC还会提供一些额外的RAM。

9-35 RTC的基本组成
如果直接利用单片机的定时器,是不是也可以用软件自己来写时钟、日历程序?是的,但是会有几个问题,首先为了使时钟不至于停走,就得在停电时给单片机供电,而相对RTC来说,单片机的功耗大很多,电池往往无法长时间工作;其次单片机计时的准确度比较差,通常很难达到需要的精度,因此目前RTC的使用已经十分广泛。
由于在需要RTC的场合一般不允许时钟停走,所以即使在单片机系统停电的时候,RTC也必须能正常工作,因此一般都需要电池供电,同时考虑到电池使用寿命,所以有不少RTC把电源电路设计成能够根据主电源电压自动切换的形式,自动切换RTC使用主电源或备用电池,即当断电的时候,后备电池能够自动给RTC供电,而像DS1302还增加了电池充电电路,用来对可充锂电池充电。
综上所述,RTC电路的主要特点是功耗低,精度高。那么,RTC在使用过程中是如何控制精度的呢?一般,RTC都使用32768Hz的晶振,本身误差小(5PPM~20PPM),同时很多设备在生产过程中对这个频率进行过校准,主要方法就是改变两个从晶振引脚到地的电容值的大小,通过测试RTC输出的秒信号的频率,然后把电容改成合适的数值,使精度控制在合理的范围里,当然目前也有些时钟芯片在片内内置了电容阵列,可以自动调整。影响精度还有另外一个原因,就是温度,因此有很多产品在采用无内置温补电路的时候,会使用软件对计时进行温度补偿。当然,现在也有些RTC内置了温度补偿,甚至还可以为系统提供环境温度值。
我们最多见到的RTC可能是DS1302和DS12887了,当然其实还有很多其它的同类产品,下面按功能不同对几个也比较常见的RTC予以简单的比较。
一些常用RTC的功能比较
RTC型号 |
生产商 |
接口方式 |
晶振内置 |
补偿方式 |
温度补偿 |
电池内置 |
充电电路 |
报警输出 |
DS12887 |
DALLAS |
并行 |
是 |
无 |
无 |
是 |
有 |
有 |
DS1302 |
DALLAS |
串行 |
否 |
无 |
无 |
否 |
有 |
无 |
DS3231 |
DALLAS |
串行 |
是 |
硬件 |
有 |
否 |
无 |
有 |
RX8025 |
EPSON |
串行 |
是 |
软件 |
无 |
否 |
无 |
有 |
PCF8563 |
PHILIPS |
串行 |
否 |
无 |
无 |
否 |
无 |
有 |
2、DS1302时钟芯片简介
DS1302是DALLAS公司推出的涓流充电时钟芯片,内含一个实时时钟/日历和31字节静态RAM,可以通过串行接口与单片机进行通信。实时时钟/日历电路提供秒、分、时、日、星期、月、年的信息,每个月的天数和闰年的天数可自动调整,时钟操作可通过AM/PM标志位决定采用24或12小时时间格式。DS1302与单片机之间能简单地采用同步串行的方式进行通信,仅需三根I/O线:复位(RST)、I/O数据线、串行时钟(SCLK)。时钟/RAM的读/写数据以一字节或多达31字节的字符组方式通信。DS1302工作时功耗很低,保持数据和时钟信息时,功耗小于1mW。DS1302主要性能如下:
实时时钟具有能计算2100年之前的秒、分、时、日、星期、月、年的能力及闰年调整的能力。
31*8位暂存数据存储RAM。
串行I/O口方式,管脚数量少。
宽电压工作范围:2.0V~5.5V。
工作电流:2.0V时小于300nA。
读/写时钟或RAM数据时,有两种传送方式:单字节传送和多字节传送。
8脚DIP封装或SOIC封装
3、DS1302的内部结构
DS1302的外部引脚功能说明如下:

9-36 DS1302封装图 |
X1,X2 |
32.768kHz晶振引脚 |
GND |
地 |
RST |
复位 |
I/O |
数据输入/输出 |
SCLK |
串行时钟 |
VCC1 |
电池引脚 |
VCC2 |
主电源引脚 |
DS1302的内部结构如图9-37所示,主要组成部分为:移位寄存器、控制逻辑、振荡器、实时时钟以及RAM。虽然数据分成两种,但是对单片机的程序而言,其实是一样的,就是对特定的地址进行读写操作。

9-37 DS1302的内部结构图
DS1302含充电电路,可以对作为后备电源的可充电电池充电,并可选择充电使能和串入的二极管数目,以调节电池充电电压。不过对我们目前而言,最需要熟悉的是和时钟相关部分的功能,对于其它参数请参阅数据手册。
4、DS1302的工作原理
DS1302工作时为了对任何数据传送进行初始化,需要将复位脚(RST)置为高电平且将8位地址和命令信息装入移位寄存器。数据在时钟(SCLK)的上升沿串行输入,前8位指定访问地址,命令字装入移位寄存器后,在之后的时钟周期,读操作时输出数据,写操作时输出数据。时钟脉冲的个数在单字节方式下为8+8(8位地址+8位数据),在多字节方式下为8加最多可达248的数据。
5、DS1302的寄存器和控制命令
对DS1302的操作就是对其内部寄存器的操作,DS1302内部共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器以外的寄存器。日历、时间寄存器及控制字如下表所示:
日历、时钟寄存器与控制字对照表
寄存器名称 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
1 |
RAM/CK |
A4 |
A3 |
A2 |
A1 |
A0 |
RD/W |
秒寄存器 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
|
分寄存器 |
1 |
0 |
0 |
0 |
0 |
0 |
1 |
|
小时寄存器 |
1 |
0 |
0 |
0 |
0 |
1 |
0 |
|
日寄存器 |
1 |
0 |
0 |
0 |
0 |
1 |
1 |
|
月寄存器 |
1 |
0 |
0 |
0 |
1 |
0 |
0 |
|
星期寄存器 |
1 |
0 |
0 |
0 |
1 |
0 |
1 |
|
年寄存器 |
1 |
0 |
0 |
0 |
1 |
1 |
0 |
|
写保护寄存器 |
1 |
0 |
0 |
0 |
1 |
1 |
1 |
|
慢充电寄存器 |
1 |
0 |
0 |
1 |
0 |
0 |
0 |
|
时钟突发寄存器 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
|
最后一位RD/W为“0”时表示进行写操作,为“1”时表示读操作。
DS1302内部寄存器列表如下所示:
DS14302内部主要寄存器分布表
寄存器名称 |
命令字 |
取值范围 |
各位内容 |
写 |
读 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
秒寄存器 |
80H |
81H |
00-59 |
CH |
10SEC |
SEC |
分寄存器 |
82H |
83H |
00-59 |
0 |
10MIN |
MIN |
小时寄存器 |
84H |
85H |
01-12或00-23 |
12/24 |
0 |
A |
HR |
HR |
日期寄存器 |
86H |
87H |
01-28,29,30,31 |
0 |
0 |
10DATE |
DATE |
月份寄存器 |
88H |
89H |
01-12 |
0 |
0 |
0 |
10M |
MONTH |
周寄存器 |
8AH |
8BH |
01-07 |
0 |
0 |
0 |
0 |
0 |
DAY |
年份寄存器 |
8CH |
8DH |
00-99 |
10YEAR |
YEAR |
DS1302内部的RAM分为两类,一类是单个RAM单元,共31个,每个单元为一个8位的字节,其命令控制字为COH~FDH,其中奇数为读操作,偶数为写操作;再一类为突发方式下的RAM,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。
我们现在已经知道了控制寄存器和RAM的逻辑地址,接着就需要知道如何通过外部接口来访问这些资源。单片机是通过简单的同步串行通讯与DS1302通讯的,每次通讯都必须由单片机发起,无论是读还是写操作,单片机都必须先向DS1302写入一个命令帧,这个帧的格式如表X-X所示,最高位BIT7固定为1,BIT6决定操作是针对RAM还是时钟寄存器,接着的5个BIT是RAM或时钟寄存器在DS1302的内部地址,最后一个BIT表示这次操作是读操作抑或是写操作。
物理上,DS1302的通讯接口由3个口线组成,即RST,SCLK,I/O。其中RST从低电平变成高电平启动一次数据传输过程,SCLK是时钟线,I/O是数据线。具体的读写时序参考图4,但是请注意,无论是哪种同步通讯类型的串行接口,都是对时钟信号敏感的,而且一般数据写入有效是在上升沿,读出有效是在下降沿(DS1302正是如此的,但是在芯片手册里没有明确说明),如果不是特别确定,则把程序设计成这样:平时SCLK保持低电平,在时钟变动前设置数据,在时钟变动后读取数据,即数据操作总是在SCLK保持为低电平的时候,相邻的操作之间间隔有一个上升沿和一个下降沿。

9-38 DS1302的命令字结构
6、DS1302的软硬件设计实例
本例将实现对DS1302的读写操作,将时钟数据在LED数码管上显示出来。调试时将功能选择开关调到DS1302的状态上。

上图为
增强型PIC实验板DS1302接口部分原理图

增强型PIC实验板上电后开始计时,数字电子钟开始运行了。

当前时间为:12:30:45

当前时间为:12:30:52

当前时间为:12:31:02
|