『51单片机』 DS1302时钟_带ds1302时钟芯片的单片机(1)


第二部分

x1和x2固定的接的就是我们的一个晶振(频率32.768KHZ),那么为什么是这个数呢?就是因为在我们通用有关的使用情况之下这个实时时钟都是这个32.768KHZ的晶振。

因为这个对于这个实时时钟来说是方便且精度比较高的,就像是我们单片机的串口一样为什么要使用11.0592KHZ一样比较合适保证精度。晶振这个东西就是给我们实时时钟的系统提供了一个稳定的实时脉冲系统提供1HZ的标准频率,因为我们需要计时的。那么有了这两部分的话我们芯片就可以自己进行独立工作了,把里面的这些时钟呢就可以运行了。

第三部分

如上图所示→那么我们单片机需要怎么样如何去获取时间内就需要这三个引脚。

利用这③个引脚我们就可以把单片机的内部时钟给读取出来

包括写入时间也是用这③个引脚把时间给写入进去。

这样就可以让我们里面的DS1302工作模式给运行出来。

当然在我们③个引脚是规定了一套协议的,利用这套协议就可以对我们里面的寄存器进行读写。就可以读取以及写入这个时间,这③个引脚和74HC595移位寄存器当中的很类似。

IO和SER(P34)⇢串行数据是对应以及SCLK(P36)⇢叫做串行时钟。注→串行数据是一位一位比特位来进行发送的。

CE就是对IOSCLK这两个使能的在读和写的时候必须保证它为高电平,相当于开关控制。

内部的结构框图

DS1302的内部结构框图如下↓

如下图→这一部分就是接的是我们的时钟晶振可以通过内部这些电路的一些设置。经过频率的一些分频阿等等运算之后,就会输出这个1HZ的标准输出频率。

如下图→这一部分就是我们时钟的一个内部寄存器,就是说我们这个内部的时间都是存在这个寄存器当中的,31x8的RAM寄存器。就跟我们单片机的寄存器一样,我们只需要对内部寄存器进行读写就可以访问时间了。内部寄存器存储时间。

如下图→这一部分就是我们的访问,怎么写寄存器就是靠这个来的。

🍈注⇢在74HC595的移位寄存器当中我们是只能进行写入的操作而不能进行读出,这个的话是可以进行读出的操作的。

其中这个CE引脚实际上就是一个使能,并不是说芯片不去使能,时钟就不工作。那么这个CE就是用来做一个判断的开关,当CE是高电平的时候你的IO和SCLK才能是有用的。如果CE为低电平那么这些就是无效的。

那么IO和74HC595的SRE是极其类似的,我们的数据是一个一个出去的也就是输出,只不过我们这个还可以读写进去。

SCLK(串行时钟)也和SRCLK是非常类似的,就是它时钟芯片每次来一个上升沿(高电平),我们的这个数据就会每次向下进行一次的移位。

寄存器定义

🍀注→在上述图当中地址是从低到高来进行排列的。注→IO数据输入/输出在DS1302也是从低位到高位的。

第一个寄存器存储的就是秒。

第二个寄存器存储的就是分。

第三个寄存器存储的就是小时。

第四个寄存器存储的就是日(1~31)

第五个寄存器存储的就是月(1~12)

第六个寄存器存储的就是年(0~99)

WP置1(高电平)写入的话是无效的,但是可以读出的。写入的话就要给低电平有效。

TCS就是涓细电流充电能力对电池进行充电。

说明→在上述的寄存器当中都是与时钟有关的寄存器。

地址命令字

那么在这里我们就需要完成两个任务如下↓

⒈在哪(地址-读秒第一个为什么不是分钟) 里写入(我们是写入还是读出) 什么 (写入实际数据是什么,就是设计时间)

⒉在哪里(比如说我想读秒) 读出 什么

🍎重点⇢在寄存器定义的那幅图当中,秒所对应的那一行(也就是第二行) READ所对应的那一列(也就是第一列) 方格里边是 81h (十六进制)转换为二进制为1000 0001对应上述图当中。

