DS1302菜鸟级讲解
时钟芯片DS1302的用法
单片机玩到此时,很想玩TFT真彩屏,但如果不玩一玩汉显字符液晶屏,就总觉得少了些什么,说实话,我对时钟制作并不很感兴趣,因为家里走针的、蹦字的计时器、定时器大小有七八个,还不算手机和电脑的时钟,而要想玩汉显屏,则做时钟算是最合适的了,也难怪杜洋老师会在这上下功夫,毕竟没有那家公司会让咱初学者去搞工控或商品。
前些时,在网上淘了一只LCD-12864模块,已经点亮并通过了简单的测试,准备做杜洋的时钟,准备技术资料时,在网上找到了一篇关于时钟芯片DS1302的应用文章,觉得不错,转帖于此以资共享。
时钟芯片DS1302可靠起振的方法作者:不详出处:不详DS1302是Dallas公司生产的一种实时时钟芯片。
它通过串行方式与单片机进行数据传送,能够向单片机提供包括秒、分、时、日、月、年等在内的实时时间信息,并可对月末日期、闰年天数自动进行调整;它还拥有用于主电源和备份电源的双电源引脚,在主电源关闭的情况下,也能保持时钟的连续运行。
另外,它还能提供31字节的用于高速数据暂存的RAM。
鉴于上述特点,DS1302已在许多单片机系统中得到应用,为系统提供所需的实时时钟信息。
一、 DS1302的主要特性1. 引脚排列图1 DS1302引脚排列图(见附图)DS1302的引脚排列如图1所示,各引脚的功能如下:X1,X2——32768Hz晶振引脚端; RST——复位端; I/O——数据输入/输出端;SCLK——串行时钟端; GND——地; VCC2,VCC1——主电源与后备电源引脚端。
2. 主要功能: DS1302时钟芯片内主要包括移位寄存器、控制逻辑电路、振荡器、实时时钟电路以及用于高速暂存的31字节RAM。
DS1302与单片机系统的数据传送依靠RST,I/O,SCLK三根端线即可完成。
其工作过程可概括为:首先系统RST引脚驱动至高电平,然后在作用于SCLK时钟脉冲的作用下,通过I/O引脚向DS1302输入地址/命令字节,随后再在SCLK时钟脉冲的配合下,从I/O引脚写入或读出相应的数据字节。
DS1302菜鸟级讲解
12.4 DS1302 的 RAM DS1302 真的很厚道,还设立了 31 个字节的 RAM 空间,RAM 空间的开始地址字节是 0x94。RAM 空间可以让使用着任意发挥,你可以把它当做外存储器,但是前提 DS1302 必须一直供电。要访问任意空间也很简单,如下表:
再重申一次,读一个字节和写一个字节是不一样,在 写一个字节 的时候,AVR 的 IO 口一 直保持输出状态,相反的在 读一个字节的时候 AVR 的 IO 口先是输出状态,然后是输入状 态,且必须改变时钟信号的顺序。(补充一点题外话,我在编辑时序的时候,由于疏忽了一 点“小错误”,后果却是很严重。)
12.3 DS1302 时钟|日期|控制|爆发寄存器 在介绍 DS1302 的时序图中不都是,先地址字节,然后数据字节码?那么地址字 节和数据字节又有什么关系呢?(看看下面的图)
我们一个一个寄存器来看吧:
第一:秒钟寄存器 地址字节;0x80 其实呀,我很佩服该芯片的设计人员,将芯片设计得很贴心,为什么呢?因为秒钟寄存 器,除了记 录秒钟以外,还控制了 DS1302 的时钟开关(晶振开始工作,或者晶振禁止 工作)。该位第 7 位 CH,当写入逻辑 1 时 DS1302 停止工作,时间的计时保持最后一次 的状态,如果写入逻辑 0 DS1302 则开始工作,时间从最后一次状态中继续计时。
慧净小店: 开发板超市:/hlmcu
慧争电子免费共享资料、欢迎复制共享、没有版权。 HJ-2G 多功能 AVR/51 二合一开发板学习笔记
上面的图说明了每个寄存器的定义和地址字节,而每个地址字节的 LSB 可以是 0 或者 1,逻辑 0 代 表写,逻辑 1 代表读。如果忽略每个地址字节的 LSB,十六进制则是 0x80+i,而 i 每一次累加 2。
ds1302用法
ds1302用法时钟ic_ds1302的应用之一……基础知识2021-11-0613:09在网上看了很久,发现初学者最有兴趣的就是ds1302时钟电路,也很自然,它是个做出来就让你觉得最实用的电路了,但实际上制做上并不简单,首先你要让你的显示部分(不管是数码管还是lcd)调试通过。
然后把ds1302接好,调试正确了才能在成功显示时间和日期。
下面我们就来说说ds1302的用法。
ds1302的图如下:ds1302就是美国dallas公司面世的一种高性能、低功耗的实时时钟芯片,额外31字节静态ram,使用spi三线USB与cpu展开同步通信,并可以使用突发性方式一次传输多个字节的时钟信号和ram数据。
实时时钟可以提供更多秒、分后、时、日、星期、月和年,一个月大与31天时可以自动调整,且具备闰年补偿功能。
工作电压长约2.5~5.5v。
使用双电源供电(主电源和水泵电源),可以设置水泵电源电池方式,提供更多了对后背电源展开涓细电流电池的能力。
下面就是标准的接线电路图:各引脚功能如下:插槽号名称功能①vcc2主电源②、③x1,x2接32768hz晶振④gnd地线⑤rst复位⑥i/0数据输入输出⑦sclk串行时钟⑧vccl后备电源ds1302有关日历、时间的寄存器共计12个,其中存有7个寄存器(念时81h~8dh,写下时80h~8ch)就是放置秒、分后,小时、日、月、年、周数据的,放置的数据格式为bcd码形式它的内部时间寄存器如下:这张表呢是ds1302内部的7个与时间、日期有关的寄存器图和一个写保护寄存器,我们要做的就是将初始设置的时间、日期数据写入这几个寄存器,然后再不断地读取这几个寄存器来获取实时时间和日期。
这几个寄存器的说明如下:1、秒寄存器(81h、80h)的位7定义为时钟暂停标志(ch)。
当起始上电时该边线为1,时钟振荡器暂停,ds1302处在低功耗状态;只有将秒寄存器的该边线重写为0时,时钟就可以开始运行。
DS1302详尽资料
1.DS1302 涓流充电时钟保持芯片的原理与应用摘要本文概括介绍了DS1302 时钟芯片的特点和基本组成通过实例详细说明了有关功能的应用软件关于 DS1302 各寄存器的详细位控功能请参考DALLAS 达拉斯公司的相应产品资料概述DS1302 是DALLAS 公司推出的涓流充电时钟芯片内含有一个实时时钟/日历和31 字节静态RAM 通过简单的串行接口与单片机进行通信实时时钟/日历电路提供秒分时日日期月年的信息每月的天数和闰年的天数可自动调整时钟操作可通过AM/PM 指示决定采用24 或12 小时格式DS1302 与单片机之间能简单地采用同步串行的方式进行通信仅需用到三个口线1 RES 复位2 I/O 数据线3 SCLK串行时钟时钟/RAM 的读/写数据以一个字节或多达31 个字节的字符组方式通信DS1302 工作时功耗很低保持数据和时钟信息时功率小于1mWDS1302 是由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 的管脚排列及描述如下图及表所示管脚描述X1 X2 32.768KHz 晶振管脚GND 地RST 复位脚I/O 数据输入/输出引脚SCLK 串行时钟Vcc1,Vcc2 电源供电管脚订单信息部分# 描述DS1302 串行时钟芯片8 脚DIPDS1302S 串行时钟芯片8 脚SOIC 200milDS1302Z 串行时钟芯片8 脚SOIC 150mil2. 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 2K10 R2 4K11 R3 8K管脚配置DS1302 与微控制器的接口软件及功能应用举例下面首先给出基本的接口软件然后举例说明各种功能的应用1 写保护寄存器操作当写保护寄存器的最高位为0 时允许数据写入寄存器写保护寄存器可以通过命令字节8E 8F 来规定禁止写入/读出写保护位不能在多字节传送模式下写入Write_Enable:MOV Command,#8Eh ;命令字节为8EMOV ByteCnt,#1 ;单字节传送模式MOV R0,#XmtDat 数据地址覆给R0MOV XmtDat,#00h 数据内容为0 写入允许ACALL Send_Byte 调用写入数据子程序RET 返回调用本子程序处当写保护寄存器的最高位为1 时禁止数据写入寄存器Write_Disable:MOV Command,#8Eh ;命令字节为8EMOV ByteCnt,#1 ;单字节传送模式MOV R0,#XmtDat 数据地址覆给R0MOV XmtDat,#80h 数据内容为80h 禁止写入ACALL Send_Byte 调用写入数据子程序RET 返回调用本子程序处以上程序调用了基本数据发送(Send_Byte)模块及一些内存单元定义, 其源程序清单在附录中给出下面的程序亦使用了这个模块2 时钟停止位操作当把秒寄存器的第7 位时钟停止位设置为0 时起动时钟开始Osc_Enable:MOV Command,#80h ; 命令字节为80MOV ByteCnt,#1 ; 单字节传送模式MOV R0,#XmtDat 数据地址覆给R0MOV XmtDat,#00h 数据内容为0 振荡器工作允许ACALL Send_Byte 调用写入数据子程序RET 返回调用本子程序处当把秒寄存器的第7 位时钟停止位设置为1 时时钟振荡器停止HT1380 进入低功耗方式Osc_Disable:MOV Command,#80h ;命令字节为80MOV ByteCnt,#1 ;单字节传送模式MOV R0,#XmtDat 数据地址覆给R0MOV 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 ;命令字节为BEhMOV ByteCnt,#8 ;多字节写入模式此模块为8 个MOV R0,#XmtDat 数据地址覆给R0MOV XmtDat,#59h 秒单元内容为59h5MOV XmtDat+1,#59h 分单元内容为59hMOV XmtDat+2,#13h 时单元内容为13hMOV XmtDat+3,#21h 日期单元内容为21hMOV XmtDat+4,#06h 月单元内容为06hMOV XmtDat+5,#03h 星期单元内容为03hMOV XmtDat+6,#0 年单元内容为00hMOV XmtDat+7,#0 写保护单元内容为00hACALL Send_Byte 调用写入数据子程序RET 返回调用本子程序处读出寄存器0-7 的内容程序设置如下Read_Multiplebyte:MOV Command,#0BFh ;命令字节为BFhMOV ByteCnt,#8 ;多字节读出模式此模块为8 个MOV R1,#RcvDat 数据地址覆给R1ACALL Receive_Byte 调用读出数据子程序RET 返回调用本子程序处以上程序调用了基本数据接收(Receive_Byte)模块及一些内存单元定义, 其源程序清单在附录中给出下面的程序亦使用了这个模块4. 单字节传送方式例如写入8 时12 小时模式程序设置如下Write_Singlebyte:MOV Command,#84h ; 命令字节为84hMOV ByteCnt,#1 ; 单字节传送模式MOV R0,#XmtDat 数据地址覆给R0MOV XmtDat,#88h 数据内容为88hACALL Send_Byte 调用写入数据子程序RET 返回调用本子程序处上面所列出的程序模块Write_Enable Write_Disable Osc_Enable Osc_Disable与单字节写入模块Write_Singlebyte 的程序架构完全相同仅只是几个入口参数不同本文是为了强调功能使用的不同才将其分为不同模块另外,与涓流充电相关的设定也是单字节操作方式,这里就不再单独列出,用户在使用中可灵活简略下面模块举例说明如何单字节读出小时单元的内容.Read_Singlebyte:MOV Command,#85h ; 命令字节为85hMOV ByteCnt,#1 ; 单字节传送模式MOV R1,#RcvDat 数据地址覆给R1ACALL Receive_Byte 调用读出数据子程序RET 返回调用本子程序处6DS1302 应用电路原理图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 ;复位引脚为低电平所有数据传送终止NOPCLR SCLK 清时钟总线NOP7SETB RST ;复位引脚为高电平逻辑控制有效NOPMOV A,Command 准备发送命令字节MOV BitCnt,#08h 传送位数为8S_Byte0:RRC A 将最低位传送给进位位CMOV IO_DATA,C 位传送至数据总线NOPSETB SCLK 时钟上升沿发送数据有效NOPCLR SCLK 清时钟总线DJNZ BitCnt,S_Byte0 位传送未完毕则继续NOPS_Byte1: 准备发送数据MOV A,@R0 传送数据过程与传送命令相同MOV BitCnt,#08hS_Byte2:RRC AMOV IO_DATA,CNOPSETB SCLKNOPCLR SCLKDJNZ BitCnt,S_Byte2INC R0 发送数据的内存地址加1DJNZ ByteCnt,S_Byte1 字节传送未完毕则继续NOPCLR RST 逻辑操作完毕清RSTRET;*************************************************************************************** ;接收数据程序;;名称:Receive_Byte;描述:从被控器DS1302 接收ByteCnt 个字节数据;命令字节地址在Command 中;所接收数据的字节数在ByteCnt 中接收的数据在RcvDat 缓冲区中;*********************************************************************************** Receive_Byte:CLR RST ;复位引脚为低电平所有数据传送终止NOPCLR SCLK 清时钟总线NOPSETB RST ;复位引脚为高电平逻辑控制有效MOV A,Command 准备发送命令字节8MOV BitCnt,#08h 传送位数为8R_Byte0:RRC A 将最低位传送给进位位CMOV IO_DATA,C 位传送至数据总线NOPSETB SCLK 时钟上升沿发送数据有效NOPCLR SCLK 清时钟总线DJNZ BitCnt,R_Byte0 位传送未完毕则继续NOPR_Byte1: 准备接收数据CLR A 清类加器CLR C 清进位位CMOV BitCnt,#08h 接收位数为8R_Byte2:NOPMOV C,IO_DATA 数据总线上的数据传送给CRRC A 从最低位接收数据SETB SCLK 时钟总线置高NOPCLR SCLK 时钟下降沿接收数据有效DJNZ BitCnt,R_Byte2 位接收未完毕则继续MOV @R1,A 接收到的完整数据字节放入接收内存缓冲区INC R1 接收数据的内存地址加1DJNZ ByteCnt,R_Byte1 字节接收未完毕则继续NOPCLR RST 逻辑操作完毕清RSTRET;========================================================================== END。
DS1302概述
DS1302有关RAM的地址 DS1302中附加31字节静态RAM的地址
DS1302的工作模式寄存器 所谓突发模式是指一次传送多个字节的时钟信号和RAM数据。 突发模式寄存器
DS1302充电寄存器
寄存器地址是08H 读操作是91H 写操作是90H
2-3位:
0-1位:
DS=01 为一个二极管 DS=10 为二个二极管 DS=00 无二极管,不能充电 DS=11 无二极管,不能充电 RS=00 无电阻,不能充电 RS=01 2K RS=10 4K RS=11 8K
DS1302读写时序 DS1302是SPI总线驱动方式。它不仅要向寄存器写入控制字, 还需要读取相应寄存器的数据。 要想与DS1302通信,首先要先了解DS1302的控制字。DS1302的控制字如图
控制字的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。 位6:如果为0,则表示存取日历时钟数据,为1表示存取RAM数据; 位5至位1(A4~A0):指示操作单元的地址; 位0(最低有效位):如为0,表示要进行写操作,为1表示进行读操作。 读数据: 读数据时在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据, 读出的数据是从最低位到最高位。 写数据: 控制字总是从最低位开始输出。在控制字指令输入后的下一个SCLK时钟的上升沿时, 数据被写入DS1302,数据输入也是从最低位(0位)开始。
DS1302时钟芯片
DS1302时钟芯片
DS1302是美国DALLAS公司推出的一种高性能、 低功耗的实时时钟芯片,附加31字节静态RAM, 采用SPI三线接口与CPU进行通信,并可采用突发 方式一次传送多个字节的时钟信号和RAM数据。 实时时钟可提供秒、分、时、日、星期、月和年, 一个月小与31天时可以自动调整,且具有闰年补 偿功能。工作电压宽达2.5~5.5V。采用双电源供 电(主电源和备用电源),可设置备用电源充电 方式,提供了对后备电源进行涓细电流充电的能 力。
ds1302教程(精)
0或1 0 或1 第12页
RAM突发模式
泉州信息职业技术学院
第12章 时钟芯片1302
2.日历、时钟寄存器 DS1302共有12个寄存器,其中有7个与日历、时钟 相关,存放的数据为BCD码形式。日历、时钟寄存器 的格式如表。
寄存器名称 取值范围
秒寄存器 00~59 D7 CH D6 D5 D4 D3 D2 D1 D0 秒的个位
01
无
R1
无
2K
10
11
R2
R3
4K
8K
2018/9/15
泉州信息职业技术学院
第17页
第12章 时钟芯片1302
3.片内RAM
DS1302片内有31个RAM单元,对片内RAM 的操作有两种方式:单字节方式和多字节方式。 当控制命令字为C0H~FDH时为单字节读写方 式,命令字中的D5~D1用于选择对应的RAM 单元,其中奇数为读操作,偶数为写操作。 当控制命令字为FEH、FFH时为多字节操作 (表中的RAM突发模式),多字节操作可一 次把所有的RAM单元内容进行读写。FEH为 写操作,FFH为读操作。
说明: (1)数据都以BCD码形式。 (2)小时寄存器的D7位为12小时制/24小时制 的选择位,当为1时选12小时制,当为0时选24小
时制。当12小时制时,D5位为1是上午,D5位为0
超详细的ds1302使用说明及其例程
DS1302时钟芯片简介
DS1302是 DALLAS 公司推出的涓流充电时钟芯片,内含一个实时时钟/日历和31字节静 态 RAM,可以通过串行接口与单片机进行通信。实时时钟/日历电路提供秒、分、时、日、 星期、月、年的信息,每个月的天数和闰年的天数可自动调整,时钟操作可通过 AM/PM 标 志位决定采用24或12小时时间格式。DS1302与单片机之间能简单地采用同步串行的方式进 行通信,仅需三根 I/O 线:复位(RST)、I/O 数据线、串行时钟(SCLK)。时钟/RAM 的读 /写数据以一字节或多达31字节的字符组方式通信。DS1302工作时功耗很低,保持数据和时 钟信息时,功耗小于1mW。
Write1302 (WRITE_PROTECT,0x80); 允许写保护
}
//十六进制转十
//禁止写保 //秒位初始 //分钟初始化
// //
51单片机综合学习系统之 DS1302时钟应用篇 《电子制作》2008年10月 站长原创,如 需引用请注明出处
大家好,通过以前的学习,我们已经对51单片机综合学习系统的使用方法及学习方式有 所了解与熟悉,学会了使用 AD 模数转换的基本知识,体会到了综合学习系统的易用性与易 学性,这一期我们将一起学习 DS1302时钟的基本原理与应用实例。
51单片机综合学习系统之 DS1302时钟应用篇
51单片机综合学习系统之DS1302时钟应用篇大家好,通过以前的学习,我们已经对51单片机综合学习系统的使用方法及学习方式有所了解与熟悉,学会了使用AD模数转换的基本知识,体会到了综合学习系统的易用性与易学性,这一期我们将一起学习DS1302时钟的基本原理与应用实例。
先看一下我们将要使用的51单片机综合学习系统能完成哪些实验与产品开发工作:分别有流水灯,数码管显示,液晶显示,按键开关,蜂鸣器奏乐,继电器控制,IIC总线,SPI总线,PS/2实验,AD模数转换,光耦实验,串口通信,红外线遥控,无线遥控,温度传感,步进电机控制等等。
主体系统如图1所示,其配套书本教程《单片机快速入门》如图2所示。
图151单片机综合学习系统主机部分图片图251单片机综合学习系统配套书本教程——《单片机快速入门》上图是我们将要使用的51单片机综合学习系统硬件平台,如图1所示,本期实验我们用到了综合系统主机、板载的DS1302时钟芯片,综合系统其它功能模块原理与使用详见前几期《电子制作》杂志及后期连载教程介绍。
在很多单片机系统中都要求带有实时时钟电路,如最常见的数字钟、钟控设备、数据记录仪表,这些仪表往往需要采集带时标的数据,同时一般它们也会有一些需要保存起来的重要数据,有了这些数据,便于用户后期对数据进行观察、分析。
本小节就介绍市面上常见的时钟芯片DS1302的应用。
DS1302是美国DALLAS公司推出的一款高性能、低功耗、带内部RAM的实时时钟芯片(RTC),也就是一种能够为单片机系统提供日期和时间的芯片。
通过本小节的学习,我们将会把RTC相关的一些技术粗略介绍一下,然后介绍DS1302与单片机之间的软硬件应用。
DS1302时钟芯片简介DS1302是DALLAS公司推出的涓流充电时钟芯片,内含一个实时时钟/日历和31字节静态RAM,可以通过串行接口与单片机进行通信。
实时时钟/日历电路提供秒、分、时、日、星期、月、年的信息,每个月的天数和闰年的天数可自动调整,时钟操作可通过AM/PM标志位决定采用24或12小时时间格式。
DS1302通俗易懂的教程
DS1302通俗易懂的教程晨辉教你轻松学51--------外围芯片之ds1302和ds18b20对于市面上的大多数51单片机开发板来说。
ds1302和ds18b20应该是比较常见的两种外围芯片。
ds1302是具有SPI总线接口的时钟芯片。
ds18b20则是具有单总线接口的数字温度传感器。
下面让我们分别来认识并学会应用这两种芯片。
首先依旧是看DS1302的datasheet中的相关介绍。
上面是它的一些基本的应用介绍。
下面是它的引脚的描述。
下面是DS1302的时钟寄存器。
我们要读取的时间数据就是从下面这些数据寄存器中读取出来的。
当我们要想调整时间时,可以把时间数据写入到相应的寄存器中就可以了。
这是DS1302内部的31个RAM寄存器。
在某些应用场合我们可以应用到。
如我们想要做一个带定时功能的闹钟。
则可以把闹钟的时间写入到31个RAM寄存器中的任意几个。
当单片机掉电时,只要我们的DS1302的备用电池还能工作,那么保存在其中的闹钟数据就不会丢失~~由于对于这些器件的操作基本上按照数据手册上面提供的时序图和相关命令字来进行操作就可以了。
因此在我们应用这些器件的时候一定要对照着手册上面的要求来进行操作。
如果觉得还不够放心的话。
可以到网上下载一些参考程序。
对着手册看别人的程序,看别人的思路是怎么样的。
DS1302和单片机的连接很简单。
只需一根复位线,一根时钟线,一根数据线即可。
同时它本身还需要接一个32.768KHz的晶振来提供时钟源。
对于晶振的两端可以分别接一个6PF左右的电容以提高晶振的精确度。
同时可以在第8脚接上一个3.6V的可充电的电池。
当系统正常工作时可以对电池进行涓流充电。
当系统掉电时,DS1302由这个电池提供的能量继续工作。
下面让我们来驱动它。
sbit io_DS1302_RST = P2^0 ;sbit io_DS1302_IO = P2^1 ;sbit io_DS1302_SCLK = P2^2 ;//-------------------------------------常数宏---------------------------------//#define DS1302_SECOND_WRITE 0x80 //写时钟芯片的寄存器位置#define DS1302_MINUTE_WRITE 0x82#define DS1302_HOUR_WRITE 0x84#define DS1302_WEEK_WRITE 0x8A#define DS1302_DAY_WRITE 0x86#define DS1302_MONTH_WRITE 0x88#define DS1302_YEAR_WRITE 0x8C#define DS1302_SECOND_READ 0x81 //读时钟芯片的寄存器位置#define DS1302_MINUTE_READ 0x83#define DS1302_HOUR_READ 0x85#define DS1302_WEEK_READ 0x8B#define DS1302_DAY_READ 0x87#define DS1302_MONTH_READ 0x89#define DS1302_YEAR_READ 0x8D//-----------------------------------操作宏----------------------------------//#define DS1302_SCLK_HIGH io_DS1302_SCLK = 1 ;#define DS1302_SCLK_LOW io_DS1302_SCLK = 0 ;#define DS1302_IO_HIGH io_DS1302_IO = 1 ;#define DS1302_IO_LOW io_DS1302_IO = 0 ;#define DS1302_IO_READ io_DS1302_IO#define DS1302_RST_HIGH io_DS1302_RST = 1 ;#define DS1302_RST_LOW io_DS1302_RST = 0 ;/******************************************************* 保存时间数据的结构体 *******************************************************/struct{uint8 Second ;uint8 Minute ;uint8 Hour ;uint8 Day ;uint8 Week ;uint8 Month ;uint8 Year ;}CurrentTime ;/************************************************************** **************** * Function: static void v_DS1302Write_f( uint8 Content ) ** Description:向DS1302写一个字节的内容 ** Parameter:uint8 Content : 要写的字节 ** **************************************************************** ***************/static void v_DS1302Write_f( uint8 Content ){uint8 i ;for( i = 8 ; i > 0 ; i-- ){if( Content & 0x01 ){DS1302_IO_HIGH}else{DS1302_IO_LOW}Content >>= 1 ;DS1302_SCLK_HIGHDS1302_SCLK_LOW}}/************************************************************** **************** * Function: static uint8 v_DS1302Read_f( void ) * * Description: 从DS1302当前设定的地址读取一个字节的内容* * Parameter: ** Return: 返回读出来的值(uint8) **************************************************************** ***************/static uint8 v_DS1302Read_f( void ){uint8 i, ReadValue ;DS1302_IO_HIGHfor( i = 8 ; i > 0 ; i-- ){ReadValue >>= 1 ;if( DS1302_IO_READ ){ReadValue |= 0x80 ;}else{ReadValue &= 0x7f ;}DS1302_SCLK_HIGHDS1302_SCLK_LOW}return ReadValue ;}/************************************************************** **************** * Function: void v_DS1302WriteByte_f( uint8 Address, uint8 Content ) ** Description: 从DS1302指定的地址写入一个字节的内容 ** Parameter: Address: 要写入数据的地址 ** Content: 写入数据的具体值 **Return: * ******************************************************************* ***********/ void v_DS1302WriteByte_f( uint8 Address, uint8 Content ){DS1302_RST_LOWDS1302_SCLK_LOWDS1302_RST_HIGHv_DS1302Write_f( Address ) ;v_DS1302Write_f( Content ) ;DS1302_RST_LOWDS1302_SCLK_HIGH}/************************************************************** **************** * Function: uint8 v_DS1302ReadByte_f( uint8 Address ) ** Description:从DS1302指定的地址读出一个字节的内容 ** Parameter:Address: 要读出数据的地址 ** ** Return: 指定地址读出的值(uint8) **************************************************************** ***************/ uint8 v_DS1302ReadByte_f( uint8 Address ) {uint8 ReadValue ;DS1302_RST_LOWDS1302_SCLK_LOWDS1302_RST_HIGHv_DS1302Write_f( Address ) ;ReadValue = v_DS1302Read_f() ;DS1302_RST_LOWDS1302_SCLK_HIGHreturn ReadValue ;}/************************************************************** **************** * Function: void v_ClockInit_f( void ) * * Description:初始化写入DS1302时钟寄存器的值(主程序中只需调用一次即可) **Parameter:** ** Return: **************************************************************** ***************/ void v_ClockInit_f( void ){if( v_DS1302ReadByte_f( 0xc1) != 0xf0 ){v_DS1302WriteByte_f( 0x8e, 0x00 ) ; //允许写操作v_DS1302WriteByte_f( DS1302_YEAR_WRITE, 0x08 ) ; //年v_DS1302WriteByte_f( DS1302_WEEK_WRITE, 0x04 ) ; //星期v_DS1302WriteByte_f( DS1302_MONTH_WRITE, 0x12 ) ; //月v_DS1302WriteByte_f( DS1302_DAY_WRITE, 0x11 ) ; //日v_DS1302WriteByte_f( DS1302_HOUR_WRITE, 0x13 ) ; //小时v_DS1302WriteByte_f( DS1302_MINUTE_WRITE, 0x06 ) ; //分钟v_DS1302WriteByte_f( DS1302_SECOND_WRITE, 0x40 ) ; //秒v_DS1302WriteByte_f( 0x90, 0xa5 ) ; //充电v_DS1302WriteByte_f( 0xc0, 0xf0 ) ; //判断是否初始化一次标识写入v_DS1302WriteByte_f( 0x8e, 0x80 ) ; //禁止写操作}}/************************************************************** **************** * Function: void v_ClockUpdata_f( void ) * * Description:读取时间数据,并保存在结构体CurrentTime中 * *Parameter:** **Return:**************************************************************** ***************/ void v_ClockUpdata_f( void ){CurrentTime.Second =v_DS1302ReadByte_f( DS1302_SECOND_READ ) ;CurrentTime.Minute = v_DS1302ReadByte_f( DS1302_MINUTE_READ ) ;CurrentTime.Hour = v_DS1302ReadByte_f( DS1302_HOUR_READ ) ;CurrentTime.Day = v_DS1302ReadByte_f( DS1302_DAY_READ ) ;CurrentTime.Month = v_DS1302ReadByte_f( DS1302_MONTH_READ ) ;CurrentTime.Week = v_DS1302ReadByte_f( DS1302_WEEK_READ ) ;CurrentTime.Year = v_DS1302ReadByte_f( DS1302_YEAR_READ ) ;}有了上面的这些函数我们就可以对DS1302进行操作了。
单片机学习项目 (12) 实时时钟DS1302的原理与应用
单片机学习项目项目12-实时时钟DS1302的原理与应用一:电路原理图利用数码管显示时间,可以在电子表电路基础上连接DS1302完成,见图5-3-3所示。
6反相器74HC04为动态显示的数码管阳极驱动,中间非门省略。
图中数码管的驱动采用74HC573。
DS1302的SCLK接单片机P3.7, I/O(SDA)端口接P1.0,RST接P1.1;DS1302的X1和X2接32768Hz的标准时钟晶振。
一:程序设计主程序主用作用是调用DS1302子程序,把读取到的是时间信息通过数码管显示出来,由于采用动态显示,因此主程序中要用到定时器中断。
分页显示在定时器中断服务函数中进行。
程序清单如下:#include<reg51.h>#include”ds1302.c”uchar cp1,cp2,cp3;code uchar seven_seg[10] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};code uchar seg_bit[] ={0x01,0x02,0x04,0x08,0x10,0x20};uchar flash;bit conv;void time0_isr(void) interrupt 1 //利用中断对数码管上显示的数据进行刷新{TH0= (65536 –2000) / 256;TL0= (65536 –2000) % 256;cp1++;if(cp1>= 250)//0.5秒{cp1= 0;flash= ~flash; //产生小数点闪烁变量cp2++;if(cp2>= 5){conv= !conv;//产生交替显示变量cp2= 0;}}P0= 0xff;//消隐if(conv== 1){switch(cp3){case0:P0 = seven_seg[sec % 10];break;case1:P0 = seven_seg[sec / 10];break;case2:P0 = seven_seg[min % 10] & (0x7f | flash);break;case3:P0 = seven_seg[min / 10];break;case4:P0 = seven_seg[hour % 10] & (0x7f | flash);break;case5:P0 = seven_seg[hour / 10];break;} }else{switch(cp3){case0:P0 = seven_seg[date % 10];break;case1:P0 = seven_seg[date / 10];break;case2:P0 = seven_seg[month % 10];break;case3:P0 = seven_seg[month / 10];break;case4:P0 = seven_seg[year % 10];break;case5:P0 = seven_seg[year / 10];break;}}P2= seg_bit[cp3];cp3++;if(cp3>= 6)cp3 = 0;}void timer0_init(void) //Timer0初始化{TMOD= 0x01;TH0= (65536 –2000) / 256;TL0= (65536 –2000) % 256;TR0= 1;ET0= 1;EA = 1;}void main(void){uchari = 46;//举例,比如要调整时间,分钟设定为46分i= DEC_BCD_conv(i);timer0_init();write_ds1302_add_dat(0x8e,0x00); //写操作,可以对DS1302调整write_ds1302_add_dat(0x80,0x30); //写秒,30秒write_ds1302_add_dat(0x82,i); //写分,46分write_ds1302_add_dat(0x84,0x12); //写时,12时write_ds1302_add_dat(0x86,0x28); //写日,28日write_ds1302_add_dat(0x88,0x05); //写月,5月write_ds1302_add_dat(0x8a,0x03); //写星期,星期三write_ds1302_add_dat(0x8c,0x12); //写年,(20)12年write_ds1302_add_dat(0x8e,0x80); //写保护while(1){get_ds1302_time();}}一、DS1302驱动程序DS1302驱动程序包含以上操作函数,程序完成后存放在DS1302.c中,用于带有DS1302芯片的单片机系统中。
实时时钟DS1302教学文案
str[0] = '2'; //年份的高2位 str[1] = '0'; str[2] = (time[6] >> 4) + ‘0’; //“年”高位数字转换为ASCII码,BCD码 str[3] = (time[6]&0x0F) + '0'; //“年”低位数字转换为ASCII码
if (DS1302_IO != 0) {
dat |= mask; } DS1302_CK = 1; //拉高时钟 DS1302_CK = 0; } return dat; //最后返回读到的字节数据 }
unsigned char DS1302SingleRead(unsigned char reg) {
实时时钟DS1302
1
15.2 SPI时序的初步认识
SPI :是一种高速的、全双工、同步通信总线,是Motorola定义的,常用于单片 机和EEPROM、FLASH、实时时钟、数字信号处理器等器件的通信。
标准SPI使用4个引脚:
➢ NSS: 片选,从设备片选使能信号 ➢ SCK: 时钟,由主机产生,和SCL类似 ➢ MOSI:主机输出从机输入,Master Output/Slave Input,主机给从机发送指令或数据的通道 ➢ MISO:主机输入从机输出,Master Input/Slave Output,主机读取从机的状态或数据的通道
DS1302_CE = 0; //初始化DS1302通信引脚 DS1302_CK = 0; i = DS1302SingleRead(0); //读取秒寄存器 if ((i & 0x80) != 0) //由秒寄存器最高位CH的值判断DS1302是否已停止 {
单片机入门培训专题(二十二)-DS1302时钟芯片详解①
单片机入门培训专题(二十二)-DS1302时钟芯片详解①单片机入门培训专题已接近尾声,预计在五期之内结束,如果你希望看到其他方面的电子DIY相关专题,欢迎通过平台回复给我们,我们将尽力满足大家的需求。
对于很多单片机系统的设计,会涉及到绝对时间的应用,比较常用的一款时钟芯片莫过于DS1302,今天我们来重点了解一下DS1302时钟芯片的电气连接相关内容22.1DS1302芯片概述DS1302是DALLAS(达拉斯)公司出的一款涓流充电时钟芯片,2001年DALLAS被MAXIM(美信)收购,因此我们看到的DS1302的数据手册既有DALLAS的标志,又有MAXIM的标志,大家了解即可。
DS1302实时时钟芯片广泛应用于电话、传真、便携式仪器等产品领域,他的主要性能指标如下1、DS1302是一个实时时钟芯片,可以提供秒、分、小时、日期、月、年等信息,并且还有软件自动调整的能力,可以通过配置AM/PM来决定采用24小时格式还是12小时格式。
2、拥有31字节数据存储RAM。
3、串行I/O通信方式,相对并行来说比较节省IO口的使用。
4、DS1302的工作电压比较宽,大概是2.0V~5.5V都可以正常工作。
5、DS1302这种时钟芯片功耗一般都很低,它在工作电压2.0V的时候,工作电流小于300nA。
6、DS1302共有8个引脚,有两种封装形式,一种是DIP-8封装,芯片宽度(不含引脚)是300mil,一种是SOP-8封装,有两种宽度,一种是150mil,一种是208mil。
7、当供电电压是5V的时候,兼容标准的TTL电平标准,这里的意思是,可以完美的和单片机进行通信。
8、由于DS1302是DS1202的升级版本,所以所有的功能都兼容DS1202。
此外DS1302有两个电源输入,一个是主电源,另外一个是备用电源,比如可以用电池或者大电容,这样是为了保证系统掉电的情况下,我们的时钟还会继续走。
如果使用的是充电电池,还可以在正常工作时,设置充电功能,给我们的备用电池进行充电。
第二讲 按键 DS1302剖析
第一部分按键一、原理图图1 矩阵按键和独立按键共20个按键,有4*4矩阵键盘:S1~S16,4个独立按键:S17~S20 1、独立按键51单片机接按键,按键一端接地,另一端与I/O引脚相连,按键按下为低电平,未按下为高电平。
如果用P0口需要加上拉电阻(10k),其他端口可以不加上拉电阻,编程时只要检测高低电平来判断是否有按键按下就可以了。
如图1所示中的独立按键:S17~S20。
P0口是开漏的,不管它的驱动能力多大,相当于它是没有电源的,需要外部的电路提供,绝大多数情况下P0口是必需加上拉电阻的。
如图2电路。
图2 P0口接独立按键2、独立按键的使用S17~S20、4个独立按键一端接地,一端接P33~P30,按键按下为低电平,未按下为高电平。
程序1、2、3中的独立按键的使用。
程序1:sbit KEY=P3^3; //定义按键输入端口s17sbit LED=P1^2; //定义led输出端口void main (void){P1=0xFF;//P1口置1KEY=1; //按键输入端口电平置高while (1) //主循环{if(!KEY) //如果检测到低电平,说明按键按下LED=0;elseLED=1; //这里使用if判断,如果按键按下led点亮,弹起来熄灭。
//上述4句可以用一句替代LED=KEY;}}程序2:sbit KEY=P3^3; //定义按键输入端口S17sbit LED=P1^2; //定义led输出端口void main (void){P1=0xFF;//P1口置1KEY=1; //按键输入端口电平置高while (1) //主循环{if(!KEY) //如果检测到低电平,说明按键按下{DelayMs(10); //延时去抖,一般10-20msif(!KEY) //再次确认按键是否按下,没有按下则退出{ while(!KEY);//如果确认按下按键等待按键释放,没有释放则一直等待{LED=!LED;//释放则执行需要的程序}}}}}程序3:按键加减操作,见程序,并且按照第4个程序的方法修改程序。
讲解
注意:红色的字要重点看功能说明:DS1302时钟芯片它可以对年、月、日、周、时、分、秒进行计时DS1302会从设置的时间开始自己计时(上面有32.767K的晶振可以每一秒给DS1302提供一个脉冲,DS1302就是通过它来计时晶振就是那个银色的小圆柱)单片机从DS1302时钟芯片读取时间存放到一个结构体中typedef struct __SYSTEMTIME__{int Second;int Minute;int Hour;int Week;int Day;int Month;int Year;}SYSTEMTIME; //定义的时间类型1、 lcd12864显示屏左半屏幕显示时钟圆盘右下角通过AM或者PM提示上下午。
实现方法:通过lcd12864 的画图功能所用到的函数 1.画一个点的函数2.画线段的函数(时、分、秒的指针就是这样画出来的)3.画圆圈的函数(可以画出表盘)如何实现指针的转动:通过画指针函数比如:给函数传递45s 函数就会在9点位置画一根指针,在下一秒会以圆盘为中心顺时针偏转1s 并且会消除上一秒位置的指针。
2、右边屏幕上方显示当前日期和距离考试天数交替显示3、右下方显示当前温度(精确到小数点后一位)4、长按最左边按键可以进入时间设置模式被设置的某一位会闪烁可以通过右边两个键调,特别说明天数的调整会根据月份的不同而不同比如 6月份不会超过30天而7月份可以调到31天防止保存时出现错误(优点)设定好的时间后按左边的按键可以设置下一位。
注意:一旦设定好时间考验倒计时时间会自动算出来比如说设定为 10月26日考研时间固定为12月27号系统会通过 5+30+27 = 62天自动计算离考验的时间流程图:。
第三节-实时时钟DS1302的原理与应用
//定义引脚连接 sbit rtc_clk=P1^1; sbit rtc_data=P1^2; sbit rtc_rst=P1^3; sbit a0=ACC^0; sbit a7=ACC^7; void write_rtc(uchar date) //写一字节 { uchar i; ACC=date; for(i=8;i>0;i--) { rtc_data=a0; rtc_clk=1; rtc_clk=0; ACC=ACC>>1; } }
+VCC
9
RESET
DS1302
1 VCC1 8 VCC2 X1 X2 2 3 32768Hz
C3 10 μ
29 30 31
PSEN ALE EA P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
P1.3 5 RET P1.1 7 SCLK P1.2 6 I/O
VCC
P1.1 P1.2 P1.3
4.3.2 DS1302的寄存器和控制命令
对DS1302的操作就是对其内部寄存器的操作, DS1302内部共有12个寄存器,其中有7个寄存器 与日历和时钟有关,存放的数据位为BCD码形式。 此外,DS1302还有年份寄存器、控制寄存器、充 电寄存器、时钟突发寄存器及与RAM相关的寄存 器等。时钟突发寄存器可一次性顺序读写除充电 寄存器以外的寄存器,日历、时钟寄存器及其控 制字如下表4-3-1所示,DS1302内部主要寄存器 功能如下表4-3-2所示。
RST输入有两种功能:首先,RST接通控制逻 辑,允许地址/命令序列送入移位寄存器,其次, RST提供终止单字节或多字节数据的传送手段。 当RST为高电平时,所有的数据传送被初始化, 允许对DS1302进行操作。如果在传送过程中RST 置为低电平,则会终止此次数据传送,I/O引脚 变为高阻态。上电运行时,在Vcc≥2.5V之前, RST必须保持低电平。只有在SCLK为低电平时, 才能将RST置为高电平。I/O为串行数据输入输出 端(双向), SCLK始终是输入端。
第2讲 如何使用DS1302时钟芯片
第讲如何使用DS1302时钟芯片教学方法:讲授法授课时数:2学时教学目的:1、掌握DS1302的硬件结构2、掌握DS1302的操作时序3、初步DS1302的使用编程方法教学重点:DS1302的使用编程方法教学难点:DS1302的使用编程方法教学环节:组织教学:检查学生人数,强调作业要求。
新授课:DS1302的使用编程方法教学目的:1、……..2、……. 教学重点作业一、DS1302的硬件结构1、……2、……3、……..二、DS1302的操作时序1、…….2、…….3、……... 三、DS1302的使用编程方法1、…….2、…….参考资料:DALLAS 达拉斯公司的相应产品资料;《DS1302 涓流充电时钟保持芯片的原理与应用》广州周立功单片机发展有限公司不足:上学期末,未申报一个用于时钟芯片DS1302的32.768KHz晶振。
一、DS1302的硬件结构X1 X2 32.768KHz 晶振管脚GND 地RST 复位脚I/O 数据输入/输出引脚SCLK 串行时钟Vcc1,Vcc2 电源供电管脚DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力(Vcc1 为可编程涓流充电电源)。
DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。
在主电源关闭的情况下,也能保持时钟的连续运行。
DS1302由Vcc1或Vcc2两者中的较大者供电。
当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。
当Vcc2小于Vcc1时,DS1302由Vcc1供电。
X1和X2是振荡源,外接32.768kHz晶振。
RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。
RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。
当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。
第二讲 按键 DS1302
第一部分按键一、原理图图1 矩阵按键和独立按键共20个按键,有4*4矩阵键盘:S1~S16,4个独立按键:S17~S20 1、独立按键51单片机接按键,按键一端接地,另一端与I/O引脚相连,按键按下为低电平,未按下为高电平。
如果用P0口需要加上拉电阻(10k),其他端口可以不加上拉电阻,编程时只要检测高低电平来判断是否有按键按下就可以了。
如图1所示中的独立按键:S17~S20。
P0口是开漏的,不管它的驱动能力多大,相当于它是没有电源的,需要外部的电路提供,绝大多数情况下P0口是必需加上拉电阻的。
如图2电路。
图2 P0口接独立按键2、独立按键的使用S17~S20、4个独立按键一端接地,一端接P33~P30,按键按下为低电平,未按下为高电平。
程序1、2、3中的独立按键的使用。
程序1:sbit KEY=P3^3; //定义按键输入端口s17sbit LED=P1^2; //定义led输出端口void main (void){P1=0xFF;//P1口置1KEY=1; //按键输入端口电平置高while (1) //主循环{if(!KEY) //如果检测到低电平,说明按键按下LED=0;elseLED=1; //这里使用if判断,如果按键按下led点亮,弹起来熄灭。
//上述4句可以用一句替代LED=KEY;}}程序2:sbit KEY=P3^3; //定义按键输入端口S17sbit LED=P1^2; //定义led输出端口void main (void){P1=0xFF;//P1口置1KEY=1; //按键输入端口电平置高while (1) //主循环{if(!KEY) //如果检测到低电平,说明按键按下{DelayMs(10); //延时去抖,一般10-20msif(!KEY) //再次确认按键是否按下,没有按下则退出{ while(!KEY);//如果确认按下按键等待按键释放,没有释放则一直等待{LED=!LED;//释放则执行需要的程序}}}}}程序3:按键加减操作,见程序,并且按照第4个程序的方法修改程序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VCC2 GND VCC1 SCLK I/O RST
工作电源 电源地 后备电源 时钟信号 数据输入输出 复位信号|片选信号
我在看视频教程时,老时觉得很奇怪的,为什么老师会把 RST 信号说成片选信 号呢?这也难怪的,因为在 DS1302 的时序图,RST 信号的角色有如片选信号。
众多的芯片中,往往最后的 PIN 都是工作电源的输入。可是 DS1302 却是很奇特 , VCC2 是工作电源的输入而 VCC1 却是后备电源的输入,或者是充电的电流的经 过,更详细的介绍在后面的内容会继续介绍。
第二:分钟寄存器 地址字节;0x82 八位寄存器,高四位记录十位 (BIT7 除外) ,低四位记录个位
第三:时钟寄存器 地址字节;0x84 八位寄存器,高四位记录十位 (BIT7,BIT6 除外) ,低四位记录个位。时钟寄存器的最 高位,决定了时间是以 24 小时制,还是 12 小时制。逻辑 1 为 12 小时致,逻辑 0 为 24 小时致。至于 24 小时致是默认的,为什么这么说呢?该解释与秒钟寄存器很相似,因 为每一次我们为时钟寄存器赋值的时候,由于时钟最大值是 23 小时(0x23),还是 11 小时(0x11),自然而然最高位我们都会赋 0 值。
慧净小店: 开发板超市:/hlmcu
慧争电子免费共享资料、欢迎复制共享、没有版权。 HJ-2G 多功能 AVR/51 二合一开发板学习笔记
注意
读一个字节和写一个字节有明显的不一样,先是写地址字节,然后再读数据字节,写地址字 节时上升沿有效,而读数据字节时下降沿有效,当然前提是 RST 信号必须拉高。写地址字 节和读数据字节同是 LSB 开始。
12.8 DS1302 头文件的理解
自带来的 DS1302 头文件,没有自己定义的好。这一章笔记,主要是以头文件的方式解释。这 是我认为,新手最简单习得的办法。
//命令,地址 #define SEC 0x80 #define MIN 0x82 #define HOUR 0x84 #define DAY 0x86 #defineMONTH 0x88 #define WEEK 0x8A #define YEAR 0x8C #define CTRL 0x8E #define CHRG 0x90 #define BRUST 0xBE #define RAM 0xC0
慧净小店: 开发板超市:/hlmcu
慧争电子免费共享资料、欢迎复制共享、没有版权。 HJ-2G 多功能 AVR/51 二合一开发板学习笔记
上面的图说明了每个寄存器的定义和地址字节,而每个地址字节的 LSB 可以是 0 或者 1,逻辑 0 代 表写,逻辑 1 代表读。如果忽略每个地址字节的 LSB,十六进制则是 0x80+i,而 i 每一次累加 2。
慧净小店: 开发板超市:/hlmcu
慧争电子免费共享资料、欢迎复制共享、没有版权。 HJ-2G 多功能 AVR/51 二合一开发板学习笔记
以上是 Trickle Charge 的概念图,充电控制寄存器的高四位(BIT7~4)是 TCS,Trickle Charger Select 位,仅 1010 才会开启充电功能。而 BIT3~2 是 DS,Diode Select 位,01 选择一个 diode,10 选择两 个 diode 串联。BIT1~0 是 RS,Resistor Select 位,两位组成了 3 个阻值的选择。浏览下表:
慧争电子免费共享资料、欢迎复制共享、没有版权。 HJ-2G 多功能 AVR/51 二合一开发板学习笔记
第 12 章 DS1302
12.1 概述 DS1302 实时时钟芯片我真的为她着迷呀。什么原因导致我为她着迷?自己接触 后您自然而然会明白的。本片笔记的手法与前几章写笔记的手法明显而外的不 同,因为介绍 DS1302 芯片不像是介绍单片机内部的资源一样,都有参考步骤可 言,但设置 DS1302 的方法太多样化了,让新手很不容易。
SCLK 是串行时钟信号的输入,而 I/O 则是串行数据输入输出。X1,X2 是晶振 32.768kHz 的输入,数据手册中有记录晶振的两端需无极电容,手册中的记录是 6pf,但是在众多的 AVR 学习板中会看到 23pf,27pf 的出现。
12.3 时序分析
以上是 DS1302 一个字节写入的时序图。第一个字节是地址字节,第二个字节是数据字节。 RST 信号必须拉高,否则数据的输入是无效的。换一句话说,RST 信号控制数据|时间信号 输入的开始和结束。 地址字节和数据字节的读取时上升沿有效,而且是由 LSB 开始读入。
换成另一句话说,每一次写入秒钟,都会使 DS1302 工作,但这又是为什么呢?秒钟寄 存器是八位寄存器,高四位中的 BIT4~BIT6(BIT7 除外)记录十位,而低四位记录个 位。秒钟的计算最多也是 59,如果换成十六进制的话是 0x59。所以呢,最高位基本上 都是用不到,但我们每一次向秒钟寄存器进行初始化的时候,都会很自然的把最高位 BIT7 记录成 0,CH 位为逻辑 0,DS1302 就开始工作。
第七:年寄存器 地址字节:0x8C 八位寄存器,高四位记录十位,低四位记录个位。
第八:控制寄存器 地址字节:0x8E 八位寄存器,仅 BIT7 有用,BIT7 亦即 WP 位(Write Protect),逻辑 0 解除写保护,逻 辑 1 开启写保护。换一句话说,每一次写其他寄存器 WP 位必须先置 0。
再重申一次,读一个字节和写一个字节是不一样,在 写一个字节 的时候,AVR 的 IO 口一 直保持输出状态,相反的在 读一个字节的时候 AVR 的 IO 口先是输出状态,然后是输入状 态,且必须改变时钟信号的顺序。(补充一点题外话,我在编辑时序的时候,由于疏忽了一 点“小错误”,后果却是很严重。)
12.3 DS1302 时钟|日期|控制|爆发寄存器 在介绍 DS1302 的时序图中不都是,先地址字节,然后数据字节码?那么地址字 节和数据字节又有什么关系呢?(看看下面的图)
慧净小店: 开发板超市:/hlmcu
慧争电子免费共享资料、欢迎复制共享、没有版权。 HJ-2G 多功能 AVR/51 二合一开发板学习笔记
第九:充电寄存器?(Trickle Charge)地址字:0x90 这是开启细流充电的寄存器,写保留。后面有详细的解释。
12.6 DS1302 的地址字节
DS1302 的地址字节,也可以作为命令字节。A0~A4 是用来选择地址的位,而 BIT0 是 制定该地址字节是写入还是读取,BIT6 是作为选择 RAM 还是 CLOCK 的区别。其实这 也没有什么困难的啦。
慧净小店: 开发板超市:/hlmcu
第十:爆发寄存器?(Burst Mode)地址字节:0x92 这个寄存器的功能可以用软件来模拟,无视他把。
12.4 DS1302 的 RAM DS1302 真的很厚道,还设立了 31 个字节的 RAM 空间,RAM 空间的开始地址字节是 0x94。RAM 空间可以让使用着任意发挥,你可以把它当做外存储器,但是前提 DS1302 必须一直供电。要访问任意空间也很简单,如下表:
慧争电子免费共享资料、欢迎复制共享、没有版权。 HJ-2G 多功能 AVR/51 二合一开发板学习笔记
12.7 简单归纳
控制 DS1302 的是 RST 信号,拉低无效,拉高有效。而 DS1302 是串行输入,串行读入。写入 一个字节和读取一个字节的时序不同。写入一个字节都是上跳沿有效,读入一个字节先是上跳 沿有效,然后下降沿有效。地址字节也可称为命令字节,BIT6 控制了对 RAM/CLOCK 的访问 控制,而 BIT0 决定了地址|命令字节的写入还是读出的特性。DS1302 有 31 个字节的 RAM 空 间。除此之外,还有细流充电的功能。秒寄存器决定了 DS1302 开始工作与否,而时钟寄存 器有 12 小时制和 24 小时制之分。每当要写入任何一个寄存器|RAM 空间,写入控制寄存器的 WP 位必须置 0,解除写保护。
#define UNLOCK 0x00
#define LV6 0xA5
#define LV5 0xA9
#define LV4 0xA6
#define LV3 0xAA
#define LV2 0xA7
#define LV1 0xAB
0xA5 0xA9 0xA6 0xAA 0xA7 0xAB
//0.7 降压,2k 阻值,2.15mA //1.4 降压,2k 阻值,1.80mA //0.7 降压,4k 阻值,1.07mA //1.7 降压,4k 阻值,0.90mA //0.7 降压,8k 阻值,0.50mA //1.4 降压,8k 阻值,0.45mA
RS 位组合的阻值选择表
细流公式
渴求细流的公式可以由上右表求出,阻值位 R1,diode drop 为二极管的降压,0.7v (一个二极管),1.4 (串联二极管)。不过我比较有爱,将他分成六个等级,为了编程更方便。
#define LV6 #define LV5 #define LV4 #define LV3 #define LV2 #define LV1
第四:日寄存器 地址字节:0x86 八位寄存器,高四位记录十位(实际上仅有 BIT4~5 被使用),低四位记录个位。
第五:月寄存器 地址字节:0x88 八位寄存器,高四位记录十位(实际上仅有 BIT4 被使用),低四位记录个位。
第六:周寄存器 地址字节:0x8A 八位寄存器,仅有低四位被使用(BIT0~3),用来记录个位。
地址字节 0x90+0 0x90+1 ... ... 0x90+31
第N个 第 0 个 RAM 第 1 个 RAM ... ... 第 31 个 RAM
嗯,使用 RAM 空间的方法很自由,自己发挥想象力吧。
12.5 细流充电 Trickle Charge 在前几个 Article,介绍了 DS1302 有后备供电的输入,亦即 VCC1 引脚,DS1302 允许 透过控制内部的充电寄存器,经 VCC2 向 VCC1 流入的充电细流(很小很小的电流)。 我们看一看 Hj-2G 的硬件布局吧: