51单片机-驱动DS1302时钟芯片模块教程 - 实践

news/2025/9/24 12:19:41/文章来源:https://www.cnblogs.com/lxjshuju/p/19108944

本章概述思维导图:

51单片机驱动DS1302时钟芯片模块

DS1302简介

DS1302 是美国 DALLAS 公司(现属 MAXIM Integrated)推出的高性能、低功耗实时时钟芯片,具备闰年补偿、双电源供电、串行通信等特性,广泛应用于消费电子、工业自动化及物联网设备中。实物图如下:


DS1302核心功能

1、实时时钟与日历

支持年、月、日、星期、时、分、秒的精确计时,自动处理闰年及月份天数变化(如2 月天数调整);提供 12/24 小时制切换,通过小时寄存器位 7 控制(1=12 小时制,0=24 小时制), 12 小时制下位 5 表示 AM/PM。

2、低功耗设计

工作电压范围 2.0V~5.5V,待机功耗低至 300nA(2.0V 时),适合电池供电场景;双电源供电:主电源(VCC2)与备用电源(VCC1)自动切换,主电源断电时由备用电 源维持计时,数据不丢失。

3、数据存储

内置 31 字节静态 RAM,可用于临时数据存储,支持单字节或突发模式(Burst Mode) 读写。

3、涓流充电

集成充电控制电路,可通过外部电阻和二极管为备用电池充电,延长电池寿命。


DS1302关键技术参数

                     参数

                                                描述

                  晶振频率

32.768kHz(标准时钟晶振)

                  通信接口        

三线 SPI 兼容接口(SCLK、I/O、RST)

                  数据格式

BCD 码(二进制编码十进制,便于显示)

                  工作温度

-40°C~+85°C(工业级)

                  封装形式

8 引脚 DIP 或 SOIC

                寄存器数量

12 个(7 个时钟寄存器、1 个控制寄存器、1个充电寄存器、1个时钟突发寄存器、2个 RAM 相关寄存器)


DS1302引脚定义与封装

DS1302采用8引脚DIP或SOIC封装,各引脚功能如下:

   引脚号

名称

功能描述

        1

VCC2

主电源引脚,接3.3V或5V电源,优先级高于VCC1。

        2

X1

晶振引脚,外接32.768kHz晶振,为芯片提供计时基准。

        3

X2

晶振引脚,与X1构成振荡回路。

        4

GND

接地引脚,确保芯片工作稳定性。

        5

RST

复位/片选引脚,高电平时启动数据传输,低电平时终止传输并使I/O引脚呈高阻态。

        6

I/O

双向数据引脚,用于串行数据输入/输出。

        7

SCLK

串行时钟引脚,控制数据传输的同步信号。

        8

VCC1

备用电源引脚,外接电池(如CR1220),主电源断电时维持时钟运行。


DS1302时钟芯片寄存器介绍

DS1302芯片的12个寄存器中,7个为日历/时钟寄存器,用于存储秒、分、时、日、月、年、星期数据;1个为控制寄存器,用于用于配置 DS1302 的工作模式(如时钟/日历模式、RAM 读写模式)以及控制数据传输,复用功能为写保护设置;1个为充电寄存器,用于配置涓流充电参数;1个为时钟突发寄存器,支持多字节连续读写;剩余31字节为独立RAM单元(部分资料将其拆分为31个单字节寄存器描述)。

控制寄存器格式:

        位

名称

功能描述

        D7

固定为1

命令有效标志。

        D6

RAM/CK

0=访问时钟寄存器,1=访问RAM。

        D5-D1

地址位

选择要读写的寄存器地址。

        D0

RD/WR

0=写操作,1=读操作。

位7:固定为1,是控制命令标志。如果该位为0,则不能把数据写入DS1302中。

位6(RAM/CK):片内RAM或日历、时钟寄存器选择位。当RAM/CK=1时,表示对片内RAM   进行读写操作;当RAM/CK=0时,表示对日历、时钟寄存器进行读写操作。

位5-位1(A4-A1):地址位,用于选择进行读写的日历、时钟寄存器或片内RAM的具体地  址。这些地址位的具体取值决定了要访问哪个寄存器或RAM单元。

位0(RD/W):读写位。当RD/W=1时,表示下一步操作是读操作;当RD/W=0时,表示下一步操作是写操作

控制寄存器的操作

