1 数码管介绍
1.1 数码管简介
数码管是一种半导体发光器件,其基本单元是发光二极管。 数码管也称 LED
数码管.按发光二极管单元连接方式可分为共阳极数码管和共阴极
数码管。
共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数
码管,共阳数码管在应用时应将公共极 COM 接到+5V,当某一字段发光二极管的
阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就
不亮。
共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数
码管,共阴数码管在应用时应将公共极 COM 接到地线 GND 上,当某一字段发光
二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相
应字段就不亮。
不同位数的数码管实物图如下所示:
1.2 数码管显示原理
从上图可看出,一位数码管的引脚是 10 个,显示一个 8 字需要 7 个小段,
另外还有一个小数点,所以其内部一共有 8 个小的发光二极管,最后还有一个
公共端,多数生产商为了封装统一,单位数码管都封装 10 个引脚,其中第 3 和
第 8 引脚是连接在一起的。而它们的公共端又可分为共阳极和共阴极,图中间
为共阳极内部原理图,右图为共阴极内部原理图。
对共阴极数码来说,其 8 个发光二极管的阴极在数码管内部全部连接在一起,
所以称“共阴”,而它们的阳极是独立的,通常在设计电路时一般把阴极接地。
当我们给数码管的任意一个阳极加一个高电平时,对应的这个发光二极管就点亮
了。如果想要显示出一个 8 字,并且把右下角的小数点也点亮的话,可以给 8
个阳极全部送高电平,如果想让它显示出一个 0 字,那么我们可以除了给第“g,
dp” 这两位送低电平外,其余引脚全部都送高电平,这样它就显示出 0 字了。
如果使用共阴数码管,需要注意增加单片机 IO 口驱动电流,因为共阴数码
管是要靠单片机 IO 口输出电流来点亮的,但单片机 I/O 口难以输出稳定的、如
此大的电流,所以数码管与单片机连接时需要加驱动电路,可以用上拉电阻的方
法或使用专门的数码管驱动芯片,比如 74HC573、74HC245 等,其输出电流较大,
电路接口简单。
共阳极数码管其内部 8 个发光二极管的所有阳极全部连接在一起,电路连接
时,公共端接高电平,因此我们要点亮哪个发光管二极管就需要给阴极送低电平,
此时显示数字的编码与共阴极编码是相反的关系,数码管内部发光二极管点亮
时,也需要 5mA 以上的电流,而且电流不可过大,否则会烧坏发光二极管。因此
不仅要防止数码管电流过大,同时要防止流经数码管的电流集中到单片机时电流
不能过大,否则会损坏主芯片。
一般共阳极数码管更为常用,为什么呢? 这是因为数码管的非公共端往往
接在 IC 芯片的 I/O 上,而 IC 芯片的驱动能力往往是比较小的,如果采用共阴极
数码管,它的驱动端在非公共端, 就有可能受限于 IC 芯片输出电流不够而显示
昏暗,要外加上拉电阻或者是增加三极管加大驱动能力。但是 IC 芯片的灌电流,
即输入电流范围比较大。所以使用共阳极数码管的好处是:将驱动数码管的工作
交到公共端(一般接驱动电源),加大驱动电源的功率自然要比加大 IC 芯片 I/O
口的驱动电流简单许多。另一方面,这样也能减轻主芯片的负担。
我们开发板上使用的数码管是 2 个四位一体的共阴极数码管(即 8 个 LED
的阳极全部并联一起引出,阴极分别引出如 A、 B...DP),本章实验也是在该
数码管上实现单个的静态显示。如果要让共阴数码管显示数字 0,即对应的段
ABCDEF 要点亮即给它高电平,其他的段熄灭即给它低电平。其他的数字显示方
式一样,这里就不多说。下面给出共阴和共阳数码管的 0-F 段码数据表,如下所
示:
从上述共阳和共阴码表中不难发现,它们的数据正好是相互取反的值。比如
共阴数码管数字 0 段码:0x3f,其二进制是:0011 1111,取反后为:1100 0000,
转换成 16 进制即为 0XC0。其他段码依此类推。该段码数据由来,是将 a 段作为
最低位,b 段作为次低位,其他按顺序类推,dp 段为最高位,共 8 位,正好和
51 单片机的一组端口数一样,因此可以直接使用某一组端口控制数码管的段选
数据口,比如 P0 口。
1.3 数码管静态显示原理
LED 数码管显示器工作方式有两种:静态显示方式和动态显示方式。静态显
示的特点是每个数码管的段选必须接一个 8 位数据线来保持显示的字形码。当送
入一次字形码后,显示字形可一直保持,直到送入新字形码为止。这种方法的优
点是占用 CPU 时间少,显示便于监测和控制。缺点是硬件电路比较复杂,成本较
高,比如使用 4 个静态数码管,那么就得 32 个 IO 来控制,这对 51 单片机来说
是无法承受的,正因为如此才会有后面章节动态数码实验的讲解。
动态显示的特点是将所有数码管的段选线并联在一起,由位选线控制是哪一
位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位
数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人
的感觉好像各位数码管同时都在显示。动态显示的亮度比静态显示要差一些,所
以在选择限流电阻时应略小于静态显示电路中的。
本章实验使用的数码管虽然是动态数码管电路,但我们依然可以使用数码管
其中一位来学习静态数码管知识。本章实验主要介绍静态数码管的控制,有关动
态数码管控制将在下一章节介绍。有关静态数码管的详细介绍,大家可以在百度
上查找了解
2 硬件设计
开发板上的静态数码管模块电路如下图所示:
上图电路实际上是动态数码管电路,使用的是 2 个四位一体的共阴数码管组
成,即 8 位数码管的段选数据 a-dp 全部并联一起引出,每位数码管的位选即公
共端引出,前面我们也说了,虽然开发板上没有单个的静态数码管,但依然可以
在动态数码管电路中使用其中一个来学习静态数码管显示。本实验使用 SMG1 最
左边那个数码管作为静态数码管,因为单片机 IO 口外部都增加了外部上拉电阻,
因此 P22、P23、P24 引脚默认就是高电平,根据 38 译码器输出特点,此时 Y7
脚(LED8)输出有效,即低电平。而数码管的段选 a-dp 连接在 74HC245 驱动芯
片输出口,由 P0 端口控制。所以只要控制 P0 口输出高电平,SMG1 最左边那个
数码管默认就可以显示。此处暂时不去理会 38 译码器的工作原理,后面动态数
码管实验会专门介绍。74HC245 作为驱动芯片使用,目的是让数码管能获得更大135
的电流,为防止因电流过大烧坏数码管,在 74HC245 芯片输出管脚又串联了 2
个 4 位的 100 欧排阻后连接数码管段码 a-dp 脚本
注:上面这些是第一手资料,虽然写的比较啰嗦,但比较全面,容易理解。不会的可以私聊问我.
3 软件设计
要实现的功能是:控制静态数码管显示数字 0,即让 P0 端口输出数字
0 的段码 0x3f(共阴)。
4.原始代码
#include"reg52.h" #define SMG_A_DP_PORT P0//定义数码管管口 typedef unsigned char u8; typedef unsigned int u16; //数码管对应的值,背会最好,不会背 //也要会自己计算或用工具计算 u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; void main() { SMG_A_DP_PORT=gsmg_code[0]; while(1) { ; } }
5 实验现象
使用 USB 线将开发板和电脑连接成功后(电脑能识别开发板上 CH340 串口),
把编译后产生的.hex 文件烧入到芯片内,实现现象如下:最左边那位数码管显
示数字 0。