0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

硬件模块---数码管基本原理与实现方法

嵌入式开发星球 2024-05-11 09:20 次阅读

嵌入式中,数码管的使用方法。

第一:数码管基本介绍

wKgZomY-NmSAOkMRAAVCZBHXK88205.png

1、单个数码管

wKgaomY-NnKAejy5AACMoczR768826.png

一个数码管是由a、b、c、d、e、f、g、dp八个二极管组成,八个LED一端接在一起,另一端引脚引出来。二极管如果阳极连在一起,就是共阳极数码管,阴极连在一起,就是共阴极数码管。

如上图,是一个共阴极数码管,要使数码管显示不同的数字,只需点亮对应LED即可。如:数码管显示“0”,则a、b、c、d、e、f六个LED亮,g、dp这俩个LED灭,即可显示“0”。

2、多个数码管

wKgaomY-No2APN9BAAENwPqHFuI590.png

上图所示的六个数码管,在使用时,需要程序选定使用哪几个数码管,这就是“位选”,选定数码管后再对选定的数码管进行操作,其操作与单个数码管的操作一致(接下来还会进一步详解),这就是“段选”。

3、数码管与芯片的连接

3.1 为什么要使用锁存器?

二极管正常工作时需要5mA以上的电流,若数码管引脚和芯片引脚直接相连,芯片的I/O口无法输出这么大的电流,对于共阴极的数码管,可以在阳极处接上拉电阻,对于共阳极的数码管,可以在阴极处接下拉电阻,但是也使得“位选”需做另外的处理。

引入锁存器,利用其输出电流大的特点,有效的解决了LED工作电流问题,而且还可以利用锁存器进行“位选”、“段选”。

3.2 锁存器的电路连接

wKgZomY-Np2ASm66AAG3mPbz1ig948.png

上图所示,连接俩块锁存器,U1控制段选,U2控制位选,锁存器现再回顾一下

wKgaomY-NquAE-HUAAAmkjT5ico387.png

根据电路图,OE始终接地,所以锁存器工作状态只有前三种,当LE软件置1时,锁存器的输入端D与输出端Q同高电平,同低电平,当LE软件置0时,锁存器输出为Q0。

由电路图可得,电路连接为:

单片机的芯片引脚P00—>P07分别接U1锁存器的D0——>D7,单片机的芯片引脚P00—>P07分别接U2锁存器的D0——>D7,也就是说U1、U2俩锁存器都与P0相连,所以在数码管工作状态下,俩个锁存器不能同时处于打开状态,即俩个锁存器的LE不能同时为高电平。锁存器U1的输出接数码管的LED阳极,锁存器U2的输出接数码管的WE,控制“数码管选择”。

锁存器U2控制位选,U2打开时,U1关闭,此时U2的输入和输出同高、同低电平。如下图,若使用数码管1,则只需D0置0,其他引脚置1,即芯片P00输出为0,P01——>P07输出为1,即P0寄存器的状态值为0xfe(上面低位,从下往上读)

wKgaomY-NsqAHrLdAAHyJD-IYCo575.png

锁存器U1控制段选,如刚刚位选了数码管1,则接下来段选是对数码管1的操作。此时关闭U2,打开U1,即U2的LE软件置0,U1的LE软件置1,而U2的LE与芯片的P27相连,U1的LE与芯片的P26相连(下图所示),所以只需使芯片的P27输出低电平来关闭U2锁存器,P26输出高电平来打开U1锁存器。

wKgZomY-Nt6AFQabAAIDi-A37qE915.png

打开U1锁存器后,使数码管显示某个数字,我们在第一节中总结过了,比如显示一个数字“6”,需要a、c、d、e、f、g六个LED亮,所以锁存器输出01111101(共阴极数码管。输出1时点亮),即P0寄存器输出01111101,P0寄存器的状态值为0x7d。

wKgaomY-NvaAAcYYAACIidtSd2M599.png

wKgaomY-NweATNS7AAHmCLEyeYM486.png

第二:数码管具体实现

第一个数码管显示数字“6”的程序如下:

#include< reg52.h >
sbit dula=P2^6;
sbit wela=P2^7;
void main()
{
  wela=1;
  P0=0xfe;//位选第一个数码管
  wela=0;

  dula=1;
  P0=0x7d;
  dula=0;
  while(1);
}

分析上面程序:

首先对连接U1、U2锁存器LE的芯片引脚P26与P27进行位操作,重命名为“dula”与“wela”,表示“段选”和“位选”。主函数里,先打开位选:wela=1,选择第一个数码管,则U2锁存器输入和输出均为11111110(从下往上),P0的输出也为11111110,即0xfe,位选结束后关闭位选:wela=0。

接下来打开段选:dula=1,对第一个数码管操作,显示数字“6”,U1锁存器输入输出均为01111101,即P0输出为01111101,即P0的状态值为0x7d。最后关闭段选。

注:

