锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

单片机学习 4-动态数码管显示

时间:2022-10-10 15:30:00 sitemap 2二极管a7

显示动态数码管

介绍动态数码管

数字管动态显示原理

在这里插入图片描述

数码管采用动态显示方式连接,则八位数码管每个位的数码管对应相同段的线路连接在一起。而位选线单独连接。

由于三八译码器的特点,每次只能选择点亮一根数码管,肉眼可以区分20-50ms(余晖效应)因此控制数字管的照明间隙小于20ms,也就是说,如果人们想看到第一个数字管显示1和第二个数字管显示2一起出现,0和1之间的延迟时间应控制在20以下ms(1显示后等待小于200ms时间,点亮2)。

74HC245和74HC138芯片介绍

开发板上控制单片功能 2 单片机仅显示位置集成的共阴数码管 IO 口驱动不好,这里需要增加外部驱动芯片,开发板使用 74HC245 芯片。2 个 4 集成共阴数码管的位选线有 8 根,直接让单片机 IO 口腔控制没有问题,但考虑到 51 单片机 IO 我们通常使用口资源的限制 IO 例如,扩展芯片 74HC138、74HC164、74HC595 芯片等,只需要很少的单片机 IO 嘴可以扩展 8 个控制口,更多的控制口甚至可以通过级联扩展(在后面 LED 详细介绍点阵实验章节)。我们在开发板上使用它 74HC138 译码器芯片只需要单片机 3 个 IO 口就能实现 8 个位选管脚的控制节省了芯片 IO 资源。

74HC245芯片

74HC245 它是一种三态输出和八路信号收发器,主要用于大屏幕显示和其他消费电子产品。可以增加I/O八个数字管可以通过芯片驱动。
(1)主要特征
①采用 CMOS 工艺
②宽电压工作范围:3.0V-5.0V
③双向三态输出
④八线双向收发器
⑤封装形式:SOP20、SOP20-2、TSSOP20、DIP20


(2)管脚功能定义

从上述管脚功能定义说明和真值表可以看出,芯片的使用方法非常简单 OE
使管脚低电平,DIR 管脚的高电平传输方向是 A->B 输出,DIR 低电平传输方
向是 B->A,至于输出高电平还是输出低电平取决于输入端的状态,如果输入为
低电平,输入高,输出高。 OE 使管脚高电平,
不论 DIR 管脚是高是低,输出是高组态。
我们通常使用它 74HC245 当芯片被用作驱动器时,它只 DIR 管脚
传输方向为高电平 A->B(二极管单向导电DIR为高电平,OE非低电平)。

74HC138芯片

74HC138D 主要用于消费电子产品的三通道输入、八通道输出译码器。
(1)主要特征
①采用 CMOS 工艺
②低功耗
③工作电压:3.0V-5.0V
④封装形式:SOP16
(2)管脚功能定义

从上述管脚功能定义说明和真值表可以看出,芯片的使用方法非常简单。一是使能有效,给予E1、E2 使管脚低电平,E3 管脚为高电平。至于哪个管脚输出有效电平(带非号就是低电平有效),要看 A0,A1,A2 输入管脚的电平状态。如果 A0,A1,A2 都是低电平,则Y0 输出有效电平(低电平),其他管脚输出高电平。如果 A0 为高电平,A1,A2 都是低电平,则 Y1 输出有效电平(低电平),其他管脚输出高电平。您可以根据真值表查看其他几种输出。如果 E1、E2 任何能量管脚的高电平或 E3 无论输入是什么,输出都是高电平。

这里总结一个方法:A0、A1、A2 输入相当于 3 位 2 进制数,A0 是低位,A1 是次高位,A2 是高位。而 Y0-Y7 具体输出有效电平取决于输入二进制对应的十进制值。例如,输入是 101(A2,A1,A0),其对应的十进制数是 5,所以 Y5 输出有效电平(低电平)。

硬件设计

A2-A4开发板电路图:

A5-A7开发板电路图:

A5-A7开发版输入端增加了下拉电阻,如输入端连接P0端口,因为P0内无上拉电阻,但外界有上拉电阻,默认输入高电平,不添加下拉电阻,自动点亮干扰。

!!!注意A2-A4开放版和A5-A7开发版的选择是相反的。

软件设计

编程

#include"reg52.h"  typedef unsigned char u8; typedef unsigned int u16;  #define SMG_A_DP_PORT P0  sbit LSA=P2^2; sbit LSB=P2^3; sbit LSC=P2^4;  u8 gsmg_code[16]={ 
        0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,         0x7f,0x6f,0x77,0x7c,0x39,0x6e,0x79,0x71};//共阴0-F

void delay_10us(u16 ten_us)
{ 
        
	while(ten_us--);
}
								
void smg_display()//数码管smg同时显示0—7
{ 
        
	  u8 i=0;
		
		for(i=0;i<8;i++)//for(i=7;i>=0;i--) //改变位选方向//A2-A4开发板
	{ 
        
			switch(i)
			{ 
        
				case 0:LSA=0;LSB=0;LSC=0;break;
				case 1:LSA=1;LSB=0;LSC=0;break;
				case 2:LSA=0;LSB=1;LSC=0;break;
				case 3:LSA=1;LSB=1;LSC=0;break;
				case 4:LSA=0;LSB=0;LSC=1;break;
				case 5:LSA=1;LSB=0;LSC=1;break;
				case 6:LSA=0;LSB=1;LSC=1;break;
				case 7:LSA=1;LSB=1;LSC=1;break;				
			}
			SMG_A_DP_PORT=gsmg_code[i];  //改变位选值//SMG_A_DP_PORT=gsmg_code[7-i]; A2-A4开发板
			//delay_10us(100);//1ms //时间越大,数码管动态显示越明显(相当于流水灯)
			delay_10us(1000);//10ms
			SMG_A_DP_PORT=0x00; //数码管段数据口清零(消隐)
	}
}
void main()
{ 
        
			SMG_A_DP_PORT=gsmg_code[0];
		while(1)
		{ 
        
			smg_display();
		}
}

消除重影!!!

在关闭前一个数码管的显示前要对数码管段的数据口清零。因为每个数码管的段码是并联在一起的,所以当前一个有效位关闭,下一个有效位开启的时候,P0的数据依然会存在前一个有效位(可以理解为电路的延迟,在前一个有效位在关闭前一瞬间,下一个有效位的数据已经影响到前一个有效位了)

实验现象

间隙1ms:

间隙10ms:

相关文章