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

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

3天内不再提示

如何在Arduino上使用八个大型红色LED而不需要放弃8个输出引脚

454398 来源:网络整理 作者:网络整理 2019-11-27 16:21 次阅读

概述

在本课程中,您将学习如何在Arduino上使用八个大型红色LED而不需要放弃8个输出引脚!

如何在Arduino上使用八个大型红色LED而不需要放弃8个输出引脚

尽管您可以将八个LED分别连接一个Arduino引脚上的电阻(就像我们在第2课中对RGB LED所做的那样),您很快就会开始用尽Arduino上的引脚。如果您没有与duino连接的东西很多,则可以这样做-但通常我们需要按钮,传感器,伺服器等,在您不知道它的情况下,您就没有管脚了。因此,您将使用名为 74HC595串行到并行转换器芯片,而不是这样做。该芯片具有八个输出(完美)和三个输入,可用于一次将数据馈入其中。

该芯片使驱动LED的速度稍慢一些(您每秒只能将LED更换大约500,000次,而不是每秒8,000,000次),但它的确非常快,比人类可以检测到的速度还要快,所以值得!

零件

要构建本课中描述的项目,您将需要以下零件。

零件 数量

5mm红色LED 8

270电阻(红色,紫色,棕色条纹) 8

74HC595移位寄存器

1

半面包板 1

Arduino Uno R3 1

跳线束 1

面包板布局

由于我们要连接八个LED和八个电阻,因此实际上需要进行很多连接。

将74HC595芯片放在第一位可能是最容易的,因为几乎所有其他东西都可以连接对此。如此放置,以使小U形槽口朝向面包板的顶部。芯片的引脚1位于该凹口的左侧。

arduino的数字4进入移位寄存器的引脚14

arduino的数字5进入移位寄存器的引脚12

来自arduino的数字6进入移位寄存器的#11引脚

除了‘595的所有输出之一,所有输出都位于芯片的左侧,因此,为了便于连接,

在芯片之后,将电阻器放置到位。您需要小心,不要使电阻的引线相互接触。在将电源连接到Arduino之前,应该再次检查这一点。如果发现很难在不接触引线的情况下布置电阻器,则有助于缩短引线,使其更靠近面包板的表面。然后,将LED放在面包板上。

更长的正极LED引线必须全部朝向芯片,无论面包板位于面包板的哪一侧。

现在仅需连接跳线,如上所示。不要忘了从IC的引脚8到面包板GND列的引脚。

稍后加载列出的草图并尝试一下。每个LED都应依次点亮,直到所有LED都点亮,然后它们都熄灭并重复该循环。

74HC595移位寄存器

在阅读代码之前,让我们快速看一下芯片的功能,以便我们可以理解代码的功能。

该芯片属于一种移位寄存器。

移位寄存器可保存八个存储单元,每个存储单元可以是1或0。

设置每个存储单元这些值的开或关,我们使用芯片的“数据”和“时钟”引脚输入数据。

时钟引脚需要接收八个脉冲。在每个脉冲时,如果数据引脚为高电平,则将1压入移位寄存器。否则,它为0。当接收到所有八个脉冲时,然后启用“锁存”引脚会将这八个值复制到锁存寄存器。这是必要的,否则当将数据加载到移位寄存器中时,错误的LED会闪烁。该芯片还具有OE(输出使能)引脚,该引脚用于一次启用或禁用所有输出。您可以将其连接到具有PWM功能的Arduino引脚,并使用“ analogWrite”控制LED的亮度。该引脚为低电平有效,因此我们将其连接至GND。

Arduino代码

Arduino包含一个名为“ shiftOut”的特殊功能,该功能专门用于将数据发送到移位寄存器。

这是完整的草图,

下载:文件

复制代码

/*

Adafruit Arduino - Lesson 4. 8 LEDs and a Shift Register

*/

int latchPin = 5;

int clockPin = 6;

int dataPin = 4;

byte leds = 0;

void setup()

{

pinMode(latchPin, OUTPUT);

pinMode(dataPin, OUTPUT);

pinMode(clockPin, OUTPUT);

}

