当前位置: 首页 > news >正文

【Arduino Uno】数码管模拟值实验

目录

  • 一.1位数码管模拟值
    • 1.共阳极数码管实验效果
    • 2.共阳极与共阴极数码管原理与构造
      • 数码管内部构造
    • 3.需要的组件
    • 4.共阳极数码管接线图
    • 5.共阳极代码
      • 阳极代码调换为阴极
    • 6.优化代码
      • 补充说明
    • 7.总结

一.1位数码管模拟值

1.共阳极数码管实验效果

数码管模拟值实验共阳极

2.共阳极与共阴极数码管原理与构造

数码管内部构造

内部结构:一位数码管通常由 8 个发光二极管组成,其中 7 个用于构成数字 0-9 的字形,分别标记为A、B、C、D、E、F、G,另一个为小数点DP

数码管分类及工作原理:按发光二极管单元连接方式可分为共阳极数码管共阴极数码管。型号分别是共阳极数码管(5161BS)和共阴极数码管(5161AS)

共阳极数码管:公共脚是正极(阳极),也就是所有二极管的阳极连接在一起,作为公共端,作为公共端所有的段码实际上是负极,当某一个或某几个段码位接低电平(LOW),公共脚接高电平(接5V)时,对应的段码位就能点亮。

共阴极数码管:公共脚是负极(阴极),也就是所有二极管的阴极连接在一起,作为公共端,段码位是阳极,当公共脚接地(3号接GND),段码位接高电平(HIGH)时,对应段码位点亮。

3.需要的组件

将需要以下组件:

Arduino UNO开发板
1个1位共阳极数码管
8个1k欧姆电阻
1个面包板
若干杜邦线或者跳线

4.共阳极数码管接线图

注意:我选用的数码管为阳极,所以公共脚(3号和8号)接5V

再来细究一下数码管所对应的引脚

1->g2->f4->a5->b6->e7->d9->c10->h

5.共阳极代码

inta=2;// 定义数字接口2 连接aintb=3;// 定义数字接口3 连接bintc=4;// 定义数字接口4 连接cintd=5;// 定义数字接口5 连接dinte=6;// 定义数字接口6 连接eintf=7;// 定义数字接口7 连接fintg=8;// 定义数字接口8 连接ginth=9;// 定义数字接口9 连接h,也就是数码管中的dpvoidsetup(){// put your setup code here, to run once:inti;for(i=2;i<=9;i++){pinMode(i,OUTPUT);// 设置2~9号引脚为输出模式}}voidloop(){// put your main code here, to run repeatedlydigital_0();// 显示数字0delay(1000);digital_1();// 显示数字1delay(1000);digital_2();// 显示数字2delay(1000);digital_3();// 显示数字3delay(1000);digital_4();// 显示数字4delay(1000);digital_5();// 显示数字5delay(1000);digital_6();// 显示数字6delay(1000);digital_7();// 显示数字7delay(1000);digital_8();// 显示数字8delay(1000);digital_9();// 显示数字9delay(1000);}// 显示数字0voiddigital_0(void){digitalWrite(a,LOW);digitalWrite(b,LOW);digitalWrite(c,LOW);digitalWrite(d,LOW);digitalWrite(e,LOW);digitalWrite(f,LOW);digitalWrite(g,HIGH);digitalWrite(h,LOW);}// 显示数字1voiddigital_1(void){digitalWrite(a,HIGH);digitalWrite(b,LOW);digitalWrite(c,LOW);digitalWrite(d,HIGH);digitalWrite(e,HIGH);digitalWrite(f,HIGH);digitalWrite(g,HIGH);digitalWrite(h,LOW);}// 显示数字2voiddigital_2(void){digitalWrite(a,LOW);digitalWrite(b,LOW);digitalWrite(c,HIGH);digitalWrite(d,LOW);digitalWrite(e,LOW);digitalWrite(f,HIGH);digitalWrite(g,LOW);digitalWrite(h,LOW);}// 显示数字3voiddigital_3(void){digitalWrite(a,LOW);digitalWrite(b,LOW);digitalWrite(c,LOW);digitalWrite(d,LOW);digitalWrite(e,HIGH);digitalWrite(f,HIGH);digitalWrite(g,LOW);digitalWrite(h,LOW);}// 显示数字4voiddigital_4(void){digitalWrite(a,HIGH);digitalWrite(b,LOW);digitalWrite(c,LOW);digitalWrite(d,HIGH);digitalWrite(e,HIGH);digitalWrite(f,LOW);digitalWrite(g,LOW);digitalWrite(h,LOW);}// 显示数字5voiddigital_5(void){digitalWrite(a,LOW);digitalWrite(b,HIGH);digitalWrite(c,LOW);digitalWrite(d,LOW);digitalWrite(e,HIGH);digitalWrite(f,LOW);digitalWrite(g,LOW);digitalWrite(h,LOW);}// 显示数字6voiddigital_6(void){digitalWrite(a,LOW);digitalWrite(b,HIGH);digitalWrite(c,LOW);digitalWrite(d,LOW);digitalWrite(e,LOW);digitalWrite(f,LOW);digitalWrite(g,LOW);digitalWrite(h,LOW);}// 显示数字7voiddigital_7(void){digitalWrite(a,LOW);digitalWrite(b,LOW);digitalWrite(c,LOW);digitalWrite(d,HIGH);digitalWrite(e,HIGH);digitalWrite(f,HIGH);digitalWrite(g,HIGH);digitalWrite(h,LOW);}// 显示数字8voiddigital_8(void){digitalWrite(a,LOW);digitalWrite(b,LOW);digitalWrite(c,LOW);digitalWrite(d,LOW);digitalWrite(e,LOW);digitalWrite(f,LOW);digitalWrite(g,LOW);digitalWrite(h,LOW);}// 显示数字9voiddigital_9(void){digitalWrite(a,LOW);digitalWrite(b,LOW);digitalWrite(c,LOW);digitalWrite(d,LOW);digitalWrite(e,HIGH);digitalWrite(f,LOW);digitalWrite(g,LOW);digitalWrite(h,LOW);}

