用移位寄存器来扩展 8位移位寄存器( 二 )


级联移位寄存器移位寄存器是根据它们处理的位数来分类的 。上图所示的是4位寄存器,而我们今天要用的两个移位寄存器都是8位器件 。
如果需要增加一个移位寄存器可以处理的并行数据量,可以用另一个移位寄存器级联 。所以两个8位移位寄存器可以支持16位 , 加上一个支持24位,以此类推 。
你不需要连接到微控制器来级联移位寄存器,所以这是一个不使用大量端口来驱动大量led或读取大量开关的好方法 。
74HC575和74HC165移位寄存器今天,我们将使用两个非常常见和容易获得的移位寄存器,即74HC595 SIPO和74HC165 PISO 。让我们仔细看看这些芯片 。
7HC595-8位串行输入-并行输出74HC575是一个8级串行移位寄存器 , 也有一个内部存储寄存器 。存储寄存器缓冲输出数据,可以独立于移位寄存器计时 。这可以防止数据在加载过程中发生变化 。
74HC595有一个“三态”输出 。这意味着并行数据输出端的引脚可以处于三种不同状态 。
低的
高的
关闭
OFF状态为高阻态,有效断开芯片的输出 。这种技术允许多个三态芯片驱动同一总线 , 并且在任何给定时间只有其中一个是活动的 。
DIP封装的74HC575引脚排列如下:
串行数据通过DS引脚(引脚14)输入 。可以使用Q7’引脚级联这些器件,以增加可以控制的并行输出数量 。
输出使能(引脚13)控制三态总线 , 如果为低电平,则输出总线使能 。
7hc 165–8位并行输入–串行输出74HC165是一个带串行输出的8位并行加载移位寄存器 。它具有互补输出,其中一个可以连接到另一个74HC165以级联它们 。
该器件用于并行到串行数据转换 , 引脚排列如下:
和74HC595一样,这是一个非常常见的集成电路,你几乎可以从任何电子供应商那里得到 。
74HC595的附加输出端口我们将从74HC595 SIPO(串行输入-并行输出)移位寄存器开始实验 。
74HC595允许我们扩展Arduino上的数字I/O端口的数量 。在这些实验中,我们将使用它来驱动一些led,我们将使用Arduino来控制这些led 。
Arduino & 74HC595连接以下是我们如何将74HC595连接到Arduino和八个led 。
请注意,电源两端都加了一个去耦电容,在使用74HC595等TTL芯片时是个不错的主意 。我用的是100uf的电容,但是10uf以上的任何值都可以正常工作 。确保观察电容器的极性 。
在我的试验板上,我用一个82220欧姆的电阻阵列取代了8个降压电阻 。当您需要大量相同的电阻时 , 这是一个方便的元件 。当然,如果没有阵列,可以使用分立电阻 。
这里有许多电线,所以请仔细检查你的布线 。可以先连接LED降压电阻组合,然后对电阻施加5伏电压 。如果接线正确 , 您将点亮LED 。对所有八个电阻-LED对重复测试 。在连接74HC595和Arduino之前,请执行此操作 。
一旦所有这些都连接起来 , 您就可以继续编写一些代码来使其工作 。
ardnoshiftout()函数使用Arduino与移位寄存器“对话”有几种方式 。一种方法是使用SPI总线,它允许您利用现有的库来简化代码编写 。
另一种方法是使用Arduino上的任何标准I/O引脚来设置定时器和交换串行数据 。这是我们将用来处理74HC595移位寄存器的方法 。
Arduino提供了一个shiftOut()函数来简化串行连接上的数据移动 。它可以获得一个字节值 , 并以串行格式输出 , 与另一个引脚上的时钟脉冲同步 。您可以选择两个方向来输出数据 。
MSB优先–最高位优先 。所以二进制数10110010会从“101”开始,或者从左到右一次输出一位 。
LSB优先–最低有效位优先 。在这种情况下 , 二进制数10110010将从“010”开始,或者从右到左一次输出一位 。
我们将在代码中使用这个函数 。
Arduino和74HC595代码我们的代码非常简单 。这个移出函数可以将我们的数据发送到移位寄存器和设置定时器信号 。
/* 74hc 595 shift register demulation 174 HC 595-demo . inocountinbinarianddisplayon 8 LEDs modified from " hello world " example by carlynmaw、TomIgoeandDavidA 。mellisdronebotworkshop 2020 https://dronebotworkshop . com *///define connections to 74hc 595//ST _ CP pin 12 constintlatchpin = 10;//SH _ CP pin 11 constintclockpin = 11;//ds pin 14 constintdatapin = 12;void setup(){//setuppinsautputspinmode(latch pin,OUTPUT);pinMode(clockPin,输出);pinMode(数据引脚 , 输出);} void loop(){//count from 0 to 255 anddisplayinbinary for(intnumberToDisplay = 0;NumberToDisplay我们首先给连接到74HC595的管脚分配变量名 。然后将所有这些引脚设为输出 。然后我们进入循环 。

推荐阅读