数码管实验
  • 数码管
    多位数码管,即是两个或两个以上单个数码管并列集中在一起形成一体的数码管。当多位一体时,它们内部的公共端是独立的,而负责显示什么数字的段线全部是连接在一起的,独立的公共端可以控制多位一体中的哪一位数码管点亮,而连接在一起的段线可以控制这个能点亮数码管亮什么数字,通常我们把公共端叫做“位选线”,连接在一起的段线叫做“段选线”有了这两个线后,通过单片机及外部驱动电路就可以控制任意的数码管显示。一般一位数码管有10个引脚,二位数码管也是10个引脚,四位数码管是12个引脚。
    为了更方便区分段选和位选,请看下原理图:

    如图为两个4位一体的数码管,可以看到与8个com相连的是两个数码管的位选,位选与引脚相连,所以位选控制那个灯亮。段选可以看到a,b,g并联到一起。因为是并联,所以点亮的数码管显示的数字相同。
  • 共阴极数码管和共阳极数码管

图a数码管管脚图,图b是共阳极数码管,图c是共阴极数码管。
由图b可知共阳极数码管阳极连接在一起,接高电平,阴极对应的各段分别控制。比如要想显示1,则阴极对应的bc段低电平,其它接高电平,即可显示。
由图C可知,共阴极数码管将各个二极管的阴极连接在一起(阴极为低电平),而阳极控制各段,比如要显示1,则bc为高电平,其它各段低电平即可显示。

共阳极和共阴极数码管对照表
共阳极数码管对照表(位选位高电平,各段选低电平控制数字显示)

uchar code table[]={0xc0,//00xf9,//10xa4,//20xb0,//30x99,//40x92,//50x82,//60xf8,//70x80,//80x90,//90x88,//A0x83,//B0xc6,//C0xa1,//D0x86,//E0x8e, //F0x8c, //P0xc1,//U0x91,//Y0x7c,//L0x00,//全亮0xff  //熄灭
};

共阴极数码管对照表(位选为低电平,段选为高电平)

