61阅读

时钟芯片ds1302-时钟芯片DS1302中文资料

发布时间:2017-07-30 所属栏目:单片机数码管时钟程序

一 : 时钟芯片DS1302中文资料

首页 在线计算 EDA技术 电路图库 嵌入式 经验心得 电子基础 电子制作 国外资源 技术文章 专利技术 下载频道

电子基础 > 常用芯片

时钟芯片DS1302中文资料

概述

DS1302 是DALLAS 公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和31 字节静态RAM,通过简单的串行接口与单片机进行通信实时时钟/日历电路.提供秒分时日日期.月年的信息,每月的天数和闰年的天数可自动调整时钟操作可通过AM/PM 指示决定采用24 或12 小时格式.DS1302 与单片机之间能简单地采用同步串行的方式进行通信,仅需用到三个口线:1 RES 复位,2 I/O 数据线,3 SCLK串行时钟.时钟/RAM 的读/写数据以一个字节或多达31 个字节的字符组方式通信.DS1302 工作时功耗很低,保持数据和时钟信息时功率小于1mW.DS1302 是由DS1202 改进而来,增加了以下的特性.双电源管脚用于主电源和备份电源供应Vcc1,为可编程涓流充电电源附加七个字节存储器.它广泛应用于电话传真便携式仪器以及电池供电的仪器仪表等产品领域.

下面将主要的性能指标作一综合:

?? 实时时钟具有能计算2100 年之前的秒分时日日期星期月年的能力还有闰年调整的能力;

?? 31 8 位暂存数据存储RAM;

?? 串行I/O 口方式使得管脚数量最少;

?? 宽范围工作电压2.0 5.5V;

?? 工作电流2.0V 时,小于300nA;

?? 读/写时钟或RAM 数据时有两种传送方式单字节传送和多字节传送字符组方式;

?? 8 脚DIP 封装或可选的8 脚SOIC 封装根据表面装配;

?? 简单3 线接口;

?? 与TTL 兼容Vcc=5V;

?? 可选工业级温度范围-40 +85;

?? 与DS1202 兼容;

?? 在DS1202 基础上增加的特性;

对Vcc1 有可选的涓流充电能力;

双电源管用于主电源和备份电源供应;

备份电源管脚可由电池或大容量电容输入;

附加的7 字节暂存存储器;

1 DS1302 的基本组成和工作原理

DS1302 的引脚功能排列及描述如下图所示.



ds1302引脚图

管脚描述

X1 X2 32.768KHz 晶振管脚

GND 地

RST 复位脚

I/O 数据输入/输出引脚

SCLK 串行时钟

Vcc1,Vcc2 电源供电管脚

DS1302 串行时钟芯片8 脚DIP

DS1302S 串行时钟芯片8 脚SOIC 200mil

DS1302Z 串行时钟芯片8 脚SOIC 150mil

2. DS1302 内部寄存器

CH: 时钟停止位 存器2 的第7 位12/24 小时标志

CH=0 振荡器工作允许 bit7=1,12 小时模式

CH=1 振荡器停止 bit7=0,24 小时模式

WP: 写保护位 寄存器2 的第5 位:AM/PM 定义

WP=0 寄存器数据能够写入 AP=1 下午模式

WP=1 寄存器数据不能写入 AP=0 上午模式

TCS: 涓流充电选择 DS: 二极管选择位

TCS=1010 使能涓流充电 DS=01 选择一个二极管

TCS=其它 禁止涓流充电 DS=10 选择两个二极管

DS=00 或11, 即使TCS=1010, 充电功能也被禁止

RS位

电阻

典型位

00

没有

没有

01

R1

2KΩ

10

R2

4KΩ

11

R3

8KΩ

时钟:



DS1302 与微控制器的接口软件及功能应用举例

下面首先给出基本的接口软件然后举例说明各种功能的应用

1 写保护寄存器操作

当写保护寄存器的最高位为0 时允许数据写入寄存器写保护寄存器可以通过命令字节8E,8F 来

规定禁止写入/读出写保护位不能在多字节传送模式下写入

Write_Enable:

MOV Command,#8Eh ;命令字节为8E

MOV ByteCnt,#1 ;单字节传送模式

MOV R0,#XmtDat 数据地址覆给R0

MOV XmtDat,#00h 数据内容为0 写入允许

ACALL Send_Byte 用写入数据子程序

RET 返回调用本子程序处

当写保护寄存器的最高位为1 时禁止数据写入寄存器

Write_Disable:

MOV Command,#8Eh ;命令字节为8E

MOV ByteCnt,#1 ;单字节传送模式

MOV R0,#XmtDat 数据地址覆给R0

MOV XmtDat,#80h 数据内容为80h 禁止写入

ACALL Send_Byte 调用写入数据子程序

RET 返回调用本子程序处

以上程序调用了基本数据发送(Send_Byte)模块及一些内存单元定义, 其源程序清单在附录中给出下面

的程序亦使用了这个模块

2 时钟停止位操作

当把秒寄存器的第7 位时钟停止位设置为0 时起动时钟开始

Osc_Enable:

MOV Command,#80h ; 命令字节为80

MOV ByteCnt,#1 ; 单字节传送模式

MOV 0,#XmtDat 数据地址覆给R0

MOV XmtDat,#00h 数据内容为0 振荡器工作允许

ACALL Send_Byte 调用写入数据子程序

RET 返回调用本子程序处



当把秒寄存器的第7 位时钟停止位设置为1 时时钟振荡器停止HT1380 进入低功耗方式

Osc_Disable:

MOV Command,#80h ;命令字节为80

MOV ByteCnt,#1 ;单字节传送模式

MOV R0,#XmtDat 数据地址覆给R0

MOV XmtDat,#80h 数据内容为80h 振荡器停止

ACALL Send_Byte 调用写入数据子程序

RET 返回调用本子程序处

3. 多字节传送方式

当命令字节为BE 或BF 时DS1302 工作在多字节传送模式8 个时钟/日历寄存器从寄存器0 地址开

始连续读写从0 位开始的数据当命令字节为FE 或FF 时DS1302 工作在多字节RAM 传送模式31 个

