找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12872|回复: 11
收起左侧

10分钟理解DS1302时钟模块

  [复制链接]
ID:304634 发表于 2018-4-19 18:43 | 显示全部楼层 |阅读模式
1. 思路分析


讲解DS1302模块之前先来看看我们平时使用的电子表或者手机。主要涉及两个方面,如下图所示。第一个就是查看时间和日期,比如2014年11月15日09时00分50秒星期六,等等。另外一个方面就是设置或者调整时间/日期信息。


图1.png

图1 时钟信息示意图


同样的道理,对于DS1302模块,我们也是从这两个方面来类比分析的。第一个,查看日期时间,既然是“查看”也就是从DS1302“获取”信息,那么与‘读’ DS1302相关。第二个,设置日期时间,既然是“设置”也就是向DS1302“输入”信息,那么就是与 ‘写’ DS1302相关了,或者说修改它的相关信息。好了,分析到这里,根据以前讲过的内容,你应该可以猜到它的大概设计模样了。既然是‘读’和‘写’ DS1302,那么紧跟着的问题就是,怎么读,从哪里‘读‘,怎么“写”,往哪里“写”?前面讲过,对于机器只有0和1,那么很明显需要把年月日时间等转成用0和1来表示。根据前面的经验通常以一个字节为单位。现在我们把年月日时分秒星期拆成几个部分。比如‘秒’,我们就用一个字节来表示,‘分’也用一个字节来表示,依此类推,这样‘秒-分-时-日-月-年’一共需要6个字节,另外加一个‘星期’,一共7个字节来表示,同时给它们排序。比如地址0的字节表示‘秒’,地址1的字节表示’分‘,等等。如下表1所示,注意这个表格只是我们自己的猜测。


表格猜测.png

表1 时钟信息存储分布猜测


这样就好理解了,当我们需要设置时间和日期时,就是往这7个字节写入信息,当需要查看时间和日期时,就是去读取这7个字节内容即可。如果理解了这个,那么对DS1302的整个分析思路也就清晰了,下面我们就按照这个思路看看具体的操作步骤。


2. 操作步骤分析


这里以"写"为例,简单描述这个过程,"读"的过程与"写"类似。


(1) 如何确定地址

既然是写,首先要告诉1302写到哪一个地址,思考过程与LCD1602类似,那么就给DS1302发送一个地址命令(CMD)。前面说过,机器之间的沟通通常是以字节也就是8位为基本单元的,那么就用"0000 0000"来表示1302地址0的字节,用"0000 0001"来表示1302地址1的字节,依此类推。前面做了个猜想,DS1302一共才7个字节(表格1所示),用8个bit来确定,太浪费了。那么就改进一下,如何改进呢?我们用这个地址命令CMD的bit1~bit5来确定这7个字节,比如当bit1~bit5取00000的时候就表示DS1302地址0的字节,取00001的时候就表示DS1302地址1的字节,依此类推。那么地址命令CMD的bit0,bit6和bit7如何处理?这个bit7也就是最高位固定为1,bit6用来设置选择CK(时钟)还是RAM。那么还剩下最后一位bit0如何处理?

(2) 如何确定"写"还是"读"

通过上面的分析已经知道了单片机如何告诉1302"写"的地址。注意,这里只是确定了"地址",DS1302仍然不知道你对这个地址是要"读"还是"写"。这样地址命令CMD的最低位还没有处理,刚好拿来用作"写"和"读"的确定。比如当CMD的bit0取0的时候就表示"写", 取1的时候就表示"读"。这样CMD里面既有地址信息,又有命令信息,所以叫做地址命令字节。

现在我们来举个例子,假如往表格1中的地址0写入数据(实际上就是设置秒钟),那么CMD的bit1~bit5就取00000,最低位bit0确定"读"还是"写",很明显也取"0"。最高位bit7固定为1。剩下bit6用来选择写RAM还是CK,我们要写时钟相关的信息,很明显取0,这样CMD就是1000 0000(0x80). 如果你要"读"地址0的数据(实际上就是查看秒钟)呢?只需要把CMD的bit0修改为1就可以了。那么CMD就为1000 0001(0x81).


(3) 确定写入的数据


"读"还是"写"确定了,地址也确定了,之后再发送一个字节的数据,这个数据与秒钟是如何对应的,就去翻一翻芯片手册了,这个比较好理解。

3. 突发模式(Burst Mode)分析


以上操作过程如果正确,就能显示和设置时间了。但是这里面实际上还有个BUG,举个例子来说明一下。假如你要记录一个人跑步的图像,第一次观察到他的左腿在前,第二次观察到他的右腿在前,如果你把这两次信息结合起来一定会得出错误的结论,就是两条腿都在前面,这不是"跑"这是"跳"。 错误的原因是"跑"是一个动态的过程。同样的道理,假设现在时间为00分59秒,你先读"秒",记录为59秒,然后读"分"。注意这也是一个动态的过程,此时00分可能变成01分了,这样你读到就是01分,然后把这两次读的结果结合起来就是01分59秒。很明显是不对的,那么如何处理呢?对于"跑",处理过程很简单,"拍照"就行了,拍完照片然后去观察照片就不会出错了,因为照片是"静止"的。对于DS1302也用同样"拍照"的处理方法,把"时"分"""秒"等信息"照"下来,然后去读这张"静止"的照片就不会出错了。拍照是一个比较平民化的词汇,为了体现这个行业的专业性,换一个比较难懂的词汇显得更高深,叫Burst Mode-突发模式,实际上就是拍照或者说我们平时用的截屏。


综合来看,不论是LCD1602,OLED 还是DS18B20,如果仔细去分析的话,它们还是有很多内在共同点的。


上一篇:


10分钟理解LCD1602液晶显示模块
10分钟理解LCD1602如何显示自定义字符
10分钟理解OLED显示模块
10分钟理解DS18B20数字温度计模块


所有参考代码工具视频下载百度网盘链接:


百度云盘链接地址-51HEI分享.rar (180 Bytes, 下载次数: 107)

评分

参与人数 2黑币 +15 收起 理由
dingqinhong + 5 很给力!
zkele + 10 赞一个!谢谢分享

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表