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

上一节我们讲了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://xiahunao.cn/news/2776380.html

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

相关文章

牛客网SQL进阶114:更新记录

官网链接&#xff1a; 更新记录&#xff08;二&#xff09;_牛客题霸_牛客网现有一张试卷作答记录表exam_record&#xff0c;其中包含多年来的用户作答试卷记录&#xff0c;结构如下表。题目来自【牛客题霸】https://www.nowcoder.com/practice/0c2e81c6b62e4a0f848fa7693291d…

肯尼斯·里科《C和指针》第13章 高级指针话题(2)函数指针

我们不会每天都使用函数指针。但是&#xff0c;它们的确有用武之地&#xff0c;最常见的两个用途是转换表(jump table)和作为参数传递给另一个函数。本节将探索这两方面的一些技巧。但是&#xff0c;首先容我指出一个常见的错误&#xff0c;这是非常重要的。 简单声明一个函数指…

【MATLAB源码-第138期】基于matlab的D2D蜂窝通信仿真,对比启发式算法,最优化算法和随机算法的性能。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 D2D蜂窝通信介绍 D2D蜂窝通信允许在同一蜂窝网络覆盖区域内的终端设备直接相互通信&#xff0c;而无需数据经过基站或网络核心部分转发。这种通信模式具有几个显著优点&#xff1a;首先&#xff0c;它可以显著降低通信延迟&…

铱塔 (iita) 开源 IoT 物联网开发平台,基于 SpringBoot + TDEngine +Vue3

01 铱塔 (iita) 物联网平台 铱塔智联 (open-iita) 基于Java语言的开源物联网基础开发平台&#xff0c;提供了物联网及相关业务开发的常见基础功能, 能帮助你快速搭建自己的物联网相关业务平台。 铱塔智联平台包含了品类、物模型、消息转换、通讯组件&#xff08;mqtt/EMQX通讯组…

1、 快速上手 [代码级手把手解diffusers库析]

快速上手Pipeline 内部执行步骤后续更新计划 diffusers是Hugging Face推出的一个diffusion库&#xff0c;它提供了简单方便的diffusion推理训练pipe&#xff0c;同时拥有一个模型和数据社区&#xff0c;代码可以像torchhub一样直接从指定的仓库去调用别人上传的数据集和pretrai…

Linux中ps/kill/execl的使用

ps命令&#xff1a; ps -aus或者ps -ajx或者 ps -ef可以查看有哪些进程。加上 | grep "xxx" 可以查看名为”xxx"的进程。 ps -aus | grep "xxx" kill命令&#xff1a; kill -9 pid 杀死某个进程 kill -l 查看系统有哪些信号 execl函数&#…

RocketMQ(二):领域模型(生产者、消费者)

1 生产者&#xff08;Producer&#xff09; 本节介绍Apache RocketMQ 中生产者的定义、模型关系、内部属性、版本兼容和使用建议。 1.1 定义 生产者是Apache RocketMQ 系统中用来构建并传输消息到服务端的运行实体。 生产者通常被集成在业务系统中&#xff0c;将业务消息按照要…

C++基础入门之引用

目录 一.引用 1.1引用和取地址 1.2 别名和原名的区别 1.3 引用的用法 1.31 做参数 1.311 输出型参数&#xff1a;形参改变实参 1.312 可以减少拷贝&#xff0c;增加效率 1.32 引用的约定 1. 引用必须初始化 2. 引用定义后&#xff0c;不能改变指向 4. 给指针取别名 1.33…

【Linux环境基础开发工具的使用(yum、vim、gcc、g++、gdb、make/Makefile)】

Linux环境基础开发工具的使用yum、vim、gcc、g、gdb、make/Makefile Linux软件包管理器- yumLinux下安装软件的方式认识yum查找软件包安装软件如何实现本地机器和云服务器之间的文件互传卸载软件 Linux编辑器 - vimvim的基本概念vim下各模式的切换vim命令模式各命令汇总vim底行…

聊聊JIT优化技术

&#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是小徐&#x1f947;☁️博客首页&#xff1a;CSDN主页小徐的博客&#x1f304;每日一句&#xff1a;好学而不勤非真好学者 &#x1f4dc; 欢迎大家关注&#xff01; ❤️ 我们知道&#xff0c;想要把高级语言转变成计算…

《动手学深度学习(PyTorch版)》笔记7.7

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过&…

Python中的嵌套字典访问与操作详解

前言 在Python编程中&#xff0c;嵌套字典是一种常见的数据结构&#xff0c;它可以以层次结构的方式组织和存储数据。嵌套字典通常包含字典内嵌套在其他字典中&#xff0c;创建了一种多层级的数据结构。本文将详细介绍如何在Python中访问和操作嵌套字典&#xff0c;包括访问、…

卷积层Conv1d包含的元素分别是什么,经过卷积层,数据的形状发生变化吗?

nn.Conv1d 是一个一维卷积层&#xff0c;它通常用于处理序列数据&#xff0c;如时间序列或文本数据。这个层包含以下主要元素&#xff1a; 输入通道数&#xff08;In_channels&#xff09;&#xff1a;这是输入数据的通道数。对于单通道数据&#xff08;如灰度图像或单变量时间…

Leetcode3021. Alice 和 Bob 玩鲜花游戏

Every day a Leetcode 题目来源&#xff1a;3021. Alice 和 Bob 玩鲜花游戏 解法1&#xff1a;数学 Alice 和 Bob 在一个长满鲜花的环形草地玩一个回合制游戏。环形的草地上有一些鲜花&#xff0c;Alice 到 Bob 之间顺时针有 x 朵鲜花&#xff0c;逆时针有 y 朵鲜花。 游戏…

Ubuntu环境下安装部署Nginx(有网)

本文档适用于在Ubuntu20.04系统下部署nginx 一、使用apt-get命令安装nginx 注&#xff1a;以下命令都是在root用户下使用 1. 检查是否存在apt命令 apt –version 说明&#xff1a;出现版本号就说明当前环境存在apt 2. 更新apt命令 apt update 3. 安装nginx apt-get in…

containerd中文翻译系列(十八)containerd支持NRI

节点资源接口 NRI 是节点资源接口&#xff08;Node Resource Interface&#xff09;&#xff0c;它是一个通用框架&#xff0c;用于将扩展功能插入兼容 OCI 的容器运行时。它提供了插件跟踪容器状态并对其配置进行有限的更改改的基本机制。 NRI 本身与任何容器运行时的内部实…

猫头虎分享已解决Bug || AJAX请求错误(AJAX Request Error):AJAX Error: 404 Not Found

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

SpringIOC之support模块ReloadableResourceBundleMessageSource

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

分布式系统架构介绍

1、为什么需要分布式架构&#xff1f; 增大系统容量&#xff1a;单台系统的性能瓶颈&#xff0c;多台机器才能应对大规模的应用场景&#xff0c;所以就需要我们的应用支撑平台具备分布式架构。 加强系统的可用&#xff1a;为了满足业务的SLA要求&#xff0c;需要通过分布式架构…

uniapp的配置和使用

①安装环境和编辑器 注册小程序账号 微信开发者工具下载 uniapp 官网 HbuilderX 下载 首先先下载Hbuilder和微信开发者工具 &#xff08;都是傻瓜式安装&#xff09;&#xff0c;然后注册小程序账号&#xff1a; 拿到appid&#xff1a; ②简单通过demo使用微信开发者工具和…