RAM 寄存器从0 地址开始连续读写从0 位开始的数据

例如写入00 年6 月21 日星期三13 时59 分59 秒程序设置如下

Write_Multiplebyte:

MOV Command,#0BEh ;命令字节为BEh

MOV ByteCnt,#8 ;多字节写入模式此模块为8 个

MOV R0,#XmtDat 数据地址覆给R0

MOV XmtDat,#59h 秒单元内容为59h

MOV XmtDat+1,#59h 分单元内容为59h

MOV XmtDat+2,#13h 时单元内容为13h

MOV XmtDat+3,#21h 日期单元内容为21h

MOV XmtDat+4,#06h 月单元内容为06h

MOV XmtDat+5,#03h 星期单元内容为03h

MOV XmtDat+6,#0 年单元内容为00h

MOV XmtDat+7,#0 写保护单元内容为00h

ACALL Send_Byte 调用写入数据子程序

RET 返回调用本子程序处



读出寄存器0-7 的内容程序设置如下

Read_Multiplebyte:

MOV Command,#0BFh 命令字节为BFh

MOV ByteCnt,#8 ; 多字节读出模式此模块为8 个

MOV R1,#RcvDat 数据地址覆给R1

ACALL Receive_Byte 调用读出数据子程序

RET 返回调用本子程序处

以上程序调用了基本数据接收(Receive_Byte)模块及一些内存单元定义, 其源程序清单在附录中给

出下面的程 序亦使用了这个模块

4. 单字节传送方式

例如写入8 时12 小时模式程序设置如下

Write_Singlebyte:

MOV Command,#84h ; 命令字节为84h

MOV ByteCnt,#1 ; 单字节传送模式

MOV R0,#XmtDat 数据地址覆给R0

MOV XmtDat,#88h 数据内容为88h

ACALL Send_Byte 调用写入数据子程序

RET 返回调用本子程序处



上面所列出的程序模块Write_Enable Write_Disable Osc_Enable Osc_Disable 与单字节写入模块Write_Singlebyte 的程序架构完全相同仅只是几个入口参数不同本文是为了强调功能使用的不同才将其分为不同模块另外,与涓流充电相关的设定也是单字节操作方式,这里就不再单独列出,用户在使用中可灵活简略.

下面模块举例说明如何单字节读出小时单元的内容.



Read_Singlebyte:

MOV Command,#85h ; 命令字节为85h

MOV ByteCnt,#1 ; 单字节传送模式

MOV R1,#RcvDat 数据地址覆给R1

ACALL Receive_Byte 调用读出数据子程序

RET 返回调用本子程序处



DS1302 应用电路原理图P87LPC764 单片机选取内部振荡及内部复位电路

附录数据发送与接收模块源程序清单

; CPU 工作频率最大不超过20MHz

;

; P87LPC762/4 主控器发送接受数据程序

; 说明本程序是利用Philips 公司的P87LPC764 单片机任何具有51 内核或其它合适的单片机都可在此

作为主控器的普通I/O 口(如P1.2/P1.3/P1.4)实现总线的功能对总线 上的器件本程序采用DS1302

进行读写操作命令字节在Command 传送字节数在ByteCnt 中所发送的数据在XmtDat 中所接收

的数据在RcvDat 中

;

;P87LPC762/4 主控器总线发送接受数据程序头文件

;内存数据定义

BitCnt data 30h ; 数据位计数器

ByteCnt data 31h ; 数据字节计数器

Command data 32h ; 命令字节地址

RcvDat DATA 40H ; 接收数据缓冲区

XmtDat DATA 50H ; 发送数据缓冲区

;端口位定义

IO_DATA bit P1.3 ; 数据传送总线

SCLK bit P1.4 ; 时钟控制总线

RST bit P1.2 ; 复位总线

;

;发送数据程序

;名称:Send_Byte

;描述:发送ByteCnt 个字节给被控器DS1302

;命令字节地址在Command 中

;所发送数据的字节数在ByteCnt 中发送的数据在XmtDat 缓冲区中

;

Send_Byte:

CLR RST ;复位引脚为低电平所有数据传送终止

NOP

CLR SCLK 清时钟总线

NOP

SETB RST ;复位引脚为高电平逻辑控制有效

NOP

MOV A,Command 准备发送命令字节

MOV BitCnt,#08h 传送位数为8

S_Byte0:

RRC A 将最低位传送给进位位C

MOV IO_DATA,C 位传送至数据总线

NOP

SETB SCLK 时钟上升沿发送数据有效

NOP

CLR SCLK 清时钟总线

DJNZ BitCnt,S_Byte0 位传送未完毕则继续

NOP

S_Byte1: 准备发送数据

MOV A,@R0 传送数据过程与传送命令相同

MOV BitCnt,#08h

S_Byte2:

RRC A

MOV IO_DATA,C

NOP

SETB SCLK

NOP

CLR SCLK

DJNZ BitCnt,S_Byte2

INC R0 发送数据的内存地址加1

DJNZ ByteCnt,S_Byte1 字节传送未完毕则继续

NOP

CLR RST 逻辑操作完毕清RST

RET

;接收数据程序;

;名称:Receive_Byte

;描述:从被控器DS1302 接收ByteCnt 个字节数据

;命令字节地址在Command 中

;所接收数据的字节数在ByteCnt 中接收的数据在RcvDat 缓冲区中

Receive_Byte:

CLR RST ;复位引脚为低电平所有数据传送终止

NOP

CLR SCLK 清时钟总线

NOP

SETB RST ;复位引脚为高电平逻辑控制有效

MOV A,Command 准备发送命令字节

MOV BitCnt,#08h 传送位数为8

R_Byte0:

RRC A 将最低位传送给进位位C

MOV IO_DATA,C 位传送至数据总线

NOP

SETB SCLK 时钟上升沿发送数据有效

NOP

CLR SCLK 清时钟总线

DJNZ BitCnt,R_Byte0 位传送未完毕则继续

NOP

R_Byte1: 准备接收数据

CLR A 清类加器

CLR C 清进位位C

MOV BitCnt,#08h 接收位数为8

R_Byte2:

NOP

