使用 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 开发板的负极。

代码解释:

  1. 包含库文件: #include <MsTimer2.h>,包含 MsTimer2 库,用于管理定时器中断。
  2. 定义引脚: #define DIGITAL_PIN_A 2 等,定义数码管每个段的连接引脚。
  3. 定义数字对应码: const byte DIGITAL_NUMBERS[],定义每个数字对应的显示码,共阳极数码管,对应码为 0 表示对应段点亮,1 表示对应段熄灭。
  4. 定义显示变量: int digitalFirst = 0int digitalSecond = 0,定义两个变量用于存储要显示的数字。
  5. 定时器中断函数: void timerInterrupt(),定时器中断函数,每秒钟执行一次,进行计时并更新要显示的数字。
  6. 初始化函数: void setup(),初始化函数,初始化定时器和数码管引脚。
  7. 循环函数: 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
Arduino 定时器与数码管显示实验:0-59 秒循环计时

原文地址: https://www.cveoy.top/t/topic/nUq1 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录