31. DS1302实时时钟(STC89c52) 一、硬件及连接
三大块:电源部分(主、副电源)、晶振部分、通信部分。 二、通信方式 通信方式与SPI相似:三线串行通信,通过CE/RST引脚来使能数据的传输。低位在前,高位后。时钟上升沿发送,下降沿接收。先发送控制字再发送(接收)数据。 1.控制字各位说明。
位7:必须是逻辑1,如果它为0,则不能把数据写入到DS1302中 位6:如果为0,则表示存取日历时钟数据,为1表示存取RAM数据 位5~位1 (A4~A0) : 指示操作单的地址 位0: 如为0,表示要进行写操作,为1表示进行读操作。
读数据: 读数据时在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据读出的数据是从最低位到最高位。 写数据: 控制字总是从最低位开始输出。在控制字指令输入后的下一个SCLK时钟的上升沿时数据被写入DS1302,数据输入也是从最低位 (0位) 开始。 2.内部有时钟和RAM两类寄存器可供操作,一般只用时钟就行,下面是时钟操作表格
这张表是DS1302内部的7个与时间、日期有关的寄存器图和一个写保护寄存器,我们要做的就是将初始设置的时间、日期数据写入这几个寄存器,然后再不断地读取这几个寄存器来实时时间和日期。这几个寄存器的说明如下: 秒寄存器 (81h、80h) 的位7定义为时钟暂停标志 (CH) 。当初始上电时该位置为1,时钟振荡器停止,DS1302处于低功耗状态,只有将秒寄存器的该位置改写为0时,时钟才能开始运行。 小时寄存器(85h、84h) 的位7用于定义DS1302是运行于12小时模式还是24小时模式。当为高时,选择12小时模式。在12小时模式时,位5是 ,当为1时,表示PM。在24小时模式时,位5是第二个10小时位 控制寄存器(8Fh、8Eh) 的位7是写保护位(W),其它7位均置为0。在对任何的时钟和RAM的写操作之前,WP位必须为0。当WP位为1时,写保护位防止对任一寄存器的写操作。也就是说在电路上电的初始态WP是1,这时是不能改写上面任何一个时间寄存器的,只有首先将WP改写为0,才能进行其它寄存器的写操作。 3.时钟寄存器中是按BCD码存储数据的,使用时要进行转换。 BCD码(Binary-Coded Decimal) ,简称BCD。BCD码用4位二进制数来表示1位十进制数中的0~9这10个数码 非压缩的BCD码用8位二进制数表示一个十进制数位其中低4位是BCD码,高4位是0。例如,十进制数78表示0000 0111 0000 1000成压缩的BCD码为压缩的BCD码: 压缩的BCD码用4位二进制数表示一个十进制数位,整个十进制数用一串BCD码来表示。例如,十进制数59表示成压缩的BCD码为0101 1001 例:0001 0011表示13,1000 0101表示85,0001 1010不合法 在十六进制中的体现:0x13表示13,0x85表示85,0x1A不合法 BCD码转十进制:DEC=BCD/16*10+BCD%16;(2位BCD) 十进制转BCD码:BCD=DEC/10*16+DEC%10;(2位BCD) 三、使用及代码实现 首先要通过8EH命令字把WP写成0,将写保护去掉。 通过命令字80H、82H、84H、86H、88H、8AH、8CH进行初值的写入。 然后就可以同时也通过秒寄存器将位7的CH值改成0,这样DS1302就开始走时运了。 通过命令字8EH再写为80H,防止误改写寄存器的值。 通过命令字80H一8CH不断读取相应寄存器的值,将它们格式化后显示到1602LCD液晶上 DS1320模块代码 下面是main中的代码 四、自己遇到的问题和解决 读出的数据是乱的,没有什么规律。后来发现问题如下: 我为了节省代码,把读一个字节和写一个字节分别写成一个函数,然后在把两个拼起来组成手册中的读和写(手册中的写是连续两个写字节,而读是一个写加上一个读),结果老是不行。 问题出在了时序上,手册中的读(写+读)总共15脉冲,写的最后是半个与读的首半个组成一个脉冲。手册中的写(写+写)这个简单,每个8个脉冲,总共16个。 因此无法抽取出单独的写和单独的读,因为手册中的读中的写字节是7.5个脉冲,而写中写字节是8个脉冲,读也一样,无法抽取出独立的函数。 学习他人的视频说在读完后要把IO置0,我试了试不置0也没影响,大家再试试。
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/83800.html