Arduino 外部中断与串口通信实验:按键计数与二进制 LED 显示
Arduino 外部中断与串口通信实验:按键计数与二进制 LED 显示
实验目的:
- 掌握 Arduino 的外部中断引脚有哪些,串行通信的接口是哪几个引脚,这在硬件层面上的应用很重要。
- 掌握外部中断的触发与回调函数,串口通信的启动等。
实验内容:
- 连接 1 个按键至外部中断引脚 2 上,Arduino 记录按键次数(采用中断方式,非查询方式),并通过串口打印按键次数。
- 连接 2 个按键至外部中断引脚 2、3 上,同时自己选取其它的 5 个端口接 5 个 LED;以 2 号引脚按键次数为十位,3 号引脚按键次数为个位,将这二个按键的次数组合成十进制数后转化为二进制,要求控制 5 个 LED 以对应的二进制数显示,并将该二进制数打印在串口上显示。举例:2 号引脚按了 2 下,3 号引脚按了 3 下,获得十进制数 23,对应二进制数为 00010111,即控制标红的这四个灯点亮,并且串口显示 10111。
实验步骤:
- 连接 1 个按键至外部中断引脚 2 上,定义一个计数器变量 count,初始化为 0。
- 在 setup() 函数中,使用 attachInterrupt() 函数将中断引脚 2 绑定到一个中断服务函数中,当按键被按下时,该函数将被调用。
- 在中断服务函数中,每次按键被按下,将计数器变量 count 加 1,然后通过串口打印按键次数。
- 连接 2 个按键至外部中断引脚 2、3 上,同时连接 5 个 LED 到自己选取的 5 个端口上。
- 在 setup() 函数中,使用 attachInterrupt() 函数将中断引脚 2 和 3 绑定到两个不同的中断服务函数中,当按键被按下时,对应的函数将被调用。
- 在两个中断服务函数中,分别记录按键被按下的次数,然后将这两个计数器变量的值组合成一个十进制数,并将该数转化为二进制数。
- 控制 5 个 LED 的状态,使其对应二进制数的每一个位。
- 在串口上打印该二进制数。
代码实现:
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 的状态,使其对应二进制数的每一个位,并在串口上打印该二进制数。
原文地址: https://www.cveoy.top/t/topic/nP1q 著作权归作者所有。请勿转载和采集!