0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用移位寄存器

454398 来源:网络整理 作者:网络整理 2019-12-02 16:54 次阅读

今天,我将尝试教您一些有关移位寄存器的知识。这些是Arduino编程中相当重要的部分,基本上是因为它们扩展了您可以使用的输出数量,以换取3个控制引脚。您还可以将菊花链移位寄存器在一起以获取更多的输出。

这与以前的教程相比有很大的困难,我强烈建议您对以前的材料有个很好的了解。 (本文末尾的链接),以及了解我上次编写的二进制的基本知识。

什么是移位寄存器?

技术上是输出移位寄存器换句话说,串行接收数据并并行输出。实际上,这意味着我们可以快速向芯片发送一堆输出命令,告诉它激活,然后将输出发送到相关的引脚。无需遍历每个引脚,我们只需一次将所需的输出作为单个字节或更多信息发送到所有引脚。

如果可以帮助您理解,您可以考虑一下移位寄存器作为数字输出的“数组”,但是我们可以跳过常规的digitalWrite命令,而只需发送一系列位以将其打开或关闭即可。

它如何工作?

我们将使用的移位寄存器-Oomlout入门套件中包含的74HC595N-仅需要3个控制引脚。第一个是时钟-您无需担心太多,因为Arduino串行库对其进行了控制-但时钟基本上只是一个开/关电脉冲,用于设置数据信号的速度。

锁存器引脚用于告知移位寄存器何时应根据我们刚发送的位打开或关闭输出,即将它们锁存到位。

最后,数据引脚位于此处我们用位发送了实际的串行数据,以确定移位寄存器输出的开/关状态。

整个过程可以用4个步骤来描述:

设置移位寄存器上第一个输出引脚的数据引脚为高电平或低电平。

脉冲时钟以将数据“移位”到寄存器。

继续设置数据并向脉冲输出脉冲。时钟,直到为所有输出引脚设置了所需的状态为止。

对闩锁引脚进行脉冲以激活输出序列。

实现

您需要此产品的以下组件oject:

7HC595N移位寄存器芯片

8个LED和适当的电阻,或者您想要输出到任何东西的

通常的面包板,连接器和基本的Arduino

如果您有Oomlout入门套件,则可以从此处下载面包板布局。

以下是汇编视频

电路板布局:

如何使用移位寄存器

和我的组装版本:

I已修改了Ooolmout提供的原始代码,但如果您想尝试使用该代码,则可以在此处完整下载。包括了代码的说明,因此,请从下面复制或粘贴整个内容,或使用pastebin读取代码的说明。

/* ---------------------------------------------------------

* | Shift Register Tutorial, based on |

* | Arduino Experimentation Kit CIRC-05 |

* | 。: 8 More LEDs :。 (74HC595 Shift Register) |

* ---------------------------------------------------------

* | Modified by James @ MakeUseOf.com |

* ---------------------------------------------------------

*/

//Pin Definitions

// 7HC595N has three pins

int data = 2; // where we send the bits to control outputs

int clock = 3; // keeps the data in sync

int latch = 4; // tells the shift register when to activate the output sequence

void setup()

{

// set the three control pins to output

pinMode(data, OUTPUT);

pinMode(clock, OUTPUT);

pinMode(latch, OUTPUT);

Serial.begin(9600); // so we can send debug messages to serial monitor

}

void loop(){

outputBytes(); // our basic output which writes 8-bits to show how a shift register works.

//outputIntegers(); // sends an integer value as data instead of bytes, effectively counting in binary.

}

void outputIntegers(){

for (int i=0;i《256;i++){

digitalWrite(latch, LOW);

Serial.println(i); // Debug, sending output to the serial monitor

shiftOut(data, clock, MSBFIRST, i);

digitalWrite(latch, HIGH);

delay(100);

}

}

