从最开始玩单片机到做显示部分,因为知识不足加上条件限制,所以显示部分一直用单个LED,也尝试做过数码管,点阵,LCD,TFT,但是多数都以失败告终,所以现在还是喜欢用多个LED做显示部分,因为简单嘛!从最初自己用一个IO口驱动一个LED的电路开始我就在想,C51的单片机只有32个IO口,要想点亮40个LED的话不是要用到40个IO口,当时一直想不通,后来终于在数电的书上找到了答案,深深体会到大2打酱油的危害啊!所以大2的同学一定要把数模电学好。
所谓的答案就是我今天要讲的译码器,我这里用的是74HC138的译码器,它的封装如图所示:
image.png
虚焦了
这是一个3-8线的译码器,一般是用来进行外围器件的扩展,具有很强的驱动能力,一共有16个引脚,用我的话来说就是只要使用单片机3个IO口就可以控制8个LED了,相当于扩展了5个IO口,是不是解决了我开始所说的问题,我们再来看看74HC138这块芯片的引脚图:
image.png
这里选择输入ABC分别接的是单片机的IO口,数据输出Y0~Y7接的是8个LED做显示,使能端这块我还是有点模糊,总之他也是接单片机IO口就是了,也需要控制IO口输出低电平高电平来控制,那么程序该怎么写呢?我们来看看74HC138的真值表就知道了,
image.png
只要稍微学过数电的同学都能看的懂这个图吧!至于这块芯片的什么内部逻辑结构还有什么工作特性我这里就不讲了,有兴趣的同学可以自己去查资料,给出引脚图和真值表是可以方便我们搭硬件电路和写程序。
有了这点小理论,现在我们就来做实验验证一下吧!先说说这个实验所要实现的功能,很简单,就是写程序控制6个IO口(3个数据输入端,3个使能端)输出高低电平给74HC138这块芯片,然后用它的输出端控制8个LED以1s的速度循环点亮。实验所需器材如图所示:
image.png
这里主要讲一个USB接口ISP下载模块:这是我在网上买的一个别人做好的模块,它不仅可以把HEX文件下载到单片机上,还可以提供5V电源,是一个非常好用的东西。
接下来就是做硬件电路了,这是画好的原理图,只要原理图用面包板去搭电路就可以了:
image.png
接下来写程序:
#include <reg52.h>
  • sbit HC138A = P1^0;   //定义译码器输入端A  在 P1.0 管脚上
  • sbit HC138B = P1^1;   //定义译码器输入端B  在 P1.1 管脚上
  • sbit HC138C = P1^2;   //定义译码器输入端C  在 P1.2 管脚上
  • sbit G2A=P1^3;
  • sbit G2B=P1^4;
  • sbit G1=P1^5;
  • /*************************************************
  • *
  • *                  延时函数
  • *
  • **************************************************/
  • void delay(unsigned int i)
  • {
  •   unsigned char j;
  •     for(i; i > 0; i--)   
  •         for(j = 255; j > 0; j--);
  • }
  • main()
  • {
  • G2A=0;G2B=0;G1=1;
  • while(1)
  • {
  • // 点亮第一个LED灯
  • HC138C = 0; HC138B = 0; HC138A = 0;
  • delay(1000); //延时
  • // 点亮第二个LED灯
  • HC138C = 0; HC138B = 0; HC138A = 1;
  • delay(1000); //延时
  • // 点亮第三个LED灯
  • HC138C = 0; HC138B = 1; HC138A = 0;
  • delay(1000);
  • // 点亮第四个LED灯
  • HC138C = 0; HC138B = 1; HC138A = 1;
  • delay(1000);
  • // 点亮第五个LED灯
  • HC138C = 1; HC138B = 0; HC138A = 0;
  • delay(1000);
  • // 点亮第六个LED灯
  • HC138C = 1; HC138B = 0; HC138A = 1;
  • delay(1000);
  • HC138C = 1; HC138B = 1; HC138A = 0;
  • delay(1000);
  • HC138C = 1; HC138B = 1; HC138A = 1;
  • delay(1000);
  • }
  • }
  • 复制代码
    有了真值表,这个程序是十分简单的,我这里为了看得明白些,所以写的很通俗易懂,相应的程序就比较长,当然你也可以自己写的简单一些。
    接下来最后一步就是看实验现象了:上图上图
    image.png
    到此结束,实验总结:同学们可能会发现,我们这里已经用了6个IO口去控制8个LED,才扩展了两个IO口,是不是太少了,的确,但是一般大的电路是不会只用到一个138芯片的,一般都是几块芯片组合成逻辑电路来扩展,看得懂程序的同学会发现,这里的8个LED是不能同时点亮的,具体情况我也不是很明白,有个高手和我说扩展IO口最好不要用138,138主要是用来扩展存储器的,要扩展IO口最好用74HC595,如果有明白这一块的同学就留言给我说说哈!我在实验中还发现一个小现象,就是撤掉LED正极和VCC连线的时候,用手去触摸LED正极,8个LED还是会循环点亮的,但是亮度是非常小的,甚至有的时候我们人眼都看不见,为什么会出现这种现象呢?我用万用表一端接我的手,一端接LED负极,发现LED两端是有电流的,非常小,只有4uA,原理应该就是LED把我的手当做GND,把138芯片输出的低电平当作VCC了。最后,还是那句话,这个实验十分简单,但是勿以善小而不为,为了实践与理论的相结合,还是亲手做一下才印象深刻,个人能力知识有限,如果有什么不对的地方望指教。13周考试周也快到了,要开始复习了,希望自己不要挂科,同学们也是。