静态动态数码管实验

多位数码管简介

        多位数码管,即两个或两个以上单个数码管并列集中在一起形成一体的数码管。当多位一体时,其内部的公共端是独立的,而负责显示什么数字的段线 (a-dp)全部是连接在一起的,独立的公共端可以控制多位一体中的哪一位数码管点亮,而连接在一起的段线可以控制这个能点亮数码管亮什么数字,通常把公共端叫做“位选线”,连接在一起的段线叫做“段选线”,有了这两个线后, 通过单片机及外部驱动电路就可以控制任意的数码管显示任意的数字了。如图所示:

        本文使用的开发板上使用的是 2 个四位一体的共阴数码管,这样可在上面同时显示 8 个数值。

数码管动态显示原理

        多位数码管依然可以静态显示,但是显示时要么只显示一位数码管,要么多位同时显示相同内容。从上面图中得知,“位选(6/8/9/12)”是可独立控制的,而“段选(a-dp)”是连接在一起的,可以通过位选信号控制哪几个数码管亮,而在同一时刻,位选选通的所有数码管上显示的数字始终都是一样的,因为它们的段选是连接在一起的,送入所有数码管的段选信号都是相同的,所以它们显示的数字必定一样,数码管的这种显示方法叫做静态显示。

        而动态显示,就是利用减少段选线,分开位选线,利用位选线不同时的通和断,改变段选数据来实现的。例如,在第一次位选中第一位数码管时,给段选数据 0, 下一次位选中第二位数码管时显示 1。为了在显示 1 的时候,0 不会消失(当然,实际上是消失了,因为此时第一位数码管的位选为1,即阴极为1),必须在人肉眼观察不到的时间里再次点亮第一次点亮的 0。 人的肉眼正常情况下只能分辨变化超过 24ms 间隔的运动, 也就是说,下一次点亮 0 这个数字的时间差不得大于 24ms。这时就会发现, 数码管点亮是在向右或者向左一位一位点亮,形成了动态效果。如果把间隔时间改长就能直接展现这一现象。

        要使单片机能控制开发板上 2个四位一体的共阴数码管显示,仅靠单片机 IO 口来驱动是不行的,这时就需要增加外部驱动芯片。2 个 4 位一体的共阴数码管的位选线有 8 根, 直接让单片机 IO 口控制是没有任何问题的,但考虑到 51 单片机 IO 口资源的限制,通常会使用一种 IO 扩展芯片,比如 74HC138、74HC164、74HC595 芯片等,只需要很少的单片机 IO 口就可以扩展出 8 个控制口,通过级联方式甚至可扩展出更多的控制口(LED 点阵实验中会有详细介绍)。本文使用的开发板上是 74HC138 译码器芯片,只需单片机 3 个 IO 口就可以实现 8 个位选管脚的控制,节省了芯片的 IO 资源。

74HC245 芯片介绍

        74HC245 适用于显示屏以及其他数字电路的驱动。

主要特性

  • 采用 CMOS 工艺 
  • 宽电压工作范围:3.0V-5.0V
  • 双向三态输出
  • 八线双向收发器
  • 封装形式:SOP20、SOP20-2、TSSOP20、DIP20

管脚功能定义

管脚说明

真值表 

        从上面的管脚功能定义说明及真值表可知,给 OE 使能管脚低电平,DIR 管脚为高电平传输方向是 A->B 输出,DIR 为低电平传输方向是 B->A。至于输出高电平还是输出低电平取决于输入端的状态,如果输入为低电平,输出即为低;输入为高电平,输出即为高。如果 OE 使能管脚为高电平, 不论 DIR 管脚是高还是低,输出是高组态。 通常使用 74HC245 芯片用作驱动只会让其在一个方向输出,即 DIR 管脚为高电平,传输方向是 A->B

74HC138 芯片介绍

             74HC138D 是一种三通道输入(A0~A2)、八通道输出(Y0~Y7)译码器。

