Arduino成长日记3 - 数字I/O操作

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_36955622/article/details/88886787

在前面章节介绍Arduino常用开发板的时候大概说了Arduino UNO板的板载功能引脚的分布,其中带数字丝印的引脚为数字引脚,位于UNO板的上方。Arduino UNO一共有14个数字引脚,分别是0 ~ 13号脚,其中除了13号引脚默认接了一个LED灯,其他引脚都可作为外接模块的控制引脚,控制其数字信号输入输出功能。
在这里插入图片描述

数字信号

数字信号是以0、1来表示的不连续的电平信号,也就是二进制的形式,通常在Arduino程序中以高低电平来表示数字信号,高电平为数字信号1(HIGH),低电平为数字信号0(LOW),也可以直接用1或0来表示高低电平。当引脚的数字信号为1时,引脚电压值为5V高电平,引脚数字信号为0时,电压值为0V低电平。
在这里插入图片描述
除了板载的数字引脚外,带 “A” 编号的模拟引脚也可以完成输入输出数字信号的功能。


控制数字引脚的输入输出功能需要用到3个函数,分别是 pinMode()digitalWrite()digitalRead(),对应的传参跟功能在上节“Arduino编程基础”中有提及,可直接跳转 - Arduino成长日记2 - Arduino编程基础
在使用引脚输入输出功能之前,需要先通过 pinMode() 函数配置引脚模式为输入模式或输出模式,参数 pin 为需要配置的引脚,数字引脚为0 ~ 13,模拟引脚为A0 ~ A5,参数 mode 可配置引脚为INPUT(输入模式)、OUTPUT(输出模式)、INPUT_PULLUP(输入上拉模式),通常只用到前两种模式。
在这里插入图片描述
如上图配置数字引脚13为输出功能(OUTPUT),配置模拟引脚A0为输入模式(INPUT)。
配置了引脚模式之后就是对引脚进行操作了,因为数字引脚13配置了输出模式,所以对应的引脚操作就是数字信号控制(高电平或低电平写入),所用到的函数是 digitalWrite()digitalWrite()函数的传参为要控制的数字引脚和写入的数字信号(高电平或低电平)。
在这里插入图片描述
这样就能看懂Arduino的示例闪烁灯程序 - Blink了,下面是Blink的代码 ~

//定义LED引脚
#define LED_BUILTIN 13

// setup函数,当板子通电或执行复位的时候运行一次
void setup() {
  // 初始化数字引脚LED_BUILTIN为输出
  pinMode(LED_BUILTIN, OUTPUT);
}

// loop函数,继setup函数之后循环运行的函数
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // 点亮LED(HIGH为高电平)
  delay(1000);                       // 延时1秒
  digitalWrite(LED_BUILTIN, LOW);    // 关闭LED(LOW为低电平)
  delay(1000);                       // 延时1秒
}

代码开头的 #define 为数字引脚13设置宏定义,使得代码编译时代码中所用到 LED_BUILTIN 的地方都会被替换成数字 13 ,setup函数中将数字引脚13初始化为输出模式,loop函数中通过digitalWrite函数对 13 引脚写入高电平与低电平,搭配延时函数 delay 形成LED灯的循环闪烁效果。
掌握了 Blink程序的功能实现,我们可以着手来编写流水灯的实验了,程序如下:

/*******************************************
*
*			  Arduino流水灯实验
*
********************************************/

void setup()
{
	//通过for循环初始化LED引脚2到引脚7为输出模式
	for (int i = 2; i < 8; ++i)
	{
		/* code */
		pinMode(i, OUTPUT);
	}
}

void loop()
{
	//从引脚2到引脚6,点亮LED,等待500毫秒在熄灭LED
	for (int i = 2; i < 7; ++i)
	{
		/* code */
		digitalWrite(i, HIGH);
		delay(500);
		digitalWrite(i, LOW);
	}
	//从引脚7到引脚3,点亮LED,等待500毫秒在熄灭LED
	for (int i = 7; i > 2; --i)
	{
		/* code */
		digitalWrite(i, HIGH);
		delay(500);
		digitalWrite(i, LOW);
	}
}

该实验巧妙的利用for循环语句节省了一些多余的代码量,也使得程序看起来更加简洁。硬件方面可用面包板、1k电阻、直插式LED搭建,数字引脚串联电阻跟LED,再共地,需要注意LED的正负极方向(正极接电阻,负极接地),否则可能出现LED无法点亮的情况。


学会了数字引脚输出功能的流水灯,现在来看看输入功能,接下来通过按键控制LED实验来了解数字引脚输入的使用,首先看看按键还有LED的原理图
在这里插入图片描述
按键没被按下时电路默认式外部上拉,引脚输入高电平,当按键按下时,引脚接地输入低电平;LED灯在引脚输出高电平时点亮,输出低电平时熄灭,由此我们来看按键控制LED程序:

// 设置常量
const int buttonPin = 2;     // 需要检测的按键引脚
const int ledPin =  13;      // LED引脚

// 设置变量
int buttonState = 0;         // 存储按键状态的变量

void setup() {
  // 初始化LED引脚为输出模式
  pinMode(ledPin, OUTPUT);
  // 初始化按键为输入模式
  pinMode(buttonPin, INPUT);
}

void loop() {
  // 读取按键引脚状态赋值给buttonState
  buttonState = digitalRead(buttonPin);
  // 检测按键是否按下,当按键按下时将返回低电平
  if (buttonState == LOW) {
    // 按键按下,亮灯
    digitalWrite(ledPin, HIGH);
  } else {
    // 按键没被按下,灭灯
    digitalWrite(ledPin, LOW);
  }
}

通过 digitalRead() 函数返回的引脚电平,来控制LED的亮灭。按键按下时, digitalRead() 返回低电平(LOW),按键没按下时,返回高电平(HIGH)。
接下来修改一下程序,完成不一样的控制效果 - 按一下按键,LED灯点亮,按一下按键,LED灯熄灭。

const int buttonPin = 2;     // 需要检测的按键引脚
const int ledPin =  13;      // LED引脚

// variables will change:
int buttonState = 0;         //  存储按键状态的变量
int ledState = false;		 //LED状态的变量

void setup() {
  //初始化LED引脚为输出模式
  pinMode(ledPin, OUTPUT);
  //初始化按键为输入模式
  pinMode(buttonPin, INPUT);
}

void loop() {
  //判断按键是否按下,按键按下时返回低电平(LOW)
  if(digitalRead(buttonPin) == LOW){
      //判断LED变量,true为点亮LED,false为熄灭LED灯
      if (ledState == true) {
        // 亮灯
        digitalWrite(ledPin, HIGH);
        ledState = false;						//修改LED状态变量,当下次按键按下时执行灭灯操作
      } else {
        // 灭灯
        digitalWrite(ledPin, LOW);
        ledState = true;						//修改LED状态变量,当下次按键按下时执行亮灯操作
      }

	 delay(200);
  }
}

为了能使每次按键按下时能够准确的控制LED,需要在每次按键按下时加入小段延时函数,这在按键实验中称为“按键去抖”。

猜你喜欢

转载自blog.csdn.net/qq_36955622/article/details/88886787