Arduino 定时器与数码管显示实验代码详解

本实验旨在通过 Arduino 的定时器 2 生成精确的 1 秒间隔,并利用该间隔控制数码管的显示,实现 0-59 的循环计时。

目标:

  • 掌握 Arduino 下的定时器使用方法
  • 理解数码管的驱动与显示原理
  • 完成一个简单的计时器程序

硬件准备:

  • Arduino 开发板
  • 两个七段数码管
  • 必要的连接线

实验步骤:

  1. 连接数码管:根据数码管的位选和段选引脚,选择合适的 Arduino 引脚进行连接。例如,可以将数码管的位选引脚连接到 Arduino 的 2-9 号引脚,段选引脚连接到 Arduino 的 10-13 和 A0-A3 号引脚。
  2. 编写代码:以下代码示例演示了如何使用定时器 2 生成 1 秒间隔,并控制数码管的显示:
// 定义常量
const int digitPins[] = {2, 3, 4, 5, 6, 7, 8, 9}; // 数码管位选引脚
const int segmentPins[] = {10, 11, 12, 13, A0, A1, A2, A3}; // 数码管段选引脚
const unsigned long interval = 1000; // 定时器间隔

// 定义变量
int digits[] = {0, 0}; // 数码管显示的两位数
unsigned long previousMillis = 0; // 上一次定时器计时的时间
int digitIndex = 0; // 当前显示的数码管位选引脚

void setup() {
  // 初始化引脚
  for (int i = 0; i < 8; i++) {
    pinMode(digitPins[i], OUTPUT);
    pinMode(segmentPins[i], OUTPUT);
  }
  // 设置定时器 2
  TCCR2A = 0; // 清空寄存器 A
  TCCR2B = 0; // 清空寄存器 B
  TCNT2 = 0; // 清空计数器
  OCR2A = 249; // 设置比较值,产生 1ms 的间隔
  TCCR2A |= (1 << WGM21); // 设置比较模式
  TCCR2B |= (1 << CS22) | (1 << CS21) | (1 << CS20); // 设置预分频,64 分频,1ms 间隔
}

void loop() {
  // 获取当前时间
  unsigned long currentMillis = millis();
  // 如果定时器时间间隔已经过去
  if (currentMillis - previousMillis >= interval) {
    // 重置计时器
    previousMillis = currentMillis;
    // 计时器加一
    digits[digitIndex]++;
    // 如果当前位加到 9,就重置为 0
    if (digits[digitIndex] == 10) {
      digits[digitIndex] = 0;
    }
    // 如果当前位是个位数,就更新十位数
    if (digitIndex == 0 && digits[digitIndex] == 0) {
      digits[1]++;
      if (digits[1] == 6) {
        digits[1] = 0;
      }
    }
    // 更新显示
    updateDisplay();
    // 切换到下一个位
    digitIndex++;
    if (digitIndex == 2) {
      digitIndex = 0;
    }
  }
}

void updateDisplay() {
  // 更新数码管显示
  for (int i = 0; i < 8; i++) {
    digitalWrite(segmentPins[i], LOW);
    digitalWrite(digitPins[i], HIGH);
  }
  digitalWrite(segmentPins[digits[0]], HIGH);
  digitalWrite(digitPins[0], LOW);
  digitalWrite(segmentPins[digits[1]], HIGH);
  digitalWrite(digitPins[1], HIGH);
}
  1. 上传代码:将代码上传到 Arduino 开发板,并观察数码管的显示效果。

代码解析:

  • 代码首先定义了数码管位选引脚和段选引脚的数组,以及定时器间隔 interval
  • 变量 digits 用于存储两个数码管的显示值,previousMillis 用于记录上次定时器触发的时间,digitIndex 用于指示当前显示的数码管。
  • setup() 函数中初始化了引脚,并配置了定时器 2,使其产生 1ms 的间隔。
  • loop() 函数中使用 millis() 函数获取当前时间,并判断是否已经达到定时器间隔。如果达到,则更新 digits 数组的值,并调用 updateDisplay() 函数更新数码管显示。
  • updateDisplay() 函数根据 digits 数组的值,控制数码管的段选引脚,实现数字的显示。

注意事项:

  • 在连接数码管时,要确保引脚连接正确。
  • 代码中的引脚定义和定时器配置可以根据你的实际情况进行调整。
  • 数码管显示的数字范围可以根据需要进行修改。

扩展:

  • 可以增加一个按钮,用于控制计时器的启动和停止。
  • 可以使用其他类型的定时器,例如定时器 0 或定时器 1。
  • 可以使用更复杂的显示算法,例如 BCD 码显示。

通过这个实验,你可以深入理解 Arduino 的定时器和数码管的使用方法,并为其他项目的开发打下基础。

Arduino 定时器与数码管显示实验代码详解

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

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