MOV C,IO_DATA 数据总线上的数据传送给C

RRC A 从最低位接收数据

SETB SCLK 时钟总线置高

NOP

CLR SCLK 时钟下降沿接收数据有效

DJNZ BitCnt,R_Byte2 位接收未完毕则继续

MOV @R1,A 接收到的完整数据字节放入接收内存缓冲区

INC R1 接收数据的内存地址加1

DJNZ ByteCnt,R_Byte1 字节接收未完毕则继续

NOP

CLR RST 逻辑操作完毕清RST

RET

END

直流参数表:



主要电参数表:



交流参数表:



电容配置表:

二 : 实时时钟芯片DS1302

本节课的DS1302是个实时时钟芯片,我们可以用单片机写入时间或者读取当前的时间数据,我也会带着大家通过阅读这个芯片的数据手册来学习和掌握这个器件。

由于IT技术国际化比较强,因此数据手册绝大多数都是英文的,导致很多英语基础不好的同学看到英文手册头就大了。这里我要告诉大家的是,只要精神不退缩,方法总比困难多,很多英语水平不高的,看数据手册照样完全没问题,因为我们的专业词汇也就那么几个,多看几次就认识了。我们现在不是考试,因此大家可以充分利用一些英文翻译软件,翻译过来的中文意思有的时候可能不是那么准确,那你就把翻译的内容和英文手册里的一些图表比较参考学习。此外数据手册除了介绍性的说明外,一般还会配相关的图形或者表格,结合起来看也有利于理解手册所表达的意思。这节课我会把DS1302的英文资料尽可能的用比较便于理解的方式给大家表达出来,同学们可以把我的表达和英文手册多做一下对比,尽可能快的慢慢开始学会了解英文手册。

1、DS1302的特点

DS1302是DALLAS(达拉斯)公司出的1款涓流充电时钟芯片,2001年DALLAS被MAXIM(美信)收购,因此我们看到的DS1302的数据手册既有DALLAS的标志,又有MAXIM的标志,大家了解就可以。

DS1302实时时钟芯片广泛应用于电话、传真、便携式仪器等产品领域,他的主要性能指标如下:

1、DS1302是1个实时时钟芯片,可以提供秒、分、小时、日期、月、年等信息,并且还有软件自动调整的能力,可以通过配置AM/PM来决定采用24小时格式还是12小时格式。

2、拥有31字节数据存储RAM。

3、串行I/O通信方式,相对并行来说比较节省IO口的使用。

4、DS1302的工作电压比较宽,大概是2.0V~5.5V都可以正常工作。

5、DS1302这种时钟芯片功耗一般都很低,它在工作电压2.0V的时候,工作电流小于300nA。

6、DS1302共有八个引脚,有2种封装形式,1种是DIP-8封装,芯片宽度(不含引脚)是300mil,1种是SOP-8封装,有2种宽度,1种是150mil,1种是208mil。我们看一下DS1302的引脚封装图,如图1所示。

实时时钟芯片DS1302_时钟芯片

图1DS1302封装图

所谓的DIP封装DualIn-linePackage,也叫做双列直插式封装技术,就如同我们开发板上的STC89C52RC单片机,就是个典型的DIP封装,当然这个STC89C52RC还有其他的封装,为了方便学习使用,我们采用的是DIP封装。而74HC245、74HC138、24C02、DS1302我们用的都是SOP封装SmallOut-LinePackage,是1种芯片两侧引出L形引脚的封装技术,大家可以看看开发板上的芯片,了解一下这些常识性知识。

7、当供电电压是5V的时候,兼容标准的TTL电平标准,这里的意思是,可以完美的和单片机进行通信。

8、由于DS1302是DS1202的升级版本,所以所有的功能都兼容DS1202。此外DS1302有2个电源输入,1个是主电源,另外1个是备用电源,比如可以用电池或者大电容,这样是为了保证系统掉电的情况下,我们的时钟还会继续走。如果使用的是充电电池,还可以在正常工作时,设置充电功能,给我们的备用电池进行充电。

DS1302的特点第二条“拥有31字节数据存储RAM”,这是DS1302额外存在的资源。这31字节的RAM相当于1个存储器一样,我们编写单片机程序的时候,可以把我们想存储的数据存储在DS1302里边,需要的时候读出来,这块功能和EEPROM有点类似,相当于1个掉电丢失数据的“EEPROM”,如果我们的时钟电路加上备用电池,那么这3一个字节的RAM即可替代EEPROM的功能了。这31字节的RAM功能使用很少,所以在这里我不讲了,大家了解就可以。

2、DS1302的硬件信息

我们平时所用的不管是单片机,还是其他一些电子器件,根据使用条件的约束,可以分为商业级和工业级,DS1302的购买信息如下图2所示。

实时时钟芯片DS1302_时钟芯片

图2DS1302订购信息

我们在订购DS1302的时候,即可根据图15-4所标识的来跟销售厂家沟通,商业级的工作电压略窄,是0到70度,而工业级可以工作在零下40度到85度。TOPMARK就是指在芯片上印的字。

DS1302一共有八个引脚,下边要根据引脚分布图和典型电路图来介绍一下每个引脚的功能,如图3和图4所示。

实时时钟芯片DS1302_时钟芯片
图3DS1302引脚图

实时时钟芯片DS1302_时钟芯片

图4DS1302典型电路

1脚VCC2是主电源正极的引脚,2脚X1和3脚X2是晶振输入和输出引脚,4脚GND是负极,5脚CE是使能引脚,接单片机的IO口,6脚I/O是数据传输引脚,接单片机的IO口,7脚SCLK是通信时钟引脚,接单片机的IO口,8脚VCC1是备用电源引脚。考虑到KST-51开发板是一套以学习为目的的板子,加上备用电池对航空运输和携带不方便,所以8脚可以直接悬空,断电后不需要DS1302再运行了,或者是在8脚接1个10uF的电容,经过试验可以运行1分钟左右的时间,如果大家想运行时间再长,可以加大电容的容量,如图5和图6所示。

实时时钟芯片DS1302_时钟芯片
图5DS1302无备用电源
实时时钟芯片DS1302_时钟芯片

