1.数码管

1.1.什么是数码管?

数码显示器简称数码管,是一种可以显示数字和其他信息的电子设备。它在数字式显示系统中是不可缺少的器件,应用极其广泛,发展速度很快,数码管朝着小型化、 平面化、多功能化和低耗电方面发展。

1.2.数码管的种类

数码管主要有下列三大类。

  1. 字形重叠式数码管。这种数码管的特点是将不同的数字、字母等符号的电极重叠起来,当需要哪一个符号显示时,就驱动该符号的电极,使之发光显示,此时其他符号电极不发光。 这种数码管有辉光放电管和边光显示管等。
  2. 分段式数码管。这种数码管的特点是将一个数字分成若干个笔画,通过驱动相应的笔画发光来显示某一个数字,如荧光数码管就是这种类型的。 分段式数码管有八段式和七段式两种。在数字显示方面,分段式数码管是主要显示器件。
  3. 点矩阵式数码显示器件。这种显示器由一些可发光的点阵排列而成,利用发光点不同排列和组合显示数字或字符,如场致发光数字板就是这种显示器件。

如果按照数码管发光物质不同,数码管可以分成下列 4 种类型。

  1. 半导体数码管。这种数码管由半导体 发光二极管(LED)构成,所以又称为发光二极管数码管,或发光二极管显示器。按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。如图:
    在这里插入图片描述
    这种数码管也是最常用的数码管

  2. 荧光数码管。这是一种电真空器件,荧光数码管、场致发光数字板等就是这种显示器件。

  3. 液体数码管。如液晶显示器、电泳显示器等就是这种显示器件。

  4. 气体放电数码管。例如辉光数码管、 等离子体显示板等就是这种显示器件。

1.3.分段式发光二极管数码管

在进行数字显示时,分段式数码管显示电路最常用。

1.3.1八段和七段数码管笔画分布

下图左边所示是八段数码管各段分布示意图,图中共有a~dp这8段笔画,右边所示是这种数码管显示 0 ~ 9 这 10 个数字时的笔画示意图。
在这里插入图片描述
下图为七段数码管各段分布图,与八段的唯一区别是没有右下角的小数点“dp”在这里插入图片描述

1.3.2.TTL 门驱动半导体数码管电路

下图所示是用 TTL 门驱动半导体数码管的电路,这一电路中只画出它的一段驱动电路,其他各段的驱动电路与此相同。在这里插入图片描述
当译码器输出高电平 1 时,与非门 A 输出低电平 0,这样发光二极管 VD1 导通发光。当译码器输出低电平 0 时,与非门输出高电平 1, 这样 VD1 不能导通发光。 电路中,VD1 是数码管中的任一段发光二极管,R1 为限流保护电阻。数码管中的哪几段发光二极管导通发光与不发光由译码器控制。 半导体数码管的工作电压较低,一般为 1.5~ 3V, 所以可以用集成门电路直接驱动。这种半导体数码管的段电流比较大,为几至十几毫安。

1.3.3.识图方法

关于发光二极管数码显示电路主要说明下列几点。

  1. 下图(a)所示是由发光二极管构成的分段式数码显示器件,这是一个七段式数 码显示器,a ~ g 分别是七段笔画,TP 是小数点。 (b)所示是显示电路,A、B、C 和 D 是二进制数码输入端,该数码首先输入到七段式译码器电路中,其输出信号分别从 7 个输出端 a ~ g 输出,加到各自的驱动三极管基极,由导通的三极管来驱动笔画段发光二极管发光显示。在这里插入图片描述
  2. 这种显示电路中的显示器件采用发光二极管,发光二极管的驱动电路比较简单,电路分析时要分成输入驱动管的高电平 1 和低电 平 0 两种情况,通过 1 或 0 对驱动管的偏置状态来判断驱动管是否导通。在输入信号给驱动管正向偏置时,驱动管导通,发光二极管发光显示;在输入信号给驱动管反向偏置时,驱动管截止,发光二极管不能发光显示。
  3. 发光二极管数码管中有许多个单个的发光二极管或 PN 结,它们都有一个相同的驱动电路,分别驱动各自的发光二极管,进行电路分析时只要对其中一个驱动电路分析就行。
  4. 发光二极管数码管具有亮度强、清晰度高、低电压(1.5 ~ 3V)、 可靠性好、体积小、 寿命长(大于 1000h)等优点,其缺点是工作电流还是比较大了一些,一般加入一个470~800Ω的限流电阻。

1.4.荧光数码管

