Arduino 外部中断与串口通信实验:按键计数与二进制 LED 显示
Arduino 外部中断与串口通信实验:按键计数与二进制 LED 显示
实验目的:
- 掌握 Arduino 的外部中断引脚以及串口通信接口,了解其在硬件层面的应用。
- 学习如何使用外部中断的触发与回调函数,以及串口通信的启动与数据传输。
实验内容:
- 部分 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:单按键计数与串口打印
- 连接一个按键到外部中断引脚 2 上,并将其它五个引脚连接五个 LED 灯,电阻大小为 220Ω。按键连接方式如下图所示:

- 打开 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);
}
}
}
- 打开串口监视器,设置波特率为 9600,按下按键,观察串口监视器中的输出,同时 LED 灯也会相应地控制。
部分 2:双按键计数与二进制 LED 显示
- 将第二个按键连接到外部中断引脚 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++; // 记录第二个按键次数
}
- 重新打开串口监视器,按下两个按键,观察串口监视器和 LED 灯的输出。
注意:
- 在编写代码时,请注意引脚的对应关系。
- 可以根据需要修改代码中的参数,例如 LED 灯引脚和按键引脚。
- 在连接电路时,请注意正负极的连接方式。
- 实验过程中,要注意安全,避免触电。
扩展:
- 可以尝试使用更多个按键,实现更多种功能。
- 可以尝试使用不同的 LED 显示方式,例如七段数码管显示。
- 可以尝试使用其他传感器,例如光传感器、温度传感器等,实现更复杂的应用。
原文地址: https://www.cveoy.top/t/topic/nQft 著作权归作者所有。请勿转载和采集!