单片机学习笔记---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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

005集——shp格式数据转换乱码问题——arcgis

shp数据格式与其他数据格式转换过程中会遇到乱码等问题&#xff0c;原因如下&#xff1a; 在Shapefile头文件&#xff08;dBase Header&#xff09;中&#xff0c;一般会包含字符编码信息&#xff0c;这个信息称为 LDID &#xff08; Language Driver ID&#xff09;。在使用ar…

博主:今日无更

今天放个假&#xff0c;不更新文章 &#xff08;占位符&#xff09;

龙芯开启ssh服务——使用Putty连接

本文采用龙芯3A6000处理器&#xff0c;Loongnix操作系统。 为了能使用其他电脑远程操控龙芯电脑&#xff0c;需要打开loongnix的ssh服务&#xff0c;并在其他电脑里使用putty连接loongnix。 1 修改ssh配置文件 命令行输入&#xff1a; sudo vim /etc/ssh/sshd_config按下i插…

防疫物资管理新篇章:Java+SpringBoot实战

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

问题:A注册会计师必须在期中实施实质性程序的情形是()。 #学习方法#其他

问题&#xff1a;A注册会计师必须在期中实施实质性程序的情形是&#xff08;&#xff09;。 A&#xff0e;甲公司整体控制环境不佳 B&#xff0e;将期中实质性程序所获证据与期末数据进行比较 C&#xff0e;评估的认定层次重大错报风险很高 D&#xff0e;没有把握通过在期中…

Sklearn、TensorFlow 与 Keras 机器学习实用指南第三版(七)

原文&#xff1a;Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第十六章&#xff1a;使用 RNN 和注意力进行自然语言处理 当艾伦图灵在 1950 年想象他著名的Turing 测试时&#xff0c;他提出了…

leetcode(双指针)283.移动零(C++详细题解)DAY3

文章目录 1.题目示例提示 2.解答思路3.实现代码结果 4.总结 1.题目 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 示例 1: 输入…

C语言每日一题(52)单值二叉树

力扣网 965 单值二叉树 题目描述 如果二叉树每个节点都具有相同的值&#xff0c;那么该二叉树就是单值二叉树。 只有给定的树是单值二叉树时&#xff0c;才返回 true&#xff1b;否则返回 false。 示例 1&#xff1a; 输入&#xff1a;[1,1,1,1,1,null,1] 输出&#xff1a;t…

MySQL数据库⑦_复合查询+内外链接(多表/子查询)

目录 1. 回顾基本查询 2. 多表查询 2.1 笛卡尔积初步过滤 3. 自连接 4. 子查询 4.1 单行子查询 4.2 多行子查询 4.2 多列子查询 4.2 from子句中使用子查询 5. 合并查询 6. 内外链接 6.1 内连接 6.2 左外链接 6.2 右外连接 本篇完。 1. 回顾基本查询 先回顾一下…

ctfshow-web11~20-WP

web11 根据提示,查询对ctfshow域名进行dns查询,查看TXT记录 阿里云查询链接:阿里云网站运维检测平台 获取flag成功 web12 根据题目提示,我们访问robots.txt,获取到后台地址 然后我们访问一下后台

Linux线程 分离和同步与互斥 条件变量

Linux线程 分离和同步与互斥 条件变量 1. 分离线程2. 线程互斥与互斥量3. 线程同步与竞态条件4. pthread库与条件变量5. 生产者-消费者 1. 分离线程 什么是线程分离&#xff1f; 线程分离是指线程在结束时&#xff0c;操作系统会自动回收其资源&#xff0c;而无需其他线程显式地…

一文带你读懂Python中的pickle模块

pickle模块&#xff1a; 属于python专有的模块&#xff0c;用法&#xff0c;功能与json类似。 常用方法&#xff1a; dump(obj,fp)&#xff1a;将对象以字符串的形式写入文件中。 load(fp)&#xff1a;将数据从文件中读出&#xff0c;并返回&#xff08;需要变量接收&#…

幻兽帕鲁(Palworld)允许自建私服,它是怎么挣钱的呢?

最近爆火的网游幻兽帕鲁由于官方准备不足导致服务拥堵&#xff0c;游戏公司没有单纯的自建服务器扩容&#xff0c;而是开放了服务器安装包&#xff0c;让玩家自搭私服。玩家自搭私服&#xff0c;游戏公司还怎么挣钱&#xff1f; 幻兽帕鲁的财务模式在允许用户托管服务器的同时…

Low 级别反射型 XSS 攻击演示(附链接)

环境准备 如何搭建 DVWA 靶场保姆级教程&#xff08;附链接&#xff09;https://eclecticism.blog.csdn.net/article/details/135834194?spm1001.2014.3001.5502 测试 打开 DVWA 靶场并登录&#xff0c;找到反射型 XSS 页面&#xff08;笔者这里是 Low 级别&#xff09; 先…

C++算法之双指针、BFS和图论

一、双指针 1.AcWing 1238.日志统计 分析思路 前一区间和后一区间有大部分是存在重复的 我们要做的就是利用这部分 来缩短我们查询的时间 并且在使用双指针时要注意对所有的博客记录按时间从小到大先排好顺序 因为在有序的区间内才能使用双指针记录两个区间相差 相当于把一个…

Java 使用 Map 集合统计投票人数

Java 使用 Map 集合统计投票人数 package com.zhong.mapdemo.map;import javax.swing.plaf.synth.SynthOptionPaneUI; import java.util.ArrayList; import java.util.HashMap; import java.util.Map;/*** ClassName : MapCountPeopleNumber* Description : 使用 map 统计投票人…

记一次使用gophish开展的钓鱼演练

这周接到客户要求&#xff0c;组织一次钓鱼演练&#xff0c;要求是发送钓鱼邮件钓取用户账号及个人信息。用户提交后&#xff0c;跳转至警告界面&#xff0c;以此来提高客户单位针对钓鱼邮件的防范意识。 与客户沟通后得知他们企业内部是由邮箱网关的&#xff0c;那么就意味着…

基于微信小程序的校园失物招领小程序

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

C++初阶篇----新手进村

目录 一、什么是C二、C关键字三、命名空间3.1命名空间的定义3.2命名空间的使用 四、C输入和输出五、缺省参数5.1缺省参数的概念5.2缺省参数的分类 六、函数重载6.1函数重载的概念6.2函数重载的原理----名字修饰 七、引用7.1引用概念7.2引用特性7.3常引用7.4引用的使用7.5传值、…

nginx + DNS域名解析(使用自己的域名访问)

配置链接: Nginx 安装配置 | 菜鸟教程 安装完nginx后&#xff0c;访问&#xff1a; cd /usr/local/nginx/sbin/ 然后使用./nginx可使用nginx。 停止nginx服务 ./nginx -s stop 访问:http://服务器的ip地址后出现 因为访问IP地址很繁琐&#xff0c;需要记忆ip的数字地址&a…