NO12 蓝桥杯单片机之DS1302的使用

1 DS1302是什么

DS1302由两块存储器组成,一个是日历时钟寄存器还有一个是31位的静态RAM存储器。

而在蓝桥杯中常考的就是日历时钟寄存器,故这里只介绍日历时钟寄存器。简单来说,其就是一个“电子表”,他会自动的实时记录时间,而不需要像我们之前运用定时器做的时钟一样,要自己来设计时钟怎么运行,DS1302是已经自动设计好了,我们只需要写入从哪个时刻开始计时,以及读取相应的时间即可。

2 DS1302的结构

2.1 硬件原理图(就是单片机上DS1302芯片的引脚连接情况)

这里比较重要的就是SCK,RST,I/O(SDA)这三个引脚,其在头文件中需要定义,要学会看原理图这三个口连接哪三个引脚。

2.2 内部寄存器结构图

2.2.1 控制字的格式

控制字简单理解就是控制写入或读取哪个地址啊,是读取还是写入啊,用的是RAM还是CK啊这些操作,各个位的要求如图。

(再往下看,其实这个控制字就是下个图中左侧读寄存器和写寄存器的那些地址为什么是这样写。)

比如:当选择日历时钟给模式。

读寄存器的第一个地址为81H, BIT7=1,BIT6=0,BIT5~BIT1=0,读操作故BIT0=1,

即1000 0001,写成16进制为81H

写寄存器的第一个地址为80H,BIT7=1,BIT6=0,BIT5~BIT1=0,写操作故BIT0=0,

即1000 0000,写成16进制为80H。

读寄存器的第二个地址为83H, BIT7=1,BIT6=0,BIT5~BIT2=0,BIT1=1,读操作故BIT0=1,

即1000 0001,写成16进制为83H

......

2.2.2 日历时钟寄存器

