目录
1.实验结果展示
2.实验连接图
2.1接线步骤与注意事项
2.2 关键注意事项
3.实验材料
3.1实验材料介绍
4.代码
4.1代码原理详解
1.点亮逻辑本质
2.段码与数字的对应关系
5.代码逐行深度解析
5.1 变量定义部分:引脚映射
5.2 setup()函数:引脚模式初始化
5.3 pinMode()函数详解
5.4 loop()函数:主循环显示逻辑
5.5 自定义显示函数:digital_X()
1.函数定义格式: void 函数名() { 函数体 }
2.digitalWrite()函数详解
3.各数字函数的共性与差异
6.常见故障排查与解决方法
问题1.数码管完全不亮
可能原因:
解决办法:
问题三:数字显示闪烁过快/过慢
可能原因:
解决办法:
问题四:部分笔段不亮
可能原因:
解决办法:
问题五:所有笔段全亮(显示8)
可能原因:
7.代码优化思路(进阶拓展)
1.实验结果展示
VID20251210155942
2.实验连接图
2.1接线步骤与注意事项
- 把数码管插在面包板中央,确保8个段引脚和1个公共引脚都独立插入不同的孔位,避免短路。
- 取8个220Ω限流电阻,每个电阻的一端接数码管的a-g、dp引脚,另一端接面包板的空孔位。
- 用杜邦线将电阻另一端的孔位,分别连接到Arduino的数字引脚2-9(严格对应上表)。
- 用一根杜邦线将数码管的公共阴极(COM)引脚连接到Arduino的GND引脚。
2.2 关键注意事项
- 限流电阻必须串联在段引脚与Arduino引脚之间,不能直接将数码管引脚接Arduino,否则大电流会烧毁元件。
- 接线时注意杜邦线的颜色区分(如红色接高电平相关,黑色接地),方便后续排查故障。
- 确认数码管是共阴极类型,若误用共阳极数码管,代码逻辑需要完全反转。
3.实验材料
Arduino 板1个,
USB下载数据线1根,
面包板1个,
杜邦线若干,
一位数码管,
220欧姆电阻8个
3.1实验材料介绍
一位数码管:是一种简单的显示器件,由多个发光二极管以特定形状组合而成,主要用于显示单个数字或简单符号。以下是详细介绍:
- 内部结构:一位数码管通常由 8 个发光二极管组成,其中 7 个用于构成数字 0-9 的字形,分别标记为 A、B、C、D、E、F、G,另一个为小数点 DP。
- 分类及工作原理:按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管。
共阳数码管:是指将所有发光二极管的阳极接到一起形成公共阳极 (COM) 的数码管,共阳数码管在应用时应将公共极 COM 接到 + 5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。
共阴数码管:是指将所有发光二极管的阴极接到一起形成公共阴极 (COM) 的数码管,共阴数码管在应用时应将公共极 COM 接到地线 GND 上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。
本次实验我们基于共阴极数码管来实现。
4.代码
// 定义数字引脚2-9对应数码管a-g段、dp段(共阴极:低电平点亮) int a = 2; // 数码管a段 int b = 3; // 数码管b段 int c = 4; // 数码管c段 int d = 5; // 数码管d段 int e = 6; // 数码管e段 int f = 7; // 数码管f段 int g = 8; // 数码管g段 int h = 9; // 数码管dp段(小数点) void setup() { // 批量设置引脚2-9为输出模式 for (int i = 2; i <= 9; i++) { pinMode(i, OUTPUT); } } void loop() { // 循环显示0-9,每个数字停留1秒 digital_0(); delay(1000); digital_1(); delay(1000); digital_2(); delay(1000); digital_3(); delay(1000); digital_4(); delay(1000); digital_5(); delay(1000); digital_6(); delay(1000); digital_7(); delay(1000); digital_8(); delay(1000); digital_9(); delay(1000); } // 显示数字0(共阴极:对应段低电平点亮) void digital_0() { digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, HIGH); digitalWrite(h, HIGH); } // 显示数字1 void digital_1() { digitalWrite(a, HIGH); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH); digitalWrite(h, HIGH); } // 显示数字2 void digital_2() { digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, HIGH); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, HIGH); digitalWrite(g, LOW); digitalWrite(h, HIGH); } // 显示数字3 void digital_3() { digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, LOW); digitalWrite(h, HIGH); } // 显示数字4 void digital_4() { digitalWrite(a, HIGH); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, LOW); digitalWrite(g, LOW); digitalWrite(h, HIGH); } // 显示数字5 void digital_5() { digitalWrite(a, LOW); digitalWrite(b, HIGH); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, HIGH); digitalWrite(f, LOW); digitalWrite(g, LOW); digitalWrite(h, HIGH); } // 显示数字6 void digital_6() { digitalWrite(a, LOW); digitalWrite(b, HIGH); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); digitalWrite(h, HIGH); } // 显示数字7 void digital_7() { digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH); digitalWrite(h, HIGH); } // 显示数字8(全亮) void digital_8() { digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); digitalWrite(h, HIGH); } // 显示数字9 void digital_9() { digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, HIGH); digitalWrite(f, LOW); digitalWrite(g, LOW); digitalWrite(h, HIGH); }4.1代码原理详解
1.点亮逻辑本质
常规共阴极逻辑:公共端(COM)接GND(地),某一段引脚接高电平(HIGH,约5V) 时,该段的发光二极管导通,笔段点亮;接低电平(LOW,约0V) 时,二极管截止,笔段熄灭。
本实验特殊逻辑:代码中采用低电平点亮、高电平熄灭的反向控制方式,原理是通过硬件接线或代码逻辑反转实现,核心是“段引脚与公共端形成电势差即可点亮”。
2.段码与数字的对应关系
不同数字的显示,本质是控制不同笔段的亮灭组合。例如:
- 显示数字0:需要点亮 a、b、c、d、e、f 段,熄灭 g 段;
- 显示数字8:需要点亮 a-g 所有段;
- 本实验中小数点 dp 全程熄灭,因此对应的引脚始终保持高电平。
5.代码逐行深度解析
5.1 变量定义部分:引脚映射
int a = 2; int b = 3; int c = 4; int d = 5; int e = 6; int f = 7; int g = 8; int h = 9;- 变量命名逻辑:用数码管的段名 a-g 和 h (代表dp小数点)作为变量名,直观对应硬件接线,方便后续维护。
- 数据类型:使用int(整数型),因为Arduino的引脚编号是整数(0-13)。
- 作用:将抽象的引脚编号与具体的数码管段码绑定,后续通过变量名操作引脚,比直接写引脚号更易理解。
5.2setup()函数:引脚模式初始化
void setup() { for (int i = 2; i <= 9; i++) { pinMode(i, OUTPUT); } }- setup()函数的特性:Arduino程序启动后只执行一次,用于初始化硬件、配置参数。
- for循环的作用:批量遍历引脚2-9,替代重复写8次pinMode(2, OUTPUT); pinMode(3, OUTPUT);...,简化代码。
- 循环变量 i 从2开始,到9结束(i <= 9),每次循环 i 自增1。
5.3pinMode()函数详解
void setup() { for (int i = 2; i <= 9; i++) { pinMode(i, OUTPUT); } }- 函数原型:pinMode(pin, mode)
- 参数1pin:要配置的引脚编号,此处是循环变量 i 。
- 参数2mode:引脚模式,OUTPUT表示输出模式(可主动输出高低电平);另一种常用模式是INPUT(输入模式,用于读取外部信号)。
- 必要性:Arduino的数字引脚默认是INPUT模式,若不设置为OUTPUT,无法通过digitalWrite()控制电平。
5.4loop()函数:主循环显示逻辑
void loop() { digital_0(); delay(1000); // ... 中间省略digital_1()到digital_8()的调用 digital_9(); delay(1000); }- loop()函数的特性:setup()执行完毕后,无限循环执行内部代码,是Arduino程序的核心执行区域。
- 函数调用逻辑:依次调用digital_0()到digital_9()这10个自定义函数,每个函数负责显示一个数字。
- delay()函数详解
- 函数原型:delay(ms)
- 参数 ms:延时时间,单位是毫秒(ms),1000ms = 1秒。
- 作用:执行到该函数时,程序暂停对应时间,再继续执行下一行代码。
- 阻塞性说明:delay()是阻塞式延时,延时期间Arduino无法执行其他操作(如读取传感器、响应按键),适合简单的定时显示场景。
- 循环显示原理:当执行到digital_9()和对应的delay(1000)后,loop()函数会回到开头,重新调用digital_0(),如此反复,实现0-9的循环显示。
5.5 自定义显示函数:digital_X()
以digital_0()为例,解析段码控制逻辑
void digital_0() { digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, HIGH); digitalWrite(h, HIGH); }1.函数定义格式:void函数名() { 函数体 }
- void:表示函数无返回值,执行完后不向调用处返回任何数据。
- 函数名digital_0():见名知意,明确表示该函数的功能是显示数字0。
2.digitalWrite()函数详解
- 函数原型:digitalWrite(pin, value)
- 参数1pin:要控制的引脚编号,此处是之前定义的变量 a、b、c... 。
- 参数2value:引脚输出的电平,LOW表示低电平(0V),HIGH表示高电平(5V)。
- 与硬件的关联:在本实验逻辑中,digitalWrite(引脚, LOW) 对应段码点亮,HIGH对应段码熄灭。
3.各数字函数的共性与差异
- 共性:所有函数中digitalWrite(h, HIGH)保持不变,因此小数点全程不亮。
- 差异:不同函数通过调整 a-g 引脚的电平组合,实现不同数字的显示(如digital_1()只点亮 b、c 段,其余熄灭)。
6.常见故障排查与解决方法
问题1.数码管完全不亮
可能原因:
- 公共端(COM)未接GND
- 限流电阻接错
- 引脚模式未设为OUTPUT
解决办法:
- 检查COM引脚与Arduino GND的连接,确保杜邦线接触良好
- 确认每个段引脚都串联了220Ω电阻
- 检查setup()函数中的for循环是否正确
问题二:个别数字显示错误(如0显示成8)
可能原因:
- 对应段的电平设置错误(如g段应该设为HIGH却设为LOW)
解决办法:
- 对照数码管段码图,检查对应数字函数的 语句,修正电平值
问题三:数字显示闪烁过快/过慢
可能原因:
delay()函数的参数值设置错误
解决办法:
- 过快:增大参数值(如改为2000,显示2秒);
- 过慢:减小参数值(如改为500,显示0.5秒)
问题四:部分笔段不亮
可能原因:
- 对应引脚接线松动
- 限流电阻损坏
- 数码管笔段烧毁
解决办法:
- 重新插拔对应引脚的杜邦线
- 用万用表测量限流电阻阻值,更换损坏电阻
- 更换数码管测试
问题五:所有笔段全亮(显示8)
可能原因:
- 代码中所有电平都设为LOW,或引脚短路
解决办法:
- 检查代码中各显示函数的电平设置,排查面包板上是否有引脚短路情况
7.代码优化思路(进阶拓展)
当前代码的缺点是重复代码过多(10个显示函数结构相似),可通过数组+通用函数优化,核心思路如下:
- 一维数组整合引脚:用int segPins[] = {2,3,4,5,6,7,8,9};替代单独的变量定义。
- 二维数组存储段码表:用byte numCodes[10][8] = {...};存储0-9对应的电平组合,一行对应一个数字,一列对应一个段引脚。
- 封装通用显示函数:写一个void displayNum(int num)函数,通过参数num读取段码表中的数据,循环控制所有引脚的电平。