普中51单片机:DS1302时钟芯片讲解与应用(十)

在这里插入图片描述

文章目录

  • 引言
  • 基本特性
    • 什么是RAM?
    • 什么是涓流充电?
  • 电路图和引脚说明
  • 通信协议以及工作流程
  • 寄存器
    • 控制寄存器
    • 日历/时钟寄存器
  • DS1302读写时序
  • 代码演示——数码管显示时分秒

引言

DS1302 是一款广泛使用的实时时钟 (RTC) 芯片,具有低功耗、内置电池备份和串行通信接口等优点。它常用于需要精确时间保持的应用中,如电子时钟、数据记录器和嵌入式系统。

基本特性

DS1302是一款高性能、低功耗的实时时钟芯片,兼容TTL电平,可以直接与单片机的IO口连接。以下是其主要特性:

  • 时间保持功能:DS1302 可以保持秒、分、时、日、周、月、年等时间信息,并能自动调整月份天数和闰年。
  • 串行通信接口:使用简单的串行接口 (SPI) 进行通信,仅需三根线:RST(复位)、SCLK(串行时钟)和 I/O(串行数据)。
  • 低功耗:工作电流低,适合电池供电的应用。工作电压范围为2.0V至5.5V,工作电流小于300nA。
  • 内置 RAM:31 字节的静态 RAM,用于存储用户数据。RAM数据时有两种方式:单字节传送或多字节传送(字符组的方式)
  • 电池备份:支持备用电池,确保在主电源断电时继续保持时间。
  • 涓流充电:当主电源关闭或电压不足时,DS1302可以通过涓流充电寄存器从备用电源(VCC2)获取电力,维持时钟的运行和RAM中的数据。

什么是RAM?

RAM,全称为随机存取存储器(Random Access Memory),是计算机中的一种重要存储器。它的主要特点是可以随时读写数据,并且速度非常快。

RAM是计算机的“短期记忆”。当你打开一个程序或文件时,计算机会将其数据加载到RAM中,以便快速访问和处理。例如,当你在编辑一篇文档时,文档的内容会暂时存储在RAM中,这样你可以快速进行编辑和保存。RAM是易失性存储器,这意味着一旦断电,存储在RAM中的数据就会丢失。这就像是你在白板上写字,一旦擦掉(断电),字迹就消失了。RAM与CPU直接交换数据,速度非常快。它是计算机运行速度的重要因素之一。更多的RAM意味着计算机可以同时处理更多的任务,而不会变慢。

在DS1302时钟芯片中,31字节的静态RAM(SRAM)是一个小型的存储区域,用于存储用户数据。静态表示SRAM中的数据只要保持通电,就可以一直保存,不需要像动态RAM(DRAM)那样定期刷新。31字节表示这个SRAM可以存储31个字节的数据,总共248位(31 x 8 = 248位)。

假设你有一个小笔记本,每一页可以写8个字母,那么31字节的SRAM就相当于这个笔记本有31页,每页可以写8个字母。你可以随时在任何一页上写字或擦掉重写。

什么是涓流充电?

想象一下,你有一个珍贵的水晶杯,需要用极细的水流来清洗,以防止水流过猛导致损坏。涓流充电也是同样的道理。这是一种以非常低的电流对电池进行充电的方法,目的是在电池接近充满时,继续以小电流充电,确保电池完全充满而不受损。

电池充电通常有三个阶段:恒流充电、恒压充电和涓流充电。当电池电量接近满电时,充电器会自动切换到涓流模式,这时候的电流非常小,就像是给电池做最后的“润色”。

在许多电子设备中,如手机、笔记本电脑,甚至一些特殊的芯片(例如DS1302时钟芯片)都采用了涓流充电技术。这些设备在主电源断电后,可以依靠涓流充电来维持电池健康,保证设备在关键时刻不掉链子。

电路图和引脚说明

在这里插入图片描述

