(六)、DS1302实时时钟

1、原理(图 二十六)

      DS1302通过三线串行接口与单片机进行通信。微控制器可以通过设置RST引脚为高电平来使能DS1302,并通过SCK引脚提供串行时钟信号,然后通过I/O引脚进行数据的读写操作。在开头用sbit来定义三个引脚,方便后续操作。(sbit SDA = P2^3;sbit SCK = P1^7;sbit RST = P1^3;)操作RST = 0实际含义就是P1^3 = 0。DS1302 的时钟和日历数据采用二进制编码的十进制(BCD码,即字节的高四位是数据的十位,字节的低四位是数据的个位)格式存储,这样方便读取和显示。所以在发送数据前我们可以将十进制转为BCD码形式发送。读取时将BCD码形式转换为十进制数据。

       蓝桥杯官方会给出底层通信函数,包括在指定地址下写入一个数据,在指定地址下读取一个数据。通过这两个函数就可以实现简单的通信了。至于具体的时序图我们可以不深入研究。 在DS1302中时分秒、年月日、星期都有固定的写入与读取的地址。见图 二十七注释。

       在写入之前必须解除写保护,也就是将0x8E对应寄存器下WP位数据置0,在写入完成后再重新开启写保护。

      定义一个unsigned char 类型数据Time[3]存放十进制的数据,再写入时要将十进制转换为BCD码,公式:Time[0]/10*16+Time[0]%10;读取时BCD码形式转换为十进制数据,公式:Data/16*10+Data%16。

      在今年蓝桥杯国赛中出现了从来没考过的读取负温度,打破了常规,目前DS1302只考过24小时制度--时分秒写入与读取(十分简单)。在后期的文案中会给大家普及,包括可能突破常规的DS1302年月日写入与读取、12小时制度小时…

                     图 二十六 DS1302原理图

                    图 二十七  时分秒、年月日、星期地址

注释:

      第一列READ—read读取、第二列WRITE-write写入、BIT就是二进制数据下对应的位,Seconds秒、Minutes分钟、Hour小时、Date日,Month月、Day星期、Year年、WP是写保护位(该位置为0关闭写保护,允许写入,为1禁止写入)

       标为10Year或者10Seconds类似表示该位置表示十位,如写入0x56数据(BCD码)在秒寄存器中就表示十位为5,个位为6的秒数据,就是56s,如果此时写入的表示BCD码形式,而是十进制56,数据就会出现错误。

       小时默认都为24小时制度,不用管。写入0x23就是23小时,默认Bi7写入0,Bit5、Bit4共同决定十位,Bit0-3就是决定个位的数据。

2、代码解读

写入:

       第一步,关闭写保护也就是让WP位置置0,Write_Ds1302_Byte(地址,数据),所以在0x8e位置写0x00就可以解除写保护。

       接下来我们需要将秒位置停止,当在23:59:59时,此时如果继续让秒指针转动,而分与小时还没写入就会出现一些问题。所以在0x80(秒对应写入地址如图 二十七)写入数据0x80停止秒。

       然后开始写入时分秒数据,可以在主函数中定义unsigned char Time[3]={20,56,45}数组,在Ds1302.c中声明外部可调用数组extern unsigned char Time[3],秒写入地址0x80,分0x82,小时0x84,分别在对应地址下可写入对应数据,将十进制数据转换成BCD码形式。公式:Time[0]/10*16+Time[0]%10,Time[0]为即将写入的十进制小时数据。

      最后再打开写保护,将Bit7位置WP位置置1,即在0x8e位置下写0x80就可以打开写保护。

读取:

依次读取0x85(小时读取地址),0x83(分钟读取地址),0x81(秒读取地址),并且将数据转换为十进制即可。公式:Data / 16 * 10 + Data % 16,Data为BCD码形式数据(读取原始数据)

            图 二十八 DS1302时分秒写入代码展示

           图 二十九 DS1302时分秒读取代码展示

3、提供参考代码,希望对读者有帮助

