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

本实验旨在帮助您掌握 Arduino 的外部中断引脚和串口通信功能,并将其应用于实际项目中。我们将通过两个实验步骤,分别实现按键计数和 LED 二进制显示:

实验一:按键计数并通过串口打印

  1. 连接一个按键至 Arduino 的外部中断引脚 2 上,使用中断方式记录按键次数,并通过串口打印按键次数。

实验二:按键次数控制 LED 二进制显示

  1. 连接两个按键至外部中断引脚 2 和 3 上,并选择其他 5 个端口连接 5 个 LED。
  2. 以引脚 2 的按键次数为十位,引脚 3 的按键次数为个位,将两个按键的次数组合成十进制数,并将其转化为二进制数。
  3. 根据二进制数控制 5 个 LED 的亮灭状态,并将该二进制数打印在串口上显示。

例如:

  • 引脚 2 按了 2 下,引脚 3 按了 3 下,获得十进制数 23,对应二进制数为 00010111。
  • 此时,控制对应二进制数 '1' 的 4 个 LED 点亮,并在串口上显示 '10111'。

硬件连接

按键连接

  • 将一个按键连接到外部中断引脚 2 上。
  • 将另外两个按键分别连接到引脚 2 和 3 上。

LED 连接

  • 选择 5 个数字口,将它们连接到 5 个 LED 灯的正极。
  • 将 LED 灯的负极连接到 GND。

串口连接

  • 使用 USB 线将 Arduino 板连接到计算机上。
  • 打开 Arduino IDE,选择正确的串口和开发板类型。

代码实现

1. 初始化设置

首先,需要设置引脚模式和串口通信的波特率等信息。在 setup() 函数中进行初始化:

void setup() {
  // 设置引脚模式
  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  // 初始化串口通信
  Serial.begin(9600);
  // 设置外部中断
  attachInterrupt(digitalPinToInterrupt(2), interruptHandler, FALLING);
}
  • 输入引脚 2 和 3 需要使用上拉电阻,因此使用 INPUT_PULLUP 模式。
  • 输出引脚 4~8 需要设置为 OUTPUT 模式。
  • 初始化串口通信时,设置波特率为 9600,即 Serial.begin(9600)
  • 同时,需要设置一个外部中断,当引脚 2 的电平从高电平变为低电平时,触发中断并执行 interruptHandler() 函数。

2. 中断处理函数

接下来,需要实现 interruptHandler() 函数,用于处理按键中断。在该函数中,需要记录按键次数,然后通过串口输出:

volatile int keyCount = 0; // 用于记录按键次数,volatile 定义为全局变量
void interruptHandler() {
  keyCount++;
  Serial.println(keyCount);
}
  • keyCount 使用 volatile 关键字定义为全局变量,以便在中断函数和主循环中使用。
  • 中断函数直接将 keyCount 加 1,并通过 Serial.println() 函数将按键次数输出到串口。

3. 主循环控制

最后,在主循环中,需要实现将按键次数转化为二进制数,并控制 LED 点亮。将引脚 2 和 3 记录的按键次数转化为十进制数,然后使用 bitRead() 函数将该数转化为五位二进制数。最后,根据二进制数控制对应的 LED 灯亮灭,并通过 Serial.print() 函数将二进制数输出到串口。

void loop() {
  int num1 = keyCount / 10;
  int num2 = keyCount % 10;
  int binNum = (num1 << 1) | num2; // 转化为二进制数
  digitalWrite(4, bitRead(binNum, 0));
  digitalWrite(5, bitRead(binNum, 1));
  digitalWrite(6, bitRead(binNum, 2));
  digitalWrite(7, bitRead(binNum, 3));
  digitalWrite(8, bitRead(binNum, 4));
  delay(100); // 延时一段时间
  Serial.print("二进制数:");
  Serial.println(binNum, BIN); // 输出二进制数到串口
}

完整代码:

void setup() {
  // 设置引脚模式
  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  // 初始化串口通信
  Serial.begin(9600);
  // 设置外部中断
  attachInterrupt(digitalPinToInterrupt(2), interruptHandler, FALLING);
}

volatile int keyCount = 0;
void interruptHandler() {
  keyCount++;
  Serial.println(keyCount);
}

void loop() {
  int num1 = keyCount / 10;
  int num2 = keyCount % 10;
  int binNum = (num1 << 1) | num2; // 转化为二进制数
  digitalWrite(4, bitRead(binNum, 0));
  digitalWrite(5, bitRead(binNum, 1));
  digitalWrite(6, bitRead(binNum, 2));
  digitalWrite(7, bitRead(binNum, 3));
  digitalWrite(8, bitRead(binNum, 4));
  delay(100); // 延时一段时间
  Serial.print("二进制数:");
  Serial.println(binNum, BIN); // 输出二进制数到串口
}

通过这个实验,您将能够深入理解 Arduino 的外部中断和串口通信机制,并将其应用于更复杂的项目中。祝您实验成功!

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

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

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