I51开发板第十六讲 三八译码器应用

  • 三极管
  • 开发
  • SingleYork
  • LV5工程师
  • |      2016-09-02 08:39:53
  • 浏览量 1456
  • 回复:15
本帖最后由 SingleYork 于 2016-9-7 21:26 编辑 bg7.pngI51开发板第十五讲 三极管应用 https://bbs.icxbk.com/community/forum.php?mod=viewthread&tid=65922 (出处: ICKEY BBS)

在设计单片机电路的时候,单片机的IO口数量是有限的,有时候并不能满足设计需求,但是为了控制更多的器件,就要使用一些外围的数字芯片,这种数字芯片由简单的输入逻辑来控制输出逻辑,比如74HC138这个三八译码器,下图便是I51开发板上74HC138一个应用。

从这个名字来分析,三八译码器就是把三种输入状态翻译成8种输出状态。从上图中可以看出来,74HC138有1~6共6个输入引脚,但是其中4、5、6这三个引脚是使能引脚。如果这三个使能引脚不符合规定的输入要求,Y0-Y7不管输入1、2、3引脚是什么电平状态,总是高电平。所以要想让这个74HC137正常工作,E1、E2必须为低电平,E3必须为高电平。在本例中将E2直接接到了GND上,E3直接接到了VCC上,E1接到了的单片机的P2.7上,也就是只需要控制P2.7的状态,就能控制控制74HC138的输出了。

74HC138使能控制我们知道了,那么接下里就要研究逻辑控制了。对于数字器件的引脚,如果一个引脚输入的时候,有0和1两种状态,那么对于两个引脚输入的时候,就会有00,01,10,11四种状态了,那么对于3个输入的时候,机会出现8种状态了。大家可以看下下面的这个真值表,其中输入是A2,A1,A0的顺序,输出是从Y0~Y7的顺序。

A2 A1A0Y0Y1Y2Y3Y4Y5Y6Y7 00001111111 00110111111 01011011111 01111101111 10011110111 10111111011 11011111101 11111111110

从上表可以看出,任一输入状态下,只有一个输出引脚是低电平,其他的引脚都是高电平。

从上面的电路图我们可以知道,只要LED0~LED5分别输出低电平时,对应的LED会亮,那么实际上是不是这样的呢?程序中又该怎么去实现呢?那么接下来我们来看一看程序的代码部分吧。

首先,我们根据电路提,定义了74HC138的控制引脚:

#define A0_74HC138 P24

#define A1_74HC138 P25

#define A2_74HC138 P26

#define EN_74HC138 P27

接下来将对应的IO口初始化:

void        GPIO_config(void)

{

        GPIO_InitTypeDef        GPIO_InitStructure; 

        

        //P24、P25、P26、P27

        GPIO_InitStructure.Pin  = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7; 

        GPIO_InitStructure.Mode = GPIO_PullUp; 

        GPIO_Inilize(GPIO_P2,&GPIO_InitStructure);

}

那么现在我们就可以在主函数里面实现我们需要的功能了,根据三八译码器的真值表,我们可以写如下代码,实现RGB三色灯的流水灯程序:

void main(void)

{

        GPIO_config();



        EN_74HC138 = 0;//打开74HC138的使能端

        while(1)

        {        

                //流水灯

                

                //R1

                A2_74HC138 = 0;

                A1_74HC138 = 0;

                A0_74HC138 = 0;

                EN_74HC138 = 0;

                delay_ms(500);

                

                //G1

                A2_74HC138 = 0;

                A1_74HC138 = 0;

                A0_74HC138 = 1;

                delay_ms(500);

                

                //B1

                A2_74HC138 = 0;

                A1_74HC138 = 1;

                A0_74HC138 = 0;

                delay_ms(500);

                

                //R2

                A2_74HC138 = 0;

                A1_74HC138 = 1;

                A0_74HC138 = 1;

                delay_ms(500);

                

                //G2

                A2_74HC138 = 1;

                A1_74HC138 = 0;

                A0_74HC138 = 0;

                delay_ms(500);

                

                //B2

                A2_74HC138 = 1;

                A1_74HC138 = 0;

                A0_74HC138 = 1;

                delay_ms(500);

        }

}

让我们来看下实际运行的效果吧:

其实,RGB三色灯不仅仅只能发出红、蓝、绿三种颜色哦,稍微有点常识的人都知道,红、蓝、绿三色,其实就是三基色,大多数的颜色都是可以通过红、蓝、绿三色按照不同的比例生成的,比如:

红色+绿色=黄色

绿色+蓝色=青色

绿色+蓝色=品红

红色+绿色+蓝色=白色

我们可以用一个图来表示上面的合成色结构:

看了之后,会不会有点小心动呢?那么还等什么,赶紧动手试试吧,程序部分本菜在此就不再介绍了,感兴趣的小伙伴们自己动起手来吧,就当做是课后作业吧。本讲到此结束,后续精彩部分敬请关注!

I51开发板第十七讲 数码管简介https://bbs.icxbk.com/community/forum.php?mod=viewthread&tid=66084(出处: ICKEY BBS)
  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:8
wambob 2016-09-06
学数电的时候,做过实验:lol
0   回复
举报
发布
huihui163 2016-09-05
38译码器在学校学习过,在这学的比较全面啊
0   回复
举报
发布
354032@qq.com 2016-09-03
是挺简单的, 这个芯片也便宜。
0   回复
举报
发布
kk118a 2016-09-02
换成595或者164
0   回复
举报
发布
SingleYork 回复 2016-09-12
板上已经有595了,驱动数码管就是用的595
0   回复
举报
gjianw217 回复 2016-09-21
简单,基础,138,595,164。。。
0   回复
举报
君子好“球” 2016-09-02
讲得很详细啊!顶一个
0   回复
举报
发布
kk118a 2016-09-02
PWM控制三个灯,可组合出更多色彩
0   回复
举报
发布
SingleYork 回复 2016-09-12
你可以尝试一下,可以发帖做详细说明:)
0   回复
举报
lilei 2016-09-02
楼主果然好厉害啊,听说还有开发板啊!
0   回复
举报
发布
SingleYork 回复 2016-09-12
哪里,只是略懂一二,在这献丑了:)
0   回复
举报
雪狼 2016-09-02
刚大致看了一下,不错啊
0   回复
举报
发布
SingleYork 回复 2016-09-12
感谢支持……
0   回复
举报
x
收藏成功!点击 我的收藏 查看收藏的全部帖子