目录

一、数码管介绍

1、LED数码管

 2、单个数码管

(1)、单数码管电路图 

(2)、共阴、共阳极数码管

(一)、共阴极数码管 

 (二)、共阳极数码管

3、多个数码管 

(1)、多个数码管电路图

 (2)、共阴、共阳极数码管

二、C语言补充知识

1、数组

2、C51子函数 

三、程序设计 

(一)、数码管静态显示 

(二)、数码管动态显示

一、数码管介绍

1、LED数码管

        数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成“8”字型的器件。 

 2、单个数码管

(1)、单数码管电路图 

1、数码管结构 :单数码管由多个 LED 段组成,图中数码管有 a - g 七个段用于显示数字形状,还有一个 dp 段用于显示小数点。这些段通过不同的亮灭组合,能够显示 0 - 9 数字以及一些简单符号 。

2、引脚:图中显示了数码管的引脚对应关系,如引脚 1 对应 e 段、引脚 2 对应 d 段等。不同的数码管引脚定义可能不同,使用时要参照具体手册。

(2)、共阴、共阳极数码管

(一)、共阴极数码管 

1、公共阴极:图中上方的引脚 3、8 连接在一起,代表数码管的公共阴极。在共阴极数码管中,此公共端需接低电平,才能使数码管正常工作。

2、段引脚:从 A - G 和 DP 分别对应数码管的七个显示段(a - g )和小数点(dp)。其中 A 对应 a 段、B 对应 b 段,以此类推。每个段引脚连接着一个独立的发光二极管(LED)阳极 。

3、引脚编号:图中各段对应的引脚编号,如 A 段对应引脚 7、B 段对应引脚 6 等。这些编号用于在实际电路连接时,将数码管的引脚与外部电路(如单片机 I/O 口 )准确连接。

        当公共阴极接低电平后,通过向 A - G 和 DP 这些段引脚输入高电平,可点亮对应的 LED 段。例如,若要显示数字 “0”,需使 A、B、C、D、E、F 段引脚为高电平,G 和 DP 段引脚为低电平,各段 LED 点亮后即可组合成 “0” 的形状 。通过不同的段电平组合,就能显示 0 - 9 数字、小数点及部分简单字符。

 (二)、共阳极数码管

       共阳极数码管,即所有内部发光二极管(LED)的阳极连接在一起,形成公共端(引脚 3 和 8 相连 )。工作时,公共端需接高电平,才能使数码管正常显示。

3、多个数码管 

(1)、多个数码管电路图

1、数码管部分

(1)、数码管类型:采用共阴极数码管,标识为 LED1 - LED8 ,每个数码管有 a - g 七个显示段和一个 dp 小数点段,COM 为公共阴极引脚,需接低电平才能正常显示。

(2)、显示原理:通过控制各段引脚电平高低,不同段组合点亮来显示 0 - 9 数字、小数点等。如显示 “5”,需 a、c、d、f、g 段亮 。

2、驱动芯片部分

  • 芯片型号:74HC245,是常用的双向总线驱动器,用于增强单片机 I/O 口驱动能力,以驱动数码管。
  • 引脚功能:A0 - A7 和 B0 - B7 是数据输入输出引脚;DIR 引脚控制数据传输方向,此电路中 VCC 使其从 A 端口传向 B 端口 ;OE 为使能引脚,接地表示使能芯片工作。

3、其他元件

        电阻 RP3、RP4:起限流作用,保护数码管和 74HC245 芯片,防止电流过大损坏器件。

4、工作过程

        单片机通过 P00 - P07 引脚输出段码数据,经 74HC245 增强驱动后,传输到数码管各段引脚,控制数码管显示相应字符或数字 。

5、74HC138译码器

一、为啥用 74HC138?—— 省单片机引脚!

        数码管要显示多位数字(比如 8 位数码管),直接用单片机控制,得占用 8 个位选引脚 + 8 个段选引脚 ,太费资源。

        74HC138 是 3 输入、8 输出 的译码器,用 3 个单片机引脚 就能控制 8 个数码管的位选 ,大大节省 IO 口,这就是核心作用!

