图1 74HC573驱动8位数码管电路
在前面的实例中,我们已经实现了利用51单片机掌握一位数码管循环显示0~9。本实例中,我们将利用数据锁存器芯片74HC473来驱动8位数码管显示数字。从本实例中我们可以学习到74HC573的事情事理,以及如何编程掌握74HC573输出及锁存数据。
从前面的实例中我们已经理解,51单片机掌握一位数码管须要8个I/O口(数码管的公共端选择用单片机端口掌握的话,则须要9个I/O口,数码管公共端也可以直接连接到电源或者地,这样可以不用单片机掌握)。那么问题来了,如果我们要掌握8位数码管岂不是须要88=64个I/O口,而51单片机只有P0,P1,P2,P3四个32位I/O口,根本不足用啊,怎么办?有两种方法,一是利用动态显示的方法,用8个I/O连到8段数码管的段码端(a,b,c,d,e,,f,g,dp),再用8个I/O连到8位数码管的8个公共端,利用人眼的视觉暂留效应实现8位数码管的动态显示(我们将在后面的实例中理解和学习这种方法),二是利用端口扩展芯片(例如3-8译码器74HC138)来实现;三是利用专用的数码管驱动芯片,四是利用数据锁存器芯片(例如74HC573)来实现。本例中我们就利用第三种方法来实现8位数码管的显示。

