找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 14981|回复: 7
收起左侧

74HC138译码器扩展单片机IO驱动LED实验

[复制链接]
ID:103513 发表于 2016-1-17 04:30 | 显示全部楼层 |阅读模式
从最开始玩单片机到做显示部分,因为知识不足加上条件限制,所以显示部分一直用单个LED,也尝试做过数码管,点阵,LCD,TFT,但是多数都以失败告终,所以现在还是喜欢用多个LED做显示部分,因为简单嘛!从最初自己用一个IO口驱动一个LED的电路开始我就在想,C51的单片机只有32个IO口,要想点亮40个LED的话不是要用到40个IO口,当时一直想不通,后来终于在数电的书上找到了答案,深深体会到大2打酱油的危害啊!所以大2的同学一定要把数模电学好。
所谓的答案就是我今天要讲的译码器,我这里用的是74HC138的译码器,它的封装如图所示:


这是一个3-8线的译码器,一般是用来进行外围器件的扩展,具有很强的驱动能力,一共有16个引脚,用我的话来说就是只要使用单片机3个IO口就可以控制8个LED了,相当于扩展了5个IO口,是不是解决了我开始所说的问题,我们再来看看74HC138这块芯片的引脚图:


这里选择输入ABC分别接的是单片机的IO口,数据输出Y0~Y7接的是8个LED做显示,使能端这块我还是有点模糊,总之他也是接单片机IO口就是了,也需要控制IO口输出低电平高电平来控制,那么程序该怎么写呢?我们来看看74HC138的真值表就知道了,


只要稍微学过数电的同学都能看的懂这个图吧!至于这块芯片的什么内部逻辑结构还有什么工作特性我这里就不讲了,有兴趣的同学可以自己去查资料,给出引脚图和真值表是可以方便我们搭硬件电路和写程序。
有了这点小理论,现在我们就来做实验验证一下吧!先说说这个实验所要实现的功能,很简单,就是写程序控制6个IO口(3个数据输入端,3个使能端)输出高低电平给74HC138这块芯片,然后用它的输出端控制8个LED以1s的速度循环点亮。实验所需器材如图所示:

这里主要讲一个USB接口ISP下载模块:这是我在网上买的一个别人做好的模块,它不仅可以把HEX文件下载到单片机上,还可以提供5V电源,是一个非常好用的东西。
接下来就是做硬件电路了,这是画好的原理图,只要原理图用面包板去搭电路就可以了:

接下来写程序:
#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);
}
}
有了真值表,这个程序是十分简单的,我这里为了看得明白些,所以写的很通俗易懂,相应的程序就比较长,当然你也可以自己写的简单一些。
接下来最后一步就是看实验现象了:上图上图

到此结束,实验总结:同学们可能会发现,我们这里已经用了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周考试周也快到了,要开始复习了,希望自己不要挂科,同学们也是。

回复

使用道具 举报

ID:65374 发表于 2016-1-19 11:38 | 显示全部楼层
“这里的8个LED是不能同时点亮的,具体情况我也不是很明白”
从真值表可以看出8个LED是不能同时亮的。要想同时亮能否试试动态显示,即缩短延时。
回复

使用道具 举报

ID:160782 发表于 2017-1-13 12:09 来自手机 | 显示全部楼层
你把延时的时间减短为1,通过视觉延迟看上去所有的LED都亮了!
回复

使用道具 举报

ID:704585 发表于 2020-6-23 10:01 | 显示全部楼层
感谢楼主分享
回复

使用道具 举报

ID:108705 发表于 2020-7-1 09:50 | 显示全部楼层
感谢楼主分享,74HC138主要是为了控制流水灯比较好,74HC595是移位寄存器,用作IO扩展确实好,可以级联很多个,移位后可以输出任意值
回复

使用道具 举报

ID:62509 发表于 2020-7-10 08:22 | 显示全部楼层
要增加一个锁存器才能单独或若干或全部点亮。比如后面接一个74ls573再接led就可以选择点亮了。带三态锁存器的,需要再一次信号才能关闭,这样只要不输入第二次LED就可以一直亮。
回复

使用道具 举报

ID:247571 发表于 2023-2-3 11:02 | 显示全部楼层
这里用74HC138 三八译码器,也可以用74HC373八D锁存器来扩展P0口更好!
回复

使用道具 举报

ID:492633 发表于 2023-2-4 17:26 | 显示全部楼层
可以试试74LS154相当于两个138
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表