荧光数码管是分段式的数码管。下图所示是 YS-18-3 型荧光数码管外形和引脚排列示意图。这是一个八段式荧光数码管,图(a)所示是外形示意图,图(b)所示是引脚排列示意图。
在这里插入图片描述
荧光数码管是一种电真空器件,其工作原理与普通的电子管相似,它的灯丝就是阴极(为直热式阴极),当灯丝通电后灯丝就会发热(即阴极发热),由于在阴极表面涂有一层逸出功很小的氧化物,于是在阴极发热后会发射大量的电子。 荧光数码管内设置有一个栅极,在栅极上加有 +20V 直流电压,栅极电压相对阴极而言为正电压,这样阴极发射出来的大量电子受到栅极正电场的吸收而得到加速。 荧光数码管的阳极也是接 +20V 直流电压(实际电路中栅极与阳极在外电路中直接相连), 这样受到电场加速的绝大多数电子冲过网状的栅极,高速轰击阳极表面。在阳极表面涂有一 层荧光粉(为氧化锌材料),荧光粉在受到高速轰击的电子作用下而发出光。

荧光数码管内的笔画就是阳极,所以八段式荧光数码管就有 8 个阳极。当某一个或某几个阳极受到高速电子轰击后发光,就能显示出某一个数字。具体有哪几个阳极发光,这是需要译码器输出的信号来控制。 荧光数码管的优点是工作电压低,驱动电流小,显示清晰悦目,视角大,工作可靠性好, 寿命长,但是机械强度差,使用安装不方便。

由于在单片机中不经常使用,所以不再此详述。

1.5.辉光数码管

辉光数码管是一种字形重叠式气体放电显示器件。这种数码管与分段式数码管不同,它 将各种不同的数字或字符直接置于玻璃壳内, 通过译码器和驱动器电路直接将某一数字或字 符点亮即可显示。

下图所示是辉光数码管示意图,图(a)所示是 SZ-1 型辉光数码管的引脚排 列示意图,图 (b)所示是该管显示十进制数 8 时的示意图。辉光数码管外壳为透明的玻璃材料,体形矮胖,管内充有惰性气体,不需要灯丝加热,靠辉光放电来显示数码。
在这里插入图片描述
辉光数码管内有一个阳极 a(②脚),另有 10 个阴极 k0 ~ k9,它们分别是数字 0 ~ 9,它们各有一根引脚接到管壳外部。在辉光数码管工作时,阳极上接有 +180V 直流电压,当某一个阴极在外电路中接地时,该阴极与阳极之间有 +180V 直流电压,这样阳极与该阴极之间进行气体放电,此时该接地阴 极就能发出橘红色辉光数字,达到显示目的。在某一个阴极接地时,其他各阴极处于悬空或高电位状态,它们的阴极不能发光显示。

由于在单片机中不经常使用,所以不再此详述。

2.数码管仿真

2.1. BCD-七段显示译码器 7448

7448芯片的内部逻辑图(a)与逻辑框图(b):
在这里插入图片描述
该芯片的主要控制电路工作状态和扩展功能。对数码管主要起简化逻辑的功能,在1.3.3.中的驱动芯片即为7448。在Proteus 8 Professional中的 7SEG-BCD 数码管就是普通共阴数码管和7448封装在一起。如图:
在这里插入图片描述
四个引脚从左至右分别为 7448 的 A3 ~ A0 .

在Proteus 8 Professional中建立如图所示的原理图:
在这里插入图片描述上述原理图的仿真视频链接

2.2. 数码管静态显示

2.2.1. 轻触开关与按键消抖

在这里插入图片描述
轻触开关为机械弹性开关,当机械触点断开、闭合时由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开的时候也不会一下子断开。因为在闭合及断开的瞬间均伴随有一连串的抖动(如下图),这种抖动可能会引起我们芯片进行错误的判断,为了不产生这种现象而作的措施我们称之为按键消抖。 在这里插入图片描述
为了解决按键抖动我们有软件消抖和硬件消抖两种方法。
硬件消抖:顾名思义,在电路中添加元器件来达到消抖的目的,例如复位电路的电容,或RS触发器,如图:在这里插入图片描述
在这里插入图片描述
软件消抖:我们在使用开关的时候加一个延迟函数,跳过电平的不稳定时间即可:

