|
3.4 74HC138三八译码器的应用 在设计单片机电路的时候,单片机的I/O口数量是有限的,有时满足不了产品需求,比如STC89C52一共有32个I/O口,但是为了控制更多的器件,就可以使用一些外围的数字芯片,这类数字芯片由简单的输入逻辑来控制输出逻辑,比如74HC138这个三八译码器,图3-11是74HC138在Kingst51开发板上的一个应用。 图3-11 74HC138应用原理图 从名字来分析,三八译码器就是把3种输入状态翻译成8种输出状态。从图3-11能看出,74HC138的1~6一共是6个输入引脚,但是其中4、5、6这三个引脚是使能引脚。这三个引脚如果不符合芯片规定的输入要求,不管输入的1、2、3引脚是什么电平状态,7到15引脚总是输出高电平。所以根据器件使用手册说明,要想让74HC138正常工作,ENLED接的4脚和5脚必须输入低电平,ADDR3接的6脚必须输入高电平,这两个位置都是使能控制端口。不知道是否记得前边点亮LED程序有这么两条控制74HC138使能的语句: ENLED = 0;ADDR3 = 1; 这类逻辑芯片,大多都是有使能引脚的,使能符合要求的前提下,就可以研究控制逻辑了。对于数字器件的引脚,如果一个引脚输入的时候,有0和1两种状态;对于两个引脚输入的时候,就会有00、01、10、11这四种状态了,那么对于3个输入的时候,就会出现8种状态了,大家可以看下边的这个真值表——图3-12,其中输入是A2、A1、A0的顺序,输出是从Y7、Y6……Y0的顺序。 图3-12 74HC138真值表 从图3-12可以看出,任一输入状态下,只有一个输出引脚是低电平,其他的引脚都是高电平。在前面的电路中已经看到,8个LED小灯的总开关三极管Q16基极的控制端是LEDS6,也就是Y6输出一个低电平的时候,可以开通三极管Q16,从右侧的希望LEDS5输出低电平这样的结果,可以推导出左侧输入端A2、A1、A0的输入状态应该是110,如图3-13。 图3-13 LED小灯整体电路图 那么再整体捋一遍点亮LED小灯的过程,首先看74HC138,要让LEDS6为低电平才能导通三极管Q16,所以 ENLED = 0;ADDR3 = 1; 保证74HC138使能。 ADDR2 = 1; ADDR1 = 1; ADDR0 = 0; 保证了三极管Q16这个开关开通,5V电源加到LED上。 通过P0口控制,让P0.0引脚等于0,就是DB0等于0,那么这样在这一排共8个LED小灯当中,只有最右侧的小灯和5V之间有压差,有压差就会有电流通过,LED2就会发光了。 从原理图左上角P0口总线可以看出,74HC138的ADDR0 、ADDR1、ADDR2、 ADDR3和ENLED接在P1.0到P1.3引脚上,如图3-14所示。 图3-14 单片机引脚图 3.5 LED闪烁程序点亮LED小灯的程序就是LED = 0。熄灭小灯的程序是LED = 1。点亮和熄灭都会了,那么如果在亮和灭中间加个延时,反复不停的点亮和熄灭小灯,就成了闪烁了。 首先复习一下Keil写程序的过程,建立工程-->保存工程-->建立文件-->添加文件到工程-->编写程序-->编译-->下载程序。 LED闪烁程序如下所示。 #include<reg52.h> sbit LED = P0^0; sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADDR3 = P1^3; sbit ENLED = P1^4; void main() //void即函数类型 { //以下为声明语句部分 unsigned int i = 0; //定义一个无符号整型变量i,并赋初值0 //以下为执行语句部分 ENLED = 0; //U3、U4两片74HC138总使能 ADDR3 = 1; //使能U3使之正常输出 ADDR2 = 1; //经U3的Y6输出开启三极管Q16 ADDR1 = 1; ADDR0 = 0; while (1) { LED = 0; //点亮小灯 for (i=0; i<30000; i++); //延时一段时间 LED = 1; //熄灭小灯 for (i=0; i<30000; i++); //延时一段时间 } } 把这个程序编译一下,下载到单片机里,就会发现LED2这个小灯会闪烁了。 3.6 练习题1、深刻理解电容的意义,并且在今后的学习电路过程中要多多注意并且参考别人电路中所用到的去耦电路,积累经验。 2、完全背过三极管的导通原理,并且可以熟练掌握NPN和PNP这两种三极管在开关特性下的应用方法。 3、学习并且掌握74HC138的应用原理,能够在设计电路中正确应用。 4、能够独立实现点亮开发板上的每一个小灯,并且可以实现小灯点亮和灭以及闪烁功能。
|