51单片机-第七节-DS1302实时时钟

news2024/9/23 19:18:24

 一、DS1302介绍:

实时时钟芯片,可对年,月,日,周,时,分,秒计时,是一种集成电路。

二、DS1302原理:

1.寄存器定义:

Command:操作模式,决定要进行的操作是读/写,以及读写内容(秒、分、时。。。)

如下图,其中最左侧的值即为进行对应操作的Command的值。

例:对小时进行读取,Command = 0x85;

2.引脚定义与电路:

其中Vcc1/2是电源,X1/X2是晶振。重点在于后三个。

后三个的作用为输入和读取数据。

其中后三个的原理与_74HC595_完全类似,均为1位1位输入,详细过程见上一节。

CE:总开关,置1时开始工作;

I/O:传入的数据,0/1;

SCLK:来回置01,由0到1时依次传入I/O中的数据。

3.时序:

怎么看?--- 低为0高为1,画一条竖线,在同一竖线上的事是同时发生的。

例:下图中读操作:

将CE = 1,随后使SCLK在01切换,每次上升沿(0到1)依次将I/O口的数据传给R/W、A0等。

(注:R/W-1的8位即为Command)

8次上升后,确定Command,在下降沿(1到0)读取数据给I/O口。

(其中具体8位,每一位代表什么,详见上面的RTC图)

三、集成DS1302:

.h文件:

//时钟初始化
void DS1302_Init();
//数组:储存时钟的时间:年月日时分秒周(0-6)
unsigned char DS1302_Time[];
//用于设置和读取时钟数据,设置会将数组中的时间传入,读取会将时钟数据导出存在上面数组中
void DS1302_SetTime();
void DS1302_ReadTime();

.c文件:

sbit DS1302_SCLK = P3 ^ 6;
sbit DS1302_IO = P3 ^ 4;
sbit DS1302_CE = P3 ^ 5;

#define DS1302_SECOND    0x80
#define DS1302_MINUTE    0x82
#define DS1302_HOUR    0x84
#define DS1302_DATE    0x86
#define DS1302_MONTH    0x88
#define DS1302_DAY    0x8A
#define DS1302_YEAR    0x8C
#define DS1302_WP    0x8E


//储存时钟的时间:年月日时分秒周
unsigned char DS1302_Time[] = { 19,11,16,12,59,55,6 };
//时钟初始化
void DS1302_Init()
{
	DS1302_CE = 0;
	DS1302_SCLK = 0;
}
//写入数据,参数:Command,Data
void DS1302_WriteByte(unsigned char Command, unsigned char 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;
}
//读取数据,参数:Command,返回值:Data
unsigned char DS1302_ReadByte(unsigned char Command)
{
	unsigned char i;
	unsigned char Data = 0x00;
	DS1302_CE = 1;
	Command |= 0x01;

	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;
	return Data;
}
//用于设置和读取时钟数据
void DS1302_SetTime()
{
	DS1302_WriteByte(DS1302_WP, 0x00);
	DS1302_WriteByte(DS1302_YEAR, DS1302_Time[0] / 10 * 16 + DS1302_Time[0] % 10);
	DS1302_WriteByte(DS1302_MONTH, DS1302_Time[1] / 10 * 16 + DS1302_Time[1] % 10);
	DS1302_WriteByte(DS1302_DATE, DS1302_Time[2] / 10 * 16 + DS1302_Time[2] % 10);
	DS1302_WriteByte(DS1302_HOUR, DS1302_Time[3] / 10 * 16 + DS1302_Time[3] % 10);
	DS1302_WriteByte(DS1302_MINUTE, DS1302_Time[4] / 10 * 16 + DS1302_Time[4] % 10);
	DS1302_WriteByte(DS1302_SECOND, DS1302_Time[5] / 10 * 16 + DS1302_Time[5] % 10);
	DS1302_WriteByte(DS1302_DAY, DS1302_Time[6] / 10 * 16 + DS1302_Time[6] % 10);
	DS1302_WriteByte(DS1302_WP, 0x80);
}
void DS1302_ReadTime()
{
	DS1302_Time[0] = DS1302_ReadByte(DS1302_YEAR) / 16 * 10 + DS1302_ReadByte(DS1302_YEAR) % 16;
	DS1302_Time[1] = DS1302_ReadByte(DS1302_MONTH) / 16 * 10 + DS1302_ReadByte(DS1302_YEAR) % 16;
	DS1302_Time[2] = DS1302_ReadByte(DS1302_DATE) / 16 * 10 + DS1302_ReadByte(DS1302_YEAR) % 16;
	DS1302_Time[3] = DS1302_ReadByte(DS1302_HOUR) / 16 * 10 + DS1302_ReadByte(DS1302_YEAR) % 16;
	DS1302_Time[4] = DS1302_ReadByte(DS1302_MINUTE) / 16 * 10 + DS1302_ReadByte(DS1302_YEAR) % 16;
	DS1302_Time[5] = DS1302_ReadByte(DS1302_SECOND) / 16 * 10 + DS1302_ReadByte(DS1302_YEAR) % 16;
	DS1302_Time[6] = DS1302_ReadByte(DS1302_DAY) / 16 * 10 + DS1302_ReadByte(DS1302_YEAR) % 16;

}

