04 51单片机之数码管显示

发布于:2025-07-22 ⋅ 阅读:(22) ⋅ 点赞:(0)


1、前言

在前面的文章中介绍了51单片机之独立按键控制LED状态,今天介绍单片机的数码管,下面将介绍数码管的显示其中包含了动态数码管静态数码管两种。


2、数码管

数码管其实就是由多个发光二极管封装在一起组成“8”字型的器件当分别点亮这些发光二极管时就可以组成不同的数字显示出来。
在这里插入图片描述

Figure1. 数码管

3、单个数码管引脚定义

3-1、单个共阴极

所有LED的阴极连接在一起,通过控制阳极的高电平来点亮对应的段
在这里插入图片描述

Figure2. 单个共阴极数码管

3-2、单个共阳极

所有LED的阳极连接在一起,通过控制阴极的低电平来点亮对应的段

在这里插入图片描述

Figure3. 单个共阳极数码管

3-3、单个数码管引脚定义

数码管通常由7个或8个LED组成,分别对应数字0到9和英文字母A到F等字符的显示方式。每个LED可以看作是一个“像素”,通过点亮不同的LED组合,可以展示不同的字符或图形。

在这里插入图片描述

Figure4. 单个数码管引脚定义

4、四位一体数码管引脚定义

4-1、四位一体共阴极数码管

在这里插入图片描述

Figure5. 四位一体共阴极数码管

4-2、四位一体共阳极数码管

在这里插入图片描述

Figure6. 四位一体共阳极数码管

4-3、四位一体数码管引脚定义

在这里插入图片描述

Figure7. 四位一体数码管引脚定义

举例说明:假设四位一体数码管需要显示数字为()()(1)(),则在Figure6. 四位一体共阴极数码管途中,将DIG3设置为低电平(置0),DIG1、DIG2、DIG4为高点平(置1);然后引脚7、4设置为高点平(置1),其余引脚(11、2、1、10、5、3)设置为低电平(置0)


5、数码管原理图

从下图可以知道8个数码管通过了一个74HC245芯片单片机的P00-P07相连接。74HC138译码器通过P22-P24输出的相对于的电平选择控制哪个具体的数码管。由于3-8译码器是输出低电平有效,则原理图中的四位一体数码管是共阴极连接。74HC245芯片主要是用于数据缓冲功能,其中DIR表述传输方向,若是高电平,则是将Ax的数据传输给Bx;否则,则是将Bx的数据传输给Ax。OE表示使能引脚(低电平有效)。

在这里插入图片描述

Figure8. 数码管原理图

Table1. 3-8译码器输出表(低有效)
C(P2_4) B(P2_3) A(P2_2) Y LED
0 0 0 Y0 LED0
0 0 1 Y1 LED1
0 1 0 Y2 LED2
0 1 1 Y3 LED3
1 0 0 Y4 LED4
1 0 1 Y5 LED5
1 1 0 Y6 LED6
1 1 1 Y7 LED7

6、C51数组(补充知识点)

数组:把相同类型的一系列数据统一编制到某一个组别中,可以通过数组名+索引号简单快捷的操作大量数据。

int x[3]; //定义一组变量(3个)
int x[]={1,2,3}; //定义一组变量并初始化
x[0] //引用数组的第0个变量
x[1] //引用数组的第1个变量
x[2] //引用数组的第2个变量

引用×[3]时,数组会越界。读出的数值不确定,应避免这种操作。


7、C51子函数(补充知识点)

子函数:将完成某一种功能的程序代码单独抽取出来形成一个不模块在主函数中可随时调用此模块,以达到代码的复用和优化程序结构的目的

void Function(unsigned char x, y)
{

}
返回值函数名(形参)
{
	函数体
}

8、静态数码管显示

8-1、基础版本

在这里插入图片描述

Figure9. 数码管显示数字程序One

#include <REGX52.H>

void main()
{
	unsigned int i = 0;
	/* Select LED6 to light up. set /Y5. */
	P2_2 = 1;
	P2_3 = 0;
	P2_4 = 1;
	
	/* Control LED6 show number(6), set a,c,d,e,f,g. */
	P0 = 0x7D;
	while(1)
	{
	
	}
}

注意:让LED6的数码管显示数字6,则需要点亮a,c,d,e,f,g等六个端口,则如下图所示:
在这里插入图片描述

Figure10. 数码管显示数字设置

8-2、数码管段码表

Table2. 数码管段码表(0~F)
数字 a b c d e f g dp 段码
0 1 1 1 1 1 1 0 0 0x3F
1 0 1 1 0 0 0 0 0 0x06
2 1 1 0 1 1 0 1 0 0x5B
3 1 1 1 1 0 0 1 0 0x4F
4 0 1 1 0 0 1 1 0 0x66
5 1 0 1 1 0 1 1 0 0x6D
6 1 0 1 1 1 1 1 0 0x7D
7 1 1 1 0 0 0 0 0 0x07
8 1 1 1 1 1 1 1 0 0x7F
9 1 1 1 1 0 1 1 0 0x6F
A 1 1 1 0 1 1 1 0 0x77
B 0 0 1 1 1 1 1 0 0x7C
C 1 0 0 1 1 1 0 0 0x39
D 0 1 1 1 1 0 1 0 0x5E
E 1 0 0 1 1 1 1 0 0x79
F 1 0 0 0 1 1 1 0 0x71
None 0 0 0 0 0 0 0 0 0x00

