单片机学习笔记---DS1302时钟

news2024/11/20 2:43:47

上一节我们讲了DS1302的工作原理,这一节我们开始代码演示。

新创建一个工程写上框架

我们需要LCD1602进行显示,所以我们要将LCD1602调试工具那一节的LCD1602的模块化代码给添加进来

然后我们开始创建一个DS1302.c和DS1302.h

根据原理图,为了方便操作,我们要在DS1302.c文件重新定义我们的三个端口

定义好之后我们操作重命名的名字,就相当于操作单片机的这三个引脚。

然后我们就可以根据上节讲的工作原理模拟这个时序

首先我们要写一个函数,叫做单字节写DS1302,模拟这个时序

第二个函数是单字节读DS1302,模拟这个时序

然后初始化DS1302

开始写字节,第一步将CE置1

下一步把命令字的第0位放在IO线上

然后DS1302_SCLK置1再置0

这里置1后立马置0的话需要考虑我们芯片能够承受的时钟最快频率,因为置1后立马置0的过程中,可能时钟线操作的太快,而时钟芯片反应不过来。

所以要看看芯片手册上支持的最快速率是多少。

比如手册上给出了这个时序上每一段的操作时间表格

还画了图表示哪里到哪里对应的是表格中的哪一个时间

比如说tDC对应的是当VCC是2V的时候,操作时间最小不能小过200ns,如果VCC是5V的时候,时间最小是50ns。

但是由于我们51单片机的速率是比较慢的(一个机器周期是1微秒),所以置1到置0之间可以不用加延时。如果有的单片机的速度很快的话,置1到置0之间要加一段延时,等IO后完成数据交互之后再置0。

经过以上三步后我们的时序已经走完到这一步了

接下来我们接着写入命令字的第1位,第2位,第3位......数据(保持CE=1)

我们可以用for循环来实现

更正:图中应该是i<8

这个循环完成后整个时序就进行到这个地方

最后那一半时序其实和前面一半的时序操作几乎一模一样,只是它的数据不同

可以直接复制过来改一下

更正:图中应该是i<8

这个循环完成后我们时序已经完成到这里了

最后就是把CE给清零

更正:图中应该是i<8

这样单字节写的这整个时序就已经完成了。

数据写进去后,我们还要让单片机读出来,最后再显示出来才能看到我们写进去的数据。

接下来我们就操作单字节读的时序

操作命令字部分的时序几乎一样,可以直接复制过来

更正:图中应该是i<8

这样整个时序就进行到这里了

但是这里有个问题当时钟来一个下降沿的时候,时钟芯片就会向单片机输出数据了,这就意味着如果我们直接这样写的话,那进行到最后一轮for循环的时候就同时有一位数据出来了,我们应该想要时序进行到这一步才对

所以得调整一下顺序,先给0,再给1

更正:图中应该是i<8

这样当第一个for循环结束后,时序就不是到这里来了

而是到这里来了

最后一个for循环结束后就到这里来了

这样我们这个for循环就全部是与命令字有关的,

当这一部分时序进行完之后,这里单片机就要释放掉对IO口的控制,然后把IO口的控制权转交给DS1302。DS1302输出数据,然后单片机在这里直接读取IO口的状态。

因此接下来先给下降沿

更正:图中应该是i<8

那么数据就已经到了IO口的线上了,所以我们直接读

所以我们再给一个上升沿

更正:图中应该是i<8

这个时候时序就进行到这里了

这个时候DS1302操作IO口把它想要输出的数据的D0给到IO口线上了。

然后先定义一个变量Data,然后进行循环读出数据的每一位

这样就和这个时序完全相同了

PS:连续两次置1时序上的电平不会产生变化,并且单字节读的时序比单字节写的时序少了一个脉冲,那么我们这个地方重复置了一个1的话可以补充少了的这个脉冲。

最后别忘记CE清零

把Data返回(到时候主程序里面调用这个函数的话,返回值就可以打印出来了)

返回值类型也要改

这里有一个重点!敲黑板!重点来了!

读取完数据时候一定要给IO口清零!!!

如果不写上这一句代码的话效果是这样的,请看视频,读出来的数据是乱码的!

DS1302实时时钟2

这样读和写的两个时序已经模拟完成,我们需要再DS1302.h文件里面进行声明一下这几个函数

到这里我们的读写程序基本已经完成了

BCD码

然后还需要补充一个知识:BCD码

DS1302的内部寄存器不是以正常的二进制进行存储的,而是以BCD码进行存储的。

BCD码(Binary Coded Decimal‎),用4位二进制数来表示1位十进制数

高四位表示十进制的十位,低四位表示十进制的个位

例:0001 0011表示13,1000 0101表示85,0001 1010不合法

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

(10的BCD码是0001 0000,转换成正常的十进制是16)

