51单片机——DS1302 时钟芯片(二)

目录

[3. 管脚及其功能](#3. 管脚及其功能)

[4. DS1302 使用](#4. DS1302 使用)

[4.1 先做准备](#4.1 先做准备)

[1. 硬件连线(先接好 "电话线")](#1. 硬件连线(先接好 “电话线”))

[2. 解除写保护(先打开 "柜门")](#2. 解除写保护(先打开 “柜门”))

[4.2 核心操作 1](#4.2 核心操作 1)

[4.3 核心操作 2](#4.3 核心操作 2)

[4.4 收尾](#4.4 收尾)

[4.5 额外提醒](#4.5 额外提醒)

[5. 寄存器](#5. 寄存器)

[5.1 1 个核心控制寄存器](#5.1 1 个核心控制寄存器)

[5.2 12 个日历/时钟寄存器](#5.2 12 个日历/时钟寄存器)

[5.3 31 字节通用 RAM 存储区](#5.3 31 字节通用 RAM 存储区)

[5.4 BCD 码](#5.4 BCD 码)

[6. 交互流程](#6. 交互流程)

[6.1 硬件基础](#6.1 硬件基础)

[6.2 DS1302 通信协议](#6.2 DS1302 通信协议)

[6.3 核心交互](#6.3 核心交互)

[6.3.1 写操作](#6.3.1 写操作)

[6.3.2 读操作](#6.3.2 读操作)

[6.3.3 注意](#6.3.3 注意)


3. 管脚及其功能

VCC2:主电源引脚

X1、X2:DS1302 外部晶振引脚,通常外接 32.768K 晶振

CE:使能引脚,也是复位引脚

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

SCLK:串行时钟引脚

VCC1:备用电源

4. DS1302 使用

操作 DS1302 的过程可以类比成

「单片机(设备 "大脑")和带存储的电子钟核心打电话」------ 核心就两件事:给 DS1302 "说" 时间 / 存数据(写操作)从 DS1302 "听" 时间 / 取数据(读操作)

操作 DS1302 的核心就是:解锁→按 "唤醒→发地址→传数据 / 收数据→结束" 的节奏读写→可选上锁,不管是设时间还是存闹钟,都是这套固定流程,只是 "地址" 和 "数据" 不一样而已。

4.1 先做准备

硬件连好 + 解开 "锁"

1. 硬件连线(先接好 "电话线")

之前提过的 3 根核心线 + 电源,必须先接对:

  • RST(唤醒线):接单片机任意 IO 口(相当于 "打电话时先喊对方名字,唤醒它");
  • SCLK(节奏线):接单片机任意 IO 口(相当于 "通话的节拍器,双方按这个节奏传东西,不抢话");
  • I/O(数据线):接单片机任意 IO 口(相当于 "传声音的电话线,既能说也能听");
  • 电源:Vcc2 接单片机的 5V/3.3V 主电,Vcc1 接纽扣电池(保证断电后时间 / 数据不丢)。
2. 解除写保护(先打开 "柜门")

DS1302 默认有个 "写保护位"(相当于柜子的锁),不解锁的话,根本没法给它设时间、存数据。操作:单片机通过 3 根线给 DS1302 发一个 "解锁指令"(本质是往指定地址写一个特定数字),把这个锁打开 ------ 就像要往柜子里放东西,先解锁柜门。

4.2 核心操作 1

给 DS1302 "写东西"(设时间 / 存闹钟)

比如要设当前时间为 "12 点 30 分 00 秒",或存闹钟时间 "7 点 00 分",步骤完全一样(只是 "地址" 不同):

  1. 先 "喊醒":单片机把 RST 线拉低→再把 SCLK 线拉低→最后把 RST 线拉高(一套固定动作,告诉 DS1302 "要开始说话了");
  2. 说 "地址":单片机通过 I/O 线,跟着 SCLK 的节奏(每跳一下传 1 位),发 "我要写哪个位置" 的地址 ------ 比如 "我要写秒的数据""我要把闹钟存到通用存储区第 2 个位置";
  3. 说 "数据":地址发完后,继续跟着 SCLK 的节奏,发要存的具体数据(比如秒是 00、分是 30、闹钟小时是 07);
  4. 挂电话:单片机把 RST 线拉低(告诉 DS1302 "说完了")。
4.3 核心操作 2

从 DS1302 "读东西"(查时间 / 取闹钟)

比如要查当前几点,或取之前存的闹钟时间,步骤和 "写" 几乎一样,只是把 "说数据" 改成 "听数据":

  1. 先 "喊醒":和写操作一样,RST 拉低→SCLK 拉低→RST 拉高(SCLK 拉高时采样,拉低时准备下一位,RST高电平启动通信,低电平结束通信);
  2. 说 "地址":发 "我要读哪个位置" 的地址 ------ 比如 "我要读现在的小时数""我要取存储区里的闹钟数据";
  3. 听数据:地址发完后,单片机不再 "说",而是改成 "听"------DS1302 会跟着 SCLK 的节奏,通过 I/O 线把对应位置的数据传回来;
  4. 挂电话:RST 线拉低,结束读取。
4.4 收尾

可选(重新锁上 "柜门")

写完时间 / 闹钟后,建议再发一个 "上锁指令",把写保护位重新锁上 ------ 避免后续误操作(比如单片机程序乱了,不小心改了时间),就像放好东西后锁上柜门。

4.5 额外提醒
  1. 数据格式要对:传给 DS1302 的数字得是 "BCD 码"(比如十进制的 25,要转成专门的 BCD 格式),读出来后要转回十进制才能显示(比如电子钟显示 "25 分");
  2. 通用存储区和计时区通用:存闹钟、设备参数这些,和存时间的操作完全一样,只是选 "通用存储区" 的地址就行;
  3. 节奏不能乱:SCLK 每跳一次,只能传 1 位数据,必须等 SCLK 跳完,再传下一位 ------ 就像说话要一个字一个字说,不能抢。
5. 寄存器

DS1302 有 1 个核心控制寄存器(写保护/充电控制类)、12 个日历 / 时钟专用寄存器(管计时)和 31 字节通用 RAM 存储区(存自定义数据)

把 DS1302 看作一个 "专门管时间的工具箱",里面的 "格子" 就是寄存器 / RAM,各自有固定用途:

控制寄存器用于存放 DS1302 的控制命令字,其 RST 引脚回到高电平后写入的第一个字节就是控制命令,用于对 DS1302 读写过程进行控制,格式如下:

该格式是 DS1302 所有寄存器(计时寄存器、控制寄存器、通用 RAM)的通用 "访问规则"

5.1 1 个核心控制寄存器

(工具箱的 "总锁扣")

核心作用:控制整个 DS1302 的 "可写权限"(也叫 "写保护寄存器"),就是咱们之前说的 "解锁 / 上锁柜门"。

没解锁(锁扣扣上):不管是改时间、存数据,都操作不了 ------ 防止误碰、程序乱跳导致时间 / 数据被改;

解锁(打开锁扣):才能往时间寄存器里设时间、往 RAM 里存闹钟 / 参数。

补充:实际 DS1302 的 "控制类寄存器" 不止 1 个(还有涓流充电配置寄存器),但大家常说的 "1 个控制寄存器",就是指这个最核心的 "写保护锁扣"。

5.2 12 个日历/时钟寄存器

(工具箱的 "时间格子区")

这 12 个格子是专门存时间的,一个格子管一个时间维度,是 DS1302 "电子钟机芯" 的核心:

核心 8 个格子(最常用):秒、分、时、日、月、星期、年、世纪(比如 "2025 年" 的 "20" 就是世纪位);

额外 4 个格子:是计时辅助用的(比如时钟校准、备用位),日常用得少;

关键特点 :这些格子里的数据是 "BCD 码格式"(比如十进制的 25 分,要转成 BCD 码才能存进去),和咱们之前说的 "写时间要传对应数据" 完全对应 ------ 你操作 DS1302 设时间,本质就是往这 12 个格子里填数。

① 秒寄存器: D7=CH(最高位/时钟暂停位,CH=0,内部时钟运行)、D6~D4 = 秒十位、D3~D0 = 秒个位

② 小时寄存器:D7=12/24(最高位/格式选择位,D7=1:12小时,D5 = 1:PM;设置 24 小时格时,D5 显示具体的时间数据)、D5=A/P(上午 / 下午)、D4=HR(小时十位)、D3~D0 = 小时个位

③ 写保护寄存器 D7(WP):写保护位→WP=1 时上锁(只读不写),WP=0 时解锁;

④ 慢充电(涓流电流充电)寄存器:当 DS1302 掉电时,可以马上调用内部电源保护时间数据,该寄存器就是配置备用电源的充电选项的。 TCS/DS/RS:都是充电配置位(比如 TCS 选充电模式、DS 选二极管、RS 选电阻)

5.3 31 字节通用 RAM 存储区

(工具箱的 "通用储物格")

这就是之前说的 "能存闹钟、不用外接 EEPROM 的小格子",重点记 3 点:

① "31 个字节的连续存储区"可以理解为 31 个并排的小抽屉;

② 无固定用途:想存啥存啥 ------ 闹钟时间、设备运行次数、用户设置的参数,都能往里放;

③ 掉电不丢:和时间寄存器一样,靠 Vcc1 的纽扣电池供电,断电后里面的数据也不会没。

"操作 DS1302 的过程"的本质就是:

  1. 先操作「控制寄存器」解锁→
  2. 往「日历 / 时钟寄存器」里写时间(或读时间)→
  3. 往「31 字节 RAM」里存闹钟 / 参数(或取数据)→
  4. 再操作「控制寄存器」上锁(可选)。
5.4 BCD 码

时间/控制寄存器都是以BCD 码存放数据,BCD 码是通过 4 位二进制码来表示 1 位十进制中的 0-9 这 10 个数码

十进制 25 转 BCD 码的核心逻辑是:

两位十进制数拆分为十位/个位 → 每一位转4位二进制 → 高4位存十位、低4位存个位 →

组合成8位二进制 → 按4位一组转十六进制

比如十进制 89 转 BCD 码:

  • 十位 8 → 4 位二进制 1000
  • 个位 9 → 4 位二进制 1001
  • 8 位 BCD 码:1000 1001 → 十六进制0x89

容易误解的点:

  • 0x89作为BCD 码,它表示的十进制数是 89(十位 8、个位 9);
  • 0x89作为普通十六进制数,转换为十进制是 137(8×16 +9=137)。

所以从 DS1302 中读出的时钟数据均为 BCD码,需转换为 10 进制

6. 交互流程
6.1 硬件基础
6.2 DS1302 通信协议

DS1302 与 51 的交互遵循同步串行时序,核心规则:

  1. 通信触发:RST 必须先拉低,再拉高(保持高电平),才能启动通信;通信结束后拉低 RST。
  2. 时钟时序 :SCLK 为同步时钟,上升沿写入数据 (51→DS1302),下降沿读取数据(DS1302→51)。
  3. 数据位序 :所有数据(指令、时间)均为低位先行(LSB),即先发送 / 接收最低位(D0),最后发送 / 接收最高位(D7)。
  4. 指令先行 :读写任何时间寄存器(秒、分、时等)或 RAM 前,必须先发送 8 位指令字节,DS1302 根据指令判断 "读 / 写" 和 "操作哪个寄存器"。

指令格式:

位序 D7 D6 D5 D4 D3 D2 D1 D0

含义 1 寄存器地址 读写位

D7 固定为 1(区分时钟 / RAM 操作,1 = 时钟,0=RAM);

D6~D1 是寄存器地址(如秒寄存器地址 000000,分 000001,时 000010);

D0 是读写控制位(0 写,1 读)。

6.3 核心交互

核心逻辑:

硬件连接→初始化时序(RST/SCLK拉低→RST拉高)→发送指令字节→读/写数据字节→拉低RST结束通信

指令先行、低位先行、上升沿写 / 下降沿读是时序关键,BCD 码转换是数据处理的核心

6.3.1 写操作

51 单片机向 DS1302 写数据(如设置时间)

核心逻辑:先送指令(写指令)→ 再送数据(时间值,BCD 码),全程按 "低位先行、上升沿写" 时序,即

① 初始化时序

拉低 RST(P1.0=0),拉低 SCLK(P1.1=0);

拉高 RST(P1.0=1),启动通信(RST 必须先拉低,再拉高(保持高电平),才能启动通信;通信结束后拉低 RST)

② 发送 8 位写指令字节

  • 循环 8 次(逐位发送):
    • 取指令字节的当前最低位(如指令 0x00,先取 D0=0),赋值给 I/O 口(P1.2);
    • 拉高 SCLK(上升沿),将 I/O 数据写入 DS1302;
    • 拉低 SCLK,准备下一位;
    • 指令字节右移 1 位(舍弃已发送的低位,准备下一位);

CE(RST):复位时序。即在RST引脚产生一个正脉冲,在整个读写周期期间,RST 要保持高电平,读写完毕之后,要将 RST 返回低电平,以准备下次读写;

发送 8 位数据字节(时间值,BCD 码)

流程与发送指令完全一致:逐位取数据低位→I/O 赋值→SCLK 上升沿写入→右移数据。

④ 结束通信:拉低 RST(P1.0=0),拉低 SCLK(P1.1=0)。

6.3.2 读操作

51 单片机从 DS1302 读数据(如读取当前秒数)

核心逻辑:先送指令(读指令)→ 再读数据,全程按 "低位先行、下降沿读" 时序。

① 初始化时序:同写操作(拉低 RST→拉低 SCLK→拉高 RST)。

发送 8 位读指令字节

  • 循环 8 次(逐位发送):
    • 取指令字节的当前最低位(如指令 0x00,先取 D0=0),赋值给 I/O 口(P1.2);
    • 拉高 SCLK(上升沿),将 I/O 数据写入 DS1302;
    • 拉低 SCLK,准备下一位;
    • 指令字节右移 1 位(舍弃已发送的低位,准备下一位);

读取 8 位数据字节

  • 循环 8 次(逐位读取):
    • 拉高 SCLK,准备接收数据;
    • 拉低 SCLK(下降沿),此时 DS1302 将当前位数据放到 I/O 口;
    • 读取 I/O 口电平(0/1),存入数据变量的对应位;
    • 数据变量左移 1 位(预留低位,接收下一位)。

注意:图中第八个上升沿写命令结束之后紧接着下降沿就要开始读数据

④ 结束通信:拉低 RST,拉低 SCLK。

6.3.3 注意

① 注意时序匹配

51 单片机的时钟频率(如 11.0592MHz)需与 SCLK 时序匹配,避免过快(如循环中不加延时可能导致时序不满足),建议在 SCLK 高低电平切换后加短延时(如_nop_())。

② 读取数据之前,将 IO 设置为输入口,读取完之后,要将其改回输出口

7. 总结

① 硬件

  • RST(唤醒线):接单片机任意 IO 口(相当于 "打电话时先喊对方名字,唤醒它");
  • SCLK(节奏线):接单片机任意 IO 口(相当于 "通话的节拍器,双方按这个节奏传东西,不抢话");
  • I/O(数据线):接单片机任意 IO 口(相当于 "传声音的电话线,既能说也能听");
  • 电源:Vcc2 接单片机的 5V/3.3V 主电,Vcc1 接纽扣电池(保证断电后时间 / 数据不丢)。

② 通讯核心操作

  1. 先 "喊醒":单片机把 RST 线拉低→再把 SCLK 线拉低→最后把 RST 线拉高(一套固定动作,告诉 DS1302 "要开始说话了");
  2. 说 "地址":单片机通过 I/O 线,跟着 SCLK 的节奏(每跳一下传 1 位),发 "我要写哪个位置" 的地址 ------ 比如 "我要写秒的数据""我要把闹钟存到通用存储区第 2 个位置";
  3. 写/读 "数据":地址发完后,继续跟着 SCLK 的节奏,传具体数据(比如秒是 00、分是 30、闹钟小时是 07);
  4. 挂电话:单片机把 RST 线拉低(告诉 DS1302 "说完了")。

③ DS1302 通信协议

DS1302 与 51 的交互遵循同步串行时序,核心规则:

  1. 通信触发:RST 必须先拉低,再拉高(保持高电平),才能启动通信;通信结束后拉低 RST。
  2. 时钟时序 :SCLK 为同步时钟,上升沿写入数据 (51→DS1302),下降沿读取数据 (DS1302→51)(上写下读)。
  3. 数据位序 :所有数据(指令、时间)均为低位先行(LSB),即先发送 / 接收最低位(D0),最后发送 / 接收最高位(D7)。
  4. 指令先行 :读写任何时间寄存器(秒、分、时等)或 RAM 前,必须先发送 8 位指令字节,DS1302 根据指令判断 "读 / 写" 和 "操作哪个寄存器"。

④ 寄存器通用规则

⑥ BCD码

时间/控制寄存器都是以BCD 码存放数据,BCD 码是通过 4 位二进制码来表示 1 位十进制中的 0-9 这 10 个数码

十进制 25 转 BCD 码的核心逻辑是:

两位十进制数拆分为十位/个位 → 每一位转4位二进制 → 高4位存十位、低4位存个位 →

组合成8位二进制 → 按4位一组转十六进制

比如十进制 89 转 BCD 码:

  • 十位 8 → 4 位二进制 1000
  • 个位 9 → 4 位二进制 1001
  • 8 位 BCD 码:1000 1001 → 十六进制0x89
相关推荐
无畏jh32 分钟前
TLE5012B磁阻芯片解读
嵌入式硬件·汽车嵌入式·磁阻芯片
培林将军40 分钟前
Altium Designer 22的安装与汉化
嵌入式硬件·ad工具安装
idcardwang42 分钟前
xl9555-IO拓展芯片
stm32·单片机·嵌入式硬件
Y1rong1 小时前
STM32之EXTI
stm32·单片机·嵌入式硬件
兆龙电子单片机设计1 小时前
【STM32项目开源】STM32单片机智能语音家居控制系统
stm32·单片机·嵌入式硬件·物联网·开源·自动化
TaidL1 小时前
茂捷M1020电感式编码器芯片赋能工业智能升级,适用于工业及机器人等领域的各种应用场景
单片机·嵌入式硬件
意法半导体STM321 小时前
【官方原创】SAU对NSC分区的影响 LAT1578
stm32·单片机·嵌入式硬件·mcu·信息安全·trustzone·stm32开发
SmartRadio1 小时前
MK8000(UWB射频芯片)与DW1000的协议适配
c语言·开发语言·stm32·单片机·嵌入式硬件·物联网·dw1000
LDR0061 小时前
芯片电路的引脚标识代表什么?
stm32·单片机·嵌入式硬件
恒锐丰小吕2 小时前
屹晶微 EG3116 600V高压、2A/2.5A驱动、双高有效输入逻辑的半桥栅极驱动芯片技术解析
嵌入式硬件·硬件工程