void outputBytes(){

/* Bytes, or 8-bits, are represented by a B followed by 8 0 or 1s.

In this instance, consider this to be like an array that we‘ll use to control

the 8 LEDs. Here I’ve started the byte value as 00000001

*/

byte dataValues = B00000001; // change this to adjust the starting pattern

/* In the for loop, we begin by pulling the latch low,

using the shiftOut Arduino function to talk to the shift register,

sending it our byte of dataValues representing the state of the LEDs

then pull the latch high to lock those into place.

Finally, we shift the bits one place to the left, meaning the next iteration

will turn on the next LED in the series.

To see the exact binary value being sent, check the serial monitor.

*/

for (int i=0;i《8;i++){

digitalWrite(latch, LOW);

Serial.println(dataValues, BIN); // Debug, sending output to the serial monitor

shiftOut(data, clock, MSBFIRST, dataValues);

digitalWrite(latch, HIGH);

dataValues = dataValues 《《 1; // Shift the bits one place to the left - change to 》》 to adjust direction

delay(100);

}

}

位移位(OutputBytes函数)

在第一个循环示例– outputBytes()–代码使用8位序列(一个字节),然后在for循环的每次迭代中向左移。重要的是要注意,如果您进行的移位超出了可能,则只会丢失该位。

使用《《或》》加上要移位的位数来完成移位。/p》

查看以下示例,并确保您了解发生了什么:

byte val = B00011010

val = val 《《 3 // B11010000

val = val 《《 2 // B01000000, we lost those other bits!

val = val 》》 5 // B00000010

发送整数而不是(OutputIntegers函数)

数字到移位寄存器而不是字节,它将简单地将数字转换为二进制字节序列。在此函数中(取消注释并上载以查看效果),我们有一个for循环,其计数范围是0-255(可以用一个字节表示的最大整数),然后发送该循环。它基本上是二进制的,因此除非您的LED排成一排,否则该序列似乎有点随机。

例如,如果您阅读二进制的说明文章,就会知道数字44将表示为00101100,因此LED 3、5、6将在序列中的该点点亮。

菊花链超过一个移位寄存器

移位寄存器的显着之处在于,如果它们获得的信息多于8位(或者其注册表很大),它们将再次移出其他位。这意味着您可以将它们中的一系列连接在一起,推入一个较长的位链,然后将其分别分配到每个寄存器,而无需您进行额外的编码。

尽管我们不会在这里详细说明过程或原理图,如果您有多个移位寄存器,则可以从此处的Arduino官方网站尝试该项目。

该系列中的其他文章:

什么是Arduino?您可以使用它做什么?

什么是Arduino入门工具包?它包含什么?

您可以通过入门工具包购买更多更酷的组件

开始使用Arduino入门套件?安装驱动程序并设置电路板和端口

Fritzing,这是一个免费的电路图绘制工具

仔细查看Arduino应用程序和示例闪烁程序的结构

Arduino Xmas树灯项目(又是关于数组的学习)

什么是Binary?

到目前为止,我们将使用移位寄存器,我认为我们涵盖了很多。一如既往,我鼓励您使用和调整代码,并随时询问您在注释中可能遇到的任何问题,甚至共享指向基于出色移位寄存器的项目的链接。
责任编辑:wv

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 移位寄存器
    +关注

    关注

    2

    文章

    181

    浏览量

    22020