BCD码转十进制:DEC=BCD/16(把高四位提取出来)*10+BCD%16(把低四位提取出来); (2位BCD)

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

所以我们回头这一下这张表格就能看明白了

以秒寄存器为例,这张表格上写明低四位存的是秒,而高位的那三位(0-50就只能用到三位(0)101)存的是10秒,CH置为1的话,秒就会停止,整个时钟就会停止。CH=0的话时钟时钟是运行的。

所以想要最后的结果显示成正常的十进制数的话就要将结果转换成十进制再显示。

如果还是想转换成十进制再显示的话可以利用这一个转换公式

BCD码转十进制:DEC=BCD/16(把高四位提取出来)*10+BCD%16(把低四位提取出来); (2位BCD)

设置时间时,要将十进制转换成BCD码写进时钟芯片,可以利用这个公式

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

我们要将年月日,时分秒,星期显示在液晶屏上的话还要在DS1302.c文件中定义是个数组,然后再写两个函数,方便我们后续设置时间

为了方便后面不用每次都查找这个表上的地址码

我们可以把这个表格上的写入地址重定义

然后我们知道,写入时的命令字最低位肯定是0,读出时的命令字最低位肯定是1

所以我们在ReadByte()这里加一行这样的代码

因为这个读的命令字一定是1了,将Command或0x01之后,那它的最低位肯定是1,也就是肯定是读,然后我们给地址的时候,可以直接给写的地址,因为写的地址或了0x01之后就是读的地址,这样我们就不需要重复定义那么多地址了。因此我们就不需要把读的地址也弄成这样了

要想获得读的地址就直接将写的这个地址|0x01就变成读的地址了!

于是两个函数写完之后是这样

将这两个函数和数组都声明一下

最后DS1302.c的完整代码如下:

最后我们在主程序中调用函数然后运行

运行后的效果,请看视频:

DS1302实时时钟1

本节的代码演示就到这里。

之后有时间再演示一个可调时钟的代码!

源码放在评论区,自取!有什么问题,可以评论区留言。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1442624.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Web】Spring rce CVE-2022-22965漏洞复现学习笔记

目录 原理概览 漏洞简述 Tomcat AccessLogValve 和 access_log 例题: 原理概览 spring框架在传参的时候会与对应实体类自动参数绑定&#xff0c;通过“.”还可以访问对应实体类的引用类型变量。使用getClass方法&#xff0c;通过反射机制最终获取tomcat的日志配置成员属性…

FOC--有感--clion

配置CLion用于STM32开发【优雅の嵌入式开发】 - 知乎 TIM1_CH3N是TIM1_CH3的互补输出通道。TIM1是一个高级定时器&#xff0c;具有互补输出功能。TIM1_CHx是PWM的主通道&#xff0c;而TIM1_CHxN则是PWM的互补输出通道。 开漏输出和推挽输出: 输出电平能力&#xff1a; 推挽输…

HiveSQL——共同使用ip的用户检测问题【自关联问题】

注&#xff1a;参考文章&#xff1a; SQL 之共同使用ip用户检测问题【自关联问题】-HQL面试题48【拼多多面试题】_hive sql 自关联-CSDN博客文章浏览阅读810次。0 问题描述create table log( uid char(10), ip char(15), time timestamp);insert into log valuesinsert into l…

2.6日学习打卡----初学RabbitMQ(一)

2.6日学习打卡 初识RabbitMQ、 一. MQ 消息队列 MQ全称Message Queue&#xff08;消息队列&#xff09;&#xff0c;是在消息的传输过程中保 存消息的容器。多用于系统之间的异步通信。 同步通信相当于两个人当面对话&#xff0c;你一言我一语。必须及时回复 异步通信相当于通…

猫头虎分享:2024龙年IT行业热门技术大全

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

Python爬虫之文件存储#5

爬虫专栏&#xff1a;http://t.csdnimg.cn/WfCSx 文件存储形式多种多样&#xff0c;比如可以保存成 TXT 纯文本形式&#xff0c;也可以保存为 JSON 格式、CSV 格式等&#xff0c;本节就来了解一下文本文件的存储方式。 TXT 文本存储 将数据保存到 TXT 文本的操作非常简单&am…

Maui blazor ios 按设备类型设置是否启用safeArea

需求&#xff0c;新做了个app&#xff0c; 使用的是maui blazor技术&#xff0c;里面用了渐变背景&#xff0c;在默认启用SafeArea情况下&#xff0c;底部背景很突兀 由于现版本maui在SafeArea有点bug&#xff0c;官方教程的<ContentPage SafeAreafalse不生效&#xff0c;于…

【web前端开发】HTML及CSS简单页面布局练习

案例一 网页课程 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-wi…

二阶系统的迹-行列式平面方法(trace-determinant methods for 2nd order system)