void loop()

{

leds = 0;

updateShiftRegister();

delay(500);

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

{

bitSet(leds, i);

updateShiftRegister();

delay(500);

}

}

void updateShiftRegister()

{

digitalWrite(latchPin, LOW);

shiftOut(dataPin, clockPin, LSBFIRST, leds);

digitalWrite(latchPin, HIGH);

} /*

Adafruit Arduino - Lesson 4. 8 LEDs and a Shift Register

*/

int latchPin = 5;

int clockPin = 6;

int dataPin = 4;

byte leds = 0;

void setup()

{

pinMode(latchPin, OUTPUT);

pinMode(dataPin, OUTPUT);

pinMode(clockPin, OUTPUT);

}

void loop()

{

leds = 0;

updateShiftRegister();

delay(500);

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

{

bitSet(leds, i);

updateShiftRegister();

delay(500);

}

}

void updateShiftRegister()

{

digitalWrite(latchPin, LOW);

shiftOut(dataPin, clockPin, LSBFIRST, leds);

digitalWrite(latchPin, HIGH);

}

我们要做的第一件事是定义将要使用的三个引脚。这些是Arduino数字输出,将连接到74HC595的锁存器,时钟和数据引脚。

下载:file

复制代码

int latchPin = 5;

int clockPin = 6;

int dataPin = 4; int latchPin = 5;

int clockPin = 6;

int dataPin = 4;

接下来,定义了一个名为“ leds”的变量。这将用于保持当前打开或关闭LED的模式。 “字节”类型的数据表示使用八位数字。每个位都可以打开或关闭,因此非常适合跟踪我们八个LED中的哪个打开或关闭。

下载:文件

复制代码

byte leds = 0; byte leds = 0;

“设置”功能仅设置了我们正在使用的三个引脚

下载:文件

复制代码

void setup()

{

pinMode(latchPin, OUTPUT);

pinMode(dataPin, OUTPUT);

pinMode(clockPin, OUTPUT);

} void setup()

{

pinMode(latchPin, OUTPUT);

pinMode(dataPin, OUTPUT);

pinMode(clockPin, OUTPUT);

}

“循环”功能最初通过将变量“ leds”的值设置为0来关闭所有LED。然后调用“ updateShiftRegister”发送“ leds” ’模式到移位寄存器,以便所有LED熄灭。稍后我们将处理‘updateShiftRegister’的工作方式。

循环功能暂停半秒钟,然后使用‘for’循环和变量‘i’从0到7开始计数。每次,它使用Arduino函数‘bitSet’来设置控制变量‘leds’中的LED的位。然后它还会调用‘updateShiftRegister’,以便leds更新以反映变量‘leds’中的内容。

然后,在‘i’递增之前,有半秒的延迟,下一个LED点亮。

下载:文件

复制代码

void loop()

{

leds = 0;

updateShiftRegister();

delay(500);

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

{

bitSet(leds, i);

updateShiftRegister();

delay(500);

}

} void loop()

{

leds = 0;

updateShiftRegister();

delay(500);

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

{

bitSet(leds, i);

updateShiftRegister();

delay(500);

}

}

函数‘updateShiftRegister’首先将LatchPin设置为低电平,然后在再次将‘latchPin’置于高电平之前调用Arduino函数‘shiftOut’。它有四个参数,前两个是分别用于数据和时钟的引脚。

第三个参数指定要从哪个数据端开始。我们将从最右边的位开始,这就是所谓的“最低有效位”(LSB)。

最后一个参数是要移入移位寄存器的实际数据。

下载:文件

复制代码

void updateShiftRegister()

{

digitalWrite(latchPin, LOW);

shiftOut(dataPin, clockPin, LSBFIRST, leds);

digitalWrite(latchPin, HIGH);

} void updateShiftRegister()

{

digitalWrite(latchPin, LOW);

shiftOut(dataPin, clockPin, LSBFIRST, leds);

digitalWrite(latchPin, HIGH);

}

