74hc573d是8位三态锁存器,一般在实际应用电路中用于地址或数据的锁存。本文主要探讨了74hc573d在实际应用电路中的作用以及如何驱动数码管动态显示,下面就来一一介绍74hc573d。
大家都知道74hc573d是一种锁存器,那么锁存器是干嘛用的呢?
锁存器辨析
所谓锁存器,就是输出端的状态不会随输入端的状态变化而变化,仅在有锁存信号时输入的状态被保存到输出,直到下一个锁存信号到来时才改变。典型的锁存器逻辑电路是 d 触发器电路。 ps:锁存信号(即对le赋高电平时data端的输入信号)。锁存,就是把信号暂存以维持某种电平状态。
锁存器的最主要作用
1:缓存、
2:完成高速的控制其与慢速的外设的不同步问题、
3:是解决驱动的问题(提供的电流比51io口输出电流大)
4:拓展i/o口(可以很猥琐的用锁存器幂叠加方法,即锁存器的q再接锁存器~ 实现io口的无限拓展···)
锁存器应用实例:
i/o口复用:当单片机连接片外存储器时,要接上锁存器,这是为了实现地址的复用。假设,mcu 端口其中的 8 路的 i/o 管脚既要用于地址信号又要用于数据信号,这时就可以用锁存器先将地址锁存起来。(具体操作:先送地址信息,由ale使能锁存器将地址信息锁存在外设的地址端,然后送数据信息和读写使能信号,在指定的地址进行读写操作)
如果单片机的总线接口只作一种用途,不需要接锁存器;如果单片机的总线接口要作两种用途,就要用到锁存器。例如:一个i/o口要控制两个 led,对第一个 led 送数据时,“打开”第一个锁存器而“锁住”第二个锁存器,使第二个 led 上的数据不变。对第二个 led 送数据时,“打开”第二个锁存器而“锁住”第一个锁存器,使第一个 led 上的数据不变。如果单片机的一个口要做三种用途,则可用三个锁存器,操作过程相似。就这一种用法而言,可以把锁存器视为单片机的 i/o 口的扩展器。
74hc573引脚分布图
数据锁存
当输入的数据消失时,在芯片的输出端,数据仍然保持;这个概念在并行数据扩展中经常用到。
由上边这个真值表可以看出:oe为高时,输出始终为高阻态,此时芯片处于不可控制状态,所以在一般应用中,我们必须将oe接低电平。
le则是输出端状态改变使能端,当le为低电平,输出端q始终保持上一次存储的信号(从d端输入),当le为高电平时,q紧随d的状态变化,并将d的状态锁存。
也就是说当锁存使能端le为高时,这些器件的锁存对于数据是透明的(也就是说输出同步)。当锁存使能变低时,符合建立时间和保持时间的数据会被锁存。
另外:对锁存器的输入是和标准 cmos 输出兼容的;若再加上上拉电阻,他们能和 ls/alsttl 输出兼容。
锁存器的电路连接及使用详解:
(结合上面的锁存器引脚说明)
0:vcc gnd 供电不用多说吧?
1:oe接地
2:d0-d7接我们的信号发射端 (一般为单片机用来传输数据的i/o口)
3:q0-q7接我们要接受信息的终端(数码管,液晶,or anyother device)
4:le接一个i/o口(此i/o脚可视为锁存器 锁存功能 的开关,高电平为更新q端信号(要更新的信号从d输入)低电平则不更新)
74hc573在电路中的实际应用
在这里就以脉冲数据采集电路为例,如上图所示,采用at89s52与两个74hc573锁存器传输信息使用,at89s52具有低功耗、高性能、8k字节的flash及32位i/o口线、全双工串行通信口等优点。其中u10锁存器做位选功能,u9锁存器做段选功能,这样就可以有效扩展at89s52单片机p2的i/o端口,使程序控制信息与脉冲数据信息在传输过程中能够非常有效的控制,这为多路脉冲数据的采集提供了重要的基础。
74hc573驱动数码管动态扫描
数码管由于发光亮度强,指示效果好,非常适合于电梯楼层等数值显示应用中。对于一位数码管,可以采用静态显示,但实际应用中都是需要显示多位数值,数码管模块也只能动态显示。在实际应用电路中,74hc573驱动数码管中都不是简单的直连就可以的,这个需要分具体应用场景。具体情形则要看是仿真,还是实物。仿真,74hc573是可以直接连接数码管的。实物,是不可以的,数码管的每一段,都必须串联一个限流电阻。在这里我们仅仅讨论74hc573在数码管动态显示中的连接。
数码管
数码管由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只引出它们的各个笔划,公共电极。数码管实际上是由七个发光管组成8字形构成的,加上小数点就是8个。这些段分别由字母a,b,c,d,e,f,g,dp来表示。数码管根据内部接法又可分成共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(com)的数码管(如下图sm*10501),共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(com)的数码管如下图(sm*20501)。以共阳数码管为例,要想显示数字2,需把a、b、g、e、d段点亮,即公共端接上正电源,abged段阴极拉低,其余段拉高即可显示数字2。
74hc573在电路中应用设计
此处以四位一体共阳数码管显示为例讲解其大概设计。
微控制器的io口均不能流过过大的电流,led点亮时有约10ms的电流,因此数码管的段码输出不要直接接单片机io口,应先经过一个缓冲器74hc573。单片机io口只需很小的电流控制74hc573即可间接的控制数码管段的显示,而74hc573输出也能负载约10ms的电流。设置数码管段的驱动电流为id=15ma,这个电流点亮度好,并且有一定的裕度,即使电源输出电压偏高也不会烧毁led,限流电阻值
r = (vcc- vce– vol– vled) / id
vcc为5v供电,vce为三极管c、e间饱和电压,估为0.2v, vol为74hc573输出低电平时电压,不同灌电流,此值不一样,估为0.2v,具体查看规格书,vled为红光驱动电压,估为1.7v,根据上式可算出限流电阻为r = 200r。
数码管需接收逐个扫描信号,扫描到相应数码管时,对应的段码数据有效,即显示这个数码管的数值。笔者采用三线八线译码器74hc138来产生对应的扫描线信号。
当各个段码均点亮时,电流约15max8=90ma流过数码管公共端,74hc138无法直接驱动这个电流,需加三极管驱动,由于74hc138输出低电平有效,此处只有pnp三极管适合作为驱动。三极管基极电流设为2ma即可让三极管饱和,最大驱动电流远大于90ma。基极偏置电阻阻值
rb=(vcc- veb– vol) / ib
vcc为5v供电,veb为三极管e、b间的导通电压0.7v,vol为74hc138输出低电平时电压,可根据规格书估为0.3v,故rb= 2k即可。
四位一体数码管原理图
74hc573驱动实现
数码管段码接p0口,位码接p2口第0~2位。对于led显示器都是有一个刷新频率的,同样对于数码码动态扫描也需要一个扫描频率。扫描频率下限为50hz,低于一定的扫描频率,显示会闪烁。频率过高,则亮度较差且占用cpu资源。一般整个数码管扫描一遍时间为约10ms较合适(即扫描频率100hz),我们用的是四位数码管,每个数码管点亮时间为2ms,扫描一遍时间为8ms。为保证这个刷新频率,通过是通过定时器来周期性进行数码管刷新。笔者在此以四位一体数码管实现秒表计数显示为例来作代码开发。
数码管动态显示功能实现模块文件digitaltubetable.c内容如下:
#include reg52.h
#includedigitaltube.h
// 数值相对应的段码,共阳极
static unsigned char codedigitaltubetable[12]= { // 共阳led段码表
0xc0, 0xf9, 0xa4, 0xb0, 0x99,0x92, 0x82, 0xf8, 0x80, 0x90, 0xff, 0xbf
//0 1 2 3 4 5 6 7 8 9 不亮 -
};
// 每个数码管需一个字节的内存保存对应数码管数据
static unsigned charframebuffer[digitaltubenumber];
unsigned char*digitaltube_getbuffer()
{
return framebuffer;
}
void digitaltube_scan()
{
static unsigned char select = 0; // 记录扫描的选择线
unsigned char code;
// 从对应选择线中找到显存数据,并得到相应的段码
code = digitaltubetable[framebuffer[select]];
// 段码实际输出到数码管接口
digitaltube_data(code);
// 位选实际输出到数码管接口
digitaltube_select(select);
select++; // 进入到下一位选扫描
if (select >= digitaltubenumber) {
select = 0; // 所有数码管已扫描,从第一个数码管再次开始扫描
}
}
我们在数码管模块头文件digitaltube.h中实现模块的接口访问宏实现,使之方便移植及修改接口配置。模块头文件同时也引出模块的接口函数,void digitaltube_scan(void)为数码管刷新函数,需周期性调用刷新数码管显示。unsigned char *digitaltube_getbuffer(void)用来获得数码管显存,从而更新数码管显存数据。其内容如下:
#ifndef __digitaltube_h__
#define __digitaltube_h__
#ifdef __cplusplus
extern c {
#endif
// 数码管模块中的个数,最大为8
#define digitaltubenumber 4
// 输出数码管位选
#definedigitaltube_select(select) {p2 = (p2&0xf8) + (select);}
// 输出数码管段码
#define digitaltube_data(dat) {p0 =(dat);}
// 数码管刷新函数,必须保证以一定周期调用刷新
void digitaltube_scan(void);
// 获得数码管显存,以作显示的数据更新
unsigned char*digitaltube_getbuffer(void);
#ifdef __cplusplus
}
#endif
#endif /*__digitaltube_h__*/
外部模块通过引入数码管的模块头文件digitaltube.h来实现调用数码管驱动函数,简单测试调用(秒表数码管显示计数)实现如下:
#includereg52.h
#includedigitaltube.h
// 以定时器时间为计时标准,记录时间间隔
static volatile unsignedint systemtick = 0;
// 定时器2ms中断处理进行数码管刷新
void t0_interrupt()interrupt 1
{
th0 = (65536-2000) / 256;
tl0 = (65536-2000) % 256;
systemtick++; // 记录时间间隔
digitaltube_scan(); //刷新数码管
}
void t0_init()
{
tmod = 0x01; // 定时器0工作方式1
// 2ms计时中断(12m)
th0 = (65536-2000) / 256;
tl0 = (65536-2000) % 256;
et0 = 1; // 定时器t0中断允许
ea = 1; // 总中断允许
}
void main()
{
unsigned char *pbuffer;
unsigned char i;
// 定时器初始化
t0_init();
// 获得数码管显存,以作更新数据显示
pbuffer = digitaltube_getbuffer();
// 数据管显存初始化显示0
for (i=0; i
pbuffer[i] = 0;
}
// 开启定时器进行计时以及数码管刷新
tr0 = 1;
while(1) {
// systemtick读数到500时为1s间隔到
if (systemtick > 500) {
systemtick =0; // 重新计秒
// 更新数码管秒表计数显存
for (i=0; i
pbuffer[digitaltubenumber-1-i]++;
if (pbuffer[digitaltubenumber-1-i] <10) {
break; // 未到10,不用进位更新高位显存,退出
} else {
总结
对于74hc573锁存器来说,在实际的应用电路中,如果单片机的总线接口只作一种用途,不需要接锁存器;如果单片机的总线接口要作两种用途,就要用两个锁存器。对于74hc573的介绍就到这里了,希望此文能对你有所帮助。
矿井提升机变频调速的改造与实施方案的介绍
互联网把机器变成人,但机器人不可能超越人类
农业气象自动观测站的技术参数是怎样的
保定移动推出全国流量不限量套餐
移远通信与高通联合推出骁龙X65和X62 5G M.2模组
74hc573在应用电路作用解析 74hc573驱动数码管动态扫描
海尔集团董事局主席周云杰:执一不失,开创未来
网络家电成为家庭娱乐的一种新趋势
苹果13支持低轨道卫星通讯
镍镉电池放电反应式_镍镉电池完全放电的电路
smart200PLC一键启停的常用写法
热水器要装漏电保护器吗
区块链技术将如何改变服装行业
警示灯的功能、技术参数及原理图
长电科技突破5G毫米波芯片封装模块测试难题
蒲公英智慧安防建设方案:智能组网加持,降本增效易管理
世界首台焊接协作机器人面世,适用于多品种、小批量生产
基于L298N电机驱动模块的原理及使用案例
小米1S青春版今日午时12点开售 1299元
智能相机:未来摄影的新潮流!