正因为锁存器U1与U2同时接在芯片的P0引脚上,所以俩个锁存器不能同时打开,否则芯片引脚P0输出的状态值会在U1和U2上同时发生响应,造成紊乱。

第三:数码管显示数字时芯片引脚的状态值

wKgaomY-N1yAHtIlAAF3jHwxJ8g660.png

显示数字“0”,abcdef亮,状态值00111111——>0x3f

显示数字“1”,bc亮,状态值00000110——>0x06

显示数字“2”,abdeg亮,状态值01011011——>0x5b

显示数字“3”,abcdg亮,状态值01001111——>0x4f

显示数字“4”,bcfg亮,状态值01100110——>0x66

显示数字“5”,acdfg亮,状态值01101101——>0x6d

显示数字“6”,acdefg亮,状态值01111101——>0x7d

显示数字“7”,abc亮,状态值00000111——>0x07

显示数字“8”,abcdefg亮,状态值01111111——>0x7f

显示数字“9”,abcdfg亮,状态值01101111——>0x6f

显示字母“A”,abcefg亮,状态值01110111——>0x77

显示字母“B”,cdefg亮,状态值01111100——>0x7c

显示字母“C”,adef亮,状态值00111001——>0x39

显示字母“D”,bcdeg亮,状态值01011110——>0x5e

显示字母“E”,adefg亮,状态值01111001——>0x79

显示字母“F”,aefg亮,状态值01110001——>0x71

在编写程序时将上述状态值放入数组中,通过数组来实现数码管的动态显示。

放在如下数组中:

#define uchar unsigned char
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
}

在table数组名前加了code,表示编码的意思,单片机程序把不需要更改的东西通过code关键字定义为编码,单片机执行程序时,table只占用程序存储空间,可以理解为占用flash,而不占用RAM

第四:数码管实现动态显示

一个数码管从0到F动态显示

#include < reg52.h >
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
uchar num;
sbit dula=P2^6;
sbit wela=P2^7;
void delay_ms(uint );
void main()
{
  wela=1;
  P0=0xfe;
  wela=0;

  while(1)
  {  
    for(num=0;num< 16;num++)
    {
      dula=1;
      P0=table[num];
      dula=0;
      delay_ms(500);  
    }
  }
}
void delay_ms(uint ms)
{
  uint i,j;
  for(i=ms;i >0;i--)
  for(j=110;j>0;j--);
}

此时第一个数码管从0变化到F,之后停止不动。

若使数码管从0到F反复变化,只需在while()语句里添加如下代码:

  if(num==16)
    num=0; 

完整程序:


#include < reg52.h >
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
uchar num;
sbit dula=P2^6;
sbit wela=P2^7;
void delay_ms(uint );
void main()
{
  wela=1;
  P0=0xfe;
  wela=0;

  while(1)
  {  
    for(num=0;num< 16;num++)
    {
      dula=1;
      P0=table[num];
      dula=0;
      delay_ms(500);  
    }

     //------------新加
    if(num==16)
    num=0;  
  //----------------
  }
}
void delay_ms(uint ms)
{
  uint i,j;
  for(i=ms;i >0;i--)
  for(j=110;j>0;j--);
}

第五:数码管经典实例

六个数码管,第一个数码管显示数字“1”,间隔1秒后再在第二个数码管上显示数字“2”,间隔1s后在第三个数码管上显示数字“3”,以此类推…在第六个数码管上显示数字“6”

分析:

六个数码管轮流显示,所以位选时依次选择数码管1、2…6,每次位选后,再段选输出需要显示的数字。

第一个数码管位选:


  wela=1;
  P0=0xfe;//第一个数码管
  wela=0;

第一个数码管段选输出数字“1”:


  dula=1;
  P0=table[1];
  dula=0;
  delay_ms(1000);

位选时P0的输出之前已经总结过了,再回忆一下,如下图,从左到右分别为数码管1、2、3、4…从下往上读,得到8位二进制码,变为16进制即可。

wKgZomY-N-WAa2gNAAE5xJGLqxQ288.png

完整程序:


#include < reg52.h >
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
uchar num;
sbit dula=P2^6;
sbit wela=P2^7;
void delay_ms(uint );
void main()
{
  while(1)
  {
    wela=1;
    P0=0xfe;//第一个数码管
    wela=0;

    dula=1;
    P0=table[1];
    dula=0;
    delay_ms(1000);

    wela=1;
    P0=0xfd;//第二个数码管
    wela=0;

    dula=1;
    P0=table[2];
    dula=0;
    delay_ms(1000);

    wela=1;
    P0=0xfb;//第三个数码管
    wela=0;

    dula=1;
    P0=table[3];
    dula=0;
    delay_ms(1000);

    wela=1;
    P0=0xf7;//第四个数码管
    wela=0;

    dula=1;
    P0=table[4];
    dula=0;
    delay_ms(1000);

    wela=1;
    P0=0xef;//第五个数码管
    wela=0;

    dula=1;
    P0=table[5];
    dula=0;
    delay_ms(1000);

    wela=1;
    P0=0xdf;//第六个数码管
    wela=0;

    dula=1;
    P0=table[6];
    dula=0;
    delay_ms(1000);
  }
}