void delay()
 {
 	uint i;
	for(i = 0 ; i < 123 ; i ++)}
 void key()
 {
 	if(KEY0 == 0{
 		delay();
 		if(KEY0 == 0{
 		...........
 		}
 	}
 }

或者使用下面的方法,在开关按下的时候a加一,再判断a和开关的状态,这个方法适用于短按,不适用于长按多少秒之类的。

void key()
 {
	if(key0 == 0 && a == 0)
	{
		a = 1;
	}
	if(a == 1 && key0 == 1)
	{
		a = 0;
		sum++;
	}
 }

2.2.2.原理图与代码

在这里插入图片描述
在Proteus 8 Professional中绘制上图所示的原理图。

然后开始写程序。

#include<reg52.h>			 //此文件中定义了单片机的一些特殊功能寄存器
#define uint unsigned int    //对数据类型进行声明定义
#define uchar unsigned char  //对数据类型进行声明定义
sbit key0 = P1^0;			// 位地址的声明 ,注意:sbit 必须小写 ,P必须大写
uint s[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x40,0x80,0x00};	//共阴数码管0~9 、 A~F 、 - 、 . 熄灭
uint sum = 0; 		//定义无符号的整型变量  unsigned int 的数据范围为0~65535(2^16 - 1)
uchar a=0;			//定义无符号的字符型变量  unsigned char 的数据范围为0~255(2^8 - 1)

void delay(uint n)		// 延时函数,大约延时 n ms
 {
 	uint i,j;
	for(i = 0 ; i < n ; i ++)
	{
		for(j = 0 ; j < 123 ; j ++);
	}
 }

void key()   // 按钮函数 ,按下开关数码管变换
 {
	if(key0 == 0 && a == 0)
	{
		a = 1;
	}
	if(a == 1 && key0 == 1)
	{
		a = 0;
		sum++;
	}
 }

void seg()	// 数码管的显示函数
 {
 	P2 = s[sum];
	if(sum == 18)
	{
		sum = 0;
	}
 }

void main()
 {
 	while(1)
	{
		key();
		seg();
	}
 }

上述程序仿真视频链接

2.3. 数码管的动态显示

多个数码管显示数字的时候,实际上是轮流点亮数码管(即一个时只有一个数码管是亮的),利用人眼的视觉暂留现象(也叫余辉效应),就可以做到看起来是所有数码管都同时亮了,这就是动态显示,也叫动态扫描。

假如有两个数码管,要显示“12”这个数字,先让高位的数码管导通,然后控制单片机I/O口让其显示“1”,延时到一定时间后再让低位的数码管导通,控制单片机的I/O口让其显示“2”。把这个流程以一定的速度循环运行就可以让数码管显示出“12”,由于交替速度非常快,人眼识别到的就是“12”这两个数字同时亮了。
如图:在这里插入图片描述

代码:


#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int

uchar s[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};	   //共阴数码管0~9	
uchar t0 = 0 ,t1 = 0 , t2 = 0 , t3 = 0 , t4 = 0 , t5 = 0 ;			   
uchar b = 0 , c = 0 , d = 0;

void delay(uint n)			   //延时函数(运行空项目以达到延迟时间的效果)
{
	uint i,j;
	for(i = 0 ; i < n ; i ++)
	{
		for(j = 0 ; j < 120 ; j ++);
	}	
}

void display1()						   //在数码管上显示
{
	P2 = 0x7f ;				  //P2^7低电平	 0111 1111	 控制第一个数码管 
	P0 = s[t0] ;			
	delay(1) ;				  //延时大约1ms
	P2 = 0xbf ;				  //P2^6低电平	 1011 1111	 控制第二个数码管 
	P0 = s[t1] ;			 
	delay(1) ;
	P2 = 0xdf ;				  //P2^5低电平	 1101 1111	 控制第三个数码管 
	P0 = 0x40 ;				
	delay(1) ;
	P2 = 0xef ;				  //P2^4低电平	 1110 1111	 控制第四个数码管 
	P0 = s[t2] ;			 
	delay(1) ;
	P2 = 0xf7 ;				  //P2^3低电平	 1111 0111	 控制第五个数码管 
	P0 = s[t3] ;			  //用来显示“分”的个位
	delay(1) ;
	P2 = 0xfb ;				  //P2^2低电平	 1111 1011	 控制第六个数码管 
	P0 = 0x40 ;				 
	delay(1) ;
	P2 = 0xfd ;				  //P2^1低电平	 1111 1101	 控制第七个数码管 
	P0 = s[t4] ;			 
	delay(1) ;
	P2 = 0xfe ;				  //P2^0低电平	 1111 1110	 控制第八个数码管 
	P0 = s[t5] ;			 
	delay(1) ;	
}



void main()					  //主函数
{
	while(1)
	{
		display1();
	}	
}
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