图6DS1302电容作备用电源

涓流充电功能,课程也不讲了,大家也作为选学就可以,我们使用的时候直接用5V电源接1个二极管,在有主电源的情况下给电容充电,在主电源掉电的情况下,这个电容可以给DS130两大约供电1分钟左右,这种电路的最大用处是在电池供电系统中更换主电池的时候保持实时时钟的运行不中断,1分钟的时间对于更换电池足够了。此外,通过我们的使用经验,在DS1302的主电源引脚串联1个1K电阻可以有效的防止电源对DS1302的冲击,R6就是,而R9,R26,R32都是上拉电阻。

我们把八个引脚功能分别介绍,如表1所示。

表1DS1302引脚功能图

引脚编号

引脚名称

引脚功能

1

Vcc2

主电源引脚,当Vcc2比Vcc1高0.2V以上时,DS1302由VCC2供电,当Vcc2低于Vcc1时,由Vcc1供电。

2

X1

这2个引脚需要接1个32.768K的晶振,给DS1302提供1个基准。特别注意,要求这个晶振的引脚负载电容必须是6pF,而不是要加6pF的电容。如果使用有源晶振的话,接到X1上就可以,X2悬空。

3

X2

4

GND

接地。

5

CE

DS1302的输入引脚。当读写DS1302的时候,这个引脚必须是高电平,DS1302这个引脚内部有1个40k的下拉电阻。

6

I/O

这个引脚是1个双向通信引脚,读写数据都是通过这个引脚完成。DS1302这个引脚的内部含有1个40k的下拉电阻。

7

SCLK

输入引脚。SCLK是用来作为通信的时钟信号。DS1302这个引脚的内部含有1个40k的下拉电阻。

8

Vcc1

备用电源引脚。

DS1302的电路1个重点就是时钟电路,它所使用的晶振是1个32.768k的晶振,晶振外部也不需要额外添加其他的电容或者电阻电路了。时钟的精度,首先取决于晶振的精度以及晶振的引脚负载电容。如果晶振不准或者负载电容过大过小,都会导致时钟误差过大。在这一切都搞定后,最终1个考虑因素是晶振的温漂。随着温度的变化,晶振往往精度会发生变化,因此,在实际的系统中,其中1种方法就是经常校对。比如我们所用的电脑的时钟,通常我们会设置1个选项“将计算机设置于internet时间同步”。选中这个选项后,一般可以过一段时间,我们的计算机就会和internet时间校准同步一次。

3、DS1302寄存器介绍

DS1302的一条指令1个字节8位,其中第七位(即最高位)是固定1,这一位如果是0的话,那写进去是无效的。第六位是选择RAM还是CLOCK的,我前边说过,我们这里主要讲CLOCK时钟的使用,它的RAM功能我们不用,所以如果选择CLOCK功能,第六位是0,如果要用RAM,那第六位就是1。从第五到第一位,决定了寄存器的5位地址,而第零位是读写位,如果要写,这一位就是0,如果要读,这一位就是1,如图7所示。

实时时钟芯片DS1302_时钟芯片

图7DS1302命令字节

DS1302时钟的寄存器,其中八个和时钟有关的,5位地址分别是00000一直到00111这八个地址,还有1个寄存器的地址是01000,这是涓流充电所用的寄存器,我们这里不讲。在DS1302的数据手册里的地址,直接把第七位、第六位和第零位值给出来了,所以指令就成了80H、81H那些了,最低位是1,那么表示读(www.61k.com],最低位是0表示写,如图8所示。

实时时钟芯片DS1302_时钟芯片

图8DS1302的时钟寄存器

寄存器一:最高位CH是1个时钟停止标志位。如果我们的时钟电路有备用电源部分,上电后,我们要先检测一下这一位,如果这一位是0,那说明我们的时钟在系统掉电后,由于备用电源的供给,时钟是持续正常运行的;如果这一位是1,那么说明我们的时钟在系统掉电后,时钟部分不工作了。若我们的Vcc1悬空或者是电池没电了,当我们下次重新上电时,读取这一位,那这一位就是1,我们可以通过这一位判断时钟在单片机系统掉电后是否持续运行。剩下的7位高3位是秒的十位,低4位是秒的个位,这里注意再提一次,DS1302内部是BCD码,而秒的十位最大是5,所以三个二进制位就够了。

寄存器二:bit7没意义,剩下的7位高3位是分钟的十位,低4位是分钟的个位。

寄存器三:bit7是1的话代表是12小时制,是0的话代表是24小时制,bit6固定是0,bit5在12小时制下0代表的是上午,1代表的是下午,在24小时制下和bit4一起代表了小时的十位,低4位代表的是小时的个位。

寄存器四:高2位固定是0,bit5和bit4是日期的十位,低4位是日期的个位。

寄存器五:高3位固定是0,bit4是月的十位,低4位是月的个位。

寄存器六:高5位固定是0,低3位代表了星期。

寄存器七:高4位代表了年的十位,低4位代表了年的个位。这里特别注意,这里的00到99年指的是2000年到2099年。

寄存器八:bit7是1个保护位,如果这一位是1,那么是禁止给任何其他的寄存器或者那3一个字节的RAM写数据的。因此在写数据之前,这一位必须先写成0。

4、DS1302通信时序介绍

DS1302我们前边也有提起过,是三根线,分别是CE、I/O和SCLK,其中CE是使能线,SCLK是时钟线,I/O是数据线。前边我们学过SPI通信,同学们发现没发现,这个DS1302的通信线定义和SPI怎么这么像呢?

事实上,DS1302的通信是SPI的变异种类,它用了SPI的通信时序,但是通信的时候没有完全按照SPI的规则来,下面我们一点点解剖一下DS1302的变异SPI通信方式。

先看一下单字节写入操作,如图9所示。

实时时钟芯片DS1302_时钟芯片

图9DS1302单字节写操作

然后我们在对比一下再对比一下CPOL=0并且CPHA=0的情况下的SPI的操作时序,如图10所示。

实时时钟芯片DS1302_时钟芯片

图10CPOL=0/CPHA=0通信时序