写入控制命令字:在对DS1302进行读写操作之前,需要先向控制寄存器写入一个控制命令 字。这个命令字通过DS1302的I/O引脚在SCLK时钟的上升沿逐位写入。

读取数据:在写入控制命令字后,可以根据RD/W位的设置来读取或写入数据。如果是读操作,DS1302会在SCLK时钟的下降沿将数据放在I/O引脚上供微控制器读取;如 果是写操作,微控制器则需要在SCLK时钟的上升沿将数据放在I/O引脚上供  DS1302写入。

DS1302日历寄存器(7个)

存储时间数据,采用BCD码格式,支持自动闰年补偿(至2100年):

1、秒寄存器(地址:写0x80/读0x81)

        D7:时钟暂停位(CH=1时停止计时,CH=0时启动)。

        D6-D0:秒的十位(D6-D4)和个位(D3-D0),范围00-59。

2、分寄存器(地址:写0x82/读0x83)

        D7:固定为0。

        D6-D0:分的十位(D6-D4)和个位(D3-D0),范围00-59。

3、时寄存器(地址:写0x84/读0x85)

        D7:12/24小时模式选择(1=12小时制,0=24小时制)。

        D5:AM/PM标志(12小时制下,1=PM,0=AM)。

        D4-D0:小时的十位(D4)和个位(D3-D0)范围1-12(12小时制)或0-23(24 小时制)。

4、日寄存器(地址:写0x86/读0x87)

        存储日期,范围1-31。

5、月寄存器(地址:写0x88/读0x89)

        存储月份,范围1-12。

6、星期寄存器(地址:写0x8A/读0x8B)

        存储星期几,范围0-6(0=周日,1=周一,…,6=周六)。

7、年寄存器(地址:写0x8C/读0x8D)

        存储年份后两位,范围00-99(对应2000-2099年)。

充电寄存器(1个)

涓流充电寄存器(地址:写0x90/读0x91)

        D7-D4:保留位,固定为0。

        D3-D2:二极管选择(DS=01/10/11分别表示1/2/禁用二极管)。

        D1-D0:电阻选择(RS=00/01/10/11分别对应2kΩ、4kΩ、8kΩ、禁用充电)。

        功能:配置外接电池的涓流充电参数(需外接二极管和电阻)。

时钟突发寄存器(1个)

        突发模式寄存器(命令字:写0xBE/读0xBF)

        功能:支持一次性连续读写所有时钟/RAM寄存器(除充电寄存器外)。

        操作:写入0xBE后,DS1302会自动按顺序传输秒、分、时、日、月、星期、年寄存器  的数据。

RAM相关寄存器(31个字节,逻辑上视为独立单元)

        独立RAM单元(地址:C0H-FDH)

        分类:

                单字节读写:每个地址对应1字节RAM(偶地址写,奇地址读,如C0H写/C1H读)。

                突发模式读写:通过FEH(写)和FFH(读)命令一次性访问全部31字节RAM。

        用途:存储用户自定义数据,与时钟功能无关。


DS1302读写时序介绍 

DS1302采用三线串行通信接口(SCLK、I/O、RST)与CPU进行同步通信。无论是读操作还是写操作,都必须由微控制器先向DS1302写入一个命令字发起。这个命令字决定了后续操作是读还是写,以及操作的目标寄存器或RAM单元。


DS1302写时序

起始条件:

        RST(或CE)线从低电平变为高电平,表示通信周期的开始。在整个通讯期间,RST 必须保持高电平。

        SCLK线在初始状态应为低电平。

写入命令字:

        命令字的最高位(D7)必须为逻辑1,如果为0则禁止写入DS1302。

        命令字的D6位用于选择操作对象:0表示选择时钟/日历数据,1表示选择RAM数  据。

        命令字的D5-D1位(A4-A1)用于指定进行输入或输出的特定寄存器或RAM单元的地址。

        命令字的D0位(RD/W)用于选择操作类型:0表示写操作,1表示读操作。

        命令字总是从最低位(D0)开始输入,每一位都是在SCLK的上升沿被DS1302读 取。

写入数据:

        在写入命令字后,微控制器可以在接下来的8个SCLK脉冲的上升沿依次写入8位 数据。

        数据也是从最低位开始写入。

结束条件:

        在数据写入完成后,可以将RST线拉低,表示通信周期的结束。


DS1302读时序

