Arduino 外部中断与串口通信实验:按键计数和二进制 LED 显示
Arduino 外部中断与串口通信实验:按键计数和二进制 LED 显示
目的:
- 掌握 Arduino 的外部中断引脚和串口通信接口,以及它们在硬件层面的应用。
- 理解外部中断的触发机制和回调函数,以及串口通信的启动方法。
实验内容:
① 按键计数并串口打印:
- 连接一个按键至外部中断引脚 2 上。
- 使用中断方式(非查询方式)记录按键次数,并通过串口打印按键次数。
② 按键计数组合并二进制 LED 显示:
- 连接两个按键至外部中断引脚 2 和 3 上。
- 选择其他 5 个端口连接 5 个 LED。
- 以 2 号引脚按键次数为十位,3 号引脚按键次数为个位,将两个按键的次数组合成十进制数,并将其转化为二进制。
- 控制 5 个 LED 以对应的二进制数显示,并将该二进制数打印在串口上。
举例: 2 号引脚按了 2 下,3 号引脚按了 3 下,获得十进制数 23,对应二进制数为 00010111,即控制标红的这四个灯点亮,并且串口显示 10111。
实验代码:
① 按键计数并串口打印:
int buttonPin = 2; // 按键引脚
int buttonState = 0; // 按键状态
int count = 0; // 计数器
void setup() {
Serial.begin(9600); // 初始化串口通信
pinMode(buttonPin, INPUT_PULLUP); // 将引脚设置为输入模式并开启上拉电阻
attachInterrupt(digitalPinToInterrupt(buttonPin), countUp, FALLING); // 将中断函数与引脚绑定
}
void loop() {
// 无需执行任何操作,等待中断触发
}
void countUp() {
count++; // 次数加一
Serial.println(count); // 串口打印次数
}
② 按键计数组合并二进制 LED 显示:
int buttonPin1 = 2; // 按键1引脚
int buttonPin2 = 3; // 按键2引脚
int ledPin1 = 4; // LED1引脚
int ledPin2 = 5; // LED2引脚
int ledPin3 = 6; // LED3引脚
int ledPin4 = 7; // LED4引脚
int ledPin5 = 8; // LED5引脚
int buttonState1 = 0; // 按键1状态
int buttonState2 = 0; // 按键2状态
int count1 = 0; // 按键1计数器
int count2 = 0; // 按键2计数器
void setup() {
Serial.begin(9600); // 初始化串口通信
pinMode(buttonPin1, INPUT_PULLUP); // 将按键1引脚设置为输入模式并开启上拉电阻
pinMode(buttonPin2, INPUT_PULLUP); // 将按键2引脚设置为输入模式并开启上拉电阻
pinMode(ledPin1, OUTPUT); // 将LED1引脚设置为输出模式
pinMode(ledPin2, OUTPUT); // 将LED2引脚设置为输出模式
pinMode(ledPin3, OUTPUT); // 将LED3引脚设置为输出模式
pinMode(ledPin4, OUTPUT); // 将LED4引脚设置为输出模式
pinMode(ledPin5, OUTPUT); // 将LED5引脚设置为输出模式
attachInterrupt(digitalPinToInterrupt(buttonPin1), countUp1, FALLING); // 将按键1中断函数与引脚绑定
attachInterrupt(digitalPinToInterrupt(buttonPin2), countUp2, FALLING); // 将按键2中断函数与引脚绑定
}
void loop() {
int num = count1 * 10 + count2; // 将按键次数合成十进制数
String binaryNum = String(num, BIN); // 将十进制数转化为二进制
int len = binaryNum.length(); // 获取二进制数的长度
while (len < 5) { // 如果二进制数长度小于5位,在其前面添加0
binaryNum = '0' + binaryNum;
len++;
}
Serial.println(binaryNum); // 串口打印二进制数
digitalWrite(ledPin1, binaryNum.charAt(4) - '0'); // 控制LED1
digitalWrite(ledPin2, binaryNum.charAt(3) - '0'); // 控制LED2
digitalWrite(ledPin3, binaryNum.charAt(2) - '0'); // 控制LED3
digitalWrite(ledPin4, binaryNum.charAt(1) - '0'); // 控制LED4
digitalWrite(ledPin5, binaryNum.charAt(0) - '0'); // 控制LED5
}
void countUp1() {
count1++; // 按键1次数加一
}
void countUp2() {
count2++; // 按键2次数加一
}
原文地址: https://www.cveoy.top/t/topic/nQha 著作权归作者所有。请勿转载和采集!