74hc595芯片手册


74HC595 移位寄存器芯片手册详解
74HC595 是一款广泛应用于电子项目中的串行输入、并行输出的 8 位移位寄存器。它以其简单的接口、节省微控制器 I/O 引脚的特性,成为驱动 LED、数码管以及扩展 I/O 口的理想选择。本篇将详细介绍 74HC595 的工作原理、引脚功能、时序图、级联应用及其在实际项目中的注意事项。
1. 74HC595 概述
74HC595 属于高速 CMOS 逻辑系列,具有低功耗和高噪声抑制的特点。其核心功能是实现串行数据到并行数据的转换。这意味着你可以通过三个微控制器引脚(数据、时钟和锁存)控制多达八个输出引脚。这对于那些 I/O 引脚资源有限的微控制器(如 Arduino Nano、ESP32 等)来说,无疑是一大福音。通过级联多个 74HC595 芯片,可以轻松地扩展更多的输出引脚,例如,使用两个 74HC595 可以控制 16 个输出,而仅需额外的电源和地线连接。
该芯片内部主要包含两个重要的寄存器:一个 8 位移位寄存器和一个 8 位存储寄存器(锁存器)。串行数据首先通过数据输入引脚(DS)进入移位寄存器,在时钟脉冲(SH_CP)的作用下逐位移动。当移位寄存器中的数据准备好后,通过存储时钟脉冲(ST_CP)将数据传输到存储寄存器,从而在并行输出引脚(Q0-Q7)上显示出来。这种分离的设计使得在并行输出更新之前,可以在后台进行数据的串行输入,从而避免输出的瞬态变化。
2. 引脚功能与定义
理解 74HC595 的各个引脚功能是正确使用它的前提。74HC595 通常采用 16 引脚 DIP 或 SOIC 封装。以下是各个引脚的详细说明:
Q0 - Q7 (并行数据输出):这八个引脚是 74HC595 的并行数据输出端。当数据被锁存到存储寄存器后,这些引脚会立即反映出相应的数据状态(高电平或低电平),用于驱动外部设备如 LED、继电器等。Q0 是移位寄存器中的最低位(LSD),而 Q7 则是最高位(MSD)。
DS (串行数据输入):这是串行数据的输入引脚。微控制器通过这个引脚逐位发送数据。每次 SH_CP 引脚接收到一个上升沿时,DS 引脚上的当前电平就会被移入移位寄存器的最低位。
SH_CP (移位寄存器时钟输入):这个引脚是移位寄存器的时钟输入。每个从低电平到高电平的跳变(上升沿)都会使移位寄存器中的数据向高位移动一位,并将 DS 引脚上的数据移入最低位。这是数据串行输入的同步信号。
ST_CP (存储寄存器时钟输入/锁存):这个引脚是存储寄存器的时钟输入,也被称为锁存器时钟。当这个引脚从低电平到高电平跳变(上升沿)时,移位寄存器中的 8 位数据将被复制到存储寄存器,并同步更新 Q0-Q7 的并行输出。为了防止在数据移位过程中输出发生变化,通常会在所有数据都移位完成后才产生 ST_CP 的上升沿。
OE (输出使能/低电平有效):这个引脚是输出使能引脚,它是一个低电平有效的输入。当 OE 为低电平时(接地),Q0-Q7 引脚处于正常输出状态。当 OE 为高电平时(接 VCC),Q0-Q7 引脚将进入高阻态(High-Z)。这允许你通过外部信号控制何时使能输出,在某些应用中,比如需要多路复用或者降低功耗时,此功能非常有用。
MR (主复位/低电平有效):这是主复位引脚,也是一个低电平有效的输入。当 MR 为低电平时,移位寄存器中的所有数据位将被清零(Q0-Q7 输出不受影响,除非 ST_CP 产生上升沿)。通常,在初始化时会短暂地将 MR 拉低以确保移位寄存器处于已知状态。如果不需要复位功能,MR 引脚通常连接到 VCC。
VCC (电源):这是芯片的电源输入引脚,通常连接到 +5V 或 +3.3V,具体取决于使用的 74HC595 版本和系统电压。
GND (地):这是芯片的接地引脚,连接到电源负极。
Q'S (串行数据输出):这个引脚是移位寄存器最高位(Q7)的串行输出。当 SH_CP 引脚产生一个上升沿时,Q7 的数据会从这个引脚输出。Q'S 的主要用途是级联多个 74HC595 芯片。你可以将前一个芯片的 Q'S 引脚连接到下一个芯片的 DS 引脚,从而实现数据的级联传输。
3. 工作原理与数据传输流程
74HC595 的工作原理可以分为两个主要阶段:串行数据输入和并行数据输出。
3.1 串行数据输入
数据通过 DS 引脚以串行方式一位一位地送入 74HC595。每次 SH_CP 引脚产生一个从低到高的跳变(上升沿)时,当前 DS 引脚上的数据电平就会被移入移位寄存器的最低位(Q0)。同时,移位寄存器中原有的所有数据位都会向高位移动一位。例如,Q0 的数据移到 Q1,Q1 的数据移到 Q2,以此类推,直到 Q6 的数据移到 Q7。而 Q7 原有的数据则会通过 Q'S 引脚输出。
这个过程需要重复 8 次,才能将一个完整的 8 位字节数据全部移入移位寄存器。例如,如果你想将二进制数据 10110010
移入芯片,你需要先将最低位 0
通过 DS 发送并提供一个 SH_CP 上升沿,然后是 1
,再提供一个 SH_CP 上升沿,依此类推,直到最高位 1
。
3.2 并行数据输出(锁存)
当 8 位数据全部移入移位寄存器后,为了在 Q0-Q7 上显示这些数据,需要将移位寄存器中的数据传输到存储寄存器。这个操作是通过 ST_CP 引脚控制的。当 ST_CP 引脚产生一个从低到高的跳变(上升沿)时,移位寄存器中当前的 8 位数据会立即复制到存储寄存器。一旦数据被复制,Q0-Q7 引脚上的电平就会更新,反映出新的 8 位数据。
这个分离的锁存机制非常重要。它允许你在背景中更新移位寄存器中的数据,而不会影响当前的并行输出。只有当你明确地通过 ST_CP 锁存时,输出才会改变。这对于需要平滑更新显示或者避免输出抖动的应用场景非常关键。
3.3 复位与输出使能
MR 引脚(主复位)的低电平会清空移位寄存器,但不会立即影响并行输出。只有在 MR 复位后,如果 ST_CP 再次触发,清零后的数据才会显示在输出端。
OE 引脚(输出使能)用于控制 Q0-Q7 的输出状态。当 OE 为高电平时,Q0-Q7 处于高阻态,即它们既不输出高电平也不输出低电平,就像断开连接一样。这在需要将多个设备连接到同一总线或进行电源管理时非常有用。
4. 时序图详解
理解 74HC595 的时序图对于正确编程和避免数据错误至关重要。以下是关键的时序参数和信号关系:
4.1 数据输入时序 (SH_CP 和 DS)
SH_CP (移位寄存器时钟):这是一个脉冲信号,控制数据在移位寄存器中的移位。数据在 SH_CP 的上升沿被锁存。
DS (串行数据):在 SH_CP 的上升沿到来之前,DS 引脚上的数据必须稳定保持一段时间(数据建立时间
t_su
),并在上升沿之后保持一段时间(数据保持时间t_h
)。如果数据在这些时间窗口内不稳定,可能会导致数据丢失或错误。通常,将 DS 在 SH_CP 的下降沿或 SH_CP 变为低电平后改变,这样可以确保数据在 SH_CP 的下一个上升沿到来之前有足够的时间稳定。
4.2 锁存时序 (ST_CP)
ST_CP (存储寄存器时钟):这个脉冲信号控制将移位寄存器中的数据传输到存储寄存器。数据在 ST_CP 的上升沿被锁存。
移位寄存器数据到锁存器建立时间 (
t_setup_STCP
):在 ST_CP 的上升沿到来之前,移位寄存器中的数据必须稳定。这意味着在发送最后一个 SH_CP 脉冲之后,需要等待一个很短的时间,确保数据在移位寄存器中稳定下来,然后才能触发 ST_CP。输出延迟 (
t_pd
):从 ST_CP 的上升沿到 Q0-Q7 输出稳定变化的时间。
4.3 复位时序 (MR)
MR (主复位):当 MR 为低电平并保持一段时间后,移位寄存器被清零。复位后,MR 需要回到高电平才能进行正常的移位操作。
4.4 输出使能时序 (OE)
OE (输出使能):从 OE 从高电平变为低电平到 Q0-Q7 输出有效,以及从 OE 从低电平变为高电平到 Q0-Q7 进入高阻态,都有一个小的延迟。
在实际应用中,由于微控制器的时钟速度通常远低于 74HC595 的最大操作频率,所以严格的时序要求通常不会成为瓶颈,但理解这些时序有助于调试和解决潜在的问题。
5. 级联应用
74HC595 的一个最强大的特性就是其级联能力。通过级联,你可以用极少的微控制器引脚控制任意数量的输出。实现级联的关键在于 Q'S 引脚。
5.1 级联原理
级联的原理是将前一个 74HC595 的 Q'S 引脚(串行数据输出)连接到下一个 74HC595 的 DS 引脚(串行数据输入)。所有的 74HC595 芯片共享相同的 SH_CP 和 ST_CP 引脚,以及 OE 和 MR 引脚(如果使用)。
当你发送数据时,首先发送用于最后一个 74HC595 的数据,然后是倒数第二个,以此类推。数据会像一个长串一样,从第一个芯片的 DS 输入,逐位经过所有级联的芯片,直到每个芯片的移位寄存器都被填满。
例如,如果你级联了两个 74HC595,你需要发送 16 位数据。首先发送的是第二个 74HC595 的最低位,然后是第一个 74HC595 的最低位。数据会先进入第一个芯片,然后通过 Q'S 传递到第二个芯片。
5.2 级联编程示例
假设你想控制 16 个 LED,使用两个 74HC595。你需要发送一个 16 位的数值。在编程时,你可以将两个 8 位字节拼接成一个 16 位整数,或者分别处理它们。
发送数据到级联 74HC595 的一般步骤:
拉低 ST_CP:准备开始数据传输。
循环发送数据:对于每个芯片的 8 位数据,从最高位(或最低位,取决于你的发送顺序)开始,将数据位发送到 DS 引脚。每次发送一个位后,拉高再拉低 SH_CP,将该位移入。
拉高 ST_CP:当所有数据位都发送完毕后(例如,16 位数据发送了 16 个 SH_CP 脉冲),拉高 ST_CP,将移位寄存器中的数据锁存到存储寄存器,从而更新所有 74HC595 的并行输出。
6. 典型应用
74HC595 在各种电子项目中都有广泛的应用:
LED 驱动:这是最常见的应用,通过 74HC595 可以轻松控制大量 LED,例如制作 LED 点阵、LED 跑马灯、LED 显示屏等。只需三个引脚就可以控制 8 个、16 个甚至更多的 LED。
数码管显示:用于驱动多位共阴或共阳数码管。通常,一位数码管需要 7 或 8 个引脚来显示数字和小数点,使用 74HC595 可以大大减少所需的微控制器引脚。
继电器驱动:通过 74HC595 的输出驱动继电器,可以控制各种高功率设备,如电机、灯具、泵等。
I/O 扩展:当微控制器可用引脚不足时,74HC595 可以作为通用的 I/O 扩展器,用于控制一些简单的数字输出设备。
矩阵键盘扫描:虽然 74HC595 主要用于输出,但结合其他组件,也可以用于复杂的输入/输出系统。
7. 74HC595 与微控制器连接
将 74HC595 与微控制器连接非常简单:
DS 连接到微控制器的某个数字输出引脚(例如 Arduino 的
DATA_PIN
)。SH_CP 连接到微控制器的另一个数字输出引脚(例如 Arduino 的
CLOCK_PIN
)。ST_CP 连接到微控制器的第三个数字输出引脚(例如 Arduino 的
LATCH_PIN
)。VCC 连接到微控制器的 5V(或 3.3V)电源输出。
GND 连接到微控制器的 GND。
OE 通常连接到 GND(始终使能输出),或者连接到微控制器的数字引脚以动态控制输出。
MR 通常连接到 VCC(不使用复位功能),或者连接到微控制器的数字引脚以在启动时复位。
Q0-Q7 连接到你想要控制的设备,例如 LED(通过限流电阻)。
8. 编程实践与代码结构
使用 74HC595 进行编程时,通常会封装一个函数来处理数据发送。以 Arduino 为例,可以使用 shiftOut()
函数,或者自己实现一个。
8.1 shiftOut()
函数
Arduino IDE 提供了一个方便的 shiftOut()
函数,它简化了串行数据的发送。其语法为:
shiftOut(dataPin, clockPin, bitOrder, val);
dataPin
: 连接 DS 的引脚。clockPin
: 连接 SH_CP 的引脚。bitOrder
: 发送位的顺序,可以是LSBFIRST
(最低位优先)或MSBFIRST
(最高位优先)。val
: 要发送的 8 位数据。
使用 shiftOut()
时,你需要自己控制 ST_CP 引脚。
// 示例:使用 shiftOut 控制单个 74HC595const int latchPin = 8;
// ST_CPconst int clockPin = 12;
// SH_CPconst int dataPin = 11;
// DSvoid setup() {
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}void loop() {
byte dataToSend = B10101010; // 要发送的8位数据
// 1. 拉低 ST_CP
digitalWrite(latchPin, LOW); // 2. 发送数据
shiftOut(dataPin, clockPin, LSBFIRST, dataToSend); // 或 MSBFIRST
// 3. 拉高 ST_CP (锁存数据)
digitalWrite(latchPin, HIGH);
delay(500); // 保持500毫秒
dataToSend = B01010101; // 改变数据
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, dataToSend);
digitalWrite(latchPin, HIGH);
delay(500);
}
8.2 自定义发送函数
为了更好地理解 74HC595 的工作原理,或者在特定场景下需要更精细的控制,可以自定义发送函数:
// 示例:自定义发送函数控制单个 74HC595const int latchPin = 8;
// ST_CPconst int clockPin = 12;
// SH_CPconst int dataPin = 11;
// DSvoid setup() {
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}// 自定义函数发送8位数据void sendData(byte data) {
digitalWrite(latchPin, LOW); // 拉低 ST_CP
for (int i = 0; i < 8; i++) { // 根据需要选择 MSBFIRST 或 LSBFIRST
// 这里使用 MSBFIRST (最高位优先)
if (data & 0x80) { // 判断最高位是否为1 (0x80 = 10000000b)
digitalWrite(dataPin, HIGH);
} else {
digitalWrite(dataPin, LOW);
}
data <<= 1; // 数据左移一位,准备下一位
digitalWrite(clockPin, HIGH); // SH_CP 上升沿
digitalWrite(clockPin, LOW); // SH_CP 下降沿 (数据稳定)
}
digitalWrite(latchPin, HIGH); // 拉高 ST_CP (锁存数据)}void loop() {
sendData(B10101010);
delay(500);
sendData(B01010101);
delay(500);
}
8.3 级联编程
对于级联应用,你可以将多个字节组合成一个更大的数据类型(例如 int
或 long
),然后循环发送。或者更清晰地,你可以创建一个字节数组,并从最后一个芯片的数据开始发送。
// 示例:控制两个级联 74HC595 (16个LED)const int latchPin = 8;const int clockPin = 12;const int
dataPin = 11;void setup() {
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}void sendTwoBytes(byte byte1, byte byte2) {
digitalWrite(latchPin, LOW); // 先发送第二个芯片的数据(因为它会先被推到第一个芯片的Q'S)
// 或者说,最远端芯片的数据先发送
shiftOut(dataPin, clockPin, MSBFIRST, byte2);
// 然后发送第一个芯片的数据
shiftOut(dataPin, clockPin, MSBFIRST, byte1);
digitalWrite(latchPin, HIGH);
}void loop() { // 第一个芯片的Q0-Q7亮,第二个芯片的Q0-Q7灭
sendTwoBytes(B11111111, B00000000);
delay(1000); // 第一个芯片的Q0-Q7灭,第二个芯片的Q0-Q7亮
sendTwoBytes(B00000000, B11111111);
delay(1000); // 所有LED交替亮灭
sendTwoBytes(B10101010, B01010101);
delay(1000);
}
9. 实际应用中的注意事项
在使用 74HC595 时,有一些重要的实际考虑因素可以确保电路的稳定性和可靠性:
电源去耦电容:在 VCC 和 GND 引脚之间放置一个 0.1uF 的陶瓷去耦电容。这个电容应尽可能靠近 74HC595 的 VCC 和 GND 引脚。它的作用是滤除电源线上的高频噪声,并为芯片提供瞬时电流,从而确保芯片在高速开关时的稳定性。
限流电阻:当 74HC595 的输出用于驱动 LED 时,每个 LED 都必须串联一个限流电阻。74HC595 的每个输出引脚能够提供的电流是有限的(通常为几毫安,具体查阅数据手册),如果直接驱动 LED 而没有限流电阻,可能会导致 LED 损坏,甚至损坏 74HC595 芯片。电阻的计算公式为 R=(V_CC−V_LED)/I_LED,其中 V_LED 是 LED 的正向压降,I_LED 是 LED 的工作电流。
最大输出电流:虽然 74HC595 可以驱动 8 个输出,但它有总输出电流限制(灌电流/拉电流)。这意味着所有输出引脚的总电流不能超过芯片的最大额定值。如果需要驱动大量高电流负载(例如多个继电器),可能需要额外的驱动电路(如 ULN2003 达林顿管阵列)。
引脚状态初始化:在微控制器程序启动时,最好明确地设置 74HC595 的所有控制引脚(DS, SH_CP, ST_CP)为已知状态(通常为低电平),并在需要时拉低 MR 引脚进行复位,确保移位寄存器处于一个确定的初始状态。
数据顺序:在级联多个 74HC595 时,理解数据发送的顺序至关重要。数据总是从最靠近微控制器的芯片的 DS 引脚进入,然后逐级向后传递。因此,当你发送一个 N 位的数据串时(N 是所有级联芯片的总位数),最先发送的位最终会到达最远的那个芯片的最低位。反之,最后发送的位会停留在第一个芯片的最低位。这在编程时需要特别注意,以确保数据能够正确地映射到预期的输出。
电平转换(如果需要):如果 74HC595 工作在 5V,而微控制器工作在 3.3V,或者反之,你可能需要进行电平转换以确保信号电平匹配。然而,许多 74HC595 版本(如 74HC595)可以兼容 3.3V 和 5V 的逻辑电平,具体兼容性应查阅其对应的数据手册。
热插拔:尽量避免在电路带电的情况下插拔 74HC595 芯片,这可能会导致瞬时电流冲击,损坏芯片。
长导线的影响:如果连接微控制器和 74HC595 的导线过长,可能会引入噪声或信号失真。在这种情况下,可以考虑在信号线上增加小电阻或使用更短的导线。
总结
74HC595 是一款功能强大、应用广泛的串行输入并行输出移位寄存器。通过理解其引脚功能、工作原理、时序和级联方法,可以有效利用它来扩展微控制器的输出能力,实现更复杂的电子项目。它简化了硬件连接,节省了宝贵的 I/O 资源,是电子爱好者和工程师工具箱中不可或缺的组件。熟练掌握 74HC595 的使用,将为你的项目带来极大的便利和灵活性。
责任编辑:David
【免责声明】
1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系拍明芯城(marketing@iczoom.com),本方将及时处理。
2、本文的引用仅供读者交流学习使用,不涉及商业目的。
3、本文内容仅代表作者观点,拍明芯城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。
4、如需转载本方拥有版权的文章,请联系拍明芯城(marketing@iczoom.com)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。
拍明芯城拥有对此声明的最终解释权。