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

实验目的:

  • 掌握 Arduino 的外部中断引脚有哪些,串行通信的接口是哪几个引脚,这在硬件层面上的应用很重要。
  • 掌握外部中断的触发与回调函数,串口通信的启动等。

实验内容:

  1. 连接 1 个按键至外部中断引脚 2 上,Arduino 记录按键次数(采用中断方式,非查询方式),并通过串口打印按键次数。
  2. 连接 2 个按键至外部中断引脚 2、3 上,同时自己选取其它的 5 个端口接 5 个 LED;以 2 号引脚按键次数为十位,3 号引脚按键次数为个位,将这二个按键的次数组合成十进制数后转化为二进制,要求控制 5 个 LED 以对应的二进制数显示,并将该二进制数打印在串口上显示。举例:2 号引脚按了 2 下,3 号引脚按了 3 下,获得十进制数 23,对应二进制数为 00010111,即控制标红的这四个灯点亮,并且串口显示 10111。

实验步骤:

  1. 连接 1 个按键至外部中断引脚 2 上,定义一个计数器变量 count,初始化为 0。
  2. 在 setup() 函数中,使用 attachInterrupt() 函数将中断引脚 2 绑定到一个中断服务函数中,当按键被按下时,该函数将被调用。
  3. 在中断服务函数中,每次按键被按下,将计数器变量 count 加 1,然后通过串口打印按键次数。
  4. 连接 2 个按键至外部中断引脚 2、3 上,同时连接 5 个 LED 到自己选取的 5 个端口上。
  5. 在 setup() 函数中,使用 attachInterrupt() 函数将中断引脚 2 和 3 绑定到两个不同的中断服务函数中,当按键被按下时,对应的函数将被调用。
  6. 在两个中断服务函数中,分别记录按键被按下的次数,然后将这两个计数器变量的值组合成一个十进制数,并将该数转化为二进制数。
  7. 控制 5 个 LED 的状态,使其对应二进制数的每一个位。
  8. 在串口上打印该二进制数。

代码实现:

int count = 0; // 记录按键次数
int count2 = 0; // 记录第二个按键次数
int count3 = 0; // 记录第三个按键次数
int ledPin1 = 2; // LED 1 对应引脚
int ledPin2 = 3; // LED 2 对应引脚
int ledPin3 = 4; // LED 3 对应引脚
int ledPin4 = 5; // LED 4 对应引脚
int ledPin5 = 6; // LED 5 对应引脚

void setup() {
  Serial.begin(9600);
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);
  pinMode(ledPin5, OUTPUT);
  attachInterrupt(digitalPinToInterrupt(2), handleInterrupt1, FALLING);
  attachInterrupt(digitalPinToInterrupt(3), handleInterrupt2, FALLING);
}

void loop() {
}

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

void handleInterrupt2() {
  count2++; // 记录第二个按键次数
  count3++; // 记录第三个按键次数
  int num = count2 * 10 + count3; // 将两个计数器变量组合成一个十进制数
  String binary = String(num, BIN); // 将该数转化为二进制数
  while (binary.length() < 5) { // 将二进制数补齐到 5 位
    binary = '0' + binary;
  }
  digitalWrite(ledPin1, binary.charAt(4) == '1' ? HIGH : LOW); // 控制 LED 1 的状态
  digitalWrite(ledPin2, binary.charAt(3) == '1' ? HIGH : LOW); // 控制 LED 2 的状态
  digitalWrite(ledPin3, binary.charAt(2) == '1' ? HIGH : LOW); // 控制 LED 3 的状态
  digitalWrite(ledPin4, binary.charAt(1) == '1' ? HIGH : LOW); // 控制 LED 4 的状态
  digitalWrite(ledPin5, binary.charAt(0) == '1' ? HIGH : LOW); // 控制 LED 5 的状态
  Serial.println(binary); // 在串口上打印该二进制数
}

该程序中,我们使用了 attachInterrupt() 函数来绑定中断引脚到中断服务函数中。在中断服务函数中,我们记录按键被按下的次数,并且在第二个中断服务函数中,我们将两个计数器变量组合成一个十进制数,并将该数转化为二进制数。然后,我们控制 5 个 LED 的状态,使其对应二进制数的每一个位,并在串口上打印该二进制数。

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

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

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