单片机交流
直播中

李微波

8年用户 992经验值
私信 关注
[问答]

如何利用51单片机学习数码管倒计时?

74LS138具有哪些工作原理和应用?

如何利用51单片机学习数码管倒计时?

回帖(1)

武彩霞

2021-10-26 11:34:05
简介

74LS138 为3 线-8线译码器,共有 54LS138和 74LS138 两种线路结构型式。54LS138为军用,74LS138为民用。
工作原理

①当一个选通端(E1)为高电平,另两个选通端()和()为低电平时,可将地址端(A0、A1、A2)的二进制编码在Y0至Y7对应的输出端以低电平译出。(即输出为Y0至Y7的非)比如:A2A1A0=110时,则Y6输出端输出低电平信号。
②利用 E1、E2和E3可级联扩展成 24 线译码器;若外接一个反相器还可级联扩展成 32 线译码器。
③若将选通端中的一个作为数据输入端时,74LS138还可作数据分配器。
④可用在8086的译码电路中,扩展内存。
真值表






引脚功能






应用

74LS138可以组成三变量输入,四变量输入的任意组合逻辑电路。
(1)用一块3线-8线译码器74LS138可以组成任何一个三变量输入的逻辑函数,任意一个输入三变量的逻辑函数都可以用一块3线-8线译码器74LS138来实现。因为任意一个组合逻辑表达式都可以写成标准与或式的形式,即最小项之和的形式,而·块3线-8线译码器74LS138的输出正好是二变量最小项的全部体现。
(2)二块3线-8线译码器74LS138可以组成任何一个四变量输入的逻辑函数。
常见的一些编码器、译码器如(74LS138)都只是三位或四位二进制的编码译码,只能满足一些简单电子电路的需求,对于复杂电子电路就无能为力了。
中规模集成电路74LS138的工作原理十分简单,根据输出表达式,从中可以看出译码器74LS138是一个完全译码器,涵盖了所有三变量输入的最小项,这个特性正是它组成任意一个组合逻辑电路的基础。74ls138还有另一重要应用,可以组成数据分配器。其实在电路在家用电器、自动化控制等方面都有重要的应用。
软件部分

//基于普中单片机138译码器数码管实验
#include "reg51.h"                         //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;


***it LSA=P2^2;
***it LSB=P2^3;
***it LSC=P2^4;
***it led=P2^2;
***it beez=P1^5;
u16 flag=60,q,w,i,num=0,qwe=0;
double  code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值


void delay(u16 i)//us软件延迟
{
        while(i--);       
}
void DigDisplay()
{
        u8 i;
        for(i=0;i<2;i++)
        {
                switch(i)         //位选,选择点亮的数码管,
                {
                        case(0):
                                LSA=0;LSB=0;LSC=0;        P0=smgduan[0]; break;//显示第0位
                        case(1):
                                LSA=1;LSB=0;LSC=0;        P0=smgduan[6]; break;//显示第1位
                        case(2):
                                LSA=0;LSB=1;LSC=0; break;//显示第2位
                        case(3):
                                LSA=1;LSB=1;LSC=0; break;//显示第3位
                        case(4):
                                LSA=0;LSB=0;LSC=1; break;//显示第4位
                        case(5):
                                LSA=1;LSB=0;LSC=1; break;//显示第5位
                        case(6):
                                LSA=0;LSB=1;LSC=1; break;//显示第6位
                        case(7):
                                LSA=1;LSB=1;LSC=1; break;//显示第7位       
                }
                delay(100); //间隔一段时间扫描       
                P0=0x00;//消隐
        }
}
void time() interrupt 1
        {
                TH0=(65535-45872)/256;
                TL0=(65536-45872)%256;
                num++;
                if(num==20)
                {
                    num=0;
                    flag--;
                    q = flag%10;
           w = flag/10%10;
                }
  }
void main()
{       
        TMOD=0x01;
        TH0=(65535-45872)/256;
        TL0=(65536-45872)%256;
        EA=1;
        ET0=1;
        TR0=1;
        while(1)
        {       
                  for(i=0;i<2;i++)
                switch(i)         //位选,选择点亮的数码管,
                {
                        case(0):
                                LSA=0;LSB=0;LSC=0;        P0=smgduan[w]; break;//显示第0位
                        case(1):
                                LSA=1;LSB=0;LSC=0;        P0=smgduan[q]; break;//显示第1位
            }               
   }
}
关于显示数字的处理(简单处理,可能有错误,毕竟小白)
一维数组表示数字,
取万位,就要/10000%10,主要看前面的数字取什么位
取个位,就要/1%10     //number%10 = number/1%10
LightBuf[0]= DuanMa[num%10]; //取个位/     number%1/10
LightBuf[1]= DuanMa[num/10%10];//取十位   number%10/10
LightBuf[2]= DuanMa[num/100%10];//取百位  number%100/10
LightBuf[3]= DuanMa[num/1000%10];//取千位 number%1000/10
举报

更多回帖

发帖
×
20
完善资料,
赚取积分