龙空技术网

基于proteus的51单片机开发实例(10)-74HC573控制8位数码管

老马识途单片机 430

前言:

此时咱们对“c语言编程单片机数码管”大约比较关心,姐妹们都需要学习一些“c语言编程单片机数码管”的相关内容。那么小编同时在网摘上汇集了一些对于“c语言编程单片机数码管””的相关文章,希望朋友们能喜欢,兄弟们一起来学习一下吧!

1. 基于proteus的51单片机开发实例(10)--74HC573控制8位数码管

特别说明:本实例应今日头条网友需要而写,感谢今日头条上朋友们的关注和支持。你们的关注和支持是我最大的动力。

1.1. 实验目的

图1是本实例所用电路图。

图1 74HC573驱动8位数码管电路

在前面的实例中,我们已经实现了使用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的引脚图。

图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的工作原理以及编程控制。

标签: #c语言编程单片机数码管 #八数码问题c代码