第7章 静态数码管显示实验
第七章 静态数码管实验
1. 数码管介绍
1.1 数码管简介
数码管是一种半导体发光器件,基本单位是发光二极管。因此数码管也称LED数码管。按能显示多少个( 8) 可分为 1 位、 2 位、 3 位、 4 位、 5 位、6 位、 7 位等数码管。 按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管。
共阳数码管是指所有的发光二极管的阳极接到一起形成公共阳极(COM)的数码管。当某一段发光二极管的阴极为低电平时,这一段就点亮,高电平灭(共阳数码管-阴极-低电平工作)
共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管, 共阴数码管在应用时应将公共极 COM 接到地线 GND 上, 当某一字段发光二极管的阳极为高电平时, 相应字段就点亮, 当某一字段的阳极为低电平时, 相应字段就不亮(共阴数码管-阳极-高电平工作)
关于共阴共阳数码管内容参考:共阴极和共阳数码管详解_共阴极数码管-CSDN博客
1.2 数码管显示原理
数码管的显示原理都一样,不管几位,都是靠点亮内部的LED来显示数字。(比如,我们想显示0,就得把abcdef点亮)
数码管内部电路如下:
通过内部电路我们可以看到,一位数码管的引脚是10个,正常显示一个8需要7个小段,然后加上一个小数点(c),所以一位数码管内部一共有8个LED,最后还有一个公共端, 多数生产商为了封装统一, 单位数码管都封装 10 个引脚, 其中第 3 和第 8 引脚是连接在一起的。 而它们的公共端又可分为共阳极和共阴极。
对于共阴数码管来说,其8个发光二极管的阴极在数码管内部连接在一起,所以称为“共阴”,但是它们的阳极是独立的,当我们给数码管的任意一个阳极加一个高电平时,对于这个LED就亮了。比如我们想显示1个“8”,那么就把8个阳极全部送高电平。
值得注意的是,如果使用共阴数码管,需要增加单片机IO口驱动电流,因为共阴数码管是要靠单片机 I/O 口输出电流来点亮的, 但单片机 I/O 口难以输出稳定的、 如此大的电流, 所以数码管与单片机连接时需要加驱动电路,可以用上拉电阻的方式或者用驱动芯片, 比如 74HC573、 74HC245 等, 其输出电流较大,电路接口简单。
理解了共阴数码管,共阳数码管就简单了。共阳极数码管其内部 8 个发光二极管的所有阳极全部连接在一起, 电路连接时, 公共端接高电平, 因此我们要点亮哪个发光管二极管就需要给阴极送低电平,并且此时显示数字的编码与共阴极编码是相反的关系。
但是我们平常往往使用共阳极数码管(单片机上面的模块也是共阳极)为什么呢?这是因为数码管的非公共端往往接在芯片的I/O上,而芯片的驱动能力是比较小的,采用共阴数码管的话,就有可能受限于 IC 芯片输出电流不够而显示昏暗, 要外加上拉电阻或者是增加三极管加大驱动能力。
所以使用共阳极数码管的好处是: 将驱动数码管的工作交到公共端( 一般接驱动电源) , 加大驱动电源的功率自然要比加大 IC 芯片 I/O口的驱动电流简单许多。 另一方面, 这样也能减轻主芯片的负担。
下面给出共阴和共阳数码管的 0-F 段码数据表, 如下所示:
- 共阴数码管码表
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d,
0 1 2 3 4 5
0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c,
6 7 8 9 A B
0x39, 0x5e, 0x79, 0x71, 0x00,
C D E F 无显示
- 共阳数码管码表
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92,
0 1 2 3 4 5
0x82, 0xF8, 0x80, 0x90, 0x88, 0x83,
6 7 8 9 A B
0xC6, 0xA1, 0x86, 0x8E, 0xFF,
C D E F 无显示
1.3 数码管显示原理
LED数码管显示工作有两种方式:静态显示方式和动态显示方式,可以参考:C51单片机学习笔记(五)——数码管的静态显示和动态显示_c51单片机动态显示加数器-CSDN博客数码管的工作原理、静态显示及动态显示-电子发烧友网 (elecfans.com)
简单来说。静态显示方式:当送入一次字形码后, 显示字形可一直保持, 直到送入新字形码为止。 这种方法的优点是占用 CPU 时间少, 显示便于监测和控制。 缺点是硬件电路比较复杂, 成本较高, 比如使用 4 个静态数码管, 那么就得 32 个 IO 来控制, 这对 51 单片机来说是无法承受的, 正因为如此才会有后面章节动态数码实验的讲解。
动态显示方式则采用动态扫描显示,利用发光管的余辉和人眼作用,使人感觉各位数码管好像同时在显示。同时也导致了动态显示的亮度比静态显示要差一些,所以在选择限流电阻时应略小于静态显示电路中的。
2. 硬件设计
我们的开发板上的静态数码管模块电路如下所示:
入图可知,我们的开发板上面静态数码管电路,模块独立,使用1个共阳数码管,数码管的位选即公共端直接接 VCC,根据共阳数码管显示特点可知, 只要保证数码管 a-dp 段输入电平为低电平即可点亮。
由于使用的是共阳数码管, 公共极接 VCC, 所以在数码管控制端可加一个限流电阻, 阻值为 470 欧( 471) 。
3. 软件设计
本章要实现的功能是:控制静态数码管显示数字0,即让P0端口输出数字0的段码0x3f
#include <REGX52.H>
#define SMG P0 // 使用宏定义数码管
// 共阴极数码管显示0~F的段码数据(以后我们要使用)数码管直接复制粘贴就行了
unsigned char smg_code[17] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void main()
{
// 使数码管显示0
// [0]涉及C语言基础,意思是数组里的第一位,因为是从0开始的
SMG =~ smg_code[0]; // 对共阴极数码管段码取反,就是阳极的了-如果嫌麻烦我们可以直接使用共阳数码管段码
while(1)
{
}
}
4. 小结
本章应该来说还是比较好理解,本质就是点亮LED,只不过一次点亮多个,从而使数码管显示数字。
段码可以直接复制粘贴使用,当然理解是最好的了,段码实际是一个数组,我们想显示哪个数字的时候,直接取数组就行了
2024.6.24修订,后期不再维护