图9和图10的通信时序,其中CE和SSEL的使能控制是反的,对于通信写数据,都是在SCK的上升沿,从机进行采样,下降沿的时候,主机发送数据。DS1302的时序里,单片机要预先写1个字节指令,指明要写入的寄存器的地址以及后续的操作是写操作,然后再写入1个字节的数据。

对于单字节读操作,我就不做对比了,把DS1302的时序图贴出来给大家看一下,如图11所示。

实时时钟芯片DS1302_时钟芯片

图11DS1302单字节读操作

读操作有两处特别注意的地方。第一,DS1302的时序图上的箭头都是针对DS1302来说的,因此读操作的时候,先写第1个字节指令,上升沿的时候DS1302来锁存数据,下降沿我们用单片机发送数据。到了第二个字数据,由于我们这个时序过程相当于CPOL=0/CPHA=0,前沿发送数据,后沿读取数据,第二个字节是DS1302下降沿输出数据,我们的单片机上升沿来读取,因此箭头从DS1302角度来说,出现在了下降沿。

第二个需要注意的地方就是,我们的单片机没有标准的SPI接口,和I2C一样需要用IO口来模拟通信过程。在读DS1302的时候,理论上SPI是上升沿读取,但是我们的程序是用IO口模拟的,所以数据的读取和时钟沿的变化不可能同时了,必然就有1个先后顺序。通过实验发现,如果先读取IO线上的数据,再拉高SCLK产生上升沿,那么读到的数据一定是正确的,而颠倒顺序后数据就有可能出错。这个问题产生的原因还是在于DS1302的通信协议与标准SPI协议存在的差异造成的,如果是标准SPI的数据线,数据会一直保持到下1个周期的下降沿才会变化,所以读取数据和上升沿的先后顺序就无所谓了;但DS1302的IO线会在时钟上升沿后被DS1302释放,也就是撤销强推挽输出变为弱下拉状态,而此时在51单片机引脚内部上拉的作用下,IO线上的实际电平会慢慢上升,从而导致在上升沿产生后再读取IO数据的话就可能出错。因此这里的程序我们按照先读取IO数据,再拉高SCLK产生上升沿的顺序。

下面我们就写1个程序,先将2013年10月8号周二12点30分00秒这个时间写到DS1302内部,让DS1302正常运行,然后在不停的读取DS1302的当前时间,并显示在我们的液晶屏上。

三 : DS1302时钟芯片资料

我们继续向CEPARKAVR的第一个终点跨进,今天是倒数第二个内容,时钟芯片DS1302。以下是DS1302的一些概述(来自ZLG文档):

DS1302是DALLAS公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和31字节静态RAM,通过简单的串行接口与单片机进行通信。实时时钟/日历电路提供秒、分、时、日、周、月、年的信息,每月的天数和闰年的天数可自动调整。时钟操作可通过AM/PM指示决定采用24或12小时格式。DS1302与单片机之间能简单地采用同步串行的方式进行通信,仅需用到三个口线:(1)RES复位(2)I/O数据线(3)SCLK串行时钟。时钟/RAM的读/写数据以一个字节或多达31个字节的字符组方式通信。DS1302工作时功耗很低保持数据和时钟信息时功率小于1mW

DS1302是由DS1202改进而来增加了以下的特性:双电源管脚用于主电源和备份电源供应,Vcc1为可编程涓流充电电源,附加七个字节存储器。它广泛应用于电话、传真、便携式仪器以及电池供电的仪器仪表等产品领域下面。将主要的性能指标作一综合:

★实时时钟具有能计算2100年之前的秒、分、时、日、星期、月、年的能力,还有闰年调整的能力

★318位暂存数据存储RAM

★串行I/O口方式使得管脚数量最少

★宽范围工作电压2.05.5V

★工作电流2.0V时,小于300nA

★读/写时钟或RAM数据时有两种传送方式单字节传送和多字节传送字符组方式

★8脚DIP封装或可选的8脚SOIC封装根据表面装配

★简单3线接口

★与TTL兼容Vcc=5V

★可选工业级温度范围-40+85

★双电源管用于主电源和备份电源供应

以上是DS1302的一些全面的预览,以下为DS1302管脚图:

四 : 时钟芯片DS1302中文资料

首页 在线计算 EDA技术 电路图库 嵌入式 经验心得 电子基础 电子制作 国外资源 技术文章 专利技术 下载频道

电子基础 > 常用芯片

时钟芯片DS1302中文资料

概述

DS1302 是DALLAS 公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和31 字节静态RAM,通过简单的串行接口与单片机进行通信实时时钟/日历电路.提供秒分时日日期.月年的信息,每月的天数和闰年的天数可自动调整时钟操作可通过AM/PM 指示决定采用24 或12 小时格式.DS1302 与单片机之间能简单地采用同步串行的方式进行通信,仅需用到三个口线:1 RES 复位,2 I/O 数据线,3 SCLK串行时钟.时钟/RAM 的读/写数据以一个字节或多达31 个字节的字符组方式通信.DS1302 工作时功耗很低,保持数据和时钟信息时功率小于1mW.DS1302 是由DS1202 改进而来,增加了以下的特性.双电源管脚用于主电源和备份电源供应Vcc1,为可编程涓流充电电源附加七个字节存储器.它广泛应用于电话传真便携式仪器以及电池供电的仪器仪表等产品领域.

下面将主要的性能指标作一综合:

?? 实时时钟具有能计算2100 年之前的秒分时日日期星期月年的能力还有闰年调整的能力;

?? 31 8 位暂存数据存储RAM;

?? 串行I/O 口方式使得管脚数量最少;

?? 宽范围工作电压2.0 5.5V;

?? 工作电流2.0V 时,小于300nA;

?? 读/写时钟或RAM 数据时有两种传送方式单字节传送和多字节传送字符组方式;

?? 8 脚DIP 封装或可选的8 脚SOIC 封装根据表面装配;

?? 简单3 线接口;

?? 与TTL 兼容Vcc=5V;

?? 可选工业级温度范围-40 +85;

?? 与DS1202 兼容;

?? 在DS1202 基础上增加的特性;

对Vcc1 有可选的涓流充电能力;

双电源管用于主电源和备份电源供应;