收藏 人收藏

    评论

    相关推荐

    移位寄存器可降低LED设计的尺寸和成本

    在使用 LED 的设计中,移位寄存器非常有用。例如,如果系统包括七段显示器、单个指示器或形成网格或面板的 LED 阵列,则可以使用标准 8 位移位寄存器来允许低引脚数微控制器驱动多个LED。
    发表于 01-30 15:14 127次阅读
    <b class='flag-5'>移位寄存器</b>可降低LED设计的尺寸和成本

    移位寄存器的工作原理 移位寄存器左移和右移怎么算

    移位寄存器是一种用于在数字电路中实现数据移位操作的基本电路元件。它由多个触发器以及相关控制电路组成,具有存储、接受和移动数据的功能。移位寄存器可以分为两种类型:串行移位寄存器和并行
    的头像 发表于 01-18 10:52 1579次阅读

    labview移位寄存器如何清零

    LabVIEW中的移位寄存器(Shift Register)是一种用于存储和移动数据的功能性块。它类似于传统计算机中的寄存器,可以用于在循环中保留变量的状态。但与传统寄存器不同的是,移位寄存器
    的头像 发表于 01-05 13:49 782次阅读

    移位寄存器和译码有什么区别?是不是功能差不多?

    移位寄存器和译码有什么区别,是不是功能差不多​
    发表于 11-03 07:28

    基于VHDL的移位寄存器实验

    非常实用的基于VHDL的移位寄存器实验
    发表于 09-25 08:06

    什么是移位寄存器?数字电路中的寄存器类型有哪些呢?

    移位寄存器是一种时序逻辑电路,能够存储和传输数据。它们由触发器组成,这些触发器的连接方式使得一个触发器的输出可以作为另一个触发器的输入,具体取决于所创建的移位寄存器的类型。
    的头像 发表于 09-20 10:44 4220次阅读
    什么是<b class='flag-5'>移位寄存器</b>?数字电路中的<b class='flag-5'>寄存器</b>类型有哪些呢?

    使用移位寄存器构建环形计数器电路

    移位寄存器是一种重要的数字电路元件,可用于构建各种电路,包括环形计数器。在这篇文章中,我们将介绍如何使用移位寄存器来构建一个环形计数器电路。
    的头像 发表于 07-09 11:42 2288次阅读

    移位寄存器连接方法及类型

    移位寄存器在一条线上接收传输的4位和8位信号,并一一发送出去。反之亦然,它的作用是将海量的数据分拣到每一位,进行转换和传输数据,移位寄存器允许高速传输大量信号而无需大量布线。在本文中将解释此类移位寄存器
    的头像 发表于 07-07 10:50 1672次阅读

    使用移位寄存器构建一个环形计数器电路

    移位寄存器可用于各种电路。例如,如果您稍微修改串行输入 – 并联输出移位寄存器,则可以创建一个环形计数器电路,如下所示:
    的头像 发表于 06-29 11:24 806次阅读
    使用<b class='flag-5'>移位寄存器</b>构建一个环形计数器电路

    移位寄存器有哪些不同类型?

    移位寄存器在串行数据输入端仅接受一位数据。每次Clk输入接收到有效的触发信号时,它都会横向移动到下一个D触发器。触发器中的有效触发信号可以是上升沿(即从数字状态0 到 1 ↑ 的变化)或下降沿(从 1 到 0 ↓ 的变化)。在本教程中,我们使用触发器,通过上升沿信号触发。
    的头像 发表于 06-29 11:22 1227次阅读
    <b class='flag-5'>移位寄存器</b>有哪些不同类型?

    什么是移位寄存器移位寄存器的用途是什么?

    移位寄存器是数字电子学中的常见构建模块,用于存储和移动位,例如,从串行数据转换为并行数据,反之亦然。
    的头像 发表于 06-29 11:21 4866次阅读
    什么是<b class='flag-5'>移位寄存器</b>?<b class='flag-5'>移位寄存器</b>的用途是什么?

    移位寄存器复位与不复位的区别在哪?

    下图是ISE14.7实现后的结果如下图所示,编译器直接把他综合进了一个SRL16里面,也就是专用的移位寄存器模块,只需要一个LUT就可以实现16bit以内的移位
    的头像 发表于 06-28 14:58 903次阅读
    <b class='flag-5'>移位寄存器</b>复位与不复位的区别在哪?

    Arduino 74hc595移位寄存器

    电子发烧友网站提供《Arduino 74hc595移位寄存器.zip》资料免费下载
    发表于 06-14 10:03 3次下载
    Arduino 74hc595<b class='flag-5'>移位寄存器</b>

    基于移位寄存器TDM的实现方式

    设计中两片FPGA分割边界的数据Sig1、Sig2、Sig3、Sig4……等一大波的信号被并行地加载到传输时钟的上升沿上的移位寄存器中,并用相同的时钟移出。
    发表于 05-26 14:08 121次阅读
    基于<b class='flag-5'>移位寄存器</b>TDM的实现方式

    基于移位寄存器的TDM的实现方式

    设计中两片FPGA分割边界的数据Sig1、Sig2、Sig3、Sig4……等一大波的信号被并行地加载到传输时钟的上升沿上的移位寄存器中,并用相同的时钟移出。
    发表于 05-23 15:42 208次阅读
    基于<b class='flag-5'>移位寄存器</b>的TDM的实现方式