阳极代码调换为阴极

在讲义中修改为共阴极需要将段脚设为LOW熄灭,HIGH点亮(也就是原代码中所有digitalWrite的HIGH和LOW互换

如果烧录进去的代码是阴极的,而数码管是阳极,并且接在5V上,就会出现

数码管模拟值实验共阳极反面案例

6.优化代码

结合一维数组、二维数组和函数的封装优化上述代码

intsegPins[]={2,3,4,5,6,7,8,9};// a,b,c,d,e,f,g,dp(h)constintSEGMENT_COUNT=8;// 段数(a-g + dp)// 共阳极数码管段码表(0-9),每一行对应一个数字,每一列对应segPins的引脚电平// 数组索引:0:a,1:b,2:c,3:d,4:e,5:f,6:g,7:dpbyte numCodes[10][8]={{LOW,LOW,LOW,LOW,LOW,LOW,HIGH,LOW},// 0{HIGH,LOW,LOW,HIGH,HIGH,HIGH,HIGH,LOW},// 1{LOW,LOW,HIGH,LOW,LOW,HIGH,LOW,LOW},// 2{LOW,LOW,LOW,LOW,HIGH,HIGH,LOW,LOW},// 3{HIGH,LOW,LOW,HIGH,HIGH,LOW,LOW,LOW},// 4{LOW,HIGH,LOW,LOW,HIGH,LOW,LOW,LOW},// 5{LOW,HIGH,LOW,LOW,LOW,LOW,LOW,LOW},// 6{LOW,LOW,LOW,HIGH,HIGH,HIGH,HIGH,LOW},// 7{LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW},// 8{LOW,LOW,LOW,LOW,HIGH,LOW,LOW,LOW}// 9};voidsetup(){// 设置所有段引脚为输出模式for(inti=0;i<SEGMENT_COUNT;i++){pinMode(segPins[i],OUTPUT);}}voidloop(){// 循环显示0-9,每个数字显示1秒for(intnum=0;num<10;num++){displayNumber(num);delay(1000);}}// 通用显示函数:根据数字显示对应的段码voiddisplayNumber(intnumber){// 检查数字范围,避免数组越界if(number<0||number>9){return;// 超出范围不显示}// 遍历所有段引脚,设置对应电平for(inti=0;i<SEGMENT_COUNT;i++){digitalWrite(segPins[i],numCodes[number][i]);}}

1.段引脚数组 segPins:把原来分散定义的 a-h 引脚整合到一个数组中,方便循环操作,减少重复代码。
2.段码表 numCodes二维数组:第一维表示数字(0-9),第二维表示对应段的电平把原来 10 个函数里的电平值集中存储,一目了然,修改时只需改数组值
3.简化的 loop 函数:用一个 for 循环遍历 0-9,调用通用显示函数,替代原来重复调用 10 个函数的写法

补充说明

共阴极数码管:高电平点亮对应段,低电平(LOW)熄灭
共阳极数码管:低电平点亮对应段,高电平(HIGH)熄灭
如果需要关闭小数点,可以将段码表中最后一列(dp 位)全部改为HIGH

7.总结

每一次做Arduino板子的实验,都会从中受益很多,不仅对电子元器件上的,还有对代码上的理解都是一种进步与挑战!!!

http://www.jsqmd.com/news/84590/

相关文章:

  • 高频软件测试基础面试题
  • 挖漏洞一个月赚2万多,别被骗了!
  • 终极指南:如何为泉盛UV-K5对讲机刷入开源固件实现专业功能
  • 基于自抗扰控制ADRC的永磁同步电机仿真模型附Simulink仿真
  • C++进阶技巧:如何在同一对象中存储左值或右值
  • 进程PCB
  • 豆包手机AI Agent技术深度解析
  • Springboot医药采购管理2mqc3(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • LeetCode 41. 缺失的第一个正数 | 原地哈希最优解全解析
  • 线性回归模型
  • 榛子矮砧密植:水肥一体化系统的铺设要点指南
  • 我在私有漏洞赏金计划常规测试中发现IP欺骗漏洞的过程
  • 基于无迹卡尔曼滤波(UKF)与模型预测控制(MPC)的多无人机避撞研究附Matlab代码
  • java基础流程控制笔记
  • Flutter 通用轮播图组件 BannerWidget:自动播放 + 指示器 + 全场景适配
  • Java冷启动全指南:从原理到实战优化
  • 校招 Java 面试必看:JVM 其实就考这 3 个点(我帮你讲透)
  • 列表基本概念
  • Flutter 通用下拉刷新上拉加载列表 RefreshListWidget:分页 + 空态 + 错误处理
  • 【Java方法】--递归的正确使用方法,告别栈溢出
  • 【JavaWeb】Servlet继承结构
  • Linux网络编程-udp
  • [从零构建操作系统]08 函数调用时栈的底层行为解析
  • Springboot医疗云胶片管理系统nem7x(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • MATLAB与FlightGear联合仿真教程:包含Simulink工程文件的PDF指南
  • 实战教程:1小时掌握逆向Unity游戏 (共13课时)
  • 提升SEO效率:2025年真正有效的8款AI工具终极清单
  • Day 37 MLP神经网络的训练
  • 力扣hot100:搜索插入位置
  • 探索含光伏、火电与飞轮储能系统的奇妙调频之旅