备份电源管脚可由电池或大容量电容输入;

附加的7 字节暂存存储器;

1 DS1302 的基本组成和工作原理

DS1302 的引脚功能排列及描述如下图所示.



ds1302引脚图

管脚描述

X1 X2 32.768KHz 晶振管脚

GND 地

RST 复位脚

I/O 数据输入/输出引脚

SCLK 串行时钟

Vcc1,Vcc2 电源供电管脚

DS1302 串行时钟芯片8 脚DIP

DS1302S 串行时钟芯片8 脚SOIC 200mil

DS1302Z 串行时钟芯片8 脚SOIC 150mil

2. DS1302 内部寄存器

CH: 时钟停止位 存器2 的第7 位12/24 小时标志

CH=0 振荡器工作允许 bit7=1,12 小时模式

CH=1 振荡器停止 bit7=0,24 小时模式

WP: 写保护位 寄存器2 的第5 位:AM/PM 定义

WP=0 寄存器数据能够写入 AP=1 下午模式

WP=1 寄存器数据不能写入 AP=0 上午模式

TCS: 涓流充电选择 DS: 二极管选择位

TCS=1010 使能涓流充电 DS=01 选择一个二极管

TCS=其它 禁止涓流充电 DS=10 选择两个二极管

DS=00 或11, 即使TCS=1010, 充电功能也被禁止

RS位

电阻

典型位

00

没有

没有

01

R1

2KΩ

10

R2

4KΩ

11

R3

8KΩ

时钟:



DS1302 与微控制器的接口软件及功能应用举例

下面首先给出基本的接口软件然后举例说明各种功能的应用

1 写保护寄存器操作

当写保护寄存器的最高位为0 时允许数据写入寄存器写保护寄存器可以通过命令字节8E,8F 来

规定禁止写入/读出写保护位不能在多字节传送模式下写入

Write_Enable:

MOV Command,#8Eh ;命令字节为8E

MOV ByteCnt,#1 ;单字节传送模式

MOV R0,#XmtDat 数据地址覆给R0

MOV XmtDat,#00h 数据内容为0 写入允许

ACALL Send_Byte 用写入数据子程序

RET 返回调用本子程序处

当写保护寄存器的最高位为1 时禁止数据写入寄存器

Write_Disable:

MOV Command,#8Eh ;命令字节为8E

MOV ByteCnt,#1 ;单字节传送模式

MOV R0,#XmtDat 数据地址覆给R0

MOV XmtDat,#80h 数据内容为80h 禁止写入

ACALL Send_Byte 调用写入数据子程序

RET 返回调用本子程序处

以上程序调用了基本数据发送(Send_Byte)模块及一些内存单元定义, 其源程序清单在附录中给出下面

的程序亦使用了这个模块

2 时钟停止位操作

当把秒寄存器的第7 位时钟停止位设置为0 时起动时钟开始

Osc_Enable:

MOV Command,#80h ; 命令字节为80

MOV ByteCnt,#1 ; 单字节传送模式

MOV 0,#XmtDat 数据地址覆给R0

MOV XmtDat,#00h 数据内容为0 振荡器工作允许

ACALL Send_Byte 调用写入数据子程序

RET 返回调用本子程序处



当把秒寄存器的第7 位时钟停止位设置为1 时时钟振荡器停止HT1380 进入低功耗方式

Osc_Disable:

MOV Command,#80h ;命令字节为80

MOV ByteCnt,#1 ;单字节传送模式

MOV R0,#XmtDat 数据地址覆给R0

MOV XmtDat,#80h 数据内容为80h 振荡器停止

ACALL Send_Byte 调用写入数据子程序

RET 返回调用本子程序处

3. 多字节传送方式

当命令字节为BE 或BF 时DS1302 工作在多字节传送模式8 个时钟/日历寄存器从寄存器0 地址开

始连续读写从0 位开始的数据当命令字节为FE 或FF 时DS1302 工作在多字节RAM 传送模式31 个

RAM 寄存器从0 地址开始连续读写从0 位开始的数据

例如写入00 年6 月21 日星期三13 时59 分59 秒程序设置如下

Write_Multiplebyte:

MOV Command,#0BEh ;命令字节为BEh

MOV ByteCnt,#8 ;多字节写入模式此模块为8 个

MOV R0,#XmtDat 数据地址覆给R0

MOV XmtDat,#59h 秒单元内容为59h

MOV XmtDat+1,#59h 分单元内容为59h

MOV XmtDat+2,#13h 时单元内容为13h

MOV XmtDat+3,#21h 日期单元内容为21h

MOV XmtDat+4,#06h 月单元内容为06h

MOV XmtDat+5,#03h 星期单元内容为03h

MOV XmtDat+6,#0 年单元内容为00h

MOV XmtDat+7,#0 写保护单元内容为00h

ACALL Send_Byte 调用写入数据子程序

RET 返回调用本子程序处



读出寄存器0-7 的内容程序设置如下

Read_Multiplebyte:

MOV Command,#0BFh 命令字节为BFh

MOV ByteCnt,#8 ; 多字节读出模式此模块为8 个

MOV R1,#RcvDat 数据地址覆给R1

ACALL Receive_Byte 调用读出数据子程序

RET 返回调用本子程序处

以上程序调用了基本数据接收(Receive_Byte)模块及一些内存单元定义, 其源程序清单在附录中给

出下面的程 序亦使用了这个模块

4. 单字节传送方式

例如写入8 时12 小时模式程序设置如下

Write_Singlebyte:

MOV Command,#84h ; 命令字节为84h

MOV ByteCnt,#1 ; 单字节传送模式

MOV R0,#XmtDat 数据地址覆给R0

MOV XmtDat,#88h 数据内容为88h

ACALL Send_Byte 调用写入数据子程序

RET 返回调用本子程序处



上面所列出的程序模块Write_Enable Write_Disable Osc_Enable Osc_Disable 与单字节写入模块Write_Singlebyte 的程序架构完全相同仅只是几个入口参数不同本文是为了强调功能使用的不同才将其分为不同模块另外,与涓流充电相关的设定也是单字节操作方式,这里就不再单独列出,用户在使用中可灵活简略.

