74hc595芯片的工作原理


74HC595 移位寄存器工作原理详解
74HC595 是一款常用的 8 位串行输入、并行输出的移位寄存器,常用于微控制器扩展 I/O 口、驱动 LED 显示、控制继电器等应用中。它以其简单的接口、高效的数据传输方式以及多芯片级联能力,成为电子项目中的常客。理解其工作原理对于有效利用它至关重要。
1. 74HC595 芯片概述与特点
74HC595 芯片属于高速 CMOS 逻辑系列,具有低功耗和高噪声容限的特点。它集成了两个主要的寄存器:一个 8 位移位寄存器和一个 8 位存储寄存器(锁存器)。这两个寄存器的协同工作使得 74HC595 能够将串行数据转换为并行数据输出。
该芯片的主要特点包括:
串行输入,并行输出: 这是其核心功能,允许用户通过少量引脚(通常是三根)控制大量的输出引脚。
8 位数据宽度: 每次操作可以处理 8 位数据。
存储寄存器: 内部的存储寄存器使得输出数据可以被锁定,即使在移位寄存器中进行新的数据输入,输出也能保持稳定。
级联能力: 可以方便地将多个 74HC595 芯片串联起来,以扩展更多的输出端口,这对于需要控制大量输出的应用场景非常有用。
高速性能: 作为 HC 系列芯片,它具有较快的开关速度,适用于对响应时间有一定要求的场合。
宽工作电压范围: 通常支持 2V 至 6V 的工作电压,使其能够兼容多种微控制器和逻辑电平。
2. 74HC595 引脚功能详解
理解 74HC595 的工作原理,首先要熟悉其各个引脚的功能。标准的 74HC595 芯片通常有 16 个引脚,其中最重要的几个引脚如下:
VCC (引脚 16): 电源正极。为芯片提供工作电压。
GND (引脚 8): 接地。芯片的公共参考电位。
SER (Serial Data Input, 引脚 14): 串行数据输入引脚。这是数据从微控制器或其他数据源输入到 74HC595 移位寄存器的入口。数据以位(bit)的形式一位一位地送入。
SRCLK (Shift Register Clock, 引脚 11): 移位寄存器时钟输入引脚。每当此引脚接收到一个上升沿(从低电平到高电平的跳变),SER 引脚上的数据就会被移入到移位寄存器的最低位(Q0),同时移位寄存器中的所有现有数据都会向高位移动一位(Q0 移到 Q1,Q1 移到 Q2,以此类推,Q7 的数据会移出到 QH')。
RCLK (Storage Register Clock / Latch Clock, 引脚 12): 存储寄存器时钟输入引脚,也称锁存时钟或输出使能时钟。当此引脚接收到一个上升沿时,移位寄存器中的 8 位数据会被并行地传输并锁定到存储寄存器中。一旦数据被锁存,它们就会立即反映到 Q0 到 Q7 的并行输出引脚上,并且在下一个 RCLK 上升沿到来之前,这些输出将保持不变。
OE (Output Enable, 引脚 13): 输出使能引脚。这是一个低电平有效(Active Low)的引脚。当 OE 为低电平时,存储寄存器中的数据会输出到 Q0-Q7 引脚。当 OE 为高电平时,所有并行输出引脚(Q0-Q7)将处于高阻态(High Impedance),这意味着它们既不输出高电平也不输出低电平,可以有效地断开与负载的连接,常用于多路复用或节省功耗的场景。在许多应用中,为了简化设计,OE 引脚通常直接接地,使其始终处于使能状态。
CLR (Master Reset / Clear, 引脚 10): 清零引脚。这是一个低电平有效(Active Low)的引脚。当 CLR 为低电平时,移位寄存器中的所有数据位(Q0-Q7)都会被异步清零为逻辑 0。请注意,CLR 只清零移位寄存器,不影响存储寄存器中的数据。为了正常操作,此引脚通常连接到 VCC 以保持高电平,使其处于非清零状态。
Q0 - Q7 (Parallel Data Outputs, 引脚 15, 1-7): 8 位并行数据输出引脚。这些引脚直接连接到存储寄存器的输出,当数据被锁存后,它们会并行地显示存储寄存器中的数据。它们是 74HC595 与外部设备(如 LED、继电器等)连接的主要接口。
QH' (Serial Data Output, 引脚 9): 串行数据输出引脚。这是移位寄存器中最高位(Q7)的数据输出。在 SRCLK 的每个上升沿,当数据从 Q7 移出时,它会出现在 QH' 引脚上。这个引脚使得多个 74HC595 芯片可以方便地进行级联,一个芯片的 QH' 可以连接到下一个芯片的 SER 引脚,从而形成更长的移位寄存器链。
3. 74HC595 内部结构与工作流程
74HC595 的内部结构可以简化为两个核心部分:一个 8 位串行移位寄存器(Shift Register)和一个 8 位并行存储寄存器(Storage Register / Latch)。
3.1 移位寄存器的工作
移位寄存器是 74HC595 数据输入的核心。它由 8 个 D 触发器串联而成。
数据输入: 当 SRCLK 引脚接收到一个上升沿时,SER 引脚上的当前逻辑电平(高或低)会被载入到移位寄存器的第一位(通常标记为 Q0 或 QA)。
数据移位: 与此同时,移位寄存器中所有已有的数据位都会向高位移动一个位置。例如,Q0 中的数据会移动到 Q1,Q1 的数据移动到 Q2,依此类推,直到 Q6 的数据移动到 Q7。
数据溢出: 移位寄存器最高位(Q7)的数据会从 QH' 引脚输出。这正是实现级联的关键。
这个过程重复 8 次,就可以将 8 位数据完整地从 SER 引脚一位一位地移入到移位寄存器中。例如,如果要将字节 0b10110010
送入,你需要发送 8 个 SRCLK 脉冲,并在每个脉冲到来之前将对应的数据位设置在 SER 引脚上。通常的做法是先发送最高位或最低位,这取决于具体的协议和实现。
3.2 存储寄存器(锁存器)的工作
存储寄存器同样由 8 个 D 触发器组成,但这些触发器是并行连接的,并且它们的输入端直接连接到移位寄存器的输出端。
数据传输: 当 RCLK 引脚接收到一个上升沿时,移位寄存器中当前的所有 8 位数据会被同步、并行地传输并锁定到存储寄存器中。
输出稳定: 一旦数据被锁存,它就会立即反映到 Q0-Q7 的并行输出引脚上。存储寄存器的作用是隔离移位寄存器的操作和最终的输出。这意味着你可以继续在移位寄存器中加载新的数据,而并行输出Q0-Q7仍然保持上一次锁存的数据,直到下一个 RCLK 上升沿到来。这对于避免数据在移位过程中对输出造成闪烁或不稳定状态至关重要。
3.3 清零与输出使能
CLR (Master Reset): 当 CLR 引脚为低电平时,移位寄存器会被强制清零,所有位都变为 0。这个操作是异步的,不依赖于时钟信号。存储寄存器中的数据不受影响。在正常工作时,CLR 应该保持高电平。
OE (Output Enable): OE 引脚控制着存储寄存器输出到 Q0-Q7 引脚的通路。当 OE 为低电平时,存储寄存器的数据会正常输出。当 OE 为高电平时,Q0-Q7 引脚会进入高阻态,断开与外部电路的连接。这在需要暂时关闭输出或在多路复用系统中选择性地启用输出时非常有用。通常,为了让 74HC595 正常工作并显示输出,OE 引脚会被连接到 GND。
4. 74HC595 工作时序
理解时序图对于正确驱动 74HC595 至关重要。主要涉及三个时钟信号:SER、SRCLK 和 RCLK。
4.1 数据移位时序
准备数据: 在 SRCLK 的上升沿到来之前,将要输入的数据位(高或低)设置在 SER 引脚上。
移入数据: 当 SRCLK 从低电平跳变到高电平(上升沿)时,SER 引脚上的数据被读入移位寄存器的第一位。同时,移位寄存器中的所有数据都向高位移动一位。
重复 8 次: 重复步骤 1 和 2 共 8 次,将一个完整的 8 位字节数据逐位移入移位寄存器。
4.2 数据锁存时序
加载数据: 在 8 位数据全部移入移位寄存器之后,确保 RCLK 保持低电平。
锁存数据: 当 RCLK 从低电平跳变到高电平(上升沿)时,移位寄存器中的 8 位数据会并行地传输并锁定到存储寄存器中。
输出更新: 锁存操作完成后,Q0-Q7 引脚的输出会立即更新为新的数据。
4.3 清零与输出使能时序
CLR: 这是一个异步清零信号。无论 SRCLK 或 RCLK 的状态如何,只要 CLR 引脚从高电平变为低电平,移位寄存器就会被立即清零。当 CLR 恢复高电平后,移位寄存器才能再次正常工作。
OE: 这是异步控制输出的信号。当 OE 为高电平时,Q0-Q7 处于高阻态;当 OE 为低电平时,Q0-Q7 正常输出存储寄存器中的数据。它的变化不依赖于任何时钟信号。
在实际操作中,为了避免输出的抖动或闪烁,通常会在数据完全加载到移位寄存器后,再通过一个 RCLK 脉冲将数据一次性更新到输出。SRCLK 和 RCLK 之间应该有足够的时间间隔,以确保数据稳定。
5. 74HC595 级联应用
74HC595 芯片最强大的功能之一就是其级联能力,允许用户通过仅仅三个微控制器引脚(或者说一套数据、时钟和锁存引脚)控制任意数量的输出。
5.1 级联原理
级联的实现依赖于 QH' 引脚。前一个 74HC595 芯片的 QH' (串行数据输出)引脚连接到后一个 74HC595 芯片的 SER (串行数据输入)引脚。所有级联的 74HC595 芯片共享相同的 SRCLK 和 RCLK 引脚。
当数据通过第一个芯片的 SER 引脚移入时,经过 8 个 SRCLK 脉冲后,第一个字节的数据完全移入第一个芯片的移位寄存器。此时,第一个字节的最高位(Q7)会从 QH' 引脚输出,并作为第二个芯片的 SER 输入。继续发送 SRCLK 脉冲,第二个字节就会被移入第一个芯片,同时第一个字节的数据会进一步移入第二个芯片。
5.2 级联操作流程
假设我们要级联两个 74HC595 芯片来控制 16 个输出。
连接:
微控制器的 数据引脚 连接到第一个 74HC595 的 SER。
微控制器的 时钟引脚 连接到所有 74HC595 的 SRCLK。
微控制器的 锁存引脚 连接到所有 74HC595 的 RCLK。
第一个 74HC595 的 QH' 连接到第二个 74HC595 的 SER。
所有 74HC595 的 OE 通常接地。
所有 74HC595 的 CLR 通常接 VCC。
数据发送:
为了控制 16 个输出,我们需要发送 16 位数据。通常,从最后一个芯片需要的数据开始发送(或者说,从最"远"的输出开始发送)。例如,如果控制 LED 阵列,通常从最右边或最底部开始。
首先发送第二个 74HC595 需要的 8 位数据(例如,先发送低 8 位)。在每次 SRCLK 上升沿到来时,将数据位送入第一个 74HC595 的 SER。这 8 位数据会经过第一个芯片,最终完全移入第二个芯片的移位寄存器。
接着发送第一个 74HC595 需要的 8 位数据(例如,再发送高 8 位)。同样,在每次 SRCLK 上升沿到来时,将数据位送入第一个 74HC595 的 SER。这些数据会填充第一个芯片的移位寄存器,同时之前移入第二个芯片的数据会保持在第二个芯片的移位寄存器中。
总共需要发送 16 个 SRCLK 脉冲。
锁存数据:
在所有 16 位数据都成功移入相应的移位寄存器后(第一个 8 位在第二个芯片中,第二个 8 位在第一个芯片中),产生一个 RCLK 上升沿。
所有的 74HC595 芯片会同时将它们各自移位寄存器中的数据锁存到存储寄存器中,并更新并行输出。
通过这种方式,无论级联多少个 74HC595 芯片,微控制器都只需要使用相同的 SER、SRCLK 和 RCLK 三个引脚,极大地节省了 I/O 资源。
6. 74HC595 应用场景与编程思路
74HC595 因其简单高效的特点,广泛应用于各种需要扩展输出端口的场景。
6.1 常见应用场景
LED 驱动: 这是最常见的应用。通过 74HC595 可以轻松驱动大量的 LED,例如 LED 点阵、LED 广告牌等。每个 74HC595 可以控制 8 个 LED。
数码管显示: 驱动多位共阴或共阳数码管,通过移位寄存器将数字编码并行输出。
继电器控制: 控制多个继电器的开关,实现对高功率设备的控制。
电机驱动: 控制多个小功率电机或电机驱动器的使能/方向引脚。
I/O 扩展: 作为微控制器的通用 I/O 扩展器,控制各种数字输入/输出设备。
6.2 编程思路(以 Arduino 为例)
使用微控制器驱动 74HC595 的基本步骤如下:
定义引脚: 在代码中定义连接 74HC595 的 SER、SRCLK 和 RCLK 引脚。
初始化引脚: 将这些引脚设置为输出模式。
数据传输函数: 编写一个函数,负责将一个字节的数据传输到 74HC595。
设置 SER: 根据当前数据位的状态(0 或 1),将 SER 引脚设置为低电平或高电平。
产生 SRCLK 脉冲: 将 SRCLK 置高,然后置低,产生一个上升沿,将数据移入。
拉低 RCLK: 在数据传输开始前,确保 RCLK 为低电平,避免误锁存。
循环 8 次: 遍历要发送的 8 位数据(通常从最高位或最低位开始,取决于习惯)。
拉高 RCLK: 在 8 位数据全部移入移位寄存器后,将 RCLK 置高,然后置低(或直接置高,保持短暂时间),产生一个上升沿,将数据从移位寄存器锁存到存储寄存器,更新并行输出。
(可选)控制 OE: 如果需要控制输出的开启/关闭,可以根据需要设置 OE 引脚。
示例伪代码:
// 定义引脚
const int SER_PIN = 2; // 数据引脚 (DS)
const int RCLK_PIN = 3; // 锁存引脚 (ST_CP)
const int SRCLK_PIN = 4; // 时钟引脚 (SH_CP)
void setup() {
pinMode(SER_PIN, OUTPUT);
pinMode(RCLK_PIN, OUTPUT);
pinMode(SRCLK_PIN, OUTPUT);
// 确保OE始终使能,CLR不复位
// 如果OE连接到微控制器引脚,则需要设置
// 如果OE接地,则不需要
// 如果CLR连接到微控制器引脚,则需要设置
// 如果CLR接VCC,则不需要
}
// 发送一个字节到74HC595的函数
void writeByteTo595(byte data) {
// 1. 拉低RCLK,准备锁存
digitalWrite(RCLK_PIN, LOW);
// 2. 循环8次,逐位发送数据
for (int i = 0; i < 8; i++) {
// 2.1. 设置SER引脚:从高位开始发送
// data & 0x80 会取出最高位,然后右移一位
digitalWrite(SER_PIN, (data & 0x80) ? HIGH : LOW);
// 2.2. 产生SRCLK上升沿
digitalWrite(SRCLK_PIN, HIGH);
digitalWrite(SRCLK_PIN, LOW); // 产生一个脉冲
// 2.3. 数据左移一位,准备发送下一位
data <<= 1;
}
// 3. 拉高RCLK,锁存数据到输出
digitalWrite(RCLK_PIN, HIGH);
// 理论上RCLK应该拉高一段时间后拉低,但很多情况下直接拉高就足以完成锁存
// digitalWrite(RCLK_PIN, LOW); // 也可以再拉低,确保脉冲完成
}
void loop() {
// 示例:从0到255循环显示
for (int i = 0; i < 256; i++) {
writeByteTo595((byte)i); // 发送数据
delay(500); // 延时500ms
}
}
级联时的编程:
如果进行级联,例如控制两个 74HC595(16 位输出),则需要发送一个 16 位的字(word),或者两个字节。在发送时,通常将需要出现在**“最后”**一个 74HC595 上的数据先发送出去,然后是倒数第二个,以此类推。这是因为数据是逐级向后移位的。
// 发送两个字节到级联的74HC595函数
void writeTwoBytesTo595(byte data2, byte data1) { // data2是给第二个595的,data1是给第一个595的
digitalWrite(RCLK_PIN, LOW);
// 先发送给第二个595的数据,它会先进入第一个595,然后移入第二个595
for (int i = 0; i < 8; i++) {
digitalWrite(SER_PIN, (data2 & 0x80) ? HIGH : LOW);
digitalWrite(SRCLK_PIN, HIGH);
digitalWrite(SRCLK_PIN, LOW);
data2 <<= 1;
}
// 再发送给第一个595的数据
for (int i = 0; i < 8; i++) {
digitalWrite(SER_PIN, (data1 & 0x80) ? HIGH : LOW);
digitalWrite(SRCLK_PIN, HIGH);
digitalWrite(SRCLK_PIN, LOW);
data1 <<= 1;
}
digitalWrite(RCLK_PIN, HIGH);
}
7. 74HC595 的优点与局限性
7.1 优点
节省 I/O 口: 这是 74HC595 最核心的优势。仅需 3 个微控制器引脚即可控制 8 个甚至更多的输出,对于 I/O 口资源有限的微控制器非常有用。
简化布线: 由于采用串行输入,PCB 布线会比并行输出的方案更加简洁。
成本效益: 芯片本身价格低廉,是经济实惠的 I/O 扩展方案。
易于级联: 方便地扩展输出数量,满足大规模控制需求。
数据稳定: 锁存功能确保在移位过程中输出保持稳定,避免闪烁。
7.2 局限性
速度限制: 尽管是高速 CMOS 器件,但由于是串行传输,刷新速度会受到限制。对于需要极高速刷新率的应用(如高速扫描显示),可能不如并行接口。
输出电流有限: 74HC595 的每个输出引脚能够提供的电流是有限的(通常为 35mA),直接驱动大功率负载(如高亮度 LED、大电流继电器)需要额外的驱动电路(如 ULN2003 达林顿管阵列或 MOSFET)。
单向传输: 74HC595 是单向(串行输入到并行输出)的,不能用于读取输入信号。
需要时序控制: 正确的时序控制对于其正常工作至关重要,编程时需要注意 SRCLK 和 RCLK 的脉冲顺序和时机。
8. 74HC595 与其他移位寄存器/I/O 扩展方案的比较
除了 74HC595,还有其他一些常见的 I/O 扩展方案,每种都有其适用场景:
74LS164/74HC164: 也是串行输入并行输出的移位寄存器,但没有内部锁存器。这意味着它的输出会随着数据在移位寄存器中的移动而实时变化,可能导致输出闪烁。适用于对闪烁不敏感或需要实时显示移位过程的应用。
74HC165: 串行输出并行输入的移位寄存器。与 74HC595 功能相反,用于将并行输入(如多个按钮状态)转换为串行数据,以便用少量引脚读回微控制器。
PCF8574/PCF8575 (I2C 扩展器): 这些是基于 I2C 总线的 I/O 扩展芯片。它们通过 I2C 协议与微控制器通信,每个芯片提供 8 或 16 个双向 I/O 口。优点是只需两根线(SDA 和 SCL)即可与微控制器通信,且支持双向操作。缺点是 I2C 协议相对复杂,速度可能低于 SPI 或直接并行控制。适用于需要双向 I/O 或希望简化布线但不需要极高速度的应用。
MCP23017/MCP23S17 (SPI 或 I2C 扩展器): 提供 16 个双向 I/O 口,支持 SPI 或 I2C 接口。功能更强大,具有中断引脚等高级特性。
IO Expander (通用): 市面上还有很多其他类型的 I/O 扩展芯片,例如基于 SPI 的 GPIO 扩展器,它们通常提供更灵活的配置和更多的 I/O 口数量。
选择哪种 I/O 扩展方案取决于项目的具体需求,包括所需的 I/O 口数量、数据传输速度、双向通信需求、布线复杂性、成本和编程便利性等因素。74HC595 在其特有的应用领域(大量单向输出)中,仍然是性价比高、易于使用的优秀选择。
9. 总结
74HC595 是一款功能强大且易于使用的 8 位串行输入、并行输出移位寄存器。其核心工作原理在于利用串行移位寄存器接收数据,并通过存储寄存器(锁存器)将数据并行地输出并保持稳定。通过对 SER、SRCLK 和 RCLK 这三个关键引脚的时序精确控制,微控制器能够高效地扩展其输出能力。
它的级联特性进一步增强了其可用性,使得仅凭微控制器的几个引脚就能控制数十甚至数百个输出,为 LED 矩阵、多路继电器控制等应用提供了极大的便利。理解其引脚功能、内部工作流程和时序图是成功使用 74HC595 的基础。尽管存在速度和电流输出的局限性,但在许多常见的电子项目中,74HC595 仍然是实现 I/O 扩展的首选解决方案之一。
责任编辑:David
【免责声明】
1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系拍明芯城(marketing@iczoom.com),本方将及时处理。
2、本文的引用仅供读者交流学习使用,不涉及商业目的。
3、本文内容仅代表作者观点,拍明芯城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。
4、如需转载本方拥有版权的文章,请联系拍明芯城(marketing@iczoom.com)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。
拍明芯城拥有对此声明的最终解释权。