起始条件:

        与写时序相同,RST线从低电平变为高电平,SCLK线在初始状态为低电平。

写入命令字:

        与写时序相同,写入一个用于指定读操作和目标寄存器或RAM单元的命 令字。

读取数据:

        在写入命令字后,DS1302会在接下来的8个SCLK脉冲的下降沿依次输出8位数据。

        微控制器需要在SCLK的下降沿读取数据,数据从最低位开始输出。

结束条件:

        在数据读取完成后,将RST线拉低,表示通信周期的结束。


DS1302硬件电路原理分析

如图所示:

        DS1302的主电源脚连接电源电压VCC,给DS1302时钟芯片供电;

        DS1302的GND脚接地,确保芯片工作稳定;

        DS1302的X1引脚,外接32.768KHZ晶振,为芯片提供计时基准,与X2构成振荡回路;

        DS1302的SCLK串行时钟引脚与单片机P36IO管脚进行连接,控制数据传输的同步信号;

        DS1302的I/O双向数据引脚与单片机P34管脚进行连接,用于串行数据输入/输出;

        DS1302的CE脚复位/片选引脚与但单片机P35进行连接,输出高电平时启动数据传输。低电平I/O呈高阻态;


DS1302软件编程设计

本章所要实现的功能为:在数码管中上实现电子时钟时分秒,格式为XX-XX-XX

关键操作注意事项:

    写保护机制:修改时钟/RAM前需先关闭写保护(WP=0),操作完成后可重新开启(WP=1)。

    BCD码转换:十位=(BCD/16);个位=(BCD&0x0F);

实现步骤:

第一步:将实现DS1302发送字节函数,函数形参有两个字节参数。第一个参数是控制指令,第二个参数是发送的数据。按照时序图实现函数封装

void DS1302_wriet_byte(u8 command,u8 dat)		//DS1302写入字节函数封装
{
u8 i=0;
DS1302_SCLK=0;								//时钟线为低电平
_nop_();
DS1302_RET=0;							//复位线为低电平
_nop_();									//延时1微秒
DS1302_RET=1;								//复位线为高电平,开始通信
_nop_();
for(i=0;i>=1;
DS1302_SCLK=1;							//时钟线为高电平
_nop_();	  							//延时1微秒
DS1302_SCLK=0;							//时钟线为低电平
_nop_();	  							//延时1微秒
}
for(i=0;i>=1;
DS1302_SCLK=1;							//时钟线为高电平
_nop_();	  							//延时1微秒
DS1302_SCLK=0;							//时钟线为低电平
_nop_();	  							//延时1微秒
}
DS1302_RET=0;								//复位线为低电平
_nop_();
}

第二步实现DS1302接收字节函数封装,形参为控制指令

u8 DS1302_read_byte(u8 command)					//DS1302读取字节函数封装
{
u8 i=0;
u8 temp=0;
u8 dat=0;
DS1302_SCLK=0;								//时钟线为低电平
_nop_();									//延时1微秒
DS1302_RET=0;								//复位线为低电平
_nop_();									//延时1微秒
DS1302_RET=1;								//复位线为高电平,开始通信
_nop_();									//延时1微秒
for(i=0;i>=1;
DS1302_SCLK=1;							//时钟线为高电平
_nop_();								//延时1微秒
DS1302_SCLK=0;							//时钟线为低电平
_nop_();								//延时1微秒
}
for(i=0;i>=1;
dat|=(temp<<7);
DS1302_SCLK=1;							//时钟线为高点平
_nop_();								//延时1微秒
DS1302_SCLK=0;							//时钟线为低电平
_nop_();								//延时1微秒
}
DS1302_RET=0;								//通信完成
_nop_();									//延时1微秒
DS1302_SCLK=1;								//P3.4没有上拉电阻,软件实现上拉
_nop_();									//延时1微秒
DS1302_IO=0;
_nop_();									//延时1微秒
DS1302_IO=1;
_nop_();
return dat;
}

第三步:实现DS1302初始化函数,首先我们要关闭写保护功能,在将秒,分,时,日,月,星期,年数据发送给DS1302实现初始化

