大家好,欢迎来到IT知识分享网。
1. 基于proteus的51单片机开发实例(10)–74HC573控制8位数码管
特别说明:本实例应今日头条网友需要而写,感谢今日头条上朋友们的关注和支持。你们的关注和支持是我最大的动力。
1.1. 实验目的
图1是本实例所用电路图。
在前面的实例中,我们已经实现了使用51单片机控制一位数码管循环显示0~9。本实例中,我们将使用数据锁存器芯片74HC473来驱动8位数码管显示数字。从本实例中我们可以学习到74HC573的工作原理,以及如何编程控制74HC573输出及锁存数据。
1.2. 设计思路
从前面的实例中我们已经了解,51单片机控制一位数码管需要8个I/O口(数码管的公共端选择用单片机端口控制的话,则需要9个I/O口,数码管公共端也可以直接连接到电源或者地,这样可以不用单片机控制)。那么问题来了,如果我们要控制8位数码管岂不是需要8*8=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个段就需要3*8=24mA的电流,而如果点亮8位数码管的所有段,则需要24*8=192mA的电流,这个电流对于一般的单片机来说,是很难输出这么大的电流的。所以就需要驱动电路,而74HC573不但是数据锁存器,还能够提供比较大的驱动电流,所以我们使用74HC573来控制8位数码管显示时,不用再设计驱动电路了。
1.3. 基础知识
本实例使用锁存器74HC573,那么了解和掌握74HC573的工作原理是必须的了。
图2是74HC573的引脚图。
锁存器是数字电路中的一种具有记忆功能的逻辑元件。锁存,就是把信号暂存以维持某种电平状态。只有在有锁存信号时输入的状态被保存到输出,直到下一个锁存信号。
74HC573锁存器如果是和单片机一起配合使用的话,作用是使锁存器的的I/O口为高电平,打开,改变输入端的电平,则相应的输出也改为相应的电平。使锁存器的I/O口为低电平,关闭,这时输出端的电平就不会再改变了,一直保持关闭前的电平状态。
图3是74HC573引脚功能图。
从引脚图看出,单片机输出的8位数据连接在74HC573的数据输入引脚D0~D7,74HC573的数据输出引脚Q0~Q7根据1脚和11脚的控制电平输出或锁存数据。
也就是说,74HC573的输出数据是受其1脚(输出使能)和11脚(锁存使能)控制的。
那么这两个引脚怎么控制74HC573的输出数据呢?看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的工作原理以及编程控制。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/49518.html