文章目录一.编写Arduino计时器的步骤1.1 硬件的准备1.2 硬件的接线1.3核心原理1.4 代码编写二.总结2.1 常见问题及解决方法2.2 关键算法2.3 程序结果一.编写Arduino计时器的步骤1.1 硬件的准备Arduino Uno控制器1个四位共阴数码管1个10k 欧姆电阻1个按键1个面包版条线若干1.2 硬件的接线Arduino 引脚 四位共阴极数码管 其他元件数字引脚7 a段 串联220Ω电阻数字引脚8 b段 串联220Ω电阻数字引脚9 c段 串联220Ω电阻数字引脚10 d段 串联220Ω电阻数字引脚11 e段 串联220Ω电阻数字引脚12 f段 串联220Ω电阻数字引脚13 g段 串联220Ω电阻模拟引脚A0 dp段小数点 串联220Ω电阻数字引脚2 COM1千位位选数字引脚3 COM2百位位选数字引脚5 COM3十位位选数字引脚6 COM4个位位选数字引脚4 按键一端GND 按键另一端5V 数码管公共电源端共阴极GND 数码管公共地端1.3核心原理四位共阴极数码管驱动:采用动态扫描方式,依次点亮千、百、十、个位数码管利用人眼视觉暂留效应实现四位同时亮的视觉效果。共阴极数码管的段引脚高电平点亮对应段位引脚低电平点亮对应位。计时逻辑:通过millis() 函数实现非阻塞 延时每1000ms (1秒) 计数加1,达到9999后归零循环。按键控制:启用Arduino内部上拉电阻按键按下时引脚拉低通过消抖处理避免误触发实现计数启停的切换。1.4 代码编写//数码管a,b,c,d,e,f,g,dp对应引脚#defineSEG_A7#defineSEG_B8#defineSEG_C9#defineSEG_D10#defineSEG_E11#defineSEG_F12#defineSEG_G13#defineSEG_HA0// dp引脚#defineCOM12#defineCOM23#defineCOM35#defineCOM46#defineKEY_PIN4intledCount8;intsegCount4;longpreviousMillis0;// 数码管段码表0-9共阴极constunsignedcharDuanMa[10]{0x3f,// 0: 001111110x06,// 1: 000001100x5b,// 2: 010110110x4f,// 3: 010011110x66,// 4: 011001100x6d,// 5: 011011010x7d,// 6: 011111010x07,// 7: 000001110x7f,// 8: 011111110x6f// 9: 01101111};intledPins[]{7,8,9,10,11,12,13,A0};intsegPins[]{2,3,5,6};unsignedchardisplayTemp[4];// 全局变量计数启停标志、按键状态消抖、计数使能bool countEnablefalse;bool lastKeyStateHIGH;// 内部上拉默认高电平bool currentKeyStateHIGH;voidsetup(){// 初始化数码管段引脚for(intledpin0;ledpinledCount;ledpin){pinMode(ledPins[ledpin],OUTPUT);}// 初始化数码管位引脚for(intsegpin0;segpinsegCount;segpin){pinMode(segPins[segpin],OUTPUT);digitalWrite(segPins[segpin],HIGH);// 初始关闭所有位选共阴极低电平有效}// 初始化按键引脚启用内部上拉按键按下为低电平pinMode(KEY_PIN,INPUT_PULLUP);// 初始化显示缓冲区为0displayTemp[0]DuanMa[0];displayTemp[1]DuanMa[0];displayTemp[2]DuanMa[0];displayTemp[3]DuanMa[0];}// 数码管段码输出函数消影处理voiddeal(unsignedcharvalue){// 先短暂关闭所有段消影for(inti0;i8;i){digitalWrite(ledPins[i],LOW);}delayMicroseconds(100);// 100微秒消影// 输出段码for(inti0;i8;i){digitalWrite(ledPins[i],bitRead(value,i));}}// 按键处理函数检测按键状态控制计数启停消抖处理voidhandleKeyPress(){// 读取当前按键状态内部上拉按下为低电平currentKeyStatedigitalRead(KEY_PIN);// 按键消抖当前状态与上一次不同且稳定为低电平按下if(currentKeyStateLOWlastKeyStateHIGH){delay(20);// 消抖延迟20ms// 再次确认按键按下避免误触if(digitalRead(KEY_PIN)LOW){countEnable!countEnable;// 翻转计数使能状态// 等待按键释放避免重复触发while(digitalRead(KEY_PIN)LOW);}}// 更新上一次按键状态lastKeyStatecurrentKeyState;}voidloop(){staticunsignedintnum0;staticunsignedlonglastUpdateTime0;staticunsignedlonglastScanTime0;staticintcurrentDigit0;// 1. 处理按键逻辑每次循环检测handleKeyPress();// 2. 仅当计数使能时更新数字if(countEnablemillis()-lastUpdateTime1000){lastUpdateTimemillis();num(num1)%10000;// 四位数码管计数0-9999循环// 更新显示缓冲区displayTemp[0]DuanMa[num/1000];// 千位displayTemp[1]DuanMa[(num%1000)/100];// 百位displayTemp[2]DuanMa[(num%100)/10];// 十位displayTemp[3]DuanMa[num%10];// 个位}// 3. 数码管动态扫描每3ms扫描一位保证显示稳定if(millis()-lastScanTime3){lastScanTimemillis();// 步骤1关闭当前数码管位选消影第一步digitalWrite(segPins[currentDigit],HIGH);// 步骤2关闭所有段消影第二步deal(0x00);// 步骤3切换到下一个数码管currentDigit(currentDigit1)%4;// 步骤4打开新数码管位选并显示内容digitalWrite(segPins[currentDigit],LOW);// 共阴极低电平有效deal(displayTemp[currentDigit]);// 显示对应段码}}二.总结2.1 常见问题及解决方法LCD不显示:检查|2C地址是否正确( 可通过I2C扫描程序检测)确认SDA/SCL接线无误按键无响应:确认引脚模式为INPUT_ _PULLUP 按键另-端是否接GND,增加消抖延时时间走时不准: millis() 受Timer0影响,若使用analogWrite() 可能干扰建议改用Timer1中断实现更高精度2.2 关键算法按键消抖检测到按键按下后延时20ms再次确认动态扫描快速轮流点亮4个数码管利用视觉暂留形成稳定显示消影处理在切换数码管前短暂关闭所有段防止显示模糊2.3 程序结果上电后数码管显示0000按下按键开始计时每秒数字加10→1→2→…→9999→0循环再次按下按键暂停计时数码管显示稳定无闪烁