108个传感器之-移位寄存器 74HC595(50)

108个传感器之-移位寄存器 74HC595(50)

介绍

关于Arduino的好处之一是,它具有相当多的I/O口。您可以连接一些按钮,传感器,伺服器等,但是随着设备的增加,有可能很快就会用完引脚。

解决方案之一就是本文介绍的–移位寄存器,该寄存器使我们可以在Arduino(或任何微控制器)中添加更多的I/O引脚。到目前为止,最广泛使用的移位寄存器是74HC595,也称为“595”。

74HC595只用仅三个输入引脚控制八个不同的输出引脚。如果需要超过8个I/O引脚,则可以根据需要尽可能多的链来生成大量的I/O引脚。

74HC595

工作原理

74HC595具有两个8位寄存器(可以将其视为“内存容器”)。第一个称为移位寄存器,第二个称为存储/闩锁寄存器。

每次74HC595收到时钟脉冲时,都会发生两件事:

  • 移位寄存器中包含的位通过一个位置向左移动。位0的值将其推入位1,而位1的值则将其推入位2,依此类推。
  • 移位寄存器中的位0接受数据引脚上的当前值。在时钟脉冲的上升边缘上,如果数据引脚高,则将1推入移位寄存器,否则为0。

只要74HC595被计时,这个过程就会继续。

启用闩锁引脚后,将移位寄存器的内容复制到存储/闩锁寄存器。存储寄存器的每个位均链接到IC的输出引脚之一QA-QH。结果,每当存储寄存器中的值更改时,输出就会更改。

下面的动画将帮助你更好地理解它。

74HC595 Shift Register Working

Sipo vs Piso Shift寄存器

有两种类型的移位寄存器:SIPO(并行序列)和PISO(并行在串行中)。

SIPO可用于控制大量输出,例如LED。尽管PISO可用于收集大量输入,例如按钮,类似于上面讨论的原始 arduino 控制器。

最受欢迎的SIPO芯片是74HC595,最受欢迎的PISO芯片是74HC165。

引脚连接

SER(串行输入)引脚用于一次向移位寄存器发送一位数据。

SRCLK(移位寄存器时钟)是移位寄存器的时钟,由正沿触发。这意味着这些比特在时钟的上升沿被推入。

RCLK(寄存器时钟/锁存)是一个非常重要的引脚。当该引脚被拉高时,移位寄存器的内容被复制到存储/锁存寄存器中,最终出现在输出端。因此,锁存引脚可以看作是我们在输出端看到结果之前的最后一步。

SRCLR(移位寄存器清除)引脚允许我们重置整个移位寄存器,将所有位设置为零。因为这是一个活动低引脚,我们必须将SRCLR引脚拉低以执行重置。

OE(输出启用)也是一个低电平引脚:当拉高时,输出引脚被禁用(设置为高阻抗状态)。当它被拉低时,输出引脚正常工作。

QA–QH(输出启用)是输出引脚。

QH: 引脚输出移位寄存器的第7位。这允许您对74HC595进行链连接。如果将此引脚连接到另一个74HC595的SER引脚,并向两个IC提供相同的时钟信号,它们的行为就像一个具有16个输出的单个IC。当然,使用这种技术,您可以菊花链连接任意数量的IC。

将引脚16(VCC)和10(SRCLR)连接到Arduino的5V输出,引脚8(GND)和13(OE)连接到地。这应该使IC保持在正常工作模式。

接下来,连接将用于控制移位寄存器的三个引脚。将移位寄存器的引脚11(SRCLK)、引脚12(RCLK)和引脚14(SER)分别连接到Arduino的引脚6、5和4。

剩下的就是将LED连接到输出引脚。将每个LED的阴极(短引脚)连接到公共接地,将每个LED(长引脚)的阳极连接到其各自的移位寄存器输出引脚。

不要忘记串联一个220Ω的电阻器,以保护LED免受过载。

连接LED时,确保QA连接到第一个LED,QH连接到最后一个LED;否则,LED将不会以正确的顺序亮起!

下图显示了如何将所有内容连接起来。

Arduino Wiring Fritzing Connections with 74HC595 Shift Register

arduino 74HC595
GND 8(GND)、13(OE)
5 V 16(vcc)、10(SRCLR)
pin 2 14(SER)
Pin 3 12(RCLK)
pin 4 11(SRCLK)

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <Arduino.h>

int latchPin = A4; // Latch pin of 74HC595 is connected to Digital pin 5
int clockPin = A3; // Clock pin of 74HC595 is connected to Digital pin 6
int dataPin = A2; // Data pin of 74HC595 is connected to Digital pin 4

byte leds = 0; // Variable to hold the pattern of which LEDs are currently turned on or off

void setup()
{
// Set all the pins of 74HC595 as OUTPUT
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
}

void loop()
{
leds = 0; // Initially turns all the LEDs off, by giving the variable 'leds' the value 0
updateShiftRegister();
delay(500);
for (int i = 0; i < 8; i++) // Turn all the LEDs ON one by one.
{
bitSet(leds, i); // Set the bit that controls that LED in the variable 'leds'
updateShiftRegister();
delay(500);
}
}

void updateShiftRegister()
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, leds);
digitalWrite(latchPin, HIGH);
}

实验结果

使用PWM控制亮度

引脚连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <Arduino.h>
int latchPin = A5; // Latch pin of 74HC595 is connected to Digital pin 5
int clockPin = 6; // Clock pin of 74HC595 is connected to Digital pin 6
int dataPin = A4; // Data pin of 74HC595 is connected to Digital pin 4
int outputEnablePin = A3; // OE pin of 74HC595 is connected to PWM pin 3

byte leds = 0; // Variable to hold the pattern of which LEDs are currently turned on or off

void setup()
{
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(outputEnablePin, OUTPUT);
}

void loop()
{
setBrightness(255);
leds = 0; // Initially turns all the LEDs off, by giving the variable 'leds' the value 0
updateShiftRegister();
delay(500);
for (int i = 0; i < 8; i++) // Turn all the LEDs ON one by one.
{
bitSet(leds, i); // Set the bit that controls that LED in the variable 'leds'
updateShiftRegister();
delay(500);
}
for (byte b = 255; b > 0; b--) // Gradually fade all the LEDs back to off
{
setBrightness(b);
delay(50);
}
}

void updateShiftRegister()
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, leds);
digitalWrite(latchPin, HIGH);
}

void setBrightness(byte brightness) // 0 to 255
{
analogWrite(outputEnablePin, 255-brightness);
}

小结

待完善…

108个传感器之-移位寄存器 74HC595(50)

http://blog.jzxer.cn/20250122/20250122-74HC595/

作者

dev

发布于

2025-01-22

更新于

2025-01-08

许可协议

评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×