u8 wriet_time_dat[7]={0x30,0x03,0x00,0x22,0x09,0x07,0x25};
u8 wriet_time_adder[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; 	//DS1302写入时钟地址指令
u8 read_time_adder[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};		//DS1302读取时钟地址指令
void DS1302_init(void)							//DS1302时钟模块初始化函数
{
u8 i=0;
DS1302_wriet_byte(0x8e,0x00);				//发送控制寄存器指令,允许写入数据
for(i=0;i<7;i++)
{
DS1302_wriet_byte(wriet_time_adder[i],wriet_time_dat[i]);
}
DS1302_wriet_byte(0x8e,0x80);               //发送控制寄存器指令,不允许写入数据
}

第四步:实现DS1302时钟芯片获取实时计数时间数据封装成函数

void DS1302_read_time(void)
{
u8 i=0;
for(i=0;i<7;i++)
{
wriet_time_dat[i]=DS1302_read_byte(read_time_adder[i]);
}
}

第五步:在主函数中联合数码管现实函数实现显示

#include "TYPEDEF.h"   						//u8、u16定义
#include "reg52.h"							//STC89C52RC
#include "Delay.h"							//延时
#include "DIGITALTUBE.h"					//数码管
#include "DS1302.h"							//DS1302
int main()
{
u8 buffer_time[8];
DS1302_init();
while(1)
{
DS1302_read_time();
buffer_time[0]=Display[wriet_time_dat[2]/16];
buffer_time[1]=Display[wriet_time_dat[2]&0x0f];
buffer_time[2]=0x40;
buffer_time[3]=Display[wriet_time_dat[1]/16];
buffer_time[4]=Display[wriet_time_dat[1]&0x0f];
buffer_time[5]=0x40;
buffer_time[6]=Display[wriet_time_dat[0]/16];
buffer_time[7]=Display[wriet_time_dat[0]&0x0f];
DIGITALTUBE_EEPROM_Display2(buffer_time,1);
}
}

展示效果:


制作不易!喜欢的小伙伴给个小赞赞!喜欢我的小伙伴点个关注!有不懂的地方和需要的资源随时问我哟!

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

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

相关文章

JVM 类加载器详解 - 实践

JVM 类加载器详解 - 实践2025-09-24 12:16 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; fo…

石碣做网站优化偷wordpress模板

wildfly管理控制台红帽JBoss企业应用程序平台&#xff08;EAP&#xff09;和WildFly具有共生关系 。 简而言之&#xff0c;红帽JBoss企业应用程序平台&#xff08;JBoss EAP&#xff09;保留了WildFly社区项目&#xff08;以前称为JBoss Application Server&#xff09;的所有创…

音乐网站制作教程步骤wordpress登陆后查看

李宗盛有首歌的歌词里写到&#xff1a;「工作是容易的&#xff0c;赚钱是困难的」。乍一听感觉有点矛盾&#xff0c;工作的一个重要结果不就是赚钱么&#xff0c;为什么工作容易赚钱却难&#xff1f;但仔细一想就恍然其中想表达的意思了。 工作的本质是出售劳动价值&#xff0c…

网站域名备案需要什么罗湖营销型网站建设

RPC和 HTTP是两种常见的通信方式&#xff0c;它们在设计目标、使用场景和技术实现上有显著区别。以下是它们的详细对比&#xff1a; 1. 定义与核心思想 特性RPCHTTPRemote Procedure Call远程过程调用HyperText Transfer Protocol超文本传输协议定义一种协议或框架&#xff0…

昌平哪有做网站的公司比较大网站建设公司

&#x1f6eb;更多ssm知识见SSM_面向CRUD编程专栏 &#x1f695;本博客总结自黑马程序员的ssm框架视频 &#x1f692;博主对于该知识尚在学习阶段 &#x1f684;如果发现存在问题请毫不吝啬的指出 &#x1f680;&#x1f680;扎哇太枣糕的博客主页&#x1f680;&#x1f680; 目…

网站建设推广安徽国内专业网站设计

删除的场景&#xff1a; 解决思路&#xff1a; 1、计算操作后的总页数 2、删除成功之后的总页数与当前总页数进行比较 3、如果删除成功之后的总页数比小于当前总页数&#xff0c;需要把当前页码减去1&#xff1b;否则&#xff0c;直接进行列表数据的请求 代码实现 /*总条数…

中国做网站的公司新手网页制作

2022-01-25 更新&#xff1a;博客新地址&#xff1a;https://www.itbob.cn/&#xff0c;文章距上次编辑时间较远&#xff0c;部分内容可能已经过时&#xff01; 文章目录● 前言● 注册 Cloudflare● 添加站点● 修改DNS● 开启 HTTPS● 重定向强制 HTTPSHTTP&#xff08;超文本…

Unity小游戏接入抖音敏感词检测 - 指南

Unity小游戏接入抖音敏感词检测 - 指南2025-09-24 12:04 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !…

SQLite的并发问题

转载自:C# 下 SQLite 并发操作与锁库问题的 5 种解决方案_51CTO博客_sqlcipher c# SQLite是轻量级的数据库,可用于嵌入式设备,仅需几百KB的内存即可工作,整个数据库存储在单一文件中,便于管理,迁移,备份。无需繁…

域渗透靶场-vulntarget-a综合靶场

nmap发现开放80端口浏览器访问,是通达oa可以搜索poc或者使用oa利用工具拿到shell 通过账号admin 密码滞空,进入后台我们这里使用通达OA 11.2 后台getshell 点击系统管理 -> 系统参数设置 -> OA服务设置 找到We…

在线设计logo的网站小程序开发和app开发差别

1、读取哈使用方法不同SAP内存使用SET/GET parameters方法&#xff1b;ABAP内存使用 EXPORT 和 IMPORT 方法&#xff1b;2、共享范围不同SAP内存可以被所有的主session访问&#xff0c;内存数据可以同一个session中不同程序之间&#xff0c;或者不同session之间&#xff1b;AB…

现在的网站开发用什么技术南宁百度seo

简介&#xff1a; MaxCompute 是面向分析的企业级 SaaS 模式云数据仓库&#xff0c;以 Serverless 架构提供快速、全托管的在线数据仓库服务&#xff0c;消除了传统数据平台在资源扩展性和弹性方面的限制&#xff0c;最小化用户运维投入&#xff0c;使您可以经济并高效的分析处…

温州网站 公司做网站招标

一、源码特点 idea 开发 SSM 学员信息管理系统是一套完善的信息管理系统&#xff0c;结合SSM框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff…

网站建设主要学什么软件济宁哪里有网站建设

五层&#xff1a; 应用层&#xff1a;应用层是最高层&#xff0c;负责为用户提供网络服务和应用程序。在应用层&#xff0c;用户应用程序与网络进行交互&#xff0c;发送和接收数据。典型的应用层协议包括HTTP&#xff08;用于网页浏览&#xff09;、SMTP&#xff08;用于电子邮…

数组和链表读取、插入、删除以及查找的区别

数组和链表是两种常见的数据结构,它们在读取、插入、删除操作上有显著差异,下面详细说明: 1. 读取(访问)操作数组: 数组是连续的内存空间,元素按索引(下标)存储,因此可以通过索引直接访问任意位置的元素,时…

day 09 课程

day 09 课程课程:https://www.bilibili.com/video/BV1o4411M71o/?spm_id_from=333.788.videopod.episodes&p=168 9.1 了解函数———————————————————————————————————————…

在K8S中,日志分析工具有哪些可以与K8S集群通讯?

在Kubernetes中,日志分析工具与集群的通信方式多样,可以根据部署位置和采集方式分为几大类。以下是主流工具的详细分类和介绍: 📊 日志分析工具分类概览 graph TDA[K8S日志分析工具] --> B1[集群内部部署]A --…

在K8S中,网络通信模式有哪些?

好的,这是一个非常核心的问题。Kubernetes 的网络模型是一个复杂的体系,但我们可以将其分解为几个清晰的层次来理解。 Kubernetes 网络通信模式可以分为四大类,下图清晰地展示了这四类通信的全景:A[Kubernetes 网络…

中山网站代运营python nginx做网站

Creator 版本&#xff1a; 3.8.2 目标平台&#xff1a;小游戏开发 压缩后 我不知道别人压缩几百kb是怎么做到的。不过哪个要钱。 我这个技巧不用花钱。 论坛有教程但是没有教详细怎么做。 开整&#xff01; 做一个空白的场景。然后写一个load脚本。load主场景。 从代码可…

厦门网站建设a建筑设计工资一般多少

TCP客户端数据通信 文章目录 TCP客户端数据通信1、软件准备2、硬件准备3、仿真电路原理图4、仿真代码实现5、仿真结果本文将介绍Arduino在Protues仿真环境中作为TCP客户端,如何与TCP服务器进行数据通信。 1、软件准备 1)Arduino IDE或 VSCode + PlatformIO 2)Proteus电路仿…