我们知道,单片机端口的输出能力是有限的,而驱动数码管则须要比较大的电流。我们大略的来打算一下(只是为了让大家有直不雅观的观点,打算方法以及真实的电流值我们不做准确的评估),8位数码管由8个LED组成,假设点亮一个LED须要3mA的电流,那么点亮一个数码管的8个段就须要38=24mA的电流,而如果点亮8位数码管的所有段,则须要248=192mA的电流,这个电流对付一样平常的单片机来说,是很难输出这么大的电流的。以是就须要驱动电路,而74HC573不但是数据锁存器,还能够供应比较大的驱动电流,以是我们利用74HC573来掌握8位数码管显示时,不用再设计驱动电路了。
1.3. 根本知识本实例利用锁存器74HC573,那么理解和节制74HC573的事情事理是必须的了。
图2是74HC573的引脚图。
图2 74HC573引脚图
锁存器是数字电路中的一种具有影象功能的逻辑元件。锁存,便是把旗子暗记暂存以坚持某种电平状态。只有在有锁存旗子暗记时输入的状态被保存到输出,直到下一个锁存旗子暗记。
74HC573锁存器如果是和单片机一起合营利用的话,浸染是使锁存器的的I/O口为高电平,打开,改变输入真个电平,则相应的输出也改为相应的电平。使锁存器的I/O口为低电平,关闭,这时输出真个电平就不会再改变了,一贯保持关闭前的电平状态。
图3是74HC573引脚功能图。
图3 74HC573引脚功能图
从引脚图看出,单片机输出的8位数据连接在74HC573的数据输入引脚D0~D7,74HC573的数据输出引脚Q0~Q7根据1脚和11脚的掌握电平输出或锁存数据。
也便是说,74HC573的输出数据是受其1脚(输出使能)和11脚(锁存使能)掌握的。
那么这两个引脚怎么掌握74HC573的输出数据呢?看74HC573的真值表!
图4是74HC573的真值表。
图4 74HC573真值表
从图中可以很清楚的看出来:
真值表的第一行和第二行:当0E=0,LE=1时,74HC573输出真个数据与输入真个数据一样。输入端是高电平,输出端也是高电平;输入端是低电平,输出端也是低电平。
真值表的第三行:当0E=0,LE=0时,输入端不论输入高电平还是低电平,输出真个数据都保持不变。
真值表的第四行:当0E=1时,不管输入端和LE处于什么状态,输出端都处于高阻态。
通过对真值表的剖析,我们可以很清楚的看出如何掌握74HC573:想要保持输出端数据不变,就设置0E=0,LE=0,想要让输出真个数据跟输入真个数据一样,就设置0E=0,LE=1。
1.4. 电路设计本电路利用两块74HC573,个中U2用于输出数码管的段选数据,U2的数据输入短连接单片机的P0口,输出端接数码管的段选端(a,b,c,d,e,f,g,dp),U2的锁存掌握端接单片机的P2.6端口。
U2和U3的输出使能端直接连到地线(GND),这样始终保持输出使能有效,只要掌握锁存器的锁存端就可以保持或改变输出数据状态。
U3连接数码管的位选数据,个中U3的数据端同样接到单片机的P0口,输出端接数码管的位选段。U3的锁存掌握端接单片机的P2.7口。
我们以要让数码管的第二位(从左向右数第二位)显示数字0为例来讲解驱动电路的事情事理。
第一步先选择要显示的数码管是哪一位。首先要输出位选数据,确定选中第二位数码管。单片机的P2.7口输出高电平,使锁存器U3打开,让单片机P0口输出位选数据0x02,这样第二位数码管当选中,这时再让P2.7口输出低电平,使位选数据被锁定。
第二步选择要显示什么数字。单片机让P2.6输出高电平,打开锁存器U2,然后从单片机P0口输出段选数据0x3f,这时数码管所有位的段选端都收到段选数据0x3f了,但是在第一步中,只有第二位数码管当选中,以是这是只有第二位数码管会显示数字,接着再给P2.6输出低电平,段选数据就被锁存了,担保第二位数码管一贯显示数字1。
须要把稳的是,不论操作锁存器U2还是U3,操作完后,都必须把锁存器的锁存真个高电平变为低电平,这样做的缘故原由之一杜绝后续操为难刁难前面锁存器锁存的数据造成影响。例如,如果锁存器U3的位选数据发送完成后,其锁存端仍旧保持为高电平,接着给U2送段选数据时,由于U3的锁存端仍旧是高电平,P0口的段选数据就会经由U3送到数码管的位选线上,这样就会导致扰乱了位选数据线上的数据。如果U3的位选数据发送完后,将U3的锁存端变为低电平,后面P0口发送的段选数据就不会经由U3,也就不会扰乱位选线上的数据。缘故原由之二是让数码管能够持续显示,由于锁存器的锁存端变为低电平后,锁存器输出真个数据就会保持(被锁存起来了),以是数码管上的段选数据,位选数据都被锁存着,数码管就会一贯显示。
1.5. 程序设计本实例程序代码如下。
#include <AT89X52.h>sbit duanxuan = P2^6;//段选端口定义sbit weixuan = P2^7;//位选端口定义//共阳极数码管段码表,本例利用共阳极数码管unsigned char code DispTabGongYang[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阴极数码管段码表unsigned char code DispTabGongYin[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//延时函数声明void DelayMs(unsigned int ms);int main(void){ while(1) // { weixuan = 1;//先选择第一位数码管 P0 = 0x01; weixuan = 0;//锁存位选数据 P0 = 0xff; duanxuan = 1;//段选端掌握 P0= DispTabGongYang[0];//显示数字“0” //P0= DispTabGongYin[0]; duanxuan = 0; DelayMs(1000); weixuan = 1;//选择第二位数码管 P0 = 0x02; weixuan = 0; P0 = 0xff; duanxuan = 1;// P0= DispTabGongYang[1];//显示数字“1” //P0= DispTabGongYin[0]; duanxuan = 0; DelayMs(1000); weixuan = 1; P0 = 0x04; weixuan = 0; P0 = 0xff; duanxuan = 1; P0= DispTabGongYang[2]; //P0= DispTabGongYin[0]; duanxuan = 0; DelayMs(1000); weixuan = 1; P0 = 0x08; weixuan = 0; P0 = 0xff; duanxuan = 1; P0= DispTabGongYang[3]; //P0= DispTabGongYin[0]; duanxuan = 0; DelayMs(1000); weixuan = 1; P0 = 0x10; weixuan = 0; P0 = 0xff; duanxuan = 1; P0= DispTabGongYang[4]; //P0= DispTabGongYin[0]; duanxuan = 0; DelayMs(1000); weixuan = 1; P0 = 0x20; weixuan = 0; P0 = 0xff; duanxuan = 1; P0= DispTabGongYang[5]; //P0= DispTabGongYin[0]; duanxuan = 0; DelayMs(1000); weixuan = 1; P0 = 0x40; weixuan = 0; P0 = 0xff; duanxuan = 1; P0= DispTabGongYang[6]; //P0= DispTabGongYin[0]; duanxuan = 0; DelayMs(1000); weixuan = 1; P0 = 0x80; weixuan = 0; P0 = 0xff; duanxuan = 1; P0= DispTabGongYang[7]; //P0= DispTabGongYin[0]; duanxuan = 0; DelayMs(1000); }}void DelayMs(unsigned int ms){unsigned int i=0,j=0;for(i = ms;i > 0;i--)for(j = 110;j > 0;j--);}
本实例实现的功能是:数码管从左边第一位开始,第一位先显示0,然后第一位不显示,第二位显示1,然后第三位显示2,每次只有1位数码管显示。直到第8位数码管显示7,然后循环此流程。
1.6. 实例仿真编写完程序后,在keil环境下编译,天生hex文件,然后将该文件装载到proteus环境下的仿真电路的单片机中,点击开始仿真,就可不雅观察到程序的实行结果。
视频加载中...
1.7. 总结
本实例利用两片锁存器74HC573实现了51单片机10个I/O口掌握8位数码管显示数字。从中学习了74HC573的事情事理以及编程掌握。