51单片机入门_09_数码管静态显示(数码管显示原理:共阴极、共阳极;静态显示与动态显示原理;74HC573锁存器使用及原理;上拉电阻作用;准双向、开漏;原理图分析;编程实践)

1. 数码管应用场景

以下均是使用的数码管的场景
在这里插入图片描述
对于显示器件常见的有很多种,有数码管、LED点阵、LCD液晶以及TFD彩屏。

2. 数码管显示原理

在这里插入图片描述
上图分别为共阴极和共阳极的接法
数码管根据内部连接不同分为共阴极和共阳极。八段数码管内部有8颗LED组成,如果想要显示特定字形只需控制相应的LED亮起,其他LED熄灭即可。

根据原理图我们可以判断其是共阴极还是共阳极接法,那么拿到一个实物如何去判断呢?

我们拿到一个数码管可以看它是几个8,一个8表示一位,有几个8就表示有几位,以上图中一位的数码管为例,我们观察数码管上下的引脚,中间的GND均为一个公共脚,如果这个公共脚为GND表示共阴极,公共脚为VCC则表示共阳极。可以使用万用表去测,用黑表笔接到公共脚,将红脚笔假设接到a脚上,如果数码管“abcdefg”中的a亮了,表示这是一个共阴极的数码管,如果将表笔更换之后,a亮了,那么这就是一个共阳极的。(这是因为红表笔输出的是正电压,红表笔在公共脚上,黑表笔在a脚上)

假设我们要显示“1”,那么只需要将“bc”点亮,如果采用共阴极的接法,那么只需要将bc口送1,其他口送0即可,利用单片机控制如何实现呢?
也就可以发送16进制数来实现相应位的置值

以下是一位数码管的“共阴极数码管码表”
在这里插入图片描述

3. 静态与动态显示

3.1 静态显示

LED显示器工作方式有两种:静态显示方式和动态显示方式。静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。

上面的含义举例就是:为了显示数字“1”,就需要P0=0x6,也就是8位数据线需为0x6。
段选: 也就是指上面提到的一位数码管“abcdefg dp”中的一个,公共脚称为位选

静态显示缺点为: 使用的IO口非常多,为了将8位数码管都进行显示值,假如要显示“12345678”,它每一位段选都需要8位数据线来控制,就需要64个IO口进行控制。

3.2 动态显示

动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。

同样的去显示“12345678”就只需要8位IO口结合锁存器就可以实现,所以静态显示用的非常少

4. 74HC573锁存器的工作原理

4.1 为什么需要使用锁存器

在这里插入图片描述
上面的8位数码管如果采用4个一组,段选为8段是固定的“ABCDEFGH”(H也就是dp)接到锁存器11-20引脚,8个数码管有8个位选公共极接到锁存器的11-20引脚,也就说控制8位数码管需要16个IO口进行控制,但是单片机上IO口总共就32个,接了很多外设,为了节省IO口使用锁存器,使用锁存器之后,只需要用到8个IO口就可以控制8位数码管。锁存器的作用也就是节省IO口,以下具体介绍锁存器的作用。

4.2 锁存器工作原理

锁存器作用: 可以把数据输入端D与输出端Q进行隔离或连接
在这里插入图片描述

  • 输出口Q要想Q端输出高低电平OE脚必须接GND,当OE脚为高电平的时候,Q端为高阻态,也就是一个开路状态
  • LE脚为高时,输出端Q随输入端D的数据而变化(在D端输入什么值,Q端也就是什么值,假设P0口给D端输入0x06,Q端也输出0x06,相当于D和Q是直接相连)。
  • LE脚为低时,输出端Q数据保持不变,输入端D数据变化不会改变Q的数据(当LE脚为0时,此时Q端为0x06,此时接到D端的P0口如果要去控制别的东西,此时D0口要随着P0口发生变化,结社变为0x04,Q端的数值不变,还是保持0x06,相当于D和Q是断开的)。

以下就是真值表
在这里插入图片描述
在硬件选型的时候怎么知道芯片是如何工作的?
需要看芯片的原理图、data sheet(芯片的数据手册查询网址:alldatasheet.com)

5. 上拉电阻的作用

数码管接的是单片机的P0口,其如果要做准双向IO口使用的话需要加上拉电阻。

上拉就是将不确定的信号通过一个电阻钳位在高电平,电阻同时起限流作用。下拉同理,也是将不确定的信号通过一个电阻钳位在低电平。

当P0口作为输入/输出口时,上电复位后处于开漏模式(可以输出低电平,不可以输出高电平)。P0口内部无上拉电阻,所以作I/O口必须外接10K-4.7K的上的上拉电阻(增加上拉电阻就既可以输出高电平又能输出低电平)

我们知道4组IO口中,P1P2P3是准双向,P0是开漏的

在主控芯片的P0口的外部是接了上拉电阻的,
在这里插入图片描述