8-3、静态数码管显示Plus

在这里插入图片描述

Figure11. 数码管显示数字程序Plus

#include <REGX52.H>

unsigned char NixieTable[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};

void Nixie(unsigned char Location, Number)
{
	switch (Location)
	{
		case 1: P2_4 = 1; P2_3 = 1; P2_2 = 1; break; // LED8
		case 2: P2_4 = 1; P2_3 = 1; P2_2 = 0; break; // LED7
		case 3: P2_4 = 1; P2_3 = 0; P2_2 = 1; break; // LED6
		case 4: P2_4 = 1; P2_3 = 0; P2_2 = 0; break; // LED5
		case 5: P2_4 = 0; P2_3 = 1; P2_2 = 1; break; // LED4
		case 6: P2_4 = 0; P2_3 = 1; P2_2 = 0; break; // LED3
		case 7: P2_4 = 0; P2_3 = 0; P2_2 = 1; break; // LED2
		case 8: P2_4 = 0; P2_3 = 0; P2_2 = 0; break; // LED1
	}
	P0 = NixieTable[Number];
}

void main()
{

	Nixie(2,4);
	while(1)
	{
		
	}
		
}

8-4、实验现象

在这里插入图片描述

Figure12. 数码管显示数字2(LED7)

9、动态数码管显示

9-1、基础版本

在这里插入图片描述

Figure13. 数码管动态显示数字程序

#include <REGX52.H>

unsigned char NixieTable[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};

void DelayMs(unsigned int xms)		//@12.000MHz
{
	unsigned char i, j;

	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

void Nixie(unsigned char Location, Number)
{
	switch (Location)
	{
		case 1: P2_4 = 1; P2_3 = 1; P2_2 = 1; break; // LED8
		case 2: P2_4 = 1; P2_3 = 1; P2_2 = 0; break; // LED7
		case 3: P2_4 = 1; P2_3 = 0; P2_2 = 1; break; // LED6
		case 4: P2_4 = 1; P2_3 = 0; P2_2 = 0; break; // LED5
		case 5: P2_4 = 0; P2_3 = 1; P2_2 = 1; break; // LED4
		case 6: P2_4 = 0; P2_3 = 1; P2_2 = 0; break; // LED3
		case 7: P2_4 = 0; P2_3 = 0; P2_2 = 1; break; // LED2
		case 8: P2_4 = 0; P2_3 = 0; P2_2 = 0; break; // LED1
	}
	P0 = NixieTable[Number];
}

void main()
{
	unsigned int i;
	
	while(1)
	{
		for(i = 1; i <= 8; i++)
		{
			Nixie(i,i+1);
			DelayMs(i);
		}		
	}
}

9-2、实验现象

动态数码管显示


9-3、动态数码管显示(消影)

在这里插入图片描述

Figure14. 数码管动态显示数字程序(消影)

#include <REGX52.H>

unsigned char NixieTable[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};

void DelayMs(unsigned int xms)		//@12.000MHz
{
	unsigned char i, j;

	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

void Nixie(unsigned char Location, Number)
{
	switch (Location)
	{
		case 1: P2_4 = 1; P2_3 = 1; P2_2 = 1; break; // LED8
		case 2: P2_4 = 1; P2_3 = 1; P2_2 = 0; break; // LED7
		case 3: P2_4 = 1; P2_3 = 0; P2_2 = 1; break; // LED6
		case 4: P2_4 = 1; P2_3 = 0; P2_2 = 0; break; // LED5
		case 5: P2_4 = 0; P2_3 = 1; P2_2 = 1; break; // LED4
		case 6: P2_4 = 0; P2_3 = 1; P2_2 = 0; break; // LED3
		case 7: P2_4 = 0; P2_3 = 0; P2_2 = 1; break; // LED2
		case 8: P2_4 = 0; P2_3 = 0; P2_2 = 0; break; // LED1
	}
	P0 = NixieTable[Number];
	DelayMs(1);
	P0 = 0x00;
}

void main()
{
	unsigned int i;

	while(1)
	{
		for(i = 1; i <= 8; i++)
		{
			Nixie(i,i+1);
			DelayMs(i);
		}		
	}
}

9-4、实验现象

动态数码管显示(消影)


10、数码管驱动方式

  1. 单片机直接扫描:硬件设备简单,但会耗费大量的单片机CPU时间。
  2. 专用驱动芯片:内部自带显存、扫描电路,单片机只需告诉它显示什么即可。
    在这里插入图片描述
Figure15. 数码管专用驱动芯片


网站公告

今日签到

点亮在社区的每一天
去签到