引脚名引脚顺序作用
VCC11主电源电压输入
VCC28备用电源电压输入(电池)
X1、X22,3外部晶振引脚
GND4
SCLK7串行时钟输入(串行通信)
I/O6串行数据输入/输出
CE5控制使能

详细作用说明

  1. VCC1 (1号引脚):这是DS1302的主电源输入引脚。在正常工作时,它接收来自外部电源的电压。如果VCC1的电压高于VCC2(备用电源),DS1302将使用VCC1作为其电源。
  2. VCC2 (8号引脚):此引脚通常连接到一个电池,作为备用电源。在主电源VCC1失效的情况下,VCC2可以继续为DS1302提供电源,确保时间信息不会丢失。
  3. X1、X2 (2号和3号引脚):这两个引脚需要外接一个32.768kHz的晶振。晶振为DS1302提供时钟信号,确保时间的准确性。X1是输入端,X2是输出端(在某些应用中可能不使用)。
  4. GND (4号引脚):这是DS1302的接地引脚,用于建立电路的参考电位,确保电路中的信号有正确的电压水平。
  5. SCLK (7号引脚):此引脚接收来自微控制器或其他控制设备的串行时钟信号。数据传输的时序由SCLK控制,数据在SCLK的上升沿或下降沿被读取或写入,具体取决于通信协议。
  6. I/O (6号引脚):这个双向引脚用于在DS1302和外部设备之间传输数据。在写入操作中,数据通过此引脚输入到DS1302;在读取操作中,数据从DS1302输出到此引脚。
  7. CE (5号引脚):CE引脚用于控制DS1302的激活状态。当CE引脚被拉高(即逻辑1)时,DS1302芯片被激活并开始工作;当CE引脚被拉低(即逻辑0)时,芯片进入低功耗状态,停止工作。

在这里插入图片描述

通信协议以及工作流程

DS1302 通过三线接口 (SPI) 与主控设备通信。通信过程如下:

  1. 启动通信:将 RST 引脚置高。
  2. 发送命令字节:通过 SCLK 引脚发送一个命令字节,指定读写操作和寄存器地址。
  3. 数据传输:通过 I/O 引脚进行数据读写。
  4. 结束通信:将 RST 引脚置低。

寄存器

DS1302的操作就是对其内部寄存器的操作,DS1302内部共有12个寄存器,其中有:7 个寄存器与日历、时钟相关,存放的数据位为 BCD码形式。此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与 RAM 相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器以外的寄存器。

控制寄存器

用于存放DS1302控制命令的,DS1302的RST复位引脚,如果是高电平,可以开始工作,第一个写入的自己就是控制命令,它用于对DS1302读写进行控制。格式如下:
在这里插入图片描述

控制寄存器的字节格式中,最高位(D7)固定为1,这是命令有效的标志。第六位(D6)如果为0则表示存取日历时钟数据,为1表示存取RAM数据。接下来的五位(D5~D1)是地址位,用于选择将要进行读写操作的寄存器。最低位(D0)是读写选择位,0表示写入,1表示读取。

控制字总是从最低位开始输出。在控制字指令输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从最低位(0位)开始。同样,在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据,读出的数据也是从最低位到最高位。
在这里插入图片描述

日历/时钟寄存器

DS1302时钟芯片的日历/时钟寄存器是其核心功能之一,用于存储和提供当前的日期和时间信息。存放是以BCD码格式进行操作。
在这里插入图片描述

  1. 秒寄存器(地址0x80):存储秒的值,格式为BCD码。低四位表示秒的个位,第五位到第七位表示秒的十位。第八位(CH)是时钟运行标志位,当CH=0时,时钟运行;当CH=1时,时钟暂停。
  2. 分寄存器(地址0x82):存储分钟的值,格式为BCD码。低四位表示分钟的个位,第五位到第七位表示分钟的十位。最高位(第八位)固定为0
  3. 小时寄存器(地址0x84):存储小时的值,格式为BCD码。低四位表示小时的个位,第五位到第七位表示小时的十位。第八位(12/24)用于选择12小时制或24小时制。当12/24=0时,为24小时制;当12/24=1时,为12小时制,且第5位表示上午(AM)或下午(PM)。
  4. 日期寄存器(地址0x86):存储日期的值,格式为BCD码。低四位表示日期的个位,第五位到第七位表示日期的十位。