四、实战:显示秒:

利用LCD1602调试:

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);
	}
}

问题:此时调试会出现问题,由9直接变为16。

原因:DS1302不是以正常的2进制转10进制表示的,而是用BCD码。(详见:寄存器定义)

BCD码:用4位二进制数表示一位10进制数:

例:0001 0011 = 13 ; 1000 0101 = 85 ; 即 0x85 = 85 ;

解决方法:利用LCD1602中显示16进制的函数即可:LCD_ShowHexNum

正确版:

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_ShowHexNum(2, 1, Second, 3);
	}
}

五:实战:实时时钟:

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);
	}
}

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

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

相关文章

MySQL:表的增删查改——CRUD(二)

本篇博客接上篇&#xff1a;MySQL&#xff1a;表的增删查改——CRUD&#xff08;一&#xff09;-CSDN博客 目录 1、查询&#xff08;Retrieve&#xff09; 1.1 条件查询&#xff1a;WHERE 1.1.1 比较运算符 1.1.2 逻辑运算符 1.1.3 查询语句的执行顺序 1.1.3 SQL代码示例…

小试牛刀-walletconnect二维码及交互

目录 1.编写目的 2.实现功能 3.功能详解 依赖组件 3.1 二维码生成 3.1.1 初始化SignClient 3.1.2 创建会话空间获取WC协议uri 3.1.3 生成二维码供用户扫描 3.1.4 等待扫描 3.2 发送交易事务 3.2.1 创建交易事务 3.2.2 向用户发送交易事务 3.3 签名事务 3.3.1 接收…

使用AI绘图工具生成风景图像的教程

随着人工智能技术的飞速发展&#xff0c;AI绘图工具在图像生成和艺术创作方面变得越来越强大&#xff0c;无论你是一个设计师、艺术家&#xff0c;还是仅仅对生成艺术感兴趣的爱好者&#xff0c;AI绘图工具都可以帮助你轻松地创作出惊艳的风景图像。 在这篇教程中&#xff0c;…

医疗设备漏费控制管理系统的必然性及未来发展性

医疗设备控费的必然性 医疗改革的要求 随着医疗改革的不断深入&#xff0c;原有的医药模式已经发生了改变。药品和耗材零差价的执行&#xff0c;使得医院需要寻找新的开源节流、降耗增效的方法。医疗设备控费系统的出现&#xff0c;正是为了满足这种管理需求。 控制成本和优…

【AI】人工智能核心三要素

上图来自甲子光年的资料&#xff0c;如有侵权&#xff0c;请联系删除。 在当今科技飞速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;作为引领未来科技变革的重要力量&#xff0c;正以前所未有的速度改变着我们的生活、工作乃至整个社会的面貌。人工智能之所以能…

文件Io编程基础

1. 标准I/O (stdio.h) stdio.h 是标准C库的头文件&#xff0c;包含了输入输出函数的声明。位置&#xff1a;/usr/include/stdio.h 2. 文件I/O操作步骤 打开文件: 使用 fopen 函数&#xff0c;返回 FILE* 指针。读/写操作: 使用 fread、fwrite、fgets、fputs、fprintf、fscan…

【SOC】SoC架构系统总线的QoS管理——QoS generator

#工具文档理解# QoS——Quality of Service 目录 一、概念 Master对于Latency的敏感性 流量控制和事务级概念 Splitting Pending order IDs 数据包创建和传输的QoS 序列化 一、概念 这一部分描述了QoS机制如何平衡不同发起者的流量访问&#xff0c;以适应互连的有限可…

都2024年了,SQL语句还需要手写吗?

前言 在当今的AI时代&#xff0c;数据库管理和SQL开发已不再是单调的编码过程。借助AI的智能化工具&#xff0c;数据库操作变得更加简洁高效&#xff0c;错误率也大大降低。特别是当AI与强大的数据库管理工具Navicat相结合时&#xff0c;开发者可以更加专注于数据的分析和应用…

home assistant 接入国家电网

一、安装加载项 在 配置 - 加载项 File editorAdvanced SSH & Web Terminal 二、安装state_grid 上传压缩包 在 File editor中&#xff0c;进入 homeassistant - custom_components 文件夹中&#xff0c;点击上传文件。 文件下载路径 https://download.csdn.net/downl…

