Arduino 外部中断与串口通信实验:按键计数与二进制 LED 显示

实验目的:

  1. 掌握 Arduino 的外部中断引脚以及串口通信接口,了解其在硬件层面的应用。
  2. 学习如何使用外部中断的触发与回调函数,以及串口通信的启动与数据传输。

实验内容:

  • 部分 1:单按键计数与串口打印
    • 连接一个按键到外部中断引脚 2,使用中断方式记录按键次数,并通过串口打印按键次数。
  • 部分 2:双按键计数与二进制 LED 显示
    • 连接两个按键到外部中断引脚 2 和 3,并连接五个 LED 灯到其它五个引脚。
    • 将两个按键的计数结果组合成十进制数,再转化为二进制数。
    • 根据二进制数控制 LED 灯的亮灭,同时将二进制数打印在串口上。

实验材料:

  • Arduino 开发板 1 块
  • 按键 3 个
  • LED 灯 5 个
  • 220Ω 电阻 5 个
  • 面包板 1 个
  • 杜邦线若干

实验原理:

  • Arduino 的外部中断引脚: Arduino 的引脚 2 和 3 可以用作外部中断引脚。当引脚上的电平发生变化时,会触发外部中断。其中,引脚 2 对应的外部中断为 INT0,引脚 3 对应的外部中断为 INT1。
  • 串口通讯: Arduino 通过串口与计算机通信,可以通过串口向计算机发送数据,也可以接收计算机发送过来的数据。Arduino 的串口通信接口有两个引脚,分别是 TX 和 RX。
  • 外部中断的触发与回调函数: 当外部中断引脚上的电平发生变化时,会触发外部中断。在 Arduino 中,可以通过 attachInterrupt() 函数来注册中断回调函数。当外部中断触发时,中断回调函数会被自动调用。

实验步骤:

部分 1:单按键计数与串口打印

  1. 连接一个按键到外部中断引脚 2 上,并将其它五个引脚连接五个 LED 灯,电阻大小为 220Ω。按键连接方式如下图所示:

image

  1. 打开 Arduino IDE,编写以下代码,并上传到 Arduino 开发板中:
int count = 0;   // 记录按键次数
int ledPins[] = {4, 5, 6, 7, 8};   // LED 灯引脚
int keyPin = 2;   // 按键引脚
int state = 0;   // 按键状态

void setup() {
  // 初始化串口通讯
  Serial.begin(9600);

  // 初始化 LED 灯引脚
  for (int i = 0; i < 5; i++) {
    pinMode(ledPins[i], OUTPUT);
  }

  // 初始化按键引脚
  pinMode(keyPin, INPUT);
  digitalWrite(keyPin, HIGH);   // 启用内部上拉电阻

  // 注册外部中断
  attachInterrupt(digitalPinToInterrupt(keyPin), keyInterrupt, FALLING);
}

void loop() {
  // 不做任何事情
}

void keyInterrupt() {
  count++;   // 记录按键次数
  Serial.println(count);   // 通过串口打印按键次数

  if (count > 5) {
    count = 0;
  }

  // 控制 LED 灯
  for (int i = 0; i < 5; i++) {
    if (count > i) {
      digitalWrite(ledPins[i], HIGH);
    } else {
      digitalWrite(ledPins[i], LOW);
    }
  }
}
  1. 打开串口监视器,设置波特率为 9600,按下按键,观察串口监视器中的输出,同时 LED 灯也会相应地控制。

部分 2:双按键计数与二进制 LED 显示

  1. 将第二个按键连接到外部中断引脚 3 上,修改代码如下:
int count2 = 0;   // 记录第二个按键次数
int keyPin2 = 3;   // 第二个按键引脚

void setup() {
  // 初始化串口通讯
  Serial.begin(9600);

  // 初始化 LED 灯引脚
  for (int i = 0; i < 5; i++) {
    pinMode(ledPins[i], OUTPUT);
  }

  // 初始化按键引脚
  pinMode(keyPin, INPUT);
  digitalWrite(keyPin, HIGH);   // 启用内部上拉电阻
  pinMode(keyPin2, INPUT);
  digitalWrite(keyPin2, HIGH);   // 启用内部上拉电阻

  // 注册外部中断
  attachInterrupt(digitalPinToInterrupt(keyPin), keyInterrupt, FALLING);
  attachInterrupt(digitalPinToInterrupt(keyPin2), keyInterrupt2, FALLING);
}

void loop() {
  // 不做任何事情
}

void keyInterrupt() {
  count++;   // 记录第一个按键次数
  Serial.print(count2);   // 通过串口打印第二个按键次数
  Serial.print(count);   // 通过串口打印第一个按键次数
  Serial.println();   // 换行

  if (count > 5) {
    count = 0;
  }

  // 控制 LED 灯
  int num = count2 * 10 + count;   // 将按键次数组成十进制数
  String binStr = String(num, BIN);   // 将十进制数转化为二进制字符串
  binStr = String('00000' + binStr);
  binStr = binStr.substring(binStr.length() - 5);   // 取二进制字符串后面的 5 位

  for (int i = 0; i < 5; i++) {
    if (binStr.charAt(i) == '1') {
      digitalWrite(ledPins[i], HIGH);
    } else {
      digitalWrite(ledPins[i], LOW);
    }
  }
}

void keyInterrupt2() {
  count2++;   // 记录第二个按键次数
}
  1. 重新打开串口监视器,按下两个按键,观察串口监视器和 LED 灯的输出。

注意:

  • 在编写代码时,请注意引脚的对应关系。
  • 可以根据需要修改代码中的参数,例如 LED 灯引脚和按键引脚。
  • 在连接电路时,请注意正负极的连接方式。
  • 实验过程中,要注意安全,避免触电。

扩展:

  • 可以尝试使用更多个按键,实现更多种功能。
  • 可以尝试使用不同的 LED 显示方式,例如七段数码管显示。
  • 可以尝试使用其他传感器,例如光传感器、温度传感器等,实现更复杂的应用。
Arduino 外部中断与串口通信实验:按键计数与二进制 LED 显示

原文地址: https://www.cveoy.top/t/topic/nQft 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录