二、74HC138 咋选数码管?—— 3 个输入决定 8 个输出

  1. 输入(A、B、C:接单片机的 3 个引脚(比如 P22、P23、P24 ),输入 3 位二进制信号(0 或 1 ),组合出 8 种状态(000 - 111 ,对应十进制 0 - 7 )。
  2. 输出(Y0 - Y7:对应 8 个数码管的 位选端 ,默认输出高电平;当输入对应某状态时,其中 1 个输出低电平 ,选中对应的数码管。

举个栗子:

  • 输入 A=0、B=0、C=0(二进制 000 )→ Y0 输出低电平 → 选中第 1 个数码管;
  • 输入 A=1、B=0、C=0(二进制 001 )→ Y1 输出低电平 → 选中第 2 个数码管;
  • 以此类推,直到输入 111 ,Y7 输出低电平,选中第 8 个数码管。

三、和数码管咋配合显示?—— “位选 + 段选” 动态扫描

数码管显示分 位选”(选哪个数码管亮) 和 段选”(亮数码管的哪几段,显示啥数字) ,74HC138负责 位选,流程如下:

  1. 单片机给 74HC138 送 输入信号(比如选 Y0 ,让第 1 个数码管工作 );
  2. 74HC138 Y0 输出低电平 ,选中第 1 个数码管;
  3. 单片机给 段选引脚 送信号(比如要显示 “1” ,就点亮数码管的 b、c 段 );
  4. 第 1 个数码管显示 “1” ,然后快速切换到下一个数码管(比如 Y1 ),重复步骤 1 - 3 ……

因为切换速度极快(人眼跟不上),利用 视觉暂留” ,看起来就像 8 个数码管同时亮啦!

四、总结

        74HC138 就是个 数码管选号器” :用 3 个引脚控制 8 个数码管的 “选谁亮” ,配合单片机的 “段选信号” ,快速切换实现多位显示,省引脚又能动态控制,记住 “3 入选 8 出,配合段选动态扫” 就懂啦!

 (2)、共阴、共阳极数码管

    略

二、C语言补充知识

1、数组

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

2、C51子函数 

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

三、程序设计 

      上图是在第三个数码管显示6。要从下往上读 0111 1101 化成 十六进制为 0x7D。即将P0口设成0x7D。 

(一)、数码管静态显示 

#include <REGX52.H>
unsigned char NixieTable[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

void Nixie(unsigned char Location,Number){
	
		switch(Location){
			case 1:P2_4 = 1;P2_3 = 1;P2_2 = 1;break;
			case 2:P2_4 = 1;P2_3 = 1;P2_2 = 0;break;
			case 3:P2_4 = 1;P2_3 = 0;P2_2 = 1;break;
			case 4:P2_4 = 1;P2_3 = 0;P2_2 = 0;break;
			case 5:P2_4 = 0;P2_3 = 1;P2_2 = 1;break;
			case 6:P2_4 = 0;P2_3 = 1;P2_2 = 0;break;
			case 7:P2_4 = 0;P2_3 = 0;P2_2 = 1;break;
			case 8:P2_4 = 0;P2_3 = 0;P2_2 = 0;break;
		}
		P0 = NixieTable[Number];

}



void main(){
		Nixie(2,2);
		while(1){
		
		}
	}

(二)、数码管动态显示

1、数码管工作原理:(1)位选——段选—清零—位选——段选—清零—......要注意消影

#include <REGX52.H>
unsigned char NixieTable[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

void Delay(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;
			case 2:P2_4 = 1;P2_3 = 1;P2_2 = 0;break;
			case 3:P2_4 = 1;P2_3 = 0;P2_2 = 1;break;
			case 4:P2_4 = 1;P2_3 = 0;P2_2 = 0;break;
			case 5:P2_4 = 0;P2_3 = 1;P2_2 = 1;break;
			case 6:P2_4 = 0;P2_3 = 1;P2_2 = 0;break;
			case 7:P2_4 = 0;P2_3 = 0;P2_2 = 1;break;
			case 8:P2_4 = 0;P2_3 = 0;P2_2 = 0;break;
		}
		P0 = NixieTable[Number];
		Delay(1);
		P0 = 0x00;
}



void main(){
		
		while(1){
			Nixie(1,1);
			Nixie(2,2);
			Nixie(3,3);
			
		}
	}

现象: 

 

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