在这里插入图片描述

  1. 月份寄存器(地址0x88):存储月份的值,格式为BCD码。低四位表示月份,第五位表示月份的十位。
  2. 星期寄存器(地址0x8A):存储星期的值,格式为BCD码。低三位表示星期几,从星期一到星期日。
  3. 年份寄存器(地址0x8C):存储年份的值,格式为BCD码。低四位表示年份的个位,第五位到第七位表示年份的十位。DS1302的年份是从2000年开始的,因此设置年份时需要减去2000。
  4. 写保护寄存器:DS1302具有写保护功能,低七位全部为固定0,WP用于控制是否开启写保护功能,WP逻辑1为开启,只能读不能写,如果要进行操作,将WP设置为逻辑0,关闭保护进行写入。
  5. 慢充电寄存器:DS1302支持涓流充电,当主电源关闭或电压不足时,DS1302可以通过涓流充电寄存器从备用电源(VCC2)获取电力,维持时钟的运行和RAM中的数据。通过特定的控制命令,可以启用或禁用涓流充电功能。这允许用户根据需要控制充电过程,以节省电力或延长备用电源的使用寿命。

BCD码:所有日历/时钟寄存器中的数据都以BCD码格式存储。BCD码是一种二进制编码的十进制数,每四位二进制数表示一个十进制数字(0~9)。

DS1302读写时序

数据是从低位开始写入,三线制SPI的接口:CE,SELK、I/O,当对DS1302操作的时候,CE要设置为"1"(高电平),操作完成之后对CE设置“0”(低电平),等待下一次操作。SCLK为上升沿的时候写入数据。当发送完一个控制命令字节。下一个下降沿开始进行数据的读取。
在这里插入图片描述

代码演示——数码管显示时分秒

初始化显示时间:13时51分47秒。实物图:SCLK连接到P36引脚,IO连接到P34引脚,CE连接到P35引脚,具体可查看所使用的开发板电路图进行查看。关于数码管讲解请查看:普中51单片机:数码管显示原理与实现详解(四)

