51单片机编程应用(C语言):DS1302实时时钟

单片机计时的缺陷:

1.他的精度不高,没有时钟芯片精度高,

2.会占用单片机CPU的时间, 

3.单片机的时钟无法掉电继续运行,(最大的缺点)

DS1302芯片内部有备用电池,可以掉电继续计时。

 

1,VCC2:主电源引脚

2,X1、X2:DS1302 外部晶振引脚,通常需外接 32.768K 晶振(给芯片提供一个稳定的脉冲,用来计数的脉冲,由石英震荡而成)(石英钟) 

3,GND:电源地

4,CE:使能引脚,也是复位引脚(新版本功能变)。

5,I/O:串行数据引脚,数据输出或者输入都从这个引脚

6,SCLK:串行时钟引脚

7,VCC1:备用电源

CE,I/O,SCLK,是我们主要操作的引脚,我们操作这三个引脚把芯片内部的时钟读出来。写入时间也是用这三个引脚,把我们想要设置的时间写进去。它规定了一套协议,我们要熟悉这些协议。这些时间都是存在芯片内部的寄存器中。我们要通过总线对寄存器进行读写,就可以读取和写入了

看内部结构可知,时钟芯片内部有31个8位寄存器。

 

当然,上面只是RTC的寄存器,还有很多其他的寄存器,只是我们只要操作时钟,这些寄存器就够了。 

ds1302控制寄存器 

 用于存放控制DS1302命令,可以控制该寄存器以控制选择读或写等操作。

我们操作单片机,是不是要考虑:在哪  写入  什么   在哪  读出   (什么)

在哪就是我们要操作哪一个寄存器,这么多寄存器,每个寄存器是有地址的,类似于房间的门牌号。写入数据还是读出数据,所以就有了上面的控制寄存器。

1.第7位,固定为1

2.第6位,1为寻址内部存储器地址RAM,0为寻址内部寄存器,即年月日所在存储器,一般设置为0

3.第5到1位,第6位存储器的地址

4.第0位,1位读操作,0为写操作

比如:

就是读秒这个寄存器:对应16进制的0x80 h

 

有了命令字,这些命令字与数据是如何对应起来的呢。

 

CE:复位时序

SCLK:时钟时序

IO:数据传输时序

注:DS1302与DS18B20都是从低位到高位传输(读/写)数据,编程时要注意。

上面是单字节写,单字节读。在写和读的时候,CE都是给高电平的。

SCLK就是单片机给固定的时钟。

I/O口的数据怎么写进去的,我们怎么通过I/O口读出数据呢?

这个协议就规定,在时钟上升沿的时候,I/O的数据将会被写入,在时钟下降沿,DS1302就会把自己的数据输出。(输不输出看我们给的命令)(方便我们要读)

简而言之就是: 上升沿单片机向时钟芯片写入,下降沿单片机对时钟芯片读出。跟SPI通信协议很像。

上升沿是地址,下降沿是数据,就是你首先给出访问的地址,这个地址包括命令,

比如:每来一个上升沿单片机写入了地址,这时候,芯片收到命令,如果是读,在下一个时钟周期

的下降沿就把数据发出来,如果是写,就在每个时钟的上升沿把数据写进去,

下面是代码环节:

比如我们先写入一个数据再读出:

首先按照芯片协议写入相关的函数,比如字节写,字节读等一系列操作

首先引脚定义一下:

//引脚定义
sbit DS1302_SCLK=P3^6;
sbit DS1302_IO=P3^4;
sbit DS1302_CE=P3^5;

初始化:因为单片机刚上电都是默认为1的。

void DS1302_Init(void)
{DS1302_CE=0;DS1302_SCLK=0;
}

写的操作(按照时序图一步一步完成的) 

/*** @brief  DS1302写一个字节* @param  Command 命令字/地址* @param  Data 要写入的数据* @retval 无*/
void DS1302_WriteByte(unsigned char Command,Data)
{unsigned char i;DS1302_CE=1;for(i=0;i<8;i++){DS1302_IO=Command&(0x01<<i);DS1302_SCLK=1;DS1302_SCLK=0;}for(i=0;i<8;i++){DS1302_IO=Data&(0x01<<i);DS1302_SCLK=1;DS1302_SCLK=0;}DS1302_CE=0;
}

 读的操作(按照时序图一步一步完成的) 

/*** @brief  DS1302读一个字节* @param  Command 命令字/地址* @retval 读出的数据*/
unsigned char DS1302_ReadByte(unsigned char Command)
{unsigned char i,Data=0x00;Command|=0x01;	//将指令转换为读指令DS1302_CE=1;for(i=0;i<8;i++){DS1302_IO=Command&(0x01<<i);DS1302_SCLK=0;DS1302_SCLK=1;}for(i=0;i<8;i++){DS1302_SCLK=1;DS1302_SCLK=0;if(DS1302_IO){Data|=(0x01<<i);}}DS1302_CE=0;DS1302_IO=0;	//读取后将IO设置为0,否则读出的数据会出错return Data;
}