下面模块举例说明如何单字节读出小时单元的内容.



Read_Singlebyte:

MOV Command,#85h ; 命令字节为85h

MOV ByteCnt,#1 ; 单字节传送模式

MOV R1,#RcvDat 数据地址覆给R1

ACALL Receive_Byte 调用读出数据子程序

RET 返回调用本子程序处



DS1302 应用电路原理图P87LPC764 单片机选取内部振荡及内部复位电路

附录数据发送与接收模块源程序清单

; CPU 工作频率最大不超过20MHz

;

; P87LPC762/4 主控器发送接受数据程序

; 说明本程序是利用Philips 公司的P87LPC764 单片机任何具有51 内核或其它合适的单片机都可在此

作为主控器的普通I/O 口(如P1.2/P1.3/P1.4)实现总线的功能对总线 上的器件本程序采用DS1302

进行读写操作命令字节在Command 传送字节数在ByteCnt 中所发送的数据在XmtDat 中所接收

的数据在RcvDat 中

;

;P87LPC762/4 主控器总线发送接受数据程序头文件

;内存数据定义

BitCnt data 30h ; 数据位计数器

ByteCnt data 31h ; 数据字节计数器

Command data 32h ; 命令字节地址

RcvDat DATA 40H ; 接收数据缓冲区

XmtDat DATA 50H ; 发送数据缓冲区

;端口位定义

IO_DATA bit P1.3 ; 数据传送总线

SCLK bit P1.4 ; 时钟控制总线

RST bit P1.2 ; 复位总线

;

;发送数据程序

;名称:Send_Byte

;描述:发送ByteCnt 个字节给被控器DS1302

;命令字节地址在Command 中

;所发送数据的字节数在ByteCnt 中发送的数据在XmtDat 缓冲区中

;

Send_Byte:

CLR RST ;复位引脚为低电平所有数据传送终止

NOP

CLR SCLK 清时钟总线

NOP

SETB RST ;复位引脚为高电平逻辑控制有效

NOP

MOV A,Command 准备发送命令字节

MOV BitCnt,#08h 传送位数为8

S_Byte0:

RRC A 将最低位传送给进位位C

MOV IO_DATA,C 位传送至数据总线

NOP

SETB SCLK 时钟上升沿发送数据有效

NOP

CLR SCLK 清时钟总线

DJNZ BitCnt,S_Byte0 位传送未完毕则继续

NOP

S_Byte1: 准备发送数据

MOV A,@R0 传送数据过程与传送命令相同

MOV BitCnt,#08h

S_Byte2:

RRC A

MOV IO_DATA,C

NOP

SETB SCLK

NOP

CLR SCLK

DJNZ BitCnt,S_Byte2

INC R0 发送数据的内存地址加1

DJNZ ByteCnt,S_Byte1 字节传送未完毕则继续

NOP

CLR RST 逻辑操作完毕清RST

RET

;接收数据程序;

;名称:Receive_Byte

;描述:从被控器DS1302 接收ByteCnt 个字节数据

;命令字节地址在Command 中

;所接收数据的字节数在ByteCnt 中接收的数据在RcvDat 缓冲区中

Receive_Byte:

CLR RST ;复位引脚为低电平所有数据传送终止

NOP

CLR SCLK 清时钟总线

NOP

SETB RST ;复位引脚为高电平逻辑控制有效

MOV A,Command 准备发送命令字节

MOV BitCnt,#08h 传送位数为8

R_Byte0:

RRC A 将最低位传送给进位位C

MOV IO_DATA,C 位传送至数据总线

NOP

SETB SCLK 时钟上升沿发送数据有效

NOP

CLR SCLK 清时钟总线

DJNZ BitCnt,R_Byte0 位传送未完毕则继续

NOP

R_Byte1: 准备接收数据

CLR A 清类加器

CLR C 清进位位C

MOV BitCnt,#08h 接收位数为8

R_Byte2:

NOP

MOV C,IO_DATA 数据总线上的数据传送给C

RRC A 从最低位接收数据

SETB SCLK 时钟总线置高

NOP

CLR SCLK 时钟下降沿接收数据有效

DJNZ BitCnt,R_Byte2 位接收未完毕则继续

MOV @R1,A 接收到的完整数据字节放入接收内存缓冲区

INC R1 接收数据的内存地址加1

DJNZ ByteCnt,R_Byte1 字节接收未完毕则继续

NOP

CLR RST 逻辑操作完毕清RST

RET

END

直流参数表:



主要电参数表:



交流参数表:



电容配置表:

五 : 时钟芯片DS1302的驱动程序

