数码管详细总结

  • 一、数码管电路
    • 1、单个数码管
    • 2、多个数码管
    • 3、数码管与芯片的连接
      • 3.1 为什么要使用锁存器?
      • 3.2 锁存器的电路连接
  • 二、数码管显示数字时芯片引脚的状态值
  • 三、数码管实现动态显示
    • 1、一个数码管从0到F动态显示
    • 2、多个数码管从0到F动态显示
    • 3、一个经典例子

一、数码管电路

1、单个数码管

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

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

2、多个数码管


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

3、数码管与芯片的连接

3.1 为什么要使用锁存器?

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

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

3.2 锁存器的电路连接

上图所示,连接俩块锁存器,U1控制段选,U2控制位选,锁存器我们在博客(一)中做过总结,现再回顾一下

根据电路图,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(上面低位,从下往上读)

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

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



第一个数码管显示数字“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上同时发生响应,造成紊乱。

二、数码管显示数字时芯片引脚的状态值


显示数字“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。

三、数码管实现动态显示

1、一个数码管从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--);
}

2、多个数码管从0到F动态显示

与之前的一个数码管比较,多个数码管的动态显示只需改变位选时P0的输出,如六个数码管同时显示,则P0输出11000000,即0xc0

位选代码:

 wela=1;P0=0xc0;wela=0;

完整代码:

//六个数码管从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=0xc0;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--);
}

3、一个经典例子

题:
六个数码管,第一个数码管显示数字“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进制即可。

完整程序:

#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--);
}

51单片机(三)数码管(超详细、必会!)相关推荐

  1. 利用51单片机制作一个秒表的详细过程

    利用51单片机制作一个秒表的详细过程 前面的话: 和很多朋友一样,在学51单片机的过程中我们肯定会涉及到制作一个秒表,牵涉到把单片机的多个部分组合起来使用,这对于我们初学者来说可能显得有些困难,我同大 ...

  2. 51单片机七段数码管显示时钟无按键控制—①—74HC595版

    参考链接: 51单片机七段数码管显示时钟加按键控制-③-74HC595版 51单片机七段数码管显示时钟加按键控制-②-74HC595版 文章目录 一.实验内容: 二.实验分析: 三.仿真图: 四.源代 ...

  3. codevs 2924 数独挑战 x(三种做法+超详细注释~)

    2924 数独挑战  时间限制: 1 s  空间限制: 1000 KB  题目等级 : 钻石 Diamond 题目描述 Description "芬兰数学家因卡拉,花费3个月时间设计出了世界 ...

  4. 51单片机学习 数码管 倒计时

    51单片机学习 数码管 倒计时 简介 1.硬件部分 普中单片机 开发板 (138译码器控制)数码管 2.软件部分 keil软件 硬件部分 138译码器 简介 74LS138 为3 线-8线译码器,共有 ...

  5. 单片机学习笔记————51单片机实现数码管中的倒计时程序

    一.使用proteus绘制简单的电路图,用于后续仿真 二.编写程序 /***************************************************************** ...

  6. 51单片机控制数码管显示

    前言 今天学习51单片机的数码管模块 我的学习板上面的数码管是4为一体由12个引脚控制的模块. 今天就编程控制它显示我们想要的输出. 数码管本质上是由8个LED拼接而成的,他们分别叫做a,b,c,d, ...

  7. sob攻略超详细攻略_2020云南旅游超详细必看攻略(附带云南美食景点攻略)

    原标题:2020云南旅游超详细必看攻略(附带云南美食景点攻略) 云南,很多人首选的旅行目的地,云南的旅游景点多,而且也比较分散,建议大家先做好旅游攻略再出发吧,不然真的去到会很迷茫.也许有很多小伙伴是 ...

  8. 51单片机八位数码管1到F动态滚动显示仿真及程序

    51单片机八位数码管1到F动态滚动显示仿真及程序 动态滚动显示仿真及程序 #include<reg51.h> #define uchar unsigned char #define uin ...

  9. 51单片机+DS18B20+数码管显示+串口通讯+Proteus仿真

    51单片机+DS18B20+数码管显示+串口通讯+Proteus仿真 本实验通过51单片机读取DS18B20温度传感器的温度,然后通过数码管显示,并通过串口,将读取到的温度数据发送出去. 本案例需要使 ...

  10. 51单片机实现数码管显示小数

    51单片机实现数码管显示小数 要求 1 Proteus 面向编程的模型搭建 2 代码实现 2.1. 实现数码管刷新 2.2 对小数进行分解的函数 3 测试用例 4 仿真结果 要求 要求1:根据整数部分 ...

最新文章

  1. MVC模式和Maven项目构建
  2. 数据库:数据库水平切分?垂直切分?整合方案?可能存在的问题?
  3. java web 之间通信,【Java】Web发展中通信的方式有哪些呢?
  4. transferto 文件不存在_文件上传时,MultipartFile.transferTo() 方法报 FileNotFoundException...
  5. Linux 命令之 sed -- 功能强大的流式文本编辑器
  6. OpenCV学习笔记(1)——显示图片
  7. 开源中国 4 周年, 三个平台客户端全面开源
  8. 洛谷3953 (NOIp2017) 逛公园——记忆化搜索+用栈判0环
  9. php 提取二维数组的key,PHP 获取二维数组中某个key的集合
  10. Hadoop2.2.0 + HBase0.96 伪分布式安装
  11. iframe 的基本用法
  12. 保温杯内壁有很多小泡泡
  13. win7自动登录(win7自动登录不用输入密码)
  14. 如何把microsoft store里面的软件添加到桌面
  15. C++核心准则ES.56​:只在需要将一个对象显式移动到另外的作用域时使用std::move​
  16. 2017年搜狗校招Java研发笔试编程题
  17. Failed to start LSB: Enable AMQP service provided by RabbitMQ broker.
  18. 运筹说 第75期 | 数学家欧拉也玩跨界
  19. 什么是Web1.0、2.0、3.0?
  20. Raptor入门练习

热门文章

  1. 《皮格马利翁效应》-期待效应
  2. 东北大学OJ题解—1741: C语言编程测试2020-6-11-焦明海
  3. Permission denied (publickey)的解决方法
  4. Android jetpack navigation
  5. css滚动条-webkit-scrollbar
  6. android面试题(深度解析)
  7. Vue项目报错sockjs.js?9be2:1606 GET http://192.168.43.226:8080/sockjs-node/info?t=1584966826465 net::ERR_
  8. HTML表格(二)---成绩单
  9. python能不能开发安卓app_Python能开发安卓APP吗?使用python开发网站的学习路线是怎样的?...
  10. python 报错 invalid value 2_【python】错误解决经历