下面是是主函数实现写入一位数据后然后读出来:(都是模块化编程)自己把.h文件写一下

#include <REGX52.H>
#include "LCD1602.h"
#include "DS1302.h"unsigned char Second;
void main()
{LCD_Init();DS1302_Init();LCD_ShowString(1,1,"RTC");DS1302_WriteByte(0x80,0x03)while(1){Second=DS1302_ReadByte(0x81);LCD_ShowNum(2,1,Second,3);}
}

但是读出来的数仍然有问题:(看视频28分钟后)为啥加了两个代码不是很理解。

如果读出时间为一个大于59并且不动的数,这芯片有可能是处于写保护状态,在   DS1302_WriteByte(0x80,0x03)后面加上

  DS1302_WriteByte(0x8E,0x00)即可解除芯片保护状态。

但是仍然会出现计时不准确的现象,因为寄存器的存储选着的是BCD码,不是正常的二进制

什么是BCD码:

所以我们要把BCD码转化为10进制。

下面是DS1302显示时间的main函数的代码:其他的在模块化编程中

#include <REGX52.H>
#include "LCD1602.h"
#include "DS1302.h"void main()
{LCD_Init();DS1302_Init();LCD_ShowString(1,1,"  -  -  ");//静态字符初始化显示LCD_ShowString(2,1,"  :  :  ");DS1302_SetTime();//设置时间while(1){DS1302_ReadTime();//读取时间LCD_ShowNum(1,1,DS1302_Time[0],2);//显示年LCD_ShowNum(1,4,DS1302_Time[1],2);//显示月LCD_ShowNum(1,7,DS1302_Time[2],2);//显示日LCD_ShowNum(2,1,DS1302_Time[3],2);//显示时LCD_ShowNum(2,4,DS1302_Time[4],2);//显示分LCD_ShowNum(2,7,DS1302_Time[5],2);//显示秒}
}

 

 注意:

但是51单片机内部的DS1302 没有备用电源,所以掉电后也无法继续计时。

8号引脚没有接备用电源。 

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

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

相关文章

fusion360 操作总结(不断更新)

平移缩放旋转快捷键 画布选择Windows 组合键macOS 组合键平移按住鼠标中键按住鼠标中键缩放滚动鼠标中键滚动鼠标中键动态观察旋转按住 Shift 键并按住鼠标中键按住 Shift 键并按住鼠标中键绕点动态观察按住 Shift 键单击并按住鼠标中键按住 Shift 键单击并按住鼠标中键撤消Ct…

MCU看门狗

目录 一、独立看门狗(IWDG) 1、IWDG 主要作用 2、IWDG 主要特性 3、编程控制 4、注意地方 二、窗口看门狗(WWDG) 1、窗口看门狗作用&#xff1a; 2、窗口看门狗产生复位信号有两个条件&#xff1a; 3、WWDG 框图 4、WWDG 将要复位的时间 5、编程控制 一、独立看门…

STL:优先级队列的实现

STL中优先级队列本质上就是堆。在上一篇博客中讲到过&#xff1a;堆是一种完全二叉树&#xff0c;逻辑结构上看起来像树&#xff0c;但在物理结构中是存储在线性表中。与普通线性表不同的是&#xff0c;堆中数据大小是规律排列的&#xff1a;小堆中每个节点都大于它的父节点&am…

SpringBoot实战:打造企业资产管理系统

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

001kafka源码项目gradle报错UnsupportedClassVersionError-kafka-报错-大数据学习

1 报错提示 java.lang.UnsupportedClassVersionError: org/eclipse/jgit/lib/AnyObjectId has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0 如…

Linux线程(1)--线程的概念 | 线程控制

目录 前置知识 线程的概念 Linux中对线程的理解 重新定义进程与线程 重谈地址空间 线程的优缺点 线程的优点 线程的缺点 线程异常 线程的用途 Linux线程 VS 进程 线程控制 创建线程 线程等待 线程终止 线程ID的深入理解 前置知识 我们知道一个进程有属于自己的P…

docker (六)-进阶篇-数据持久化最佳实践MySQL部署

容器的数据挂载通常指的是将宿主机&#xff08;虚拟机或物理机&#xff09;上的目录或文件挂载到容器内部 MySQL单节点安装 详情参考docker官网文档 1 创建对应的数据目录、日志目录、配置文件目录(参考二进制安装&#xff0c;需自己建立数据存储目录) mkdir -p /data/mysq…

计算机毕业设计springboot_vue房屋租赁系统_ku668