#include <STC15F2K60S2.H>
#include <INTRINS.h>sbit SDA = P2^3;
sbit SCK = P1^7;
sbit RST = P1^3;/*--------------------------------------官方提供------------------------------------------*/
extern unsigned char Time[3];
/*	# 	DS1302代码片段说明1. 	本文件夹中提供的驱动代码供参赛选手完成程序设计参考。2. 	参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题中对单片机时钟频率的要求,进行代码调试和修改。
*/								//
void Write_Ds1302(unsigned  char temp) 
{unsigned char i;for (i=0;i<8;i++)     	{ SCK = 0;SDA = temp&0x01;temp>>=1; SCK=1;}
}   //
void Write_Ds1302_Byte( unsigned char address,unsigned char dat )     
{RST=0;	_nop_();SCK=0;	_nop_();RST=1; 	_nop_();  Write_Ds1302(address);	Write_Ds1302(dat);		RST=0; 
}//
unsigned char Read_Ds1302_Byte ( unsigned char address )
{unsigned char i,temp=0x00;RST=0;	_nop_();SCK=0;	_nop_();RST=1;	_nop_();Write_Ds1302(address);for (i=0;i<8;i++) 	{		SCK=0;temp>>=1;	if(SDA)temp|=0x80;	SCK=1;} RST=0;	_nop_();SCK=0;	_nop_();SCK=1;	_nop_();SDA=0;	_nop_();SDA=1;	_nop_();return (temp);			
}/*--------------------------------------官方提供------------------------------------------*///DS1302写入时分秒数据函数
void DS1302_WriteTime()
{unsigned char i;Write_Ds1302_Byte(0x8e,0x00);  //关闭写保护(WP位置置0)Write_Ds1302_Byte(0x80,0x80);  //停止秒时钟,防止写入时产生错误Write_Ds1302_Byte(0x84,Time[0]/10*16+Time[0]%10); //小时Write_Ds1302_Byte(0x82,Time[1]/10*16+Time[1]%10); //分Write_Ds1302_Byte(0x80,Time[2]/10*16+Time[2]%10); //秒/*同义表达for(i = 0;i<3;i++)Write_Ds1302_Byte(0x84-i*2,Time[i]/10*16+Time[i]%10);*/Write_Ds1302_Byte(0x8e,0x80);   //打开写保护
}//DS1302读取时分秒数据函数
void DS1302_ReadTime()
{unsigned char i;unsigned char temp;EA =  0;  //保护时序,关闭中断/*同义表达for(i = 0;i<3;i++){temp = Read_Ds1302_Byte(0x85-i*2);Time[i] = temp/16*10+temp%16;}*/temp = Read_Ds1302_Byte(0x85);  //读取时数据Time[0] = temp/16*10+temp%16;   //BCD码转十进制temp = Read_Ds1302_Byte(0x83);  //读取分数据Time[1] = temp/16*10+temp%16;temp = Read_Ds1302_Byte(0x81);  //读取秒数据Time[2] = temp/16*10+temp%16;EA = 1;   //重新打开中断
}

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++对象访问有访问权限是不是在ide里有效

在C中&#xff0c;对象的访问权限&#xff08;即公有&#xff08;public&#xff09;、保护&#xff08;protected&#xff09;和私有&#xff08;private&#xff09;成员的访问&#xff09;是编译时的一部分&#xff0c;而不是运行时。这意味着&#xff0c;无论是在IDE&#…

CubeMX安装芯片包

1.点击HELP2.选择公理嵌入式软件包3.选择并下载芯片包

【面向对象】面向对象七大原则

设计模式 设计模式是什么&#xff1f; 设计模式是一种针对于反复提出问题的解决方案&#xff0c;是经过长时间经验和试错而总结出来的一套业务流程&#xff1b; 其目的是为了提高代码的可重用性和可维护性&#xff0c;让代码更容易让人理解&#xff0c;保证代码可靠性&#…

《计算机“十万个为什么”》之 面向对象 vs 面向过程:编程世界的积木与流水线

《计算机“十万个为什么”》之 面向对象 vs 面向过程&#xff1a;编程世界的积木与流水线 &#x1f916; 想象你要造一辆汽车&#x1f527;&#xff1a; 面向过程 按手册一步步拧螺丝&#xff1a;拧紧螺栓A → 安装轮胎B → 焊接车架C 面向对象 召唤汽车人战队&#xff1a;引…

Visual Studio Code (VSCode) 的常用快捷键

Visual Studio Code (VSCode) 的常用快捷键可极大提升开发效率。以下是分类整理的 **核心快捷键**&#xff08;基于 **Windows/Linux** 系统&#xff0c;macOS 用户将 Ctrl 替换为 Cmd&#xff0c;Alt 替换为 Option&#xff09;&#xff1a;⚡ 基础操作快捷键功能Ctrl N新建文…

vite面试题及详细答案120题(01-30)

《前后端面试题》专栏集合了前后端各个知识模块的面试题&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

Cesium学习(一)-基础

Cesium是一个开源的JavaScript库&#xff0c;专门用于创建3D地球和地图可视化。它在GIS、航空航天、城市规划等领域有广泛应用。 Cesium核心特性3D地球可视化 基于WebGL的高性能3D渲染支持全球地形和影像数据准确的地球模型&#xff08;WGS84椭球体&#xff09;多维数据支持 时…

饿了么招java开发咯

