news 2026/5/6 22:23:38

【Arduino趣味实验手记】一位数码管模拟值实验

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Arduino趣味实验手记】一位数码管模拟值实验

目录

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接线步骤与注意事项

  1. 把数码管插在面包板中央,确保8个段引脚和1个公共引脚都独立插入不同的孔位,避免短路。
  2. 取8个220Ω限流电阻,每个电阻的一端接数码管的a-g、dp引脚,另一端接面包板的空孔位。
  3. 用杜邦线将电阻另一端的孔位,分别连接到Arduino的数字引脚2-9(严格对应上表)。
  4. 用一根杜邦线将数码管的公共阴极(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;
  1. 变量命名逻辑:用数码管的段名 a-g 和 h (代表dp小数点)作为变量名,直观对应硬件接线,方便后续维护。
  2. 数据类型:使用int(整数型),因为Arduino的引脚编号是整数(0-13)。
  3. 作用:将抽象的引脚编号与具体的数码管段码绑定,后续通过变量名操作引脚,比直接写引脚号更易理解。

5.2setup()函数:引脚模式初始化

void setup() { for (int i = 2; i <= 9; i++) { pinMode(i, OUTPUT); } }
  1. setup()函数的特性:Arduino程序启动后只执行一次,用于初始化硬件、配置参数。
  2. for循环的作用:批量遍历引脚2-9,替代重复写8次pinMode(2, OUTPUT); pinMode(3, OUTPUT);...,简化代码。
  3. 循环变量 i 从2开始,到9结束(i <= 9),每次循环 i 自增1。

​5.3pinMode()函数详解

void setup() { for (int i = 2; i <= 9; i++) { pinMode(i, OUTPUT); } }
  1. 函数原型:pinMode(pin, mode)
  2. 参数1pin:要配置的引脚编号,此处是循环变量 i 。
  3. 参数2mode:引脚模式,OUTPUT表示输出模式(可主动输出高低电平);另一种常用模式是INPUT(输入模式,用于读取外部信号)。
  4. 必要性:Arduino的数字引脚默认是INPUT模式,若不设置为OUTPUT,无法通过digitalWrite()控制电平。

5.4loop()函数:主循环显示逻辑

void loop() { digital_0(); delay(1000); // ... 中间省略digital_1()到digital_8()的调用 digital_9(); delay(1000); }
  1. loop()函数的特性setup()执行完毕后,无限循环执行内部代码,是Arduino程序的核心执行区域。
  2. 函数调用逻辑:依次调用digital_0()digital_9()这10个自定义函数,每个函数负责显示一个数字。
  3. 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.数码管完全不亮

可能原因:
  1. 公共端(COM)未接GND
  2. 限流电阻接错
  3. 引脚模式未设为OUTPUT
解决办法:
  1. 检查COM引脚与Arduino GND的连接,确保杜邦线接触良好
  2. 确认每个段引脚都串联了220Ω电阻
  3. 检查setup()函数中的for循环是否正确

问题二:个别数字显示错误(如0显示成8)

可能原因:

  1. 对应段的电平设置错误(如g段应该设为HIGH却设为LOW

解决办法:

  1. 对照数码管段码图,检查对应数字函数的 语句,修正电平值

问题三:数字显示闪烁过快/过慢

可能原因:

delay()函数的参数值设置错误

解决办法:
  • 过快:增大参数值(如改为2000,显示2秒);
  • 过慢:减小参数值(如改为500,显示0.5秒)

问题四:部分笔段不亮

可能原因:
  1. 对应引脚接线松动
  2. 限流电阻损坏
  3. 数码管笔段烧毁
解决办法:
  1. 重新插拔对应引脚的杜邦线
  2. 用万用表测量限流电阻阻值,更换损坏电阻
  3. 更换数码管测试

问题五:所有笔段全亮(显示8)

可能原因:
  1. 代码中所有电平都设为LOW,或引脚短路
解决办法:
  1. 检查代码中各显示函数的电平设置,排查面包板上是否有引脚短路情况

7.代码优化思路(进阶拓展)

当前代码的缺点是重复代码过多(10个显示函数结构相似),可通过数组+通用函数优化,核心思路如下:

  1. 一维数组整合引脚:用int segPins[] = {2,3,4,5,6,7,8,9};替代单独的变量定义。
  2. ​二维数组存储段码表:用byte numCodes[10][8] = {...};存储0-9对应的电平组合,一行对应一个数字,一列对应一个段引脚。
  3. ​封装通用显示函数:写一个void displayNum(int num)函数,通过参数num读取段码表中的数据,循环控制所有引脚的电平。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/3 10:38:42

ncmdumpGUI:终极ncm文件转换指南,轻松解锁网易云音乐

你是否曾经在网易云音乐下载了喜欢的歌曲&#xff0c;却发现只能在特定客户端播放&#xff1f;ncmdumpGUI正是为解决这一痛点而生的专业工具。作为一款基于C#开发的Windows图形界面应用程序&#xff0c;它能够将网易云音乐的加密ncm格式文件转换为通用的MP3、FLAC等音频格式&am…

作者头像 李华
网站建设 2026/5/1 3:16:12

3步搭建Zwift离线环境:告别网络限制的虚拟骑行新体验

3步搭建Zwift离线环境&#xff1a;告别网络限制的虚拟骑行新体验 【免费下载链接】zwift-offline Use Zwift offline 项目地址: https://gitcode.com/gh_mirrors/zw/zwift-offline 还在为网络不稳定而中断骑行训练感到烦恼吗&#xff1f;想在任何时间、任何地点享受流畅…

作者头像 李华
网站建设 2026/5/2 21:38:12

如何快速实现ncm转换?ncmdumpGUI一站式解决方案揭秘

如何快速实现ncm转换&#xff1f;ncmdumpGUI一站式解决方案揭秘 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换&#xff0c;Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 还在为网易云音乐的ncm格式文件无法在其他设备…

作者头像 李华
网站建设 2026/5/2 22:21:26

N_m3u8DL-RE终极指南:从零开始掌握流媒体下载技术

N_m3u8DL-RE终极指南&#xff1a;从零开始掌握流媒体下载技术 【免费下载链接】N_m3u8DL-RE 跨平台、现代且功能强大的流媒体下载器&#xff0c;支持MPD/M3U8/ISM格式。支持英语、简体中文和繁体中文。 项目地址: https://gitcode.com/GitHub_Trending/nm3/N_m3u8DL-RE …

作者头像 李华
网站建设 2026/5/4 11:17:07

anything-llm能否识别表格内容?结构化数据处理能力测试

Anything-LLM 能否识别表格内容&#xff1f;结构化数据处理能力深度解析 在企业知识管理日益依赖AI的今天&#xff0c;一个看似简单却至关重要的问题浮出水面&#xff1a;当我们将一份包含复杂财务报表或实验数据表的PDF上传到像 Anything-LLM 这样的智能文档系统时&#xff0…

作者头像 李华
网站建设 2026/4/26 9:30:03

如何零成本获得专业级中文字体?思源宋体完全指南

还在为商业项目中文字体授权费用而头疼吗&#xff1f;想要找到既专业又完全免费的中文字体吗&#xff1f;今天我要为你介绍一款改变游戏规则的开源字体——思源宋体&#xff08;Source Han Serif CN&#xff09;&#xff0c;让你从此告别字体选择的烦恼&#xff01; 【免费下载…

作者头像 李华