🍏注→第六位给高电平操作的是RAM给低电平操作的是CK(非) 在最高位上固定为"1".

如果我们需要写入 WR 给上低电平0。

注意看寄存器那幅图当中是分别有WRITE和READ。分别有对应的关系的。

时序定义

关于地址命令字和数据如何一一对应起来。

三大步骤(重点!)

⒈CE置"1"相当于一个开关的作用。

⒉在这里规定了我们要先把最低为给发送过去,在这里也就是R/W(非)设置到IO口上。

⒊SCLK时钟给上一个上升沿(高电平),那么我们的IO口最低为就会被写入到单片机。然后就是把SCLK置回到"0"此时在到IO(地址)口第一位依次类推。

注→I/O命令字(R/W非 ~ 1和数据(D0 ~ D7)是一一对应的(注:一个是指令还有一个是数据)高电平读出。

这一部分是完成命令字的写入操作。我们先要发命令字因为我们要告诉到底是写还是读。

这一部分就是实际的数据也就是IO数据输入/输出和上面的操作都是一样的。记住最终再把SCLK给置0以及CE。

📝重点说明→在上述我讲解的是写入数据的,实际上读出数据前半部分也都是一样的(只不过需要改变命令字最低位读"1")紧跟着时钟的下降沿然后就会开始读出这个数据每次读出一个数据来一个下降沿依次类推到最后一位就把SCLK和CE置0.

🍊注→在这些数据当中是完全对应在外面的寄存器上的。

拓展说明如下↓

在写入数据是给单片机写入进去数据的我们是看不到现象的,而当我们想要看到现象是需要把单片机的数据给读出来才行。

在CE(芯片开关)的操作中,CE始终要保持我们的高电平,写完之后再把它清0置低电平。然后整个写入操作它才是有效的。

SCLK(串行时钟)给一个固定的时钟,然后IO(数据输出/输入)就给数据,在时钟的上升沿,IO口的数据将被输入。同时还额外的规定了在时钟的下降沿,DS1302就会把它给的数据进行输出。

下面就是串行输入。所有驱动都是低电平输入/高电平输出 交替。

BCD码

在DS1302的内部寄存器地址/定义,是用BCD码表示的也就是我们常用到单片机8421码。

BCD码(Binary Coded Decimal‎),用4位二进制数分开分别来表示个位和十位。

例:0001 0011表示13,1000 0101表示85,0001(十位) 1010(个位)不合法(十进制的个位只有0~9,A代表的是10)

在十六进制中的体现:0x13表示13,0x85表示85,0x1A不合法。

**BCD码转十进制:**DEC=BCD/16*10+BCD%16; (2位BCD十位和个位)

BCD/16把高四位提取出来,BCD%16把低四位提取出来。

**十进制转BCD码:**BCD=DEC/10*16+DEC%10; (2位BCD十位和个位)

**为什么需要进制转换呢?**其根本原因就是在写代码的过程当中进制可能不一样,我写的这个代码读出的数据是BCD码而你这个库函数当中存放的Number是十进制的,此时我们应该要把BCD码用公式把它进行一个强转为十进制这样最终得到的才是一个逢十进一的一个数。如果当你直接BCD码存放十进制Number当中会发生以下情况如下👇

0000 1001 = 9
0001 0000 = 10(解码以十进制进行解码)
//十进制转换为十六进制
(1x16^1)+(0x16^0) = 16

🍊说明⇢此时如果是这样的话当我们的数字到9的时候再+1的话就会跳到16的数字。所以,我们需要把BCD码转十进制。

其实可以直接带入进去算下BCD码转十进制 例如下↓拓展:÷(获得高位) %(获得低位)

BCD码(8421码015)十进制码是(09)我们带入式子来进行计算如下↓

DEC(十进制) = (16/16*10) + (16%16) = 10 这不就相当于是从十六进制转到了十进制吗?同理。当然这个只是一个小技巧,有更加严谨的转换方式。

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

中…(img-W6iOZua8-1715605687646)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

  • 30
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值