研发工程师-JAVA/Golang&#xff08;岗位信息已经过jobleap.cn授权&#xff0c;可以在CSDN发布&#xff09;饿了么 杭州收录时间&#xff1a; 2025年08月05日职位描述1、参与基础软件的设计、开发和维护&#xff0c;如分布式中间件、DevOps平台、应用监控系统等&#xff1b; 2…

java web 未完成项目,本来想做个超市管理系统,前端技术还没学。前端是个简单的html。后端接口比较完善。

代码结构 超市管理系统/├── src/ │ ├── com/ │ │ └── zhang/ │ ├── documents.txt │ ├── documents_detail.txt │ ├── goods.txt │ ├── order.txt │ ├── order_detail.txt │ ├── role.txt │ ├── tb_test.txt │ …

R语言基础图像及部分调用函数

R语言基础图像及部分调用函数 散点图 散点图是将所有的数据以点的形式展现在直角坐标系上&#xff0c;以显示变量之间的相互影响程度&#xff0c;点的位置由变量的数值决定&#xff0c;每个点对应一个 X 和 Y 轴点坐标。 散点图可以使用 plot() 函数来绘制 例子 x<-c(10,40)…

自由学习记录(77)

官方模版、、都不用了&#xff0c;记得之前用gitextension 的时候也好像有这种问题&#xff0c;也不知道怎么回事 用自己的就行了 网上说什么都没用&#xff0c;还是要自己老实写&#xff0c;配上截图工具截屏目录直接转文字过去&#xff0c;其实字都不要打多少的 一张很深刻…

运动想象 (MI) 分类学习系列 (18) : MSVTNet

运动想象分类学习系列:用于基于脑电图的运动图像解码的多尺度视觉转换器神经网络 0. 引言 1. 主要贡献 2. 方法![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/65a03fcd4a9144f6a7324b0969fd9d4e.png#pic_center) 3. 结果 3.1 脑电图数据预处理 3.2 解码性能比较 3.3…

Spring 03 Web springMVC

Springboot 常用 Spring MVC 实现 web 服务。 Spring MVC 请求处理流程图片来自《Spring 实战第四版》 浏览器请求首先被交给 DispatcherServlet 前端控制器。 DispatcherServlet 查询处理器映射以决定将请求发送给哪个控制器。控制器处理业务逻辑后&#xff0c;向 DispatcherS…

大厂面试题

线程池的状态?回答:running->shutdown->stop->tidyng->TERMINATED 线程池状态怎么流转2. 回答:变成shutdown&#xff0c;执行shutdown()函数变成stop&#xff0c;执行shutdownnow函数 变成tining&#xff0c;所有任务已处理完 变成TERMINATED&#xff0c;线程池调…

达芬奇31-40

快捷键C鼠标左键拖拽到节点上 A鼠标左键拖拽节点 复制到另一个图层上Raw素材太哦调整为log方便调色磨皮中间调向左磨皮,向右变老找到丢失的高光磨皮后脸部高光消失,或不明显,此时用亮度吸管工具找到脸部的高光,拉高中灰和亮部的Y值质感纹理增强器Tiny,Fine高频细节(脸部)增强或…

dify

一、SVG Logo Design ### 任务 我希望你充当图像生成的提示生成器。 ### 任务描述 你的工作是提供详细且富有创意的描述&#xff0c;以激发 AI 生成独特而有趣的图像。请记住&#xff0c;格式应遵循以下一般模式&#xff1a; <主要主题>, <主要主题的描述>, <背…

Mysql 实战问题处理速通

文章目录创建账号和授权查询没有主键的表统计每个库大小前十张大表清理日志表Prepared statement needs to be re-preparedxtrabackup 问题锁问题处理快速处理查询事务等待和阻塞情况innodb_trxprocesslistdata_locksdata_lock_waitsmetadata_locksevents_statements_current其…

如何测量滚珠花键的旋转方向间隙?

测量滚珠花键的旋转方向间隙需要使用适当的工具&#xff0c;通常情况下&#xff0c;可以使用游标卡尺或外径卡尺进行测量。这些工具可以准确地测量间隙的宽度和深度&#xff0c;并且可以轻松地记录测量结果。手动检测法&#xff1a;将滚珠花键固定在支架上&#xff0c;确保其可…

Android AppSearch 深度解析:现代应用搜索架构与实践

一、AppSearch 概述1.1 什么是 AppSearchAppSearch 是 Android Jetpack 组件库中的一个现代化本地搜索框架&#xff0c;于 Android 12 (API level 31) 引入&#xff0c;旨在为 Android 应用提供高效、可靠的本地数据索引和搜索能力。与传统的 SQLite 搜索方案相比&#xff0c;A…

使用公众号的消息模板给关注用户发消息

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…