介绍
74148优先编码器为16脚的集成芯片,是一复个八线-三线优先级编码器。除电源脚 VCC(16)和GND(8)外,其余输入、输出脚的作用和脚号如图中所标。制其中 I 0— I 7为输入信号, A2,A1,A0为三位二进制编码输出信号, EI是使能输入端, EO使能输出端, G S为片优先编码输出端。
在优先编码器电路中,允许同时输入两个以上编码信号。不过在设计优先编码器时,已经将所有e69da5e887aa7a6431333361303130的输入信号按优先顺序排了队。在同时存在两个或两个以上输入信号时,优先编码器只按优先级高的输入信号编码,优先级低的信号则不起作用。74148是一个八线-三线优先级编码器。
74148优先编码器为16脚的集成芯片,除电源脚 VCC(16)和GND(8)外,其余输入、输出脚的作用和脚号如图中所标。其中 I 0— I 7为输入信号, A2,A1,A0为三位二进制编码输出信号, EI是使能输入端, EO使能输出端, G S为片优先编码输出端。
由74148真值表可列输出逻辑方程为:
A2 =(I4+I5+I6+I7)EI
A1 = (I2I4I5+I3I4I5+I6+7)· EI
A0 = (I1I2I4I6+I3I4I6+I5I6+I7)· EI
当使能输入 EI=1时,所有输出端群被封锁在高电平。
当使能输入EI=0时,允许编码,在I0~I7输入中,输入 I7优先级最高,其余依次为: I6,I5,I4,I3,I2,I1,I0等级排列。
使能输出端EO的逻辑方程为:
EO =I0· I1· I2· I3· I4· I5· 67· EI,
此逻辑表达式表明当所有的编码输入端都是高电平(即没有编码输入),且EI=0时,EO才为零;
表明EO的低电平输出信号表示“电路工作,但无编码输入。
扩展片优先编码输出端 G S的逻辑方程为: GS = (I0+I1+I2+I3+I4+I5+I6+I7)· EI,此时表明只要任何一个编码输入段有低电平信号输入,且EI=0,GS即为低电平。
GS的低电平输出信号表示“电路工作,而且有编码输入。”(GS=0)
在《数字电子技术基础》中,EI表示S,EO表示Ys,GS表示YEX(EX为下标)
在仿真软件multisim中,有74HC148DW,74HC148N 两种表示的是封装不同 不影响仿真。
芯片实物图
74HC148(有限编码器)真值表
什么是优先编码器
优先编码器是一种能将多个二进制输入压缩成更少数目输出的电路或算法。其输出是序数0到输入最高有效位的二进制表示。优先编码器常用于在处理最高优先级请求时控制中断请求。
如果同时有两个或以上的输入作用于优先编码器,优先级最高的输入将会被优先输出。下图是一位4线-2线编码器的例子,其中最高优先级的输入在功能表的左侧,而“x”代表无关项,即可是1也可是0,也就是说不论无关项的值是什么,都不影响输出,只有最高优先级的输入有变化时,输出才会改变。
单片机实现74HC148优先编码器功能的程序
//在arudino 中调试通过
//将A0,A1,A2,接入IO 4,7,8
//如数据不稳定可以将digitalRead改为digitalReadt程序消抖进行对比。
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
#define HC148A0 8
pinMode (4, INPUT);
pinMode (7, INPUT);
pinMode (8, INPUT);
}
void loop() {
int a = 0;
Serial.print(" A2 ");
Serial.print("A1");
Serial.print(" A0 ");
int n8 = digitalRead(8);
delay(2);
int n7 = digitalRead(7);
delay(2);
int n4 = digitalRead(4);
bitWrite(a, 0, n4);
bitWrite(a, 1, n7);
bitWrite(a, 2, n8);
Serial.print(n8, BIN); Serial.print(" "); Serial.print(n7, BIN); Serial.print(" "); Serial.print(n4, BIN);Serial.print(" = "); Serial.println(a);
delay(100);
}
bool digitalReadt(int testpin) {
bool digval = digitalRead(testpin); //消抖
delay(5);
while (digval != digitalRead(testpin)) {
delay(5);
digval = digitalRead(testpin);
delay(5);
}
return digval;
}