Arduino 定时器与数码管显示实验:0-59 秒循环计时
使用 Arduino 定时器与数码管实现 0-59 秒循环计时
本实验使用 Arduino 定时器实现精确的 1 秒计时,并利用数码管显示 0 到 59 秒的循环计数。
目标:
- 掌握 Arduino 下的定时器使用方法
- 掌握数码管的驱动与显示方法
硬件准备:
- Arduino 开发板
- 数码管(建议使用共阳极类型)
- 必要的连接线
代码实现:
说明:
- 代码中使用了通用的数码管驱动方式,需要根据实际使用的数码管型号进行调整。
- 如果 Arduino IO 口数量不足,可以考虑使用 IO 口扩展模块。
#include <MsTimer2.h>
// 数码管共阳极接口定义
#define DIGITAL_PIN_A 2
#define DIGITAL_PIN_B 3
#define DIGITAL_PIN_C 4
#define DIGITAL_PIN_D 5
#define DIGITAL_PIN_E 6
#define DIGITAL_PIN_F 7
#define DIGITAL_PIN_G 8
#define DIGITAL_PIN_DP 9
// 数码管显示数字定义
const byte DIGITAL_NUMBERS[] = {
B11111100, // 0
B01100000, // 1
B11011010, // 2
B11110010, // 3
B01100110, // 4
B10110110, // 5
B00111110, // 6
B11100000, // 7
B11111110, // 8
B11100110, // 9
B00000000, // 空
};
// 数码管显示变量定义
int digitalFirst = 0;
int digitalSecond = 0;
// 定时器中断函数
void timerInterrupt() {
// 每秒钟进 1
digitalSecond++;
if (digitalSecond >= 60) {
digitalSecond = 0;
digitalFirst++;
if (digitalFirst >= 6) {
digitalFirst = 0;
}
}
// 显示数字
digitalWrite(DIGITAL_PIN_DP, HIGH);
digitalWrite(DIGITAL_PIN_A, (DIGITAL_NUMBERS[digitalFirst] & B10000000) != 0);
digitalWrite(DIGITAL_PIN_B, (DIGITAL_NUMBERS[digitalFirst] & B01000000) != 0);
digitalWrite(DIGITAL_PIN_C, (DIGITAL_NUMBERS[digitalFirst] & B00100000) != 0);
digitalWrite(DIGITAL_PIN_D, (DIGITAL_NUMBERS[digitalFirst] & B00010000) != 0);
digitalWrite(DIGITAL_PIN_E, (DIGITAL_NUMBERS[digitalFirst] & B00001000) != 0);
digitalWrite(DIGITAL_PIN_F, (DIGITAL_NUMBERS[digitalFirst] & B00000100) != 0);
digitalWrite(DIGITAL_PIN_G, (DIGITAL_NUMBERS[digitalFirst] & B00000010) != 0);
delay(5);
digitalWrite(DIGITAL_PIN_DP, LOW);
digitalWrite(DIGITAL_PIN_A, (DIGITAL_NUMBERS[digitalSecond] & B10000000) != 0);
digitalWrite(DIGITAL_PIN_B, (DIGITAL_NUMBERS[digitalSecond] & B01000000) != 0);
digitalWrite(DIGITAL_PIN_C, (DIGITAL_NUMBERS[digitalSecond] & B00100000) != 0);
digitalWrite(DIGITAL_PIN_D, (DIGITAL_NUMBERS[digitalSecond] & B00010000) != 0);
digitalWrite(DIGITAL_PIN_E, (DIGITAL_NUMBERS[digitalSecond] & B00001000) != 0);
digitalWrite(DIGITAL_PIN_F, (DIGITAL_NUMBERS[digitalSecond] & B00000100) != 0);
digitalWrite(DIGITAL_PIN_G, (DIGITAL_NUMBERS[digitalSecond] & B00000010) != 0);
}
void setup() {
// 初始化定时器 2,每 1 秒钟中断一次
MsTimer2::set(1000, timerInterrupt);
MsTimer2::start();
// 初始化数码管接口
pinMode(DIGITAL_PIN_A, OUTPUT);
pinMode(DIGITAL_PIN_B, OUTPUT);
pinMode(DIGITAL_PIN_C, OUTPUT);
pinMode(DIGITAL_PIN_D, OUTPUT);
pinMode(DIGITAL_PIN_E, OUTPUT);
pinMode(DIGITAL_PIN_F, OUTPUT);
pinMode(DIGITAL_PIN_G, OUTPUT);
pinMode(DIGITAL_PIN_DP, OUTPUT);
}
void loop() {
// 循环等待定时器中断
}
电路连接:
将数码管的各个段连接到代码中定义的 DIGITAL_PIN_A 到 DIGITAL_PIN_G 引脚,数码管的公共端连接到 Arduino 开发板的正极,数码管的负极连接到 Arduino 开发板的负极。
代码解释:
- 包含库文件:
#include <MsTimer2.h>,包含 MsTimer2 库,用于管理定时器中断。 - 定义引脚:
#define DIGITAL_PIN_A 2等,定义数码管每个段的连接引脚。 - 定义数字对应码:
const byte DIGITAL_NUMBERS[],定义每个数字对应的显示码,共阳极数码管,对应码为 0 表示对应段点亮,1 表示对应段熄灭。 - 定义显示变量:
int digitalFirst = 0,int digitalSecond = 0,定义两个变量用于存储要显示的数字。 - 定时器中断函数:
void timerInterrupt(),定时器中断函数,每秒钟执行一次,进行计时并更新要显示的数字。 - 初始化函数:
void setup(),初始化函数,初始化定时器和数码管引脚。 - 循环函数:
void loop(),循环函数,等待定时器中断。
注意事项:
- 使用共阴极数码管时,
DIGITAL_NUMBERS的定义需要修改。 - 由于 Arduino 的 IO 口数量有限,如果需要显示更多数字,可以考虑使用 IO 口扩展模块。
- 可以根据需要调整计时时间和显示方式。
更多信息:
- Arduino 文档:https://www.arduino.cc/
- MsTimer2 库:https://github.com/JChristensen/MsTimer2
- 共阳极数码管和共阴极数码管:https://www.elecfreaks.com/learn/7-segment-led-display-common-anode-and-common-cathode
原文地址: https://www.cveoy.top/t/topic/nUq1 著作权归作者所有。请勿转载和采集!