尽管与以前的教程相比,这是一个很大的困难,但我强烈建议您对以前的材料(本文末尾的链接)有一个很好的理解,以及对二进制基础知识的理解。
什么是移位寄存器?
从技术上讲,输出移位寄存器是串行接收数据并并行输出的。实际上,这意味着我们可以快速向芯片发送一堆输出命令,告诉它激活,然后将输出发送到相关的引脚。无需遍历每个引脚,我们只需一次将所需的输出作为单个字节或更多信息发送到所有引脚。
如果可以帮助您理解,您可以考虑一下移位寄存器作为数字输出的“数组",但是我们可以跳过通常的digitalWrite命令,只需发送一系列位以将其打开或关闭即可。
工作原理是什么?
我们将使用的移位寄存器-Oomlout入门套件中包含的74HC595N-仅需要3个控制引脚。第一个是时钟-您无需担心太多,因为Arduino串行库对其进行了控制-但时钟基本上只是一个开/关电脉冲,用于设置数据信号的速度。
锁存器引脚用于告知移位寄存器何时应根据我们刚发送的位打开或关闭输出,即将它们锁存到位。
最后,数据引脚位于此处我们用位发送了实际的串行数据,以确定移位寄存器输出的开/关状态。
整个过程可以用4个步骤来描述:
实现
该项目需要以下组件:
有Oomlout入门套件,您可以从此处下载面包板布局。
以下是组装视频:
电路板布局:
和我的组装版本:
我已经修改了Ooolmout提供的原始代码,但是如果您想尝试一下,可以在此处完整下载。包括了代码的说明,因此请从下面复制或粘贴整个内容,或使用pastebin读取代码的说明。
位移(OutputBytes函数)
循环示例– outputBytes()–代码使用8位序列(一个字节),然后它在for循环的每次迭代中向左移。重要的是要注意,如果您进行的移位超出了可能,则只会丢失该位。
使用<<或>>加上要移位的位数来完成移位。
检查以下示例,并确保您了解发生了什么:
发送整数代替(OutputIntegers函数)
如果将整数发送到移位寄存器而不是字节,它将简单地将数字转换为二进制字节序列。在此函数中(取消注释并上载以查看效果),我们有一个for循环,其计数范围是0-255(可以用一个字节表示的最大整数),然后发送该循环。它基本上是二进制的,因此除非您的LED排成一排,否则该序列似乎有点随机。
例如,如果您阅读二进制的说明文章,就会知道数字44将表示为00101100,因此LED 3、5、6将在该点的那个点点亮。
菊花链超过一个移位寄存器
移位寄存器的问题是,如果给它们提供的信息超过8位(或者它们的注册表太大),它们将再次移出其他附加位。这意味着您可以将它们中的一系列连接在一起,推入一个较长的位链,然后将其分别分配到每个寄存器,而无需您进行额外的编码。
尽管我们不会在这里详细说明过程或原理图,如果您拥有多个移位寄存器,则可以从此处的Arduino官方网站尝试该项目。
该系列中的其他文章:
标签: