DS1302 是DALLAS 公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和31 字节静态RAM ,通过简单的串行接口与单片机进行通信。实时时钟/日历电路提供秒、分、时、日、周、月、年的信息,每月的天数和闰年的天数可自动调整。时钟操作可通过AM/PM 指示决定采用24 或12 小时格式。DS1302 与单片机之间能简单地采用同步串行的方式进行通信,仅需用到三个口线:(1)RES 复位(2)I/O 数据线(3)SCLK串行时钟。时钟/RAM 的读/写数据以一个字节或多达31 个字节的字符组方式通信。DS1302 工作时功耗很低保持数据和时钟信息时功率小于1mW
DS1302工作时为了对任何数据传送进行初始化,需要将复位脚(RST)置为高电平且将8位地址和命令信息装入移位寄存器。数据在时钟(SCLK)的上升沿串行输入,前8位指定访问地址,命令字装入移位寄存器,在之后的时钟周期,读操作时输出数据,写操作时输出数据。时钟脉冲的个数在单字节方式下为8+8(8位地址+8位数据),在多字节方式下为8加最多可达248的数据。
1.DS1302的寄存器和控制命令
对DS1302的操作就是对其内部寄存器的操作,DS1302内部共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等,如表3-79、表3-80所列。时钟突发寄存器可一次性顺序读/写除充电寄存器以外的寄存器。
表3-79 日历时钟相关寄
|
寄存器名 |
命令字节 |
范围 |
位内容 |
||||||||
|
写 |
读 |
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
||
|
秒 |
80H |
81H |
00~59 |
CH |
秒的十位 |
秒的个位 |
|||||
|
分 |
82H |
83H |
00~59 |
0 |
分的十位 |
分的个位 |
|||||
|
时 |
84H |
85H |
01~12或00~23 |
12/24 |
0 |
1/P |
HR |
小时个位 |
|||
|
日 |
86H |
87H |
01~31 |
0 |
0 |
日的十位 |
日的个位 |
||||
|
月 |
88H |
89H |
01~12 |
0 |
0 |
0 |
0/1 |
月的个位 |
|||
|
星期 |
8AH |
8BH |
01~07 |
0 |
0 |
0 |
0 |
0 |
星期几 |
||
|
年 |
8CH |
8DH |
00~99 |
年的十位 |
年的个位 |
||||||
注意:
①秒寄存器的CH位:
置1,时钟停振,进入低功耗态;
置0,时钟工作。
②小时寄存器的D7位:
置1,12小时制(D5置1表示上午,置0表示下午);
置0,24小时制(此时D5、D4组成小时的十位)。
表3-80其它寄存器及RAM
|
寄存器名 |
命令字节 |
范围 |
位内容 |
||||||||
|
写 |
读 |
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
||
|
写保护 |
8EH |
8FH |
00H~80H |
WP |
|
||||||
|
涓流充电 |
90H |
91H |
– |
TCS |
DS |
RS |
|||||
|
时钟突发 |
8EH |
BFH |
– |
– |
|||||||
|
RAM突发 |
BEH |
FFH |
– |
– |
|||||||
|
RAMO |
C0H |
C1H |
00H~FFH |
RAM数据 |
|||||||
|
… |
… |
… |
00H~FFH |
||||||||
|
RAM30 |
FCH |
FDH |
00H~FFH |
||||||||
注意:
①WP:写保护位。置为1时,写保护;置为0时,未写保护。
②TCS:1010时慢充电。DS为01,选1个二极管;为10,选2个二极管;11或00,禁止充电。
③RS:与二极管串联电阻选择。00,不充电;01,2KΩ电阻;10,4KΩ电阻;11,8KΩ电阻。
2.DS1302内部主要寄存器分布表
DS1302内部的RAM分为两类,一类是单个RAM单元,共31个,每个单元为一个8位的字节,其命令控制字为COH~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM,此方式下可一次性读/写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。
我们现在已经知道了控制寄存器和RAM的逻辑地址,接着就需要知道如何通过外部接口来访问这些资源。单片机是通过简单的同步串行方式与DS1302通信的,每次通信都必须由单片机发起。无论是读还是写操作,单片机都必须先向DS1302写入一个命令帧,这个帧的格式如表3-77所列,最高位BIT7固定为1。BIT6决定操作是针对RAM还是时钟寄存器,接着的5个BIT是RAM或时钟寄存器在DS1302的内部地址,最后一个BIT表示这次操作是读操作抑或是写操作。
表3-81 命令帧格式
|
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
|
1 |
R/C |
A4 |
A3 |
A2 |
A1 |
A0 |
R/W |
D7位: 固定为1 ;
R/C位: 为0时选择操作时钟,为1时选择操作RAM;
A4A3A2A1A0: 操作地址;
R/W位: 为0时进行写操作,为1时进行读操作。
物理上,DS1302的通信接口由3个口线组成,即RST,SCLK,I/O。其中RST从低电平变成高电平启动一次数据传输过程,SCLK是时钟线,I/O是数据线。请注意数据是对时钟信号敏感的,而且一般数据是在下降沿写入,上升沿读出。本次使用51单片机的I/O模拟协议实现通信。平时SCLK保持低电平。当需要写命令或者写数据时,在时钟输出变为高电平之前先输出数据;当需要读数据时,在时钟输出变为高电平之前采样读取数据。

