如何使用数字读/写引脚

描述

在本教程中,我们将学习如何使用数字读取和数字写入选项来读取输入设备(如开关)的状态,并控制多个输出(如 LED)。在本教程结束时,您将学习使用数字输入和输出,它可用于连接许多数字传感器,如红外传感器、PIR 传感器等,还可以打开或关闭输出,如 LED、蜂鸣器等。听起来很有趣吧!!?让我们开始吧。

所需材料:

MSP430G2 启动板

任何颜色的 LED – 8

开关 – 2

1k 电阻器 – 8

连接线

电路图:

在之前的教程中,我们注意到发射台本身在板上有两个 LED 和一个开关。但是在本教程中,我们将需要更多,因为我们计划在按下按钮时按顺序点亮八个 LED 灯。我们还将在按下另一个按钮时更改顺序,以使其有趣。所以我们必须建立一个带有8个LED灯和两个开关的电路,完整的电路图可以在下面找到。

输入设备

这里的8个LED是输出,两个开关是输入。我们可以将它们连接到电路板上的任何 I/O 引脚,但我已将 LRD 从引脚 P1.0 连接到 P2.1,并将开关 1 和 2 分别连接到引脚 P2.4 和 P2.3,如上所示。

LED的所有阴极引脚都接地,阳极引脚通过电阻连接到I/O引脚。该电阻器称为限流电阻器,此电阻器对于 MSP430 不是必需的,因为它的 I/O 引脚可以提供的最大电流仅为 6mA,引脚上的电压仅为 3.6V。但是,使用它们是一个很好的做法。当这些数字引脚中的任何一个变为高电平时,相应的 LED 将亮起。如果你能回忆起上一个教程的LED程序,那么你就会记得数字写入(LED_pin_name,高)将使LED发光,数字写入(LED_pin_name,低)将使LED转动。

开关是输入设备,开关的一端连接到接地端子,另一端连接到数字引脚P2.3和P2.4。这意味着每当我们按下开关时,I/O 引脚(2.3 或 2.4)都将接地,如果不按下按钮,I/O 引脚将保持空闲状态。让我们看看如何在编程时使用这种安排。

编程说明:
当按下开关 1 时,必须编写程序以顺序方式控制 8 LED,然后当按下开关 2 时,必须更改顺序。完整的程序和演示视频可以在此页面底部找到。下面我将逐行解释程序,以便您轻松理解。

与往常一样,我们应该从 void setup() 函数开始,在该函数中,我们将声明我们使用的引脚是输入或输出引脚。在我们的程序中,输出 8 个 LED 引脚,输入 2 个开关。这 8 个 LED 从 P1.0 连接到 P2.1,即电路板上的引脚编号 2 到 9。然后将开关连接到引脚P2.3和引脚2.4,分别是引脚编号11和12。所以我们在 void setup() 中声明了以下内容

void setup() {
for (int i = 2; i <= 9; i++) {
pinMode(i, OUTPUT);
}
for (int i = 2; i <= 9; i++) {
digitalWrite(i, LOW);
}
pinMode (11, INPUT_PULLUP);
pinMode (12, INPUT_PULLUP);
}
众所周知,pinMode() 函数将引脚声明为输出或输入,而 digitalWrite() 函数使其高电平 (ON) 或低电平 (OFF)。我们使用 for 循环来做出此声明以减少行数。变量 “i” 将在 for 循环中从 2 递增到 9,并且对于每个增量,将执行其中的函数。另一件可能让您感到困惑的事情是术语“INPUT_PULLUP”。只需调用函数pinMode(Pin_name,INPUT)即可将引脚声明为输入,但在这里我们使用了INPUT_PULLUP而不是INPUT,它们都有明显的变化。

当我们使用任何微控制器引脚时,该引脚应连接到低电平或高电平。在这种情况下,引脚 11 和 12 连接到开关,按下时开关将接地。但是,当开关未按下时,引脚未连接到任何内容,这种情况称为浮动引脚,对微控制器不利。因此,为了避免这种情况,我们要么使用上拉电阻器,要么使用下拉电阻器,在引脚浮动时将引脚保持在某种状态。在 MSP430G2553 微控制器中,I/O 引脚内置了一个上拉电阻。要使用它,我们所要做的就是在声明期间调用 INPUT_PULLUP 而不是 INPUT,就像上面所做的那样。