void delay_ms(uint ms)
{
  uint i,j;
  for(i=ms;i>0;i--)
  for(j=110;j>0;j--);
}

总结:数码管是常用器件,掌握其中的控制方法,才能走的更远。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5065

    文章

    18998

    浏览量

    302658
收藏 人收藏

    评论

    相关推荐

    数码管驱动芯片的使用方法

    数码管驱动芯片(也称为LED驱动芯片)是一种用于控制数码管显示的集成电路。它可以将微控制器产生的数字信号转换为适合数码管显示的电流和电压。本文将详细介绍数码管驱动芯片的使用
    的头像 发表于 12-08 16:24 9346次阅读

    怎样通过并行接口芯片去控制多个数码管显示呢

    实验八、数码管显示实验1、实验目的学习“七段共阴极数码管”显示的基本原理;掌握通过并行接口芯片控制多个数码管显示的方法。2、实验内容用一片8
    发表于 12-10 08:24

    数码管动态显示的基本原理实现思路

    一、模块题目二、原理简述动态显示的基本原理实现思路(转载)动态显示实质上就是轮流点亮单个数码管实现多位
    发表于 01-11 06:32

    动态数码管的使用方法

    历年的蓝桥杯单片机组比赛都会考到数码管模块;对于省赛以及国赛来说,动态数码管都是必考模块!现在来给大家介绍动态数码管的使用
    发表于 01-12 06:19

    掌握通过并行接口芯片对键盘进行扫描并在多位数码管显示数字的方法

    实验九、键盘扫描及数码管显示实验1、实验目的学习了解键盘扫描的基本原理。掌握通过并行接口芯片对键盘进行扫描并在多位数码管显示数字的方法。2、实验内容编写程序,
    发表于 01-13 08:22

    数码管静态显示和动态显示的实现方法

    数码管静态显示和动态显示数码管共阳和共阴段选和位选数码管静态显示原理代码实现数码管动态显示方法
    发表于 03-01 07:34

    数码管的型号命名方法

    数码管的型号命名方法
    发表于 12-11 10:53 108次下载

    学51单片机之数码管部分

    带您从零学51单片机之数码管部分 目录1 数码管应用2 数码管内部结构及硬件原理图3 数码管硬件
    发表于 02-10 14:36 155次下载

    数码管型号命名方法

    数码管型号命名方法
    发表于 12-11 10:51 1.4w次阅读
    <b class='flag-5'>数码管</b>型号命名<b class='flag-5'>方法</b>

    led数码管的结构及检测方法

    led数码管的结构及检测方法 LED数码管是由发光二极构成的,亦称半导体数码管. 将条状发光二极
    发表于 01-03 11:51 4952次阅读
    led<b class='flag-5'>数码管</b>的结构及检测<b class='flag-5'>方法</b>

    数码管的分类及基于AVR单片机595驱动8位数码管显示电路的实现

    发光二极单元(多一个小数点显示),其基本原理是:将所有LED的一端(正极、负极均可)连在一起作为一个公共端,然后通过分别控制这组LED的另一个端口来使部分LED点亮,从而达到显示一定字形的目的。 数码管的分类:按能显示多少
    发表于 11-30 11:03 17次下载
    <b class='flag-5'>数码管</b>的分类及基于AVR单片机595驱动8位<b class='flag-5'>数码管</b>显示电路的<b class='flag-5'>实现</b>

    led数码管怎么接线_LED数码管的测试

    本文主要介绍了LED数码管的安装接线方式及LED数码管的测试方法
    发表于 10-09 10:44 2.7w次阅读

    数码管的工作原理和使用方法解析

    数码管是嵌入式开发中比较常用的一个模块,本篇文章根据查阅的资料以及学习笔记整理成文,尽可能详尽的讲解常用数码管原理和使用方法
    发表于 02-29 13:10 10.2w次阅读

    51单片机按键控制数码管0~9_项目五 数码管应用实例

    (一)项目任务任务1:显示数字子任务1.1 数码管硬件电路认识子任务1.2 了解段选和位选概念子任务1.3 掌握数码管的静态显示方法任务2:
    发表于 11-23 10:06 6次下载
    51单片机按键控制<b class='flag-5'>数码管</b>0~9_项目五 <b class='flag-5'>数码管</b>应用实例

    基于单片机的数码管实验 八段数码管简介

    在我们生活中随处可见数码管的应用,数码管的应用形式多种多样,抛开事物表象,深入到它的本质,正所谓万变不离其中,数码管应用的原理都是基本相通的。本章我们将详细介绍数码管
    的头像 发表于 07-26 16:37 3517次阅读
    基于单片机的<b class='flag-5'>数码管</b>实验 八段<b class='flag-5'>数码管</b>简介