主要特性

  • 采用 CMOS 工艺
  • 低功耗
  • 工作电压:3.0V-5.0V
  • 封装形式:SOP16

管脚功能定义

管脚说明

真值表 

         从上面的管脚功能定义说明及真值表可知,该芯片使用方法很简单,给 E1、E2 使能管脚低电平,E3 管脚为高电平,至于哪个管脚输出有效电平(低电平),要看 A0,A1,A2 输入管脚的电平状态。例如, A0,A1,A2 都为低电平,则Y0输出有效电平(低电平),其他管脚均输出高电平。其他几种输出可以对照真值表查看。

         如果 E1、E2 使能管脚任意一个为高电平或 者 E3 为低电平,不论输入是什么,输出都为高电平(真值表第1、2行所示)。

         更多详细介绍可查看 74HC138 芯片数据手册;链接: https://pan.baidu.com/s/1-KJJBsHRJQwT1wNDXhBKOQ?pwd=4645 提取码: 4645 。

代码实现

   硬件部分

         本实验使用到硬件资源如下:

  • 动态数码管模块
  • 74HC138(控制位选)
  • 74HC245(控制段选)

         开发板上的动态数码管模块电路如下图所示:

         74HC138译码器模块电路如下图所示:

         开发板上电路模块是独立的,动态数码管的控制管脚并未直接连接到51单片机的 IO 上,而是段选端连接到 J6 端子上,位选端连接到 J1 端子上。 段选端通过 74HC245 芯片驱动这两个共阴数码管的 a-dp 段。 由于动态数码管模块电路是独立的,所以使用任意单片机管脚都可以,这里使用 P0 口控制数码管段选,使用 P2.2、P2.3、P2.4 管脚控制 74HC138 译码器输入从而控制数码管位选。 

源代码

#include "reg52.h"

typedef unsigned int u16;//使用关键字 typedef 对系统默认数据类型 unsigned int 重新命名
typedef unsigned char u8;
 
#define SMG_A_DP_PORT P0 //使用宏定义数码管段码口,使用P0控制

/*定义74HC138~数码管位选信号控制脚*/
sbit LSA=P2^2; //定义74HC138译码器的输入A管脚
sbit LSB=P2^3; //定义74HC138译码器的输入B管脚
sbit LSC=P2^4; //定义74HC138译码器的输入C管脚

void delay_10us(u16 ten_us)//延时函数,ten_us=1 时,大约延时 10us
{
 	while(ten_us--);
}

/*共阴极数码管显示 0~F 的段码数据*/
u8 gy_smg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                    0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

void SMG_DISPLAY(void)	 //函数声明
{
 	u8 i=0;

	for(i=0;i<8;i++) //循环8次,每次传递一个位选和段选来显示一个数0~7
	{
	 	switch(7-i)	//设置74HC138的使能管脚,控制位选
		{
		 	case 0:LSC=1;LSB=1;LSA=1;break;
			case 1:LSC=1;LSB=1;LSA=0;break;
			case 2:LSC=1;LSB=0;LSA=1;break;
			case 3:LSC=1;LSB=0;LSA=0;break;
			case 4:LSC=0;LSB=1;LSA=1;break;
			case 5:LSC=0;LSB=1;LSA=0;break;
			case 6:LSC=0;LSB=0;LSA=1;break;
			case 7:LSC=0;LSB=0;LSA=0;break;
		}
		/*位选确定后,设置段选*/
		SMG_A_DP_PORT=gy_smg_code[i];//传送位选数据0~7
		delay_10us(30000);//延时一定时间,否者短时间内就传送了很多位选数据,人眼分不清
		SMG_A_DP_PORT=0x00;//消除重影,把上一次显示的影响消除,防止下一次显示的时候产生重影
	}
}

void main(void)	   //主函数
{	
	while(1)
	{
	 	SMG_DISPLAY();//调用函数
	}
}

现象

猜你喜欢

转载自blog.csdn.net/weixin_60461563/article/details/122388634