74hc595应用电路图


74HC595移位寄存器应用电路详解
74HC595是一款非常常用的串行输入、并行输出的8位移位寄存器,它在需要扩展微控制器GPIO端口的应用中扮演着重要的角色。当微控制器的可用引脚数量有限,但需要控制大量的LED、数码管或其他并行设备时,74HC595能够有效地解决这个问题,极大地简化了硬件连接并节省了宝贵的微控制器引脚资源。通过串行数据传输,74HC595可以将3个微控制器引脚(数据、时钟、锁存)扩展为8个输出引脚,并且可以通过级联进一步扩展更多的输出。
74HC595引脚功能与工作原理
理解74HC595的工作原理是设计应用电路的基础。74HC595内部包含一个8位串行输入、并行输出的移位寄存器和一个8位并行输出的存储寄存器。
引脚功能:
Q0-Q7: 8位并行数据输出引脚。这些引脚直接连接到存储寄存器的输出,当存储寄存器的数据更新时,它们的状态也随之改变。它们是推挽输出,可以直接驱动LED等负载。
SER (Serial Data Input): 串行数据输入引脚。数据通过这个引脚一位一位地移入移位寄存器。每次时钟上升沿时,SER引脚上的数据位被移入移位寄存器的最低位(Q0),同时移位寄存器中的原有数据向高位移动一位。
SRCLK (Shift Register Clock): 移位寄存器时钟引脚。每个SRCLK的上升沿,SER上的数据被移入移位寄存器,并且移位寄存器中的所有位向高位(Q7方向)移动一位。这是串行数据传输的关键时钟信号。
RCLK (Register Clock / Latch Clock): 存储寄存器时钟/锁存时钟引脚。当RCLK的上升沿到来时,移位寄存器中的8位数据会被并行地传输到存储寄存器中,并立刻反映在Q0-Q7输出引脚上。这个操作允许在移位寄存器中准备好所有数据后再一次性更新输出,避免了数据在移位过程中对输出产生闪烁或不稳定的现象。
SRCLR (Shift Register Clear): 移位寄存器清零引脚。这是一个低电平有效的异步清零输入。当SRCLR引脚为低电平时,移位寄存器中的所有数据位(Q0-Q7)都会被强制清零为0。在初始化或需要清除输出状态时非常有用。通常情况下,如果不需要清零功能,应将其连接到VCC。
OE (Output Enable): 输出使能引脚。这是一个低电平有效的输出控制引脚。当OE引脚为高电平时,Q0-Q7输出引脚处于高阻态(三态),即不输出高电平也不输出低电平,相当于断开了连接。当OE引脚为低电平时,Q0-Q7输出引脚正常工作,输出存储寄存器中的数据。这个引脚在多片74HC595共用数据线或需要分时复用输出时非常有用。通常情况下,如果需要持续输出,应将其连接到GND。
Q'S (Serial Data Output / Q7 Prime): 串行数据输出引脚。这个引脚输出的是移位寄存器中的最高位数据(Q7)。它允许将多个74HC595级联,将一个74HC595的Q'S连接到下一个74HC595的SER引脚,从而实现更长的串行数据链和更多的并行输出。
VCC: 电源正极。通常连接到3.3V或5V直流电源。
GND: 电源地。
工作原理概述:
数据移入 (Shift Data): 微控制器通过SER引脚发送一位数据,并产生一个SRCLK的上升沿。74HC595会将SER上的数据移入其内部的8位移位寄存器。这个过程重复8次,直到8位数据全部移入。
数据锁存 (Latch Data): 当8位数据全部移入移位寄存器后,微控制器产生一个RCLK的上升沿。此时,移位寄存器中的数据会被并行地传输到存储寄存器中。
数据输出 (Output Data): 存储寄存器中的数据立刻通过Q0-Q7引脚输出,控制外部设备的状态。如果OE引脚为低电平,则输出有效;如果OE引脚为高电平,则输出高阻态。
这个分两步的操作(移位和锁存)是74HC595的关键特性。它确保了在所有数据都准备好之前,输出引脚不会发生变化,从而避免了输出端的“闪烁”或不一致状态。
典型应用电路图
以下是74HC595的几种典型应用电路图,涵盖了从最基本的单片驱动到多片级联扩展的应用场景。
1. 单个74HC595驱动8个LED
这是74HC595最基础也是最常见的应用。通过一个74HC595,我们可以用3个微控制器引脚来控制8个LED。
电路图描述:
电源连接:
74HC595的VCC引脚连接到微控制器的5V或3.3V电源输出。
74HC595的GND引脚连接到微控制器的地线。
控制引脚连接(与微控制器连接):
SER (Pin 14) 连接到微控制器的一个通用I/O引脚(例如:GPIO_DATA)。这是串行数据输入端。
SRCLK (Pin 11) 连接到微控制器的另一个通用I/O引脚(例如:GPIO_SRCLK)。这是移位寄存器的时钟输入。
RCLK (Pin 12) 连接到微控制器的第三个通用I/O引脚(例如:GPIO_RCLK)。这是存储寄存器的锁存时钟输入。
功能引脚连接:
SRCLR (Pin 10):通常连接到VCC(高电平),使其保持非清零状态。如果需要异步清零功能,可以连接到微控制器的另一个GPIO引脚。
OE (Pin 13):通常连接到GND(低电平),使能输出。如果需要控制输出的使能/禁用,可以连接到微控制器的另一个GPIO引脚。
输出连接 (Q0-Q7):
Q0-Q7 (Pin 15, Pin 1-7) 分别连接到8个LED的阳极。
每个LED的阴极通过一个合适的限流电阻(通常为220Ω-1KΩ,具体值取决于LED的正向电压和期望电流)连接到GND。限流电阻是必不可少的,用于保护LED和74HC595,防止过流损坏。
工作流程:
微控制器准备一个8位的数据(例如:
0b10101010
)。循环8次:
取出当前位的最高位数据(例如,先是1)。
将该数据通过SER引脚发送给74HC595。
给SRCLK引脚一个上升沿(先拉低再拉高)。这会将数据位移入74HC595的移位寄存器。
当所有8位数据都移入移位寄存器后,给RCLK引脚一个上升沿。这会将移位寄存器中的数据锁存到存储寄存器,并立即反映在Q0-Q7输出引脚上,从而控制LED的亮灭。
2. 多个74HC595级联驱动更多LED
当需要控制超过8个输出设备时,74HC595的级联功能变得非常有用。通过连接一片74HC595的Q'S引脚到下一片74HC595的SER引脚,可以轻松地扩展输出。
电路图描述:
假设我们级联两片74HC595来驱动16个LED。
公共连接:
所有74HC595的VCC和GND引脚都连接到相应的电源和地。
所有74HC595的SRCLK、RCLK、SRCLR和OE引脚都可以并联连接到微控制器的相应引脚。这意味着所有的74HC595共享同一个时钟、锁存、清零和输出使能信号。
串行数据链连接:
第一片74HC595 (U1) 的SER引脚连接到微控制器的GPIO_DATA。
第一片74HC595 (U1) 的Q'S (Pin 9) 引脚连接到第二片74HC595 (U2) 的SER引脚。
如果还有第三片,第二片(U2)的Q'S连接到第三片(U3)的SER,以此类推。
输出连接:
U1的Q0-Q7连接到前8个LED及其限流电阻。
U2的Q0-Q7连接到后8个LED及其限流电阻。
工作流程:
微控制器需要发送16位数据(例如:两个8位字节)。
发送数据时,应从最末端的74HC595(距离微控制器最远的那一片)所需的数据开始发送。例如,如果要控制U1和U2,需要先发送U2的数据,然后发送U1的数据。这是因为数据是“推”入移位寄存器的,最早进入的数据会最终出现在距离SER最远的那一片的Q7端。
对于16位数据,微控制器将循环16次:
取出当前位的最高位数据。
将该数据通过SER引脚发送给第一片74HC595 (U1)。
给所有74HC595的SRCLK引脚一个上升沿。
当所有16位数据都移入各自的移位寄存器后(U1和U2的移位寄存器都被填充),给所有74HC595的RCLK引脚一个上升沿。这会将各自移位寄存器中的数据并行地锁存到存储寄存器,同时更新Q0-Q7输出引脚。
3. 驱动七段数码管
74HC595非常适合驱动七段数码管,无论是共阳极还是共阴极。这里以共阴极数码管为例。
电路图描述(共阴极):
电源与控制连接: 同上述LED驱动电路。
输出连接:
74HC595的Q0-Q6引脚分别连接到七段数码管的a-g段。
74HC595的Q7引脚可以连接到小数点(DP)段。
每个段线(a-g, dp)都需要串联一个限流电阻(例如220Ω-1KΩ),然后连接到数码管的相应段。
数码管的公共阴极连接到GND。
工作流程:
微控制器根据需要显示的数字或字符,准备相应的8位段码数据。例如,显示数字“1”,则对应段码可能为
0b00000110
(假设gfedcba顺序)。按照驱动8个LED的方式,将8位段码数据串行移入74HC595的移位寄存器。
锁存数据,使数码管显示相应的数字。
对于多位七段数码管,可以采用以下两种方式:
多片74HC595级联: 每位七段数码管使用一片74HC595驱动,所有74HC595级联起来,实现多位并行显示。这种方式连接简单,但需要较多的74HC595芯片。
74HC595配合PNP/NPN晶体管进行动态扫描: 一片74HC595驱动所有数码管的段线(a-g, dp),然后用微控制器的其他GPIO引脚结合PNP或NPN晶体管来控制每位共阴/共阳极的通断。通过快速地轮流点亮每一位数码管,利用人眼的视觉暂留效应,实现多位同时显示的效果。这种方式节省了74HC595芯片的数量,但需要更复杂的软件控制和额外的晶体管。
4. 驱动继电器/高功率负载
74HC595的输出电流能力有限(最大输出电流通常为±35mA)。直接驱动继电器或需要更大电流的负载可能会损坏芯片。在这种情况下,需要使用外部驱动电路,例如晶体管或达林顿管阵列。
电路图描述:
电源与控制连接: 同上述LED驱动电路。
输出连接(以驱动NPN晶体管为例):
74HC595的Q0-Q7引脚分别连接到NPN晶体管(例如2N2222、BC547)的基极,每个基极前串联一个限流电阻(通常为1KΩ-10KΩ)。
晶体管的发射极连接到GND。
晶体管的集电极连接到继电器的线圈一端。
继电器的另一端线圈连接到外部电源(通常为12V或5V,取决于继电器类型)。
在继电器线圈两端并联一个续流二极管(例如1N4007),方向与电流方向相反,用于释放继电器线圈断电时产生的反向电动势,保护晶体管。
工作流程:
微控制器发送8位数据给74HC595,控制相应输出引脚的高低电平。
当74HC595的某个Qx引脚输出高电平,相应的NPN晶体管导通。
晶体管导通后,电流流过继电器线圈,继电器吸合,其触点闭合,从而控制高功率负载的通断。
74HC595编程与软件控制
虽然上述电路图说明了硬件连接,但74HC595的真正力量在于其软件控制。以下是一个使用Arduino(基于C++)控制74HC595驱动8个LED的示例代码。
C++
// 定义连接74HC595的Arduino引脚const int LATCH_PIN = 8;
// RCLK (ST_CP) - 存储寄存器时钟引脚const int CLOCK_PIN = 9;
// SRCLK (SH_CP) - 移位寄存器时钟引脚const int DATA_PIN = 10;
// SER (DS) - 串行数据输入引脚void setup() {
// 设置引脚为输出模式
pinMode(LATCH_PIN, OUTPUT);
pinMode(CLOCK_PIN, OUTPUT);
pinMode(DATA_PIN, OUTPUT); // 初始化74HC595的输出为全灭
digitalWrite(LATCH_PIN, LOW); // 拉低锁存引脚,准备接收数据
shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, 0x00); // 写入0x00,所有LED熄灭
digitalWrite(LATCH_PIN, HIGH); // 拉高锁存引脚,更新输出}void loop() { // 逐个点亮LED
for (byte i = 0; i < 8; i++) {
byte dataToSend = 0x01 << i; // 生成从Q0到Q7依次点亮的模式
updateShiftRegister(dataToSend);
delay(200); // 延时200毫秒
} // 逐个熄灭LED
for (byte i = 0; i < 8; i++) {
byte dataToSend = ~(0x01 << i); // 生成从Q0到Q7依次熄灭的模式
updateShiftRegister(dataToSend);
delay(200);
} // 交替点亮LED
updateShiftRegister(0xAA); // 10101010
delay(500);
updateShiftRegister(0x55); // 01010101
delay(500); // 全亮
updateShiftRegister(0xFF);
delay(1000); // 全灭
updateShiftRegister(0x00);
delay(1000);
}// 自定义函数,用于将数据写入74HC595void updateShiftRegister(byte data) {
// 1. 拉低锁存引脚,准备移位数据
digitalWrite(LATCH_PIN, LOW); // 2. 通过循环将8位数据一位一位地移入74HC595
// MSBFIRST表示从最高位开始发送数据,LSBFIRST表示从最低位开始发送
// Arduino的shiftOut函数已经封装了SRCLK的上升沿操作
shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, data);
// 3. 拉高锁存引脚,使数据从移位寄存器传输到存储寄存器并更新输出
digitalWrite(LATCH_PIN, HIGH);
}
代码解释:
LATCH_PIN
,CLOCK_PIN
,DATA_PIN
: 定义了连接74HC595的Arduino引脚。setup()
: 初始化Arduino引脚为输出模式,并在程序启动时将所有LED熄灭。loop()
: 包含了演示如何控制LED亮灭的几种模式(逐个点亮、逐个熄灭、交替亮灭、全亮、全灭)。updateShiftRegister(byte data)
: 这是核心函数,负责将一个字节的数据发送到74HC595。DATA_PIN
:数据引脚。CLOCK_PIN
:时钟引脚。MSBFIRST
:指定数据发送顺序,MSBFIRST
表示从最高有效位(Most Significant Bit)开始发送,LSBFIRST
表示从最低有效位(Least Significant Bit)开始发送。74HC595通常推荐使用MSBFIRST
,因为这样发送的第一个位会最终出现在Q7,最后一个位会出现在Q0。data
:要发送的8位数据。shiftOut
函数会自动处理每次发送一位数据时,拉高和拉低时钟引脚的操作,模拟SRCLK的上升沿。digitalWrite(LATCH_PIN, LOW);
:在开始发送数据之前,将锁存引脚拉低,确保数据只进入移位寄存器,不会立即更新输出。shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, data);
:这是Arduino库中提供的函数,用于串行发送数据。digitalWrite(LATCH_PIN, HIGH);
:当所有8位数据都通过shiftOut
函数移入74HC595的移位寄存器后,将锁存引脚拉高,触发数据从移位寄存器传输到存储寄存器,并更新Q0-Q7的输出。
级联控制的编程思路:
当级联多片74HC595时,编程的关键在于发送数据时的顺序。你需要发送总位数的数据,并且要确保数据发送的顺序是正确的。对于N片级联的74HC595,你需要发送N * 8位数据。在发送时,应先发送最末端74HC595所需的数据(即距离微控制器最远的那片),然后依次向前发送。
例如,两片级联:需要发送16位数据。首先发送给第二片74HC595的8位数据,然后发送给第一片74HC595的8位数据。
// 假设有两片74HC595级联void updateTwoShiftRegisters(byte data2, byte data1) {
digitalWrite(LATCH_PIN, LOW);
shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, data2); // 先发送给第二片的数据
shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, data1); // 再发送给第一片的数据
digitalWrite(LATCH_PIN, HIGH);
}
74HC595应用中的注意事项
在使用74HC595进行电路设计和编程时,需要考虑以下几点以确保电路的稳定性和可靠性:
电源去耦: 在74HC595的VCC和GND引脚之间靠近芯片的位置并联一个0.1μF(104)的陶瓷电容。这个去耦电容可以滤除电源噪声,提供稳定的电源,尤其是在高速开关或驱动感性负载时,防止芯片内部电路受到瞬态电压波动的影响。
限流电阻: 在驱动LED或其他需要电流限制的设备时,务必串联限流电阻。74HC595的每个输出引脚能够提供或吸收的电流是有限的,如果直接连接LED而不加电阻,会导致LED过流损坏或74HC595的输出引脚烧毁。
引脚状态初始化: 在程序开始时,确保所有控制引脚(LATCH_PIN, CLOCK_PIN, DATA_PIN)都被正确初始化,并将74HC595的输出设置为已知状态(例如,所有LED熄灭)。这可以避免在启动时出现随机的输出状态。
SRCLR和OE引脚:
SRCLR (Pin 10): 如果不需要清零功能,应将其连接到VCC。如果需要,可以连接到微控制器的GPIO引脚,并在需要清零时拉低该引脚。
OE (Pin 13): 如果需要持续输出,应将其连接到GND。如果需要控制输出的启用/禁用(例如,在扫描显示或多路复用应用中),可以连接到微控制器的GPIO引脚,并在需要禁用输出时拉高该引脚。
数据顺序: 当级联多片74HC595时,数据发送的顺序至关重要。始终从“最远”的74HC595(即,串行数据链的末端)开始发送数据,因为数据会“推”过所有的寄存器。例如,如果U1和U2级联(U1的Q'S连接到U2的SER),你需要先发送U2的数据,再发送U1的数据。
时序要求: 74HC595有其特定的时序要求,包括时钟脉冲宽度、数据建立时间、数据保持时间等。虽然在大多数微控制器应用中,直接使用
digitalWrite
和delayMicroseconds
来控制时序已经足够,但对于高速或更复杂的设计,需要查阅数据手册确保满足所有时序要求。Arduino的shiftOut
函数通常已经考虑了这些时序,使用起来比较方便。电源电压: 确保为74HC595提供其工作电压范围内的电源(通常为2V-6V)。HC系列是CMOS器件,对电源电压波动有一定的容忍度,但超出范围可能会导致功能异常或损坏。
共地: 微控制器和74HC595必须共用一个地线,以确保正确的信号参考电平。
上拉/下拉电阻: 通常情况下,74HC595的输入引脚不需要额外的上拉/下拉电阻,因为微控制器的GPIO可以提供足够稳定的高低电平。但在某些特殊情况下,例如为了确保在微控制器未初始化时引脚处于已知状态,可以考虑在SER、SRCLK、RCLK上添加下拉电阻,SRCLR和OE上添加上拉电阻。
74HC595的扩展应用
74HC595不仅仅局限于驱动LED或数码管,其串行输入并行输出的特性使其在许多领域都有广泛的应用:
LED点阵显示屏: 通过多片74HC595级联,结合行扫描和列驱动,可以构建大型LED点阵显示屏,显示文字、图案甚至简单的动画。
LED立方体: 类似于点阵屏,74HC595可以用于驱动LED立方体的每一层或每一列LED。
多路开关控制: 控制一组继电器、固态继电器或其他开关器件,实现多路电源通断、信号切换等功能。
移位寄存器链: 作为更复杂数字电路的一部分,用于构建数据通道、数据缓冲器或自定义逻辑功能。
扩展数字输出: 当微控制器IO口不足时,74HC595是最经济有效的扩展数字输出的方案之一。例如,控制多个步进电机驱动器、多个七段解码器等。
并行数据采集(逆向应用): 虽然74HC595是串入并出,但有些类似功能的芯片(如74HC165,并入串出)可以与74HC595配合使用,实现串行扩展输入和输出。
矩阵键盘扫描: 虽然主要用于输出,但在某些巧妙的设计中,74HC595也可以与输入扩展芯片(如74HC165)结合,用于矩阵键盘的行扫描和列读取。
总结
74HC595是一款功能强大、应用广泛的串行输入、并行输出移位寄存器。它通过简单有效的串行通信协议,极大地解决了微控制器I/O引脚不足的问题。理解其引脚功能、工作原理以及正确的应用电路设计是成功使用它的关键。无论是简单的LED控制,还是复杂的显示系统和多路控制,74HC595都能提供一种经济高效的解决方案。通过本文的详细介绍和代码示例,希望您能够充分掌握74HC595的应用,并将其灵活运用到您的电子项目中。
责任编辑:David
【免责声明】
1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系拍明芯城(marketing@iczoom.com),本方将及时处理。
2、本文的引用仅供读者交流学习使用,不涉及商业目的。
3、本文内容仅代表作者观点,拍明芯城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。
4、如需转载本方拥有版权的文章,请联系拍明芯城(marketing@iczoom.com)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。
拍明芯城拥有对此声明的最终解释权。