1 ds1302的程序,不是很简洁,占的程序空间有点长  2 3 程序:  4 5 //////////////////////////////////  6 //根据自己的接线改管脚定义  7 sbit DS1302_cs=P1^2;  8 sbit DS1302_data=P1^1;  9 sbit DS1302_clk=P1^0;  10 sbit ACC0=ACC^0;  11 sbit ACC7=ACC^7;  12 //////////////////////////////////  13 #define uchar unsigned char  14 #define uint unsigned int  15 16 uchar year,month,date,hour,minute,second,week;//定义变量  17 18 //////////////////////////////////  19 //函数声明  20 oid DS1302_init();//ds1302初始化 21 void DS1302_write(unsigned char DS1302_temp); //写入一个字节 22 uchar DS1302_read(void); //读一字节 23 void DS1302_write_time(int command,int dat);//写入second or minute or hour...... or 写入一个命令 24 uchar DS1302_read_time(int command);//读取second or minute or hour......  25 void DS1302_readdate();  26 void DS1302_writedate();  27 void long_ds1302_delay() //长延时  28 void short_ds1302_delay();//短延时  29 ////////////////////////////////// 30 31 32 void short_ds1302_delay()  33 {  34 uchar i;  35 for(i=0;i<5;i++);  36 }  37 38 void long_ds1302_delay()  39 {  40 uchar i;  41 for(i=0;i<25;i++);  42 }  43 44 void DS1302_write(unsigned char DS1302_temp) //写入一个字节 45 {  46 uchar i,temp;  47 long_ds1302_delay();  48 temp=DS1302_temp;  49 for(i=0;i<8;i++)  50 {  51 DS1302_data=temp&0x01;  52 short_ds1302_delay();  53 DS1302_clk=1;  54 short_ds1302_delay();  55 DS1302_clk=0;  56 temp=temp>>1;  57 }  58 }  59 60 unsigned char DS1302_read(void) //读一字节 61 {  62 uchar i,temp;  63 long_ds1302_delay();  64 temp=0;  65 for(i=0;i<8;i++)  66 {  67 temp=temp>>1;  68 if(DS1302_data==1)  69 temp=temp+0x80;  70 DS1302_clk=1;  71 short_ds1302_delay();  72 DS1302_clk=0;  73 short_ds1302_delay();  74 }  75 return temp;  76 }  77 /*  78 /////////写操作设置,当a=0x80时禁止写操作,a=0x00时允许////////////////  79 80 void DS1302_write_able(unsigned char a)  81 {  82 DS1302_cs=0;  83 84 DS1302_clk=0;  85 short_ds1302_delay();  86 DS1302_cs=1;  87 DS1302_write(0x8e);  88 DS1302_data=1;  89 DS1302_write(a);  90 DS1302_cs=0;  91 short_ds1302_delay();  92 DS1302_clk=1;  93 }  94 95 /////////读操作设置,当a=0x80时禁止读操作,a=0x00时允许////////////////  96 97 void DS1302_read_able(unsigned char a)  98 {  99 DS1302_cs=0; 100 101 DS1302_clk=0; 102 short_ds1302_delay(); 103 DS1302_cs=1; 104 DS1302_write(0x8f); 105 DS1302_data=1; 106 DS1302_write(a); 107 DS1302_cs=0; 108 short_ds1302_delay(); 109 DS1302_clk=1; 110 } 111 */ 112 ////////////////////ds1302初始化//////////////////////// 113 void DS1302_init() 114 { 115 uchar i; 116 DS1302_write_time(0x8e,0x00); //允许写操作 117 118 DS1302_cs=0; 119 120 DS1302_clk=0; 121 short_ds1302_delay(); 122 DS1302_cs=1; 123 DS1302_write(0x81); 124 DS1302_data=1; 125 i=DS1302_read(); 126 DS1302_cs=0; 127 short_ds1302_delay(); 128 DS1302_clk=1; 129 second=((i>>4)&0x07)*10+(i&0x0f); 130 131 DS1302_clk=0; 132 short_ds1302_delay(); 133 DS1302_cs=1; 134 DS1302_write(0x80); 135 DS1302_data=1; 136 DS1302_write(0x7f&i); 137 DS1302_cs=0; 138 short_ds1302_delay(); 139 DS1302_clk=1; 140 141 DS1302_clk=0; //充电设置 142 short_ds1302_delay(); 143 DS1302_cs=1; 144 DS1302_write(0x90); 145 DS1302_data=1; 146 // DS1302_write(0xa6); //允许充电,一个二极管 4k电阻 147 DS1302_write(0x00); //禁止充电 148 DS1302_cs=0; 149 short_ds1302_delay(); 150 DS1302_clk=1; 151 152 DS1302_write_time(0x8e,0x80); //禁止写操作 153 } 154 155 unsigned char DS1302_read_time(int command)//读取second or minute or hour...... 156 { 157 uchar i; 158 DS1302_clk=0; 159 short_ds1302_delay(); 160 DS1302_cs=1; 161 DS1302_write(command); 162 DS1302_data=1; 163 i=DS1302_read(); 164 DS1302_cs=0; 165 short_ds1302_delay(); 166 DS1302_clk=1; 167 return i; 168 } 169 void DS1302_readdate() 170 { 171 uchar i; 172 DS1302_cs=0; 173 174 //读取second 175 i=DS1302_read_time(0x81); 176 second=((i>>4)&0x07)*10+(i&0x0f); 177 178 //读取分minute 179 i=DS1302_read_time(0x83); 180 minute=((i>>4)&0x07)*10+(i&0x0f); 181 182 //读取时hour 183 i=DS1302_read_time(0x85); 184 hour=((i>>4)&0x03)*10+(i&0x0f); 185 186 //读取日date 187 i=DS1302_read_time(0x87); 188 date=((i>>4)&0x03)*10+(i&0x0f); 189 190 //读取月份month 191 i=DS1302_read_time(0x89); 192 month=((i>>4)&0x01)*10+(i&0x0f); 193 194 //读取周week 195 i=DS1302_read_time(0x8b); 196 week=i&0x07; 197 198 //读取年份year 199 i=DS1302_read_time(0x8d); 200 year=((i>>4)&0x0f)*10+(i&0x0f); 201 } 202 203 204 void DS1302_write_time(int command,int dat)//写入second or minute or hour...... or 写入一个命令 205 { 206 DS1302_clk=0; 207 short_ds1302_delay(); 208 DS1302_cs=1; 209 DS1302_write(command); 210 DS1302_data=1; 211 DS1302_write(dat); 212 DS1302_cs=0; 213 short_ds1302_delay(); 214 DS1302_clk=1; 215 } 216 217 void DS1302_writedate() 218 { 219 220 DS1302_write_time(0x8e,0x00); //允许写操作 221 DS1302_cs=0; 222 DS1302_write_time(0x80,0x7f&(((second/10)<<4)+(second%10))); //写second 223 DS1302_write_time(0x82,0x7f&(((minute/10)<<4)+(minute%10))); //minute 224 DS1302_write_time(0x84,0x3f&(((hour/10)<<4)+(hour%10))); //hour 225 DS1302_write_time(0x86,0x3f&(((date/10)<<4)+(date%10))); //date 226 DS1302_write_time(0x88,0x1f&(((month/10)<<4)+(month%10))); //month 227 DS1302_write_time(0x8a,0x07&week); //week 228 DS1302_write_time(0x8c,((year/10)<<4)+(year%10)); //year 229 DS1302_write_time(0x8e,0x80); //禁止写操作 230 }

本文标题:时钟芯片ds1302-时钟芯片DS1302中文资料
本文地址: http://www.61k.com/1057391.html

61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1