图3-123 读写操作时序
程序工程,已测试,放心使用
源码传送门:https://download.csdn.net/download/u0/
很多初次用DS1302搞时钟的朋友都碰都过装好后时钟不走的问题,结合自己的实践,初步分析如下:
不走时,既可能是软件的问题也可能是硬件的问题。
一、硬件方面可能存在的问题
1、电路焊接错误,有虚焊,接错线。
2、DS1302是坏的,假的,这种可能性不是太大,我试过多种国产的芯片,完全不能用的是少数,但有些只是不稳定,误差大而已。
3、这一条是最重要的,就是32.768K的晶振用的不对,DS1302要使用专用的晶振,即内部的电容是6P的。世面上有多种32.768K的晶振,但内部电容有12P、20P等,这些晶振用在DS1302上是不能起振的,我就为这个问题折腾过很长时间,代码检查无数遍,电路检查无数遍,DS1302换过多个,就是不走,最后仔细看DS1302的规格书,才发现要6P的晶振,化几毛钱换了个6P的(淘宝上有的是),立马走起来了。如果不走时,也可以试用手指按住电路板上晶振的两个焊点,有时就会走起来,那可以肯定是晶振问题了。
二、软件问题
1、有不少朋友的代码是从书上或网上下的,经过改编来用的,这里面要特别注意一个问题,就是各个函数里的延时函数,如有一个延时函数delay_ms(5); 要求延时5MS,但是原来的程序的使用条件是单片机用4M晶振,你移植后用在8M单片机环境中,那延时时间肯定不够了,这时DS1302就可能不走。这种情况也经常出现在LCD显示屏中,轻则出乱码,重则不显示,还有在红外遥控中也有这样的情况,插在代码中的延时时间不对,也会不能接收到遥控信号,所以提醒大家,在进行代码移植时,一定要注意晶振的大小,如和自己的晶振不同时,要尝试修改延时函数的延时时间。
2、首次使用DS1302 时,要先按下面的步骤检查:先设置好分、秒,然后看显示的时间和自己设置的时间是否一致,如果一致,说明时序等没有问题,再看是否走时,不走时,用手按住晶振的焊点看有没有变化,或用万用表的交流毫伏档量晶振两脚,应有2V以上的读数,否则换6P的晶振。
3、一定要开启时钟,DS1302的秒寄存器,在程序初始化时一定要有l类似write_ds 1302(0x80,0x00)的语句,其中0x80是秒寄存器的地址,0x00 是写入的数据,这个数据的最高位一定要是0,是0 才能开启时钟走时。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/202389.html原文链接:https://javaforall.net