密码学基础-身份认证

密码学基础-身份认证 概述 书信的亲笔签名&#xff1b;公文、证书的印章起到了核准、认证的功能。 如前文密码学基础-数据加密所述&#xff0c;信息安全少不了身份认证的话题。只有认证了信息的来源&#xff0c;我们才能知道这条信息是否是正确的&#xff0c;合法的&#xff…

如何让贵人一直帮你?

如果有贵人提携了你一把&#xff0c;牢记一定要抱住大腿。 如果一个段位比你高很多的贵人帮了你一个忙&#xff0c;他什么都不缺&#xff0c;他缺的也不是你这个层次的人能够给的了的&#xff0c;但你千万不要以为这个事儿就翻篇儿了。牢记一招&#xff0c;每隔半年给他汇报一下…

超声波眼镜清洗机有用吗?品质上等的超声波清洗机评选

超声波眼镜清洗机有用吗&#xff1f;眼镜是我们日常生活中不可或缺的配件&#xff0c;其卫生状况对健康至关重要。由于眼镜经常与外界环境接触&#xff0c;容易积聚细菌。为了有效解决这一问题&#xff0c;大家都纷纷选择使用超声波清洗机来进行彻底清洁。所以&#xff0c;超声…

C语言基础知识点(十三)结构体的深拷贝与浅拷贝

在C或C等语言中&#xff0c;结构体&#xff08;Struct&#xff09;是一种用户自定义的数据类型&#xff0c;它允许将不同类型的数据项组合成一个单一的类型。对于结构体的拷贝&#xff0c;存在深拷贝&#xff08;Deep Copy&#xff09;和浅拷贝&#xff08;Shallow Copy&#x…

DataWhale市场博弈和价格预测

文章目录 市场博弈和价格预测任务数据出清价格的形成步骤代码运行 Task1&#xff1a;跑通baseline使用ABM估计市场出清价格转换耗煤量为机组报价保存结果为submit.csv Task2&#xff1a;时间序列挖掘ABM构建学习数据基本信息统计指标分析数据分布分时统计特征不同小时的总负荷和…

错误代码0x80004005:全面解析与解决策略

在Windows操作系统中&#xff0c;错误代码0x80004005是一个相当常见的提示&#xff0c;它通常表示一个未指定的错误或一个无法找到的错误。这个错误可能出现在多种场景中&#xff0c;包括软件安装、系统更新、网络连接、文件操作等。由于其普遍性和模糊性&#xff0c;理解和解决…

搭建链路追踪系统 Jaeger

搭建链路追踪系统 Jaeger 架构 架构图 架构设计 在设计以 Jaeger 为中心的链路追踪系统时&#xff0c;我们采用微服务架构模式。 Jaeger 作为核心追踪系统&#xff0c;负责收集、存储和展示分布式追踪数据。Elasticsearch 作为后端存储&#xff0c;提供数据的持久化和高效…

网鼎杯之unfinish

题目来源&#xff1a;网鼎杯 2018 题目描述&#xff1a;SQL 问题&#xff1a;给一个页面&#xff0c;如何判断其有漏洞 通过awvs扫描得知存在 register.php 注册页面&#xff0c;并且注册界面存在SQL盲注漏洞。 题目提示SQL&#xff0c;在注册页面测试无果&#xff0c;且发现输…

解决Ubuntu报“无法解析域名cn.archive.ubuntu.com“问题

今天在Ubuntu系统上&#xff0c;使用sudo apt update命令&#xff0c;进行更新时&#xff0c;弹出"无法解析域名 cn.archive.ubuntu.com"问题&#xff0c;如图(1)所示&#xff1a; 图(1) 弹出"无法解析域名 cn.archive.ubuntu.com" 错误 出现这种现象的原因…

C++并发编程(一):线程基础

简介 本文学习的是 b 站 up 恋恋风辰的并发编程教学视频做的一些笔记补充。 教程视频链接如下&#xff1a;线程基础&#xff1a;视频教程 文档链接如下&#xff1a;线程基础&#xff1a;笔记文档 理论上直接看 up 提供的笔记文档即可&#xff0c;我这里主要是记录一些我自己…

免费qq号码估价的工具和软件

目前有多种 qq 号码估价的工具和软件。例如&#xff0c;晒号网的 QQ 估价器可以根据 QQ 号码等级、QQ 号码资深度、QQ 号码年限、活跃时间等进行准确的 QQ 号码估价。此外&#xff0c;还有其他一些相关的估价软件和平台&#xff0c;如 QQ 号码估价 2.0 全新玩法&#xff0c;利用…