这是教程序列的第二部分,在该序列中,我们使用Energia IDE从Texas Instruments学习MSP430G2 LaunchPad。在上一期Blinky LED教程中,我们向LaunchPad开发板和Energia IDE进行了自我介绍,我们还上传了第一个程序,该程序使板载LED定期闪烁。
在本教程中,我们将学习如何使用“数字读取”和“数字写入”选项来读取输入设备(如开关)的状态,并控制多个输出(如LED)。在本教程的最后,您将学习如何使用数字输入和输出,可用于连接许多数字传感器,例如IR传感器,PIR传感器等,以及打开或关闭LED,蜂鸣器等输出。听起来很有趣对!!?让我们开始吧。
所需材料:
- MSP430G2 LaunchPad
- 任何颜色的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程序,那么您会记得 digitalWrite(LED_pin_name,HIGH) 将使LED发光,而 digitalWrite(LED_pin_name,LOW) 将使LED点亮。
开关是输入设备,开关的一端连接到接地端子,另一端连接到数字引脚P2.3和P2.4。这意味着每当我们按下开关时,如果不按下按钮,则I / O引脚(2.3或2.4)将接地,并保持自由状态。让我们看看如何在编程时使用这种安排。
编程说明:
当按下开关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 循环进行此声明,以减少行数。在 for 循环中,变量 “ i” 将从2递增到9,并且每次递增都会执行内部函数。可能会使您感到困惑的另一件事是术语“ INPUT_PULLUP ”。只需调用功能 pinMode(Pin_name,INPUT) 就可以将引脚声明为输入,但是这里我们使用了 INPUT_PULLUP 而不是INPUT,它们都有明显的变化。
当我们使用任何微控制器引脚时,该引脚应连接到低电平或高电平。在这种情况下,针脚11和12连接到开关,按下该开关将接地。但是,当未按下开关时,该引脚没有连接任何东西,这种情况称为浮动引脚,这对微控制器不利。因此,为避免这种情况,我们可以使用上拉或下拉电阻将引脚保持悬空状态。在MSP430G2553微控制器中,I / O引脚内置了上拉电阻。要使用它,我们要做的就是在声明过程中像上面的w一样调用INPUT_PULLUP而不是INPUT。
现在让我们进入 void loop() 函数。该函数中写入的内容将永远执行。我们程序的第一步是检查是否按下了开关,如果按下了,我们应该开始按顺序闪烁LED。要检查是否按下了按钮,请使用以下行
如果(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); 延迟(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); 延迟(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端口,然后单击“上载”按钮。该程序应成功编译,一旦上传,将显示 “ Done Uploading”。
现在按下板上的按钮1,LED应该依次点亮,如下所示
您也可以按住第二个按钮来检查顺序是否正在更改。下面的视频显示了该项目的完整工作。如果您对结果满意,可以尝试对代码进行一些更改,例如更改延迟时间,更改序列等。这将帮助您更好地学习和理解。
希望您了解该教程并学到了一些有用的东西。如果您遇到任何问题,请随时在评论部分中发布问题或使用论坛。让我们在另一个教程中见面,该教程将学习如何使用我们的MSP30发射台读取模拟电压。