1.掌握Html&#xff0c;Css&#xff0c;JavaScript等基础编程语言。 2.掌握Vue框架&#xff0c;node环境&#xff0c;数据库等知识。 3.掌握开发系统的基本流程。 …

你了解API测试吗?如何充分的测试一个API?

什么是API&#xff1f; API代表应用程序接口。API是软件系统中的中间层&#xff0c;负责数据源与用户看到的图形用户界面&#xff08;GUI&#xff09;之间的数据通信。换句话说&#xff0c;API是软件的业务层&#xff0c;它在表示层和数据层之间创建连接。 API测试侧重于所谓的…

2.17C语言学习

P1678 烦恼的高考志愿 写完后发现题解里面用的是优先队列或者二分什么的&#xff0c;其实这个题可以贪心&#xff0c;我们把学校的分数线和学生的成绩分别进行排序&#xff0c;然后从前往后遍历&#xff0c;每次比较当前学校的分数与学生成绩的差距和下一个学校的分数与学生成…

re-captioning技术是什么

参考https://zhuanlan.zhihu.com/p/664192860 模型对图片进行caption操作时&#xff0c;输出的标题一般描述图片中的主体&#xff0c;而忽视了背景、常识关系等更为细节的描述。 图片比较重要的细节的描述应当包括&#xff1a; 物体存在的场景。如&#xff1a;在厨房的水槽&am…

Qt之条件变量QWaitCondition详解(从使用到原理分析全)

QWaitCondition内部实现结构图&#xff1a; 相关系列文章 C之Pimpl惯用法 目录 1.简介 2.示例 2.1.全局配置 2.2.生产者Producer 2.3.消费者Consumer 2.4.测试例子 3.原理分析 3.1.辅助函数CreateEvent 3.2.辅助函数WaitForSingleObject 3.3.QWaitConditionEvent …

阿里云服务器服务费怎么计算的?详细报价解析

2024年最新阿里云服务器租用费用优惠价格表&#xff0c;轻量2核2G3M带宽轻量服务器一年61元&#xff0c;折合5元1个月&#xff0c;新老用户同享99元一年服务器&#xff0c;2核4G5M服务器ECS优惠价199元一年&#xff0c;2核4G4M轻量服务器165元一年&#xff0c;2核4G服务器30元3…

001 - Hugo, 创建一个网站

001 - Hugo, 创建一个网站安装hugoWindows系统Macos Hugo博客搭建初始化博客主题安装配置博客各个页面开始创作创建 GitHub Page 仓库本地调试和预览发布内容 教程及鸣谢文字教程视频教程 001 - Hugo, 创建一个网站 这篇文章假设你已经&#xff1a; 了解基本的终端命令行知识&…

黑马鸿蒙教程学习1:Helloworld

今年打算粗略学习下鸿蒙开发&#xff0c;当作兴趣爱好&#xff0c;通过下华为那个鸿蒙开发认证&#xff0c; 发现黑马的课程不错&#xff0c;有视频和完整的代码和课件下载&#xff0c;装个devstudio就行了&#xff0c;建议32G内存。 今年的确是鸿蒙大爆发的一年呀&#xff0c;…

Win32汇编数组学习2

之前学习过win32汇编数组&#xff1b;还不熟悉&#xff1b;继续熟悉&#xff1b; 先做几个基本的对话框&#xff0c;有一个静态文本框&#xff1b; 定义数组之后&#xff0c;用 wsprintf 函数格式化&#xff0c;然后调用 SetDlgItemText 赋值给静态文本框&#xff1b; arr1 …

【力扣hot100】刷题笔记Day5

前言 回学校了&#xff0c;荒废了半天之后打算奋发图强猛猛刷题&#xff0c;找实习&#xff01;赚钱&#xff01;&#xff01; 560. 和为 K 的子数组 - 力扣&#xff08;LeetCode&#xff09; 前缀法 哈希表 这个题解解释比官方清晰&#xff0c;截个图方便看&#xff0c;另一…

OpenCV-42 直方图均匀化

目录 一、直方图均匀化原理 二、直方图均匀化在OpenCV中的运用 一、直方图均匀化原理 直方图均匀化是通过拉伸像素强度的分布范围&#xff0c;使得在0~255灰阶上的分布更加均匀&#xff0c;提高图像的对比度。达到改善图像主管视觉效果的目的。对比度较低的图像适合使用直方…

由于找不到MSVCP140.dll无法运行软件游戏,多种解决方法分享

电脑系统在运行过程中&#xff0c;当出现“由于找不到MSVCP140.dll”这一提示时&#xff0c;可能会引发一系列潜在的问题与影响。当电脑无法找到这个特定的dll文件时&#xff0c;意味着相关应用可能无法顺利加载并执行必要的组件&#xff0c;进而导致程序无法启动或运行过程中频…

【PCB】Allegro PCB 的模块复用操作

【PCB】Allegro PCB 的模块复用操作