#include <REGX52.H>
#include <intrins.h>sbit DS1302_RST = P3^5;
sbit DS1302_SCLK = P3^6;
sbit DS1302_IO = P3^4;//共阴极数码管显示 0~F 的段码数据
unsigned char gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void DelayXms(unsigned int xms)	//@12.000MHz
{unsigned char data i, j;while(xms){i = 2;j = 239;do{while (--j);} while (--i);xms--;}
}void Init_Port(unsigned char Location)
{	switch(Location){case 1:P2_2 = 0;P2_3 = 0;P2_4 = 0;break;case 2:P2_2 = 1;P2_3 = 0;P2_4 = 0;break;case 3:P2_2 = 0;P2_3 = 1;P2_4 = 0;break;case 4:P2_2 = 1;P2_3 = 1;P2_4 = 0;break;case 5:P2_2 = 0;P2_3 = 0;P2_4 = 1;break;case 6:P2_2 = 1;P2_3 = 0;P2_4 = 1;break;case 7:P2_2 = 0;P2_3 = 1;P2_4 = 1;break;case 8:P2_2 = 1;P2_3 = 1;P2_4 = 1;break;}
}void DS1302_write_byte(unsigned char addr,unsigned char dat)
{unsigned char i = 0;DS1302_RST = 0;_nop_();//延时一微秒DS1302_SCLK = 0;_nop_();//延时一微秒DS1302_RST = 1;//通信开始_nop_();for(i = 0;i < 8;i++)//写入控制{DS1302_IO = addr&0x01;//从低位开始addr>>=1;DS1302_SCLK = 1;_nop_();//延时一微秒DS1302_SCLK = 0;_nop_();}for(i = 0;i < 8;i++)//写入数据{DS1302_IO = dat&0x01;//从低位开始dat>>=1;DS1302_SCLK = 1;_nop_();//延时一微秒DS1302_SCLK = 0;_nop_();}DS1302_RST = 0;//通信结束
}//读
unsigned char DS1302_read_byte(unsigned char addr)
{unsigned char i = 0;unsigned char temp = 0;unsigned char value = 0;DS1302_RST = 0;_nop_();//延时一微秒DS1302_SCLK = 0;_nop_();//延时一微秒DS1302_RST = 1;//通信开始for(i = 0;i < 8;i++)//写入控制{DS1302_IO = addr&0x01;//从低位开始addr>>=1;DS1302_SCLK = 1;_nop_();//延时一微秒DS1302_SCLK = 0;}for(i = 0;i < 8;i++)//读取数据{temp = DS1302_IO;//从低位开始value=(temp<<7)|(value>>1);DS1302_SCLK = 1;_nop_();//延时一微秒DS1302_SCLK = 0;}DS1302_RST = 0;_nop_();	DS1302_SCLK=1;//对于实物中,P3.4口没有外接上拉电阻的,此处代码需要添加,使数据口有一个上升沿脉冲。_nop_();DS1302_IO = 0;_nop_();DS1302_IO = 1;_nop_();	return value;	
}//秒分时日月周年
unsigned char gWrite_rtc_addr[]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
unsigned char gRead_rtc_addr[]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};unsigned char gDS1302_time[]={0x47,0x51,0x13,0x24,0x07,0x06,0x24};void Init_Ds1302(void)
{unsigned char i = 0;//关闭写保护0x8e表示写保护寄存器DS1302_write_byte(0x8e,0x00);for(i = 0;i < 7;i++){DS1302_write_byte(gWrite_rtc_addr[i],gDS1302_time[i]);}//打开写保护DS1302_write_byte(0x8e,0x80);
}void ds1302_read_time(void)
{unsigned char i = 0;for(i = 0;i < 7;i++){gDS1302_time[i] = DS1302_read_byte(gRead_rtc_addr[i]);}
}void main()
{unsigned char i = 0;unsigned char time_buf[8];Init_Ds1302();//设置时间	while(1){ds1302_read_time();//读取时间time_buf[0] = gsmg_code[gDS1302_time[2]/16];//时 转换为数码管 16进制获取第一位time_buf[1] = gsmg_code[gDS1302_time[2]&0x0f];//时 转换为数码管 16进制获取第二位time_buf[2] = 0x40;// -time_buf[3] = gsmg_code[gDS1302_time[1]/16];//分 转换为数码管 16进制获取第一位time_buf[4] = gsmg_code[gDS1302_time[1]&0x0f];//分 转换为数码管 16进制获取第二位time_buf[5] = 0x40;// -time_buf[6] = gsmg_code[gDS1302_time[0]/16];//秒 转换为数码管 16进制获取第一位time_buf[7] = gsmg_code[gDS1302_time[0]&0x0f];//秒 转换为数码管 16进制获取第二位for(i = 1; i <= 8;i++){Init_Port(i);P1 = time_buf[i-1];DelayXms(1);P1 = 0x00;//消影}		}
}

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

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

相关文章

多层感知机(神经网络)

目录 一、感知机&#xff08;逻辑回归、二分类&#xff09;定义&#xff1a;二、感知机不能解决XOR问题&#xff1a;三、多层感知机定义&#xff1a;四、训练过程&#xff1a;1.参数维度&#xff1a;2.常用激活函数&#xff1a;2.1Sigmoid激活函数&#xff1a;2.2Tanh激活函数&…