现在让我们进入 void loop() 函数。在此函数中编写的任何内容都将永远执行。我们程序的第一步是检查开关是否被按下,如果按下,我们应该开始按顺序闪烁 LED。要检查按钮是否按下,请使用以下行

if (digitalRead(12) == LOW)
这里的新功能是digitalRead()函数,该函数将读取数字引脚的状态,并在引脚获得一定电压时返回HIGH(1),当引脚接地时返回低LOW(0)。在我们的硬件中,只有当我们按下按钮时,引脚才会接地,否则它会很高,因为我们使用了上拉电阻。所以我们使用 if 语句来检查按钮是否被按下。

按下按钮后,我们进入无限 while (1) 循环。这是我们开始按顺序闪烁 LED 的地方。下面显示了一个无限的while循环,循环中写入的任何内容都将永远运行,直到中断;使用语句。

whiel(1){
}
在无限内,我们检查连接到引脚 11 的第二个开关的状态。

如果按下此开关,我们将按一个特定顺序闪烁 LED,否则我们将以另一个顺序闪烁。

if (digitalRead(11) == LOW)
{
for (int i = 2; i <= 9; i++)
{
digitalWrite(i, HIGH);
delay(100);
}
for (int i = 2; i <= 9; i++)
digitalWrite(i, LOW);
}
为了按顺序闪烁 LED,我们再次使用 for 循环,但这次我们使用 delay(100) 函数使用 100 毫秒的小延迟,以便我们可以注意到 LED 变高。为了一次只使一个LED发光,我们还使用另一个for回路来关闭所有LED。因此,我们打开 LED 等待一段时间,然后关闭所有 LED,然后增加计数打开 LED 等待一段时间,循环继续。但只要不按下第二个开关,这一切都会发生。

如果按下第二个开关,然后我们更改顺序,程序将或多或少与 LED 打开的顺序相同。下面显示的行尝试查看并找出已更改的内容。


else
{
for (int i = 9; i >= 2; i--)
{
digitalWrite(i, HIGH);
delay(100);
}
for (int i = 2; i <= 9; i++)
digitalWrite(i, LOW);
}
是的,for 循环已更改。以前,我们让 LED 从数字 2 一直发光到 9。但是现在我们将从数字 9 开始,一直减少到 2。这样我们就可以注意到开关是否被按下。

闪烁 LED 序列的硬件设置:

好的,所有的理论和软件部分都足够了。让我们获取一些组件,看看该程序的实际效果。该电路非常简单,因此可以很容易地构建在面包板上。但是我已经在性能板上焊接了LED和开关,只是为了让它看起来整洁。我焊接的性能板如下所示。

输入设备

如您所见,我们将LED和开关的输出引脚作为连接器引脚取出。现在,我们已经使用母对母连接器线连接 LED 并切换至 MSP430 LaunchPad 板,如下图所示。

输入设备

上传和工作:

完成硬件操作后,只需将MSP430板连接到计算机并打开Energia IDE并使用本页末尾给出的程序即可。确保在Energia IDE中选择了正确的电路板和COM端口,然后单击“上传”按钮。该程序应该编译成功,上传后将显示“完成上传”。

现在按下板上的按钮 1,LED 应按顺序亮起,如下所示

输入设备

您也可以按住第二个按钮来检查顺序是否被更改。

/*

TUTORIAL 2 - Learning to use I/O

This program will control 8 LEDs based ont he input from two push button

LED should be connected form P1.0 to P2.1 (pin 2 to 7)

Switch is connected to P2.3 and P2.4 (pin 8 and 9)

*/


void setup() {

for (int i = 2; i <= 9; i++) {

pinMode(i, OUTPUT);

}

for (int i = 2; i <= 9; i++) {

digitalWrite(i, LOW);

}



pinMode (11, INPUT_PULLUP);

pinMode (12, INPUT_PULLUP);

}


// the loop routine runs over and over again forever:

void loop() {


if (digitalRead(12) == LOW) 

{

while (1) 



if (digitalRead(11) == LOW) 

{

for (int i = 2; i <= 9; i++) 

{

digitalWrite(i, HIGH);

delay(100);

}

for (int i = 2; i <= 9; i++)

digitalWrite(i, LOW);

}

else

{

for (int i = 9; i >= 2; i--) 

{

digitalWrite(i, HIGH);

delay(100);

}

for (int i = 2; i <= 9; i++)

digitalWrite(i, LOW);

}

}

}

}

 

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分