Arduino 定时器与数码管显示实验代码详解
Arduino 定时器与数码管显示实验代码详解
本实验旨在通过 Arduino 的定时器 2 生成精确的 1 秒间隔,并利用该间隔控制数码管的显示,实现 0-59 的循环计时。
目标:
- 掌握 Arduino 下的定时器使用方法
- 理解数码管的驱动与显示原理
- 完成一个简单的计时器程序
硬件准备:
- Arduino 开发板
- 两个七段数码管
- 必要的连接线
实验步骤:
- 连接数码管:根据数码管的位选和段选引脚,选择合适的 Arduino 引脚进行连接。例如,可以将数码管的位选引脚连接到 Arduino 的 2-9 号引脚,段选引脚连接到 Arduino 的 10-13 和 A0-A3 号引脚。
- 编写代码:以下代码示例演示了如何使用定时器 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);
}
- 上传代码:将代码上传到 Arduino 开发板,并观察数码管的显示效果。
代码解析:
- 代码首先定义了数码管位选引脚和段选引脚的数组,以及定时器间隔
interval。 - 变量
digits用于存储两个数码管的显示值,previousMillis用于记录上次定时器触发的时间,digitIndex用于指示当前显示的数码管。 setup()函数中初始化了引脚,并配置了定时器 2,使其产生 1ms 的间隔。loop()函数中使用millis()函数获取当前时间,并判断是否已经达到定时器间隔。如果达到,则更新digits数组的值,并调用updateDisplay()函数更新数码管显示。updateDisplay()函数根据digits数组的值,控制数码管的段选引脚,实现数字的显示。
注意事项:
- 在连接数码管时,要确保引脚连接正确。
- 代码中的引脚定义和定时器配置可以根据你的实际情况进行调整。
- 数码管显示的数字范围可以根据需要进行修改。
扩展:
- 可以增加一个按钮,用于控制计时器的启动和停止。
- 可以使用其他类型的定时器,例如定时器 0 或定时器 1。
- 可以使用更复杂的显示算法,例如 BCD 码显示。
通过这个实验,你可以深入理解 Arduino 的定时器和数码管的使用方法,并为其他项目的开发打下基础。
原文地址: https://www.cveoy.top/t/topic/nUp2 著作权归作者所有。请勿转载和采集!