深入分析 Android ContentProvider (三)

文章目录 深入分析 Android ContentProvider (三)ContentProvider 的高级使用和性能优化1. 高级使用场景1.1. 数据分页加载示例&#xff1a;分页加载 1.2. 使用 Loader 实现异步加载示例&#xff1a;使用 CursorLoader 加载数据 1.3. ContentProvider 与权限管理示例&#xff1…

【工具】轻松转换JSON与Markdown表格——自制Obsidian插件

文章目录 一、插件简介二、功能详解三、使用教程四、插件代码五、总结 一、插件简介 JsonMdTableConverter是一款用于Obsidian的插件&#xff0c;它可以帮助用户在JSON格式和Markdown表格之间进行快速转换。这款插件具有以下特点&#xff1a; 轻松识别并转换JSON与Markdown表格…

60个常见的 Linux 指令

1.ssh 登录到计算机主机 ssh -p port usernamehostnameusername&#xff1a; 远程计算机上的用户账户名。 hostname&#xff1a; 远程计算机的 IP 地址或主机名。 -p 选项指定端口号。 2.ls 列出目录内容 ls ls -l # 显示详细列表 ls -a # 显示包括隐藏文件在内的所有内…

【GD32】从零开始学GD32单片机 | 基于SD卡的FatFs文件系统移植(GD32F470ZGT6)

1. 简介 FatFs是一个专门为微处理器设计的通用文件系统&#xff0c;像8051、AVR、PIC、ARM架构的微处理器都能兼容该文件系统。 FatFs文件系统最大的一个优点是它是DOS和Windows兼容的&#xff0c;这意味着你只需要再移植一个USB驱动就可以实现在电脑中访问单片机的储存结构&…

Cookie与Session 实现登录操作

Cookie Cookie 是网络编程中使用最广泛的一项技术&#xff0c;主要用于辨识用户身份。 客户端&#xff08;浏览器&#xff09;与网站服务端通讯的过程如下图所示&#xff1a; 从图中看&#xff0c;服务端既要返回 Cookie 给客户端&#xff0c;也要读取客户端提交的 Cookie。所…

Domainim:一款高效的企业级网络安全扫描工具

关于Domainim Domainim是一款功能强大的企业级网络安全扫描工具&#xff0c;该工具运行效率高&#xff0c;功能完善&#xff0c;可以帮助广大研究人员针对企业或组织网络执行大规模安全扫描任务。 该工具可以快速执行网络安全扫描和域名/子域名网络侦查任务&#xff0c;旨在使…

python毕业设计选题协同过滤算法在音乐推荐系统

✌网站介绍&#xff1a;✌10年项目辅导经验、专注于计算机技术领域学生项目实战辅导。 ✌服务范围&#xff1a;Java(SpringBoo/SSM)、Python、PHP、Nodejs、爬虫、数据可视化、小程序、安卓app、大数据等设计与开发。 ✌服务内容&#xff1a;免费功能设计、免费提供开题答辩P…

暑期C++ 缺省参数

有任何不懂的问题可以评论区留言&#xff0c;能力范围内都会一一回答 1.缺省参数的概念 缺省参数是是声明或定义参数时为函数的参数指定一个缺省值。在调用该函数值时&#xff0c;如果没有指定实参则采用该形参的缺省值&#xff0c;否则使用指定的实参 看了上面定义后&#…

【零基础必看的前端教程】——JavaScript(七)数组

欢迎大家打开前端的新篇章——JavaScript&#xff0c;JavaScript与HTML、CSS合称为前端三大件&#xff0c;JavaScript是前端的重中之重&#xff0c;小洪将继续以零基础视角&#xff0c;带你循序渐进学习前端知识&#xff0c;一看就懂&#xff0c;小白也能转行做前端&#xff01…

vue3实现在新标签中打开指定的网址