在这里插入图片描述

  • 左侧图为准双向IO,口线寄存器后是一个非门,后接一个场效应管的G栅极,其上方为D漏极,下为S源极,G和S之间要有一个正偏(正电压),D和S才导通。假设口线寄存器输入一个1,经过非门输出0,此时场效应管不导通,此时VCC为高电压和D连接,D经过内部上拉电阻上拉,输出一个高电平5V;若内部给0,经非门输出为1,GS之间存在正向电压(只要达到门限电压,GS之间导通),S接地,右侧管脚相当于接到地,它的电压就会被拉低,此时引脚的电压变为0V,准双向是可以正常输出高低电平的。

  • 右侧图为漏极开路输出,漏极就是场效应管的上面的D极,开漏就是输出高电平的漏极与IO口的内部是不相连接的。假设内部输出一个1,经过非门输出为0,GS没有正向电压,DS不导通,D只与外部管脚连接,管脚是高是低无法确定,我们称之为高阻态(不确定的值);假设内部输出一个0,经过非门输出为1,GS之间有正向电压,DS导通,外部管脚连接通过DS接到地,外边管脚相当于接到地,管脚变为0V用来输出低电平,但是不能输出高电平
    在这里插入图片描述
    左右相差的就是一个VCC+上拉电阻

6. 本节相关原理图分析

此处提示:数码管锁存器模块中左侧的“D0-D7”网络标号表示上面的“74HC573”与下面“74HC573”对应的引脚连接到一起,“D0-D7”又同时接到单片机的“P0.0-P0.7”,这样就可以通过“P0.0-P0.7”连接8位数码管。
底下的数码管锁存器通过“A-H”接口,A接到数码管的A段,对应所有位数码管8顶上的一横,B对应数码管8右侧上的一竖。数码管锁存器D0接到P0,当打开锁存器的时候,D0和Q0数据是相同的,也就可以实现P0口控制A口的功能,“A-H”口的均采用该方法控制
在这里插入图片描述
上面的8位数码管如果采用4个一组,段选为8段是固定的“ABCDEFGH”(H也就是dp)接到锁存器11-20引脚,8个数码管有8个位选公共极接到锁存器的11-20引脚,也就说控制8位数码管需要16个IO口进行控制,但是单片机上IO口总共就32个,接了很多外设,为了节省IO口使用锁存器,使用锁存器之后,只需要用到8个IO口就可以控制8位数码管。

在这里插入图片描述

原理图解析:

在这里插入图片描述
使用2个锁存器,U9负责数码管的段选,U8锁存器负责数码管的位选,OE都接到了GND,LE是控制锁存与不锁存的脚,控制段的LE接到P26,控制位的LE接到P27,所以通过P26和P27就可以控制锁存器的开断,这样就可以分时复用P0口控制8位数码管,这就工作原理。

从原理图可以看到U9锁存器的Q端接了300Ω的排阻,其起到限流的作用,这是因为你锁存器是具有一定驱动能力的,不像单片机的IO口,其电流较大,可能会烧毁数码管。

7. 实践编程

7.1 单独一位数码管显示

#include <reg52.h>
#include <intrins.h>

#define unit unsigned int
#define uchar unsigned char

//对控制锁存器开通与关断的LE进行位定义
//查看电路原理图可以看到OE接的GND,Q0-Q7可以正常输出高低电平
//当LE接高电平,Q端随着D端变化,相当于D和Q是直接相连;LE接低电平,Q保持不变,不受D端干扰
//两个锁存器分别控制数码管的段和位,段选锁存器U9,其LE接的P26
sbit DU = P2^6; //数码管段选
sbit WE = P^7; //数码管位选


void main() //main函数自身就会循环
{

	   //结合原理图可以看到,让第一个数码管显示1
	   //让第一个数码管点亮的首要条件是让其位选,也就是给WE1一个0(共阴极),然后再控制段选
	   
	   //LE接高电平,Q端随着D端变化
	   WE = 1; //打开位选锁存器
	   //P0控制U8 Q端的WE值,为了选中WE1,使WE1=0,其他WE为1,D端和Q端变化一致
	   P0=0xFE;		  //1111 1110

	   //LE接低电平,U8 Q端0xFE保持不变(U8的WE1=0),位选的锁存器相当于断开,这样P0的就可以在操作段选锁存器U9的时候,不影响位选锁存器
	   WE = 0; //锁存位选数据

	   //打开段选锁存器,U9的D和Q相通
	   DU = 1;

	   //bc亮,采用共阴极的接法,阳极需要为高电平1,bc为1,其他位为0
	   P0=0x06;	 //0000 0110

	   DU = 0; //段选锁存,锁存段选数据

	   //经过上面步骤,位选锁存在0xFE, 段选锁存在0x06,低位数码管显示为1

	while(1)
	{

	}

}

以上代码输出一个1
在这里插入图片描述

7.2 多位数码管显示

如果想要8位数码管都显示为1,只需要将位选的值变为0x00,也就是以下代码:

#include <reg52.h>
#include <intrins.h>

#define unit unsigned int
#define uchar unsigned char


sbit DU = P2^6; //数码管段选
sbit WE = P^7; //数码管位选


void main() //main函数自身就会循环
{

	   WE = 1; //打开位选锁存器
	   P0=0x00;		  //0000 0000

	   WE = 0; //锁存位选数据

	   //打开段选锁存器,U9的D和Q相通
	   DU = 1;

	   //bc亮,采用共阴极的接法,阳极需要为高电平1,bc为1,其他位为0
	   P0=0x06;	 //0000 0110

	   DU = 0; //段选锁存,锁存段选数据

	   //经过上面步骤,位选锁存在0x00, 段选锁存在0x06,8位数码管显示为1

	while(1)
	{

	}

运行结果如下:
在这里插入图片描述
需要注意:在同时位选和段选的情况下,P0发生变化事不会影响到数码管显示的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十月旧城

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值