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
相关推荐
无人装备硬件开发爱好者3 小时前
深度解析:STM32 MDK 工程 HEX 文件转 BIN 文件 —— 原理、方法、优缺点与实战指南(上)
stm32·嵌入式硬件·hex2bin
up向上up3 小时前
基于51单片机智能家居环境检测设计_烟雾温度GSM短信提示报警器
嵌入式硬件·51单片机·智能家居
Nautiluss3 小时前
一起玩XVF3800麦克风阵列(五)
嵌入式硬件·音频·语音识别·智能音箱
youcans_4 小时前
【动手学电机驱动】 STM32-FOC(11)ST MCSDK6.0 电机控制软件框架
stm32·单片机·嵌入式硬件·foc·电机驱动
rechol4 小时前
cpu异常中断(2)
单片机·嵌入式硬件
会编程是什么感觉...4 小时前
硬件 - 常见通信协议整合
单片机·嵌入式硬件·fpga开发
沐欣工作室_lvyiyi5 小时前
基于单片机的垃圾容量监测与语音交互系统设计(论文+源码)
stm32·单片机·嵌入式硬件·垃圾桶
rechol5 小时前
mcu启动流程
stm32·单片机·mcu·嵌入式
chuwengeileyan16 小时前
stm32 adc采集光敏传感器模块的模拟输出脚A0的值
单片机·嵌入式硬件