有一个文件列表&#xff0c;如下图&#xff1a; 我希望点击查看按钮的时候&#xff0c;能够在新的标签页面打开这个文件的地址进行预览&#xff0c;该如何实现呢&#xff1f; 比如&#xff1a; 实际上要实现这个并不难&#xff0c;参考demo如下&#xff1a; 首先&#x…

渗透测试——利用公网反弹shell到本地的两种方式,vmware虚拟机与主机的端口转发,本地ssh无法上线的问题解决

解决问题&#xff1a; 因长期使用本地模拟靶场&#xff0c;实战护网时并非模拟靶场&#xff0c;shell反弹需要利用公网测试。解决目标站无法反弹到本地的情况。解决本地是windows&#xff0c;虚拟机是kail、linux&#xff0c;无法相互转换流量的情况。 环境搭建 靶机 centOS7 …

VScode 批量操作

VScode 批量操作 批量修改 按住 alt/option 键&#xff0c; 选择需要批量操作的位置 如果是多行&#xff0c;则按住 altshift 键 可以直接操作 但是有时候比如变量命名&#xff0c;可能需要递增操作的命名 需要下载插件 Increment Selection 按照1的方法多选光标之后&am…

html+css+js前端作业 王者荣耀官网5个页面带js

htmlcssjs前端作业 王者荣耀官网5个页面带js 下载地址 https://download.csdn.net/download/qq_42431718/89574989 目录1 目录2 目录3 项目视频 王者荣耀5个页面&#xff08;带js&#xff09; 页面1 页面2 页面3 页面4 页面5

php接口返回的json字符串,json_decode()失败,原来是多了红点

问题&#xff1a; 调用某个接口返回的json&#xff0c;json_decode()失败&#xff0c;返回数据为null&#xff0c; echo json_last_error();返回错误码 4 经过多次调试发现&#xff1a;多出来一个红点&#xff0c;预览是看不到的。 解决&#xff1a;要去除BOM头部 $resul…

vue 搜索框

效果 创建搜索组件&#xff1a; 在Vue项目中&#xff0c;首先需要创建一个搜索组件。这个组件通常包含一个输入框和一个搜索按钮。使用v-model指令将输入框与组件的数据属性&#xff08;如searchKeyword&#xff09;进行双向绑定&#xff0c;以便获取用户输入的关键词。处理搜索…

Linux网络:传输层协议TCP(二)三次挥手四次握手详解

目录 一、TCP的连接管理机制 1.1三次握手 1.2四次挥手 二、理解 TIME_WAIT 状态 2.1解决TIME_WAIT 状态引起的 bind 失败的方法 三、理解CLOSE_WAIT状态 一、TCP的连接管理机制 在正常情况下, TCP 要经过三次握手建立连接, 四次挥手断开连接 1.1三次握手 三次握手顾名思…

Docker从零开始:安装、部署到卸载,一文搞定全流程

Docker是一种开源容器化平台&#xff0c;它允许开发者将应用程序及其依赖打包成轻量级、可移植的容器。这些容器能确保软件在任何环境中稳定运行&#xff0c;无论是开发者的笔记本电脑还是生产服务器。Docker流行的原因在于其提供的隔离性、可移植性和可扩展性&#xff0c;它简…

2024年展望:人工智能领域将呈现怎样的发展趋势?

2024年&#xff0c;人工智能&#xff08;AI&#xff09;领域将继续保持强劲的发展势头&#xff0c;并呈现出多个重要的发展趋势。以下是对该领域未来发展趋势的详细展望&#xff1a; 一、技术创新与融合 多模态生成式AI的崛起&#xff1a; 多模态生成式AI系统能够处理文本、声…

C# 将字符串数组以树型结构化

例如字符串数组&#xff1a; string[] arr { "1","3-4-5-6-7", "2","3-4","3-4-5","3-4-5-6", "3", "6", "4", "6-1", "6-2", "5", "6-1-1&…