如果要关闭而不是打开LED之一,则可以在“ leds”变量上调用类似的Arduino函数(bitClear) 。这会将“ leds”的位设置为0,然后您只需跟随它调用“ updateShiftRegister”即可更新实际的LED。

亮度控制

我未提到的74HC595的一个引脚是称为“输出使能”的引脚。这是针脚13,在面包板上,它永久接地。该引脚用作开关,可以启用或禁用输出-唯一需要注意的是它是“低电平有效”(接地以启用)。因此,如果将其连接到5V,则所有输出均关闭。而如果将其接地,则应该打开的那些输出打开,应该关闭的那些输出关闭。

我们可以将此引脚与“ analogWrite”功能一起使用,我们在第3课中使用了该功能。 ,以使用PWM控制LED的亮度(另请参阅第3课)。

要做的是,更改与74HC595引脚13的连接,以代替将其接地,将其连接到Arduino的引脚3。

下面的草图将在所有LED点亮后逐渐将它们逐渐熄灭。

下载:文件

复制代码

/*

Adafruit Arduino - Lesson 4. 8 LEDs and a Shift Register - Brightness

*/

int latchPin = 5;

int clockPin = 6;

int dataPin = 4;

int outputEnablePin = 3;

byte leds = 0;

void setup()

{

pinMode(latchPin, OUTPUT);

pinMode(dataPin, OUTPUT);

pinMode(clockPin, OUTPUT);

pinMode(outputEnablePin, OUTPUT);

}

void loop()

{

setBrightness(255);

leds = 0;

updateShiftRegister();

delay(500);

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

{

bitSet(leds, i);

updateShiftRegister();

delay(500);

}

for (byte b = 255; b 》 0; b--)

{

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);

}

/*

Adafruit Arduino - Lesson 4. 8 LEDs and a Shift Register - Brightness

*/

int latchPin = 5;

int clockPin = 6;

int dataPin = 4;

int outputEnablePin = 3;

byte leds = 0;

void setup()

{

pinMode(latchPin, OUTPUT);

pinMode(dataPin, OUTPUT);

pinMode(clockPin, OUTPUT);

pinMode(outputEnablePin, OUTPUT);

}

void loop()

{

setBrightness(255);

leds = 0;

updateShiftRegister();

delay(500);

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

{

bitSet(leds, i);

updateShiftRegister();

delay(500);

}

for (byte b = 255; b 》 0; b--)

{

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);

}

其他要做的事情

一旦您知道如何使用74HC595,那么使用许多LED可以做很多事情。您可以尝试以下操作:

制作“ Larson Scanner”扫描灯,就像在电视连续剧《骑士骑士》中KITT的前部以及在《 Battle Start Galactica》系列中的Cylons上那样。 li》

制作电子骰子。将6个LED排列为两列,每列三个LED,中间一个LED。提示–看一下称为“随机”的Arduino函数。

74HC595的一大优点是,您可以通过菊花链式连接它们以增加数量。您可以控制的LED。有关74HC595的更高级用法的其他指导,请查看使用‘shiftOut’的Arduino官方文档http://arduino.cc/zh/Tutorial/ShiftOut

责任编辑:wv

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

    关注

    240

    文章

    23047

    浏览量

    656903
  • Arduino
    +关注

    关注

    187

    文章

    6456

    浏览量

    186478
