改实验代码是什么定时器与数码管显示目的:掌握ARDUINO下的定时器使用方法数码管的驱动与显示方法内容:①利用定时器2产生精确的1秒并进行计时实现0-59的循环显示;连接2个数码管需要10个端口自己选择与分配如果不够可以考虑进行IO口扩展。
以下是改进后的实验代码:
// 定义常量
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);
}
这个代码使用了定时器2来产生1ms的间隔,然后每隔1秒更新一次数码管显示。两个数码管的位选引脚和段选引脚分别通过数组进行定义和管理。使用了一个digits数组来存储当前显示的两个数码管的数字,然后在定时器中每隔一秒更新一次数字,并更新显示。更新显示使用了updateDisplay()函数,该函数会根据digits数组的值来更新数码管的显示
原文地址: https://www.cveoy.top/t/topic/eC7F 著作权归作者所有。请勿转载和采集!