(以下图来源小蜜蜂老师,注意:有个错误,CH为1的时候时钟是停止为0的时候是开始运行,这里小蜜蜂老师写反了。

日历时钟寄存器中一共包含8个8位寄存器,前7个分别为秒——分——时——日——月——周——年,(黄色高亮部位即为可以用于表示时间数据的位)

最后一个为控制寄存器,有效位只有BIT7,其他强制为0。(具体操作如图)

第一个秒寄存器:(CH为1的时候时钟是停止为0的时候是开始运行,这里小蜜蜂老师写反了。

第三个时寄存器BIT7位表示可以选择是12小时模式还是24小时模式,当选择24小时时,BIT5位用于选择AM还是PM模式。

注意:时间数据是用BCD码表示,(以八位数为例,前四个为十位,后四个为个位,且每四个数只能表示0~9),因此,图中黄色高亮部分有的写10秒,10分,指的是秒的十位和分的十位,(由于秒和时十位最多为5,故只需要用三个位就可以表示,最高位恒为0,只是秒的最高位被利用成了CH位而已。)

3 DS1302代码编写即使用

(1):地址写成数组

首先,日历时钟寄存器经过控制字格式来写,地址是固定的,因此在代码编写中将读写寄存器地址写成一个固定的数组会方便后续操作。

(与秒——分——时——日——月——周——年即上一个图中的顺序一 一对应,由于最后一个寄存器只有首位有效,我们就放到后面单独写,就不写进数组里了

///写寄存器地址
unsigned char code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};//读寄存器地址
unsigned char code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};

(2):时间参数写成数组

 DS1302的基本操作实际上非常简单,只有两个操作:其一是设定时间参数,其二是读取实时时间。不管是那个操作,MCU都要通过SPI接口进行数据交互,而SPI接口有其规定的时序,这个必须参考数据手册(这个在官方给的底层代码中.c文件有写,有空可以去看看,所以在这里只需要调用里面函数即可。)

要设定时间参数就要写进时间,因此把要写进去的时间参数也写成一个数组会比较方便

比如:注意写入顺序,秒——分——时——日——月——周——年

这里写成16进制时没有进行下一节(第四节)中讲的数据的转换,而是直接写成了16进制(已转换为为二进制的形式),这是因为若每四个单元都只是0~9,那么BCD和16进制(已转换为二进制的形式)是一样的,故直接写即可。

(3)调用函数来进行读取实时时间

调用以下两个函数(底层代码.c文件)可能有时候名称会有改变具体看你用的底层代码,传入数组的地址以及数据即可进行读取。


unsigned char Read_Ds1302_Byte ( unsigned char address ) 

void Write_Ds1302_Byte( unsigned char address,unsigned char dat ) 

(注意:千万别漏了还有几个寄存器要单独写的,在执行函数中记得写!!)

4 DS1302读写数据时的转换 !!!!!!

这是个难点!

因为DS1302储存是按BCD来储存的,然后我们需要知道一个概念,就是单片机内的数据都是以0,1这两种形式储存(不论是二进制还是BCD等本质还是01),但是在计算时,单片机就直接默认以这些数据(不论是二进制数还是BCD等等)通通运用二进制的转换规则来转换成十进制,在编写代码进行运算时,就直接把这些数据看成是十进制数来进行运算公式的编写。

但是读取显示出来的数据是以16进制的数来表示的(这个就不要管,你在编写公式时就想着这是个十进制数来写公式转化就行了!!!!)

4.1 然后就要解释一下各种进制的转换关系:

(图源:BCD码以及各进制之间的相互转换-CSDN博客)

特别要说一下十六进制和BCD码的区别。

16进制其实就只有0~F这些单个数字,平时我们运算时的每四位作为一个单元,然后每个单元对应0~F这16个数,写成01形式后就是16进制转换为二进制后的结果(即16进制本身为单个数字,而写成每四个是已经转换为2进制的结果),为了不易弄混,其转化为十进制数记成先转成二进制数在以二进制数的方法转十进制(即2^0 * _+ 2^1 * _ +....)

而BCD码本身就是以每四个数字为一个单元,只是每个单元对应的只有0~9这十个数字,而每个单元作为十进制的一位,比如11,BCD码为0001 0001(前四个数转化为十进制是1,为十进制的十位数,后四个数转化为十进制是1,为十进制的个位数,)因此BCD码还要继续转换为二进制。(比如下图中10的表达,二进制是1010,而BCD是0001 0000)

(来源bcd码和16进制的区别_bcd和16进制的区别-CSDN博客)

但是,当四个为1个单元只表示0~9时,此时BCD和16进制(已转换为二进制的形式)是一样的,此时写入数据就可以直接用16进制表达,而不需要在进行转换。


所以可以看到,对于同一个十进制数,用BCD表达,十六进制表达二进制表达都是不一样的。

4.2 DS1302中的转换

在DS1302中数据是以BCD储存的,但是我们讲到在单片机运算时,单片机是默认运用二进制的转换规则来把这些0101形式转换为十进制来进行运算(无论是写入单片机还是读取的单片机的数据),那么在写入和读写数据时(通常只用16进制来表示写入和读写的数据),就要进行BCD码的转换。

(参考:DS1302内码和10进制二进制十六进制之间转换.doc (book118.com),图片来源也是这个文档。)

写入DS1302:

要写入一个十进制为45的数,如果直接把45写进单片机的DS1302,(前面说到,单片机默认是以转换二进制的规则来把二进制转十进制,或者十进制转二进制),那么单片机就会运用2进制规则转换45后储存起来,即等于0010 1101(2^5 * 1 + 2^3 *1 +2^2 * 1 + 2^0 * 1),但是DS1302又是以BCD码的形式储存的,0010 1101对应的BCD码是完全不存在的(因为1101对应>9了,而且单看前四位为2,说明十进制数的十位为2,也是不对的),因此,我们要进行数据的转换使得写进去的数最终表示为BCD码的形式转换回来十进制是我们想要的十进制数。简单说,我们想要45,但我们不能直接写45,我们要写69,这样单片机按2进制规则储存起来的就是0100 0101,按BCD方式转化为十进制就是我们想要的45。

以下例子的公式就是把所谓45转换为69的过程。

读取DS1302:

同样,当BCD存储为0100  0101,如果我们直接读取这个数据,出来的数对应十进制应该是69,因此,我们要把BCD码转换成45对应的二进制,再进行读取,最终显示的是以16进制来显示(转化为十进制是45)。

以下例子的公式就是把69转换为45的过程。

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

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

相关文章

Suno - AI自动作曲

文章目录 关于 Suno创作歌词结构曲风 关于 Suno Suno 是一款自动编曲工具。 官网 :https://www.suno.ai Suno is building a future where anyone can make great music. Whether you’re a shower singer or a charting artist, we break barriers between you …

关于Devc++调试的问题以及解决STL变量无法查看

目前Devc的调试主要有以下几点: 1.调试不能直接查看stl变量,会卡死不动 2.目前单步进入只能用鼠标键按 3.若想按下一步进入函数体内,要在函数体内打上断点才行 4.调试到return 0 ;上一句就停了,不会结束程序 5.目前F2跳至断点…

matplotlib 绘图

matplotlib 绘图 方便设置legend图例的位置 ax1.legend(loc‘upper center’, bbox_to_anchor(0.3, -0.1)) ax2.legend(loc‘upper center’, bbox_to_anchor(0.6, -0.1)) import numpy as np import matplotlib.pyplot as plt from scipy.stats import norm from scipy.inter…

SpringBoot Redis的使用

官方文档: 官方文档:Spring Data Redis :: Spring Data Redis 和jedis一样,SpringBoot Redis 也可以让我在Java代码中使用redis,同样也是通过引入maven依赖的形式。 加速访问github: 使用steam可以免费加速访问github Spring…

HarmonyOS实战开发-目标管理、如何实现一个自定义弹窗。

介绍 本篇Codelab将介绍如何使用State、Prop、Link、Watch、Provide、Consume管理页面级变量的状态,实现对页面数据的增加、删除、修改。要求完成以下功能: 实现一个自定义弹窗,完成添加子目标的功能。实现一个可编辑列表,可点击…

Android14之深入理解sp模板类(二百零二)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

Android R 广播注册与发送流程分析

静态广播注册时序图 动态广播注册时序图 发送广播时序图 前言 广播接收器可以分为动态和静态,静态广播接收器就是在 AndroidManifest.xml 中注册的,而动态的广播接收器是在代码中通过 Context#registerReceiver() 注册的。 这里先从静态广播的流程开始…

2020年天津市二级分类土地利用数据(矢量)

天津市,位于华北平原海河五大支流汇流处,东临渤海,北依燕山。地势以平原和洼地为主,北部有低山丘陵,海拔由北向南逐渐下降,地貌总轮廓为西北高而东南低。天津有山地、丘陵和平原三种地形,平原约…

深夜变电站三维可视化:电力之心的全新解读

在寂静的深夜,城市的灯火依旧璀璨夺目,而在这背后,有一个不为人知的守护者正在默默工作——那就是变电站。如今,随着科技的飞速发展,我们有了更直观、更生动的方式来了解这个神秘的电力枢纽——三维可视化技术。 深夜变…

前端超分辨率技术应用:图像质量提升与场景实践探索-设计篇

超分辨率! 引言 在数字化时代,图像质量对于用户体验的重要性不言而喻。随着显示技术的飞速发展,尤其是移动终端视网膜屏幕的广泛应用,用户对高分辨率、高质量图像的需求日益增长。然而,受限于网络流量、存储空间和图像…

如何在Win10使用IIS服务搭建WebDAV网站并实现无公网IP访问内网文件内容

文章目录 前言1. 安装IIS必要WebDav组件2. 客户端测试3. 使用cpolar内网穿透,将WebDav服务暴露在公网3.1 安装cpolar内网穿透3.2 配置WebDav公网访问地址 4. 映射本地盘符访问 前言 在Windows上如何搭建WebDav,并且结合cpolar的内网穿透工具实现在公网访…

com.alibaba.boot.nacos.config.binder.NacosBootConfigurationPropertiesBinder解决记录

一直正常的服务突然启动失败了,控制台报错 查询后发现是spring-boot-starter版本2.4和nacos-config 0.2.8版本冲突了 于是看了下nacos-config版本,发现有两个如下 但是原来启动正常,看了下老版本代码发现nacos-config-springboot-autoconfig…

接口自动化测试——文件上传/下载

简介: 轻松搞定文件上传接口和文件下载接口。 我们在做接口自动化测试的时候,经常会碰到文件上传接口和文件下载接口。 那么,文件接口跟普通接口有什么区别呢?又该如何实现呢? 〇、前言 文件上传/下载接口与普通接…

怎么让ChatGPT批量写作原创文章

随着人工智能技术的不断发展,自然语言处理模型在文本生成领域的应用也日益广泛。ChatGPT作为其中的佼佼者之一,凭借其强大的文本生成能力和智能对话特性,为用户提供了一种高效、便捷的批量产出内容的解决方案。以下将就ChatGPT批量写作内容进…

colmap 【Feature matching】特征匹配参数解释

(Windows)Colmap 具体使用教程可参考我的这篇博文 下面只是matching参数解释 Matching这个阶段很重要,匹配方式不同会对最终结果影响很大,要根据实际情况选择合适的匹配方式。下面是各个参数的详细解释。 1.Exhaustive——官方文…

OSPF---开放式最短路径优先协议

1. OSPF描述 OSPF协议是一种链路状态协议。每个路由器负责发现、维护与邻居的关系,并将已知的邻居列表和链路费用LSU报文描述,通过可靠的泛洪与自治系统AS内的其他路由器周期性交互,学习到整个自治系统的网络拓扑结构;并通过自治系统边界的路…

URL编码:原理、应用与安全性

title: URL编码:原理、应用与安全性 date: 2024/3/29 18:32:42 updated: 2024/3/29 18:32:42 tags: URL编码百分号编码特殊字符处理网络安全应用场景标准演变未来发展 在网络世界中,URL(统一资源定位符)是我们访问网页、发送请求…

day69实现MyBatis 的Mapper接口 封装SqlSession对象 mapper接口形参怎么给占位符赋值

一 创建项目的准备工作 1 添加jar包 MySql.jar .MyBatis.jar 2 在src中配置MyBatis.xml文件 二 封装SqlSession对象 1 SqlSessionFactoryBuilder 生命周期 这个类可以被实例化,使用和丢弃。一旦你创建了 SqlSessionFactory 后…

九河云荣获“华为2024·亚太区年度杰出合作伙伴奖”

2024年3月26日~27日,以“加速智能化,一切皆服务”为主题的华为亚太生态伙伴大会在东莞隆重开幕,九河云作为专业的多云管理服务商,凭借多年来在云领域的赋能发展应邀出席并荣获“亚太区年度杰出伙伴奖”,这不仅彰显了九…

为什么要学Python?Python的优势在哪?

人生苦短,我用 Python 不知道从什么时候开始流行这句话 Python 是个什么神仙编程语言 为啥全世界都在鼓励孩子学 Python 简单容易上手 国内、国际的竞赛机会多,含金量足 Python 好就业、薪资高 下面且看详细分析 01 什么是Python / 科技编程老师…