收藏 人收藏

    评论

    相关推荐

    TPA6130A2如果不需要I2C功能,是否可以将I2C的两引脚悬空?

    如果不需要I2C功能,是否可以将I2C的两引脚悬空。 2.如果将I2C两引脚悬空,该IC是否是最大音量,而且长期使用和多次通电IC是否依
    发表于 11-01 08:16

    C语言为什么不需要包含stdio.h

    我们在写单片机程序的时候,第一行都会包含 reg51.h,于是就有同学提出了疑问,为什么不需要包含 stdio.h?
    的头像 发表于 10-29 15:48 137次阅读

    想找一AGC的芯片,不需要软件控制的 ,完全硬件AGC,求推荐

    想找一AGC的芯片完全硬件AGC不需要软件控制的价格20元以下
    发表于 10-28 06:21

    不需要点表的工业网关” 深控技术物联网解决方案

    不需要点表的工业网关” 物联网解决方案
    的头像 发表于 09-29 15:43 276次阅读
    “<b class='flag-5'>不需要</b>点表的工业网关” 深控技术物联网解决方案

    DRV8823的正确输出序列应该是怎么样的,不需要过零电流吗?

    ,来产生过零电流,但是用电流探头查看电流,发现不是正弦波。DRV8823的正确输出序列应该是怎么样的,不需要过零电流吗?
    发表于 09-26 08:07

    网线那几根线不需要

    通常是橙白、橙、绿白、绿。 剩下的四根线,即蓝、蓝白、棕、棕白,在百兆网络中通常是不需要的。这四根线在网线中主要作为备用或用于其他用途,如语音传输等。然而,在千兆网络中,由于数据传输速率的提高,这根线都
    的头像 发表于 09-04 09:40 897次阅读

    DAC8771RGZ只输出正电压不需要输出负电压的时候,芯片的引脚11和27,下图的VNEG_IN网络应该怎么接?

    请教下DAC8771RGZ这款DA芯片,当只输出正电压不需要输出负电压的时候,芯片的引脚11和27,下图的VNEG_IN网络应该怎么接,直接接地吗?
    发表于 08-08 07:24

    USART对应RTS的GPIO引脚不需要定义吗?

    USART_HardwareFlowControl_RTS_CTS 我的疑惑是那对应RTS的GPIO引脚不需要定义了吗?STM32的任何GPIO引脚应用前都要初始化定义一下。 不知有没有人用过?
    发表于 04-25 08:05

    L6235Q VREF引脚要是不需要tacho测速功能需要怎么接?

    这个L6235Q VREF引脚要是不需要tacho测速功能需要怎么接,看数据手册好像是说PWM电流控制器参考电压,最小值为-0.1V,最大值为5V,设计时应该怎
    发表于 03-28 08:17

    六类屏蔽网线和六类非屏蔽网线都不需要接地吗

    是的,一般情况下六类屏蔽网线和六类非屏蔽网线都不需要接地。在综合布线工程中,通常采用免接地方式,即网线不需要直接接地。这是因为网线传输的信号电压较低,一般在12V左右,因此不需要通过接地来消除静电等
    的头像 发表于 03-08 10:01 2908次阅读

    CY8C4146内部集成了WCO模块,这种情况下是不是不需要再去接一外部晶振?

    CY8C4146内部集成了WCO模块,这种情况下是不是不需要再去接一外部晶振?
    发表于 02-21 06:44

    电源管理芯片的八个引脚的功能和用途

    电源管理芯片是一种专用集成电路,用于在电子设备中管理和控制电源。它具有多个引脚,每个引脚都有特定的功能和用途。在本文中,我将详细说明电源管理芯片的八个引脚的功能和用途。 VDD
    的头像 发表于 12-07 11:21 2.3w次阅读

    使用AD2428不需要对总线供电,剩下的VSSN和SWP和sense引脚如何处理?

    你好, 我现在使用AD2428,不需要对总线供电,剩下的VSSN和 SWP和sense引脚如何处理? 下面示意图中的采用了本地供电后,master应该就应该没有总线电源过来了,红色框中直流通路代表的是什么?
    发表于 11-28 08:01

    求助,有没有不需要单片机直接在外部引脚加高低电平就能输出预定信号的锁相环芯片?

    有没有不需要单片机直接在外部引脚加高低电平就能输出预定信号的锁相环芯片?
    发表于 11-16 08:23

    dc2042a这是一不需要电源的设备吗?

    你好: 我想咨询一下,dc2042a 这是一不需要电源的设备吗?可以将较小的电压(20mv) (20mv)的电压提升至5V?其中原理是什么呢,对于输入电流有要求吗?因为按照能量守恒,如果没有电源输入,功率应该不变。
    发表于 11-16 07:48