Arduino 外部中断与串口通信实验 - 掌握按键计数和 LED 二进制显示
Arduino 外部中断与串口通信实验 - 掌握按键计数和 LED 二进制显示
本实验旨在帮助您掌握 Arduino 的外部中断引脚和串口通信功能,并将其应用于实际项目中。我们将通过两个实验步骤,分别实现按键计数和 LED 二进制显示:
实验一:按键计数并通过串口打印
- 连接一个按键至 Arduino 的外部中断引脚 2 上,使用中断方式记录按键次数,并通过串口打印按键次数。
实验二:按键次数控制 LED 二进制显示
- 连接两个按键至外部中断引脚 2 和 3 上,并选择其他 5 个端口连接 5 个 LED。
- 以引脚 2 的按键次数为十位,引脚 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 的外部中断和串口通信机制,并将其应用于更复杂的项目中。祝您实验成功!
原文地址: https://www.cveoy.top/t/topic/nQfo 著作权归作者所有。请勿转载和采集!