uchar code leddata[]={0x3F,  //"0"0x06,  //"1"0x5B,  //"2"0x4F,  //"3"0x66,  //"4"0x6D,  //"5"0x7D,  //"6"0x07,  //"7"0x7F,  //"8"0x6F,  //"9"0x77,  //"A"0x7C,  //"B"0x39,  //"C"0x5E,  //"D"0x79,  //"E"0x71,  //"F"0x76,  //"H"0x38,  //"L"0x37,  //"n"0x3E,  //"u"0x73,  //"P"0x5C,  //"o"0x40,  //"-"0x00  //熄灭};
  • 数码管显示原理
    1.静态显示
    多位数码管依然可以静态显示,但是显示时要么只显示一位数码管,否则一体的多位同时显示必须时显示相同内容。当多位数码管应用于某一系统时,它们的“位选”是可独立控制的,而“段选”是连接在一起的,我们可以通过位选信号控制哪几个数码管亮,而在同一时刻,位选选通的所有数码管上显示的数字始终都是一样的,因为它们的段选是连接在一起的,所以送入所有数码管的段选的信号都是相同的,那么他们显示的数字必定一样。(换言之,你可以通过位选控制那个数码管亮,但是亮的同时显示的数字必定相同)
    2.动态显示
    位选控制亮不亮,而段选控制显示数字,那怎样显示不同的数字呢?这就利用了人体肉眼观察的能力。
    举个例子,假设段选1控制第一位数码管数字显示1,那么在显示第二个数码管是段选控制数码管显示2,而位选控制灯第二位数码管亮,第一位数码管灭。但是给人的感受是第一位数码管并没有灭(实际已经灭了),因为时间太短人体肉眼无法识别。这样就会发现数码管动态显示是向左或向右一位一位点亮。
  • 静态数码管工作原理
    静态数码管原理图:

    因为共阳极数码管,所以位选接的是高电平,要想正常显示通过控制低电平来控制段选即可。
  • 静态数码管代码实现:
#include <reg52.h>
#include <intrins.h>
typedef unsigned char u8; //重定义全局字符型变量
typedef unsigned int u16; //重定义全局整型变量
u8 code table[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
/*利用数组引用数码表(注次数码表为阴极数码表,因为是共阳极数码管,本应使用刚阳极数码管,
为了方便直接将共阴极数码表取反来使用)。code是将数组从ram调到ROM节省空间*//*延时函数*/
void dealy(u16 i)
{
while(i--);
}void main()
{ int i=0;for(i=0;i<9;i++){P0=~table[i];//取反是因为使用的是阴极数码表,而取反得阳极数码表dealy(50000);} //p0=~table[0];  该写法是固定显示数字不变的写法,~table[0]显示的就为0}
  • 动态数码管工作原理

    如图,位选的控制通过连接J16的管脚连接138译码器,利用138译码器控制位选。段选不是有单片机IO直接驱动,而是通过连接74HC25芯片连接管脚,利用芯片来实现段选。
    因为是共阴极数码管,所以位选应接低电平,段选接高电平时,数码管正常显示。

译码器工作原理

可以有真值表观察,当使能控制都为低电平的情况下,A0A1A2输入不同电平控制输出。
例,A0A1A2为000(二进制为0)对应Y0就输出低电平,为001(二进制为1)输出Y1就位高电平。所以就相当于二进制十进制,十进制对应输出。

74HC25看自己的原理图即可,不再阐述。

  • 动态数码管代码实现
#include <reg52.h>
#include <intrins.h>
typedef unsigned char u8; //重定义全局字符型变量
typedef unsigned int u16; //重定义全局整型变量u8 code table[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
/*利用数组引用数码表(该数码管是共阴极数码管,所以使用共阴极数码表)。code是将数组从ram调到ROM节省空间*/sbit LSA=P2^2;    //ABC分别连接单片机的P2^2,P2^3,P2^4管脚
sbit LSB=P2^3;
sbit LSC=P2^4;/*延时函数*/
void dealy(u16 i)
{
while(i--);
}/*动态显示函数
*参数说明
*ABC分别为138译码器的输入端,通过控制输入端来控制输出端的高低电平,从而实现对位选的控制
且A为二进制中的低位,C为高位*/
void Display()
{  u16 i=0;
for(i=0;i<8;i++)
{switch(i){case 0:LSA=0;LSB=0;LSC=0;break; //利用138译码器来控制位选,当ABC都等于0时,y0为低电平,其余为高电平case 1:LSA=1;LSB=0;LSC=0;break; //Y1输出低电平case 2:LSA=0;LSB=1;LSC=0;break; //Y2输出低电平case 3:LSA=1;LSB=1;LSC=0;break; //Y3输出低电平case 4:LSA=0;LSB=0;LSC=1;break; //Y4输出低电平case 5:LSA=1;LSB=0;LSC=1;break; //Y5输出低电平case 6:LSA=0;LSB=1;LSC=1;break; //Y6输出低电平case 7:LSA=1;LSB=1;LSC=1;break; //Y7输出低电平}P0=table[i];  //第i个为低电平决定位选则跳出switch循环,P0提供段选(原理图可以看出)dealy(100);  // 短暂的延时,达到肉眼看不到的速度,以达到同时显示效果P0=0x00;     //清零,作用为了下一个显示不会产生重影
}
}void main()
{ while(1){Display();}
}

51单片机静态数码管和动态数码管原理及实验相关推荐

  1. 51单片机静态动态数码管显示

    51单片机静态动态数码管显示 通过此实训了解动态数码管的显示原理,掌握编码方法.共阴极和其阴极数码管的不同之处及常用设计方法. 实训设备 这里使用的377锁存器模块控制的数码管下面就是电路图 显示内容 ...

  2. 静态数码管和动态数码管

    目录 一,什么是数码管 二,静态数码管的驱动 三,动态数码管 四,动态数码管显示编程实战 五,使用38译码器驱动动态数码管 一,什么是数码管 1.数码管 (1)作用:数码管是显示器件,用来显示数字的 ...

  3. 51单片机入门教程(3)——数码管显示

    51单片机入门教程(3)--数码管显示 一.LED数码管简介 二.数码管静态显示 三.数码管动态显示 特别鸣谢:HFUTer-朱聪强 一.LED数码管简介 LED数码管(LED Segment Dis ...

  4. 如何使用keil进行编译并且用proteus进行51单片机仿真实现0~F的数码管字符显示

    文章目录 一.目的: 二.在keil中进行程序编译 三.在proteus上画出电路图 四.将keil中编译的hex文件在proteus电路图中进行仿真运行 一.目的: 使用keil进行编译并且用pro ...

  5. 【Proteus仿真】51单片机+74HC164驱动两个四位数码管

    [Proteus仿真]51单片机+74HC164驱动两个四位数码管 Proteus仿真 程序代码 #include <STC89C5xRC.H>sbit DAT=P1^1; sbit CL ...

  6. 51单片机(四)静态数码管和动态数码管显示

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分:建议先学习51单片机,其是STM32等高级单片机的基础:这样再学习STM32时才能融会贯通. ☀️ 专栏适 ...

  7. 51单片机 静态数码管显示

    本章博客讲述使用51单片机编写程序静态数码管显示 1.新建工程,选择芯片型号,这里注意--为了防止出现在插入头文件reg时出现某些引脚不定义的情况 可尝试切换为AT89C52型号的芯片,插入头文件即为 ...

  8. 51单片机——静态数码管

    数码管原理: LED数码管是由多个发光二极管封装在一起组成一个"8"字型的器件,将8个LED的阴极连接在一起,或将8个LED的阳极连接在一起,即组成共阴极LED数码管和共阳极LED ...

  9. 51单片机静态数码管原理及代码

    1.数码管原理图 单个数码管有8个LED灯,通过输入电平点亮a~g可显示数字,以下为原理图: 数码管原理图分为共阴极与共阳极两种: ①共阴极:a~dp位于发光二极管的阳极(即高电平的一端)部分,左接G ...

最新文章

  1. QT学习:目录操作与文件系统
  2. python求斐波那契数列第n个数及前n项和_使用python求斐波那契数列中第n个数的值示例代码...
  3. JVM六大垃圾回收器特点及区别
  4. Windows 容器
  5. linux 解压tar.jz,linux系统压缩文件和解压缩命令
  6. Linux驱动(8)--内核编译与配置
  7. python装饰器函数执行后日志_python使用装饰器作日志处理的方法
  8. c语言第三章作业题答案,c语言第三章简单练习题及答案.doc
  9. 研究别人,能知道做什么赚钱,了解自己,能知道什么钱适合赚
  10. 【接口测试】接口和接口文档概念
  11. linux脚本调用db2存储过程,LINUX定时执行含有DB2存储过程的SHELL脚本
  12. 怎样从外网访问自己的HTTP服务器
  13. Centos 安装 Oracle Java JDK
  14. Linux间共享文件夹
  15. MSP430开发环境配置
  16. java 动态线程池_线程池的参数动态调整
  17. Springboot+mybatis完整实现CRUD
  18. libjpeg的安装与使用
  19. 团队建设与高效管理--3(九型人格)
  20. 宝藏又小众的家长/学生设计模板素材网站分享

热门文章

  1. 微服务与CQRSamp;EventSourcing
  2. 一个Win11安装CurseForge提示“此应用无法在你的电脑上运行”的解决方案
  3. 生动的SDN基础内容介绍(五)--SDN北向协议/接口和意图驱动
  4. 前端框架 Electron 使用总结
  5. MapBox 矢量数据规格(MVT) C++ 编解码示例
  6. java cdi是什么意思_我在java中的各种CDI限定符中看到的值()是什么?
  7. PM过程组 vs ASAP实施步骤
  8. python请输入两个整数m和n_Python 二级模拟操作题(五)
  9. 基于单片机的简易电子钟设计
  10. Kubebuilder Hello World