让我们再次考虑二阶线性系统 d Y d t A Y \frac{d\mathbf{Y}}{dt}A\mathbf{Y} dtdY​AY 我们已经知道&#xff0c;分析这种二阶系统。最主要的是注意它的特征值情形。 &#xff08;此处没有重根的情形&#xff0c;所有是partial&#xff09; 而特征值&#xff0c;也就是系…

Java异常的处理 try-catch-finally

目录 什么是异常通过if-else处理异常用if-else堵漏洞的缺点 try-catch例第一种处理第二种处理第三种处理第四种处理 try-catch-finally例 System.exit(0);//终止当前的虚拟机执行 什么是异常 Exception&#xff1a;在程序的运行过程中&#xff0c;发生了不正常的现象&#xff0…

探索未来:集成存储器计算(IMC)与深度神经网络(DNN)的机遇与挑战

开篇部分&#xff1a;人工智能、深度神经网络与内存计算的交汇 在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;已经成为科技领域的一股强大力量&#xff0c;而深度神经网络&#xff08;DNN&#xff09;则是AI的核心引擎之一。DNN是一种模仿人类神经系统运作…

【Java八股面试系列】并发编程-并发关键字,线程池

目录 并发关键字 Synchronized synchronized最主要的三种使用方式&#xff1a; 具体使用&#xff1a;双重校验锁单例模式 synchronized 底层实现原理&#xff1f; synchronized锁的优化 偏向锁 轻量级锁 重量级锁 Mark Word 与 Monitor 之间的关系 总结 偏向锁、轻量…

2024年【高压电工】报名考试及高压电工操作证考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年高压电工报名考试为正在备考高压电工操作证的学员准备的理论考试专题&#xff0c;每个月更新的高压电工操作证考试祝您顺利通过高压电工考试。 1、【单选题】 高压电动机发生单相接地故障时,只要接地电流大于()…

苹果mac电脑如何优化系统?保持不卡顿呢

再强悍的性能和优秀的操作系统&#xff0c;但长时间使用后&#xff0c;有时也会出现卡顿的情况。为了让你的苹果电脑保持高效运行&#xff0c;我们将深入探讨导致电脑卡顿的原因&#xff0c;并提供苹果电脑如何优化系统的解决方案&#xff0c;帮助你优化系统。 过多的启动项 …

第十七篇【传奇开心果系列】Python的OpenCV库技术点案例示例:自适应阈值二值化处理图像提取文字

传奇开心果短博文系列 系列短博文目录Python的OpenCV库技术点案例示例系列短博文目录前言一、自适应阈值二值化处理图像提取文字轮廓的初步示例代码:二、扩展思路介绍三、调整自适应阈值二值化的参数示例代码四、对二值化图像进行形态学操作示例代码五、使用轮廓特征进行筛选示…

C++ 中的模型预测控制(01/2)

目录 一、说明二、MPC原理说明三、分解算法的来源并显示关键特征&#xff0c;四、C 实现说明五、平衡 Q 和 R六、资源下载地址 一、说明 以下文章介绍了应用模型预测控制器的简单控制系统方法。本文讨论了这种控制的基本机制&#xff0c;该机制适用于各种工程领域。 MPC 涉及对…

书生·浦语大模型第三课作业

基础作业&#xff1a; 复现课程知识库助手搭建过程 (截图) 进阶作业&#xff1a; 选择一个垂直领域&#xff0c;收集该领域的专业资料构建专业知识库&#xff0c;并搭建专业问答助手&#xff0c;并在 OpenXLab 上成功部署&#xff08;截图&#xff0c;并提供应用地址&#x…

【QT+QGIS跨平台编译】之三十一:【FreeXL+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、FreeXL介绍二、文件下载三、文件分析四、pro文件五、编译实践一、FreeXL介绍 【FreeXL跨平台编译】:Windows环境下编译成果(支撑QGIS跨平台编译,以及二次研发) 【FreeXL跨平台编译】:Linux环境下编译成果(支撑QGIS跨平台编译,以及二次研发) 【FreeXL跨平台…

如何在Sprint中管理UI测试?

作为iOS团队&#xff0c;我们编写3种类型的UI测试。如果你问这些是什么&#xff1b;快照、冒烟和回归测试。那么这些测试到底是什么&#xff1f;让我们稍微谈谈这些。 快照测试快照测试是检查UI中的某些内容是否损坏的测试。 首先&#xff0c;它将所需的视图图像保存在某处&am…

如何部署一个高可用的 Linux 集群?

部署一个高可用的 Linux 集群需要经过多个步骤和考虑因素。以下是一个简要的指南&#xff0c;帮助您了解如何部署一个高可用的 Linux 集群&#xff1a; 确定需求和目标&#xff1a;在开始部署之前&#xff0c;您需要明确高可用性的定义和目标。对于一些组织而言&#xff0c;高…