共计 1787 个字符,预计需要花费 5 分钟才能阅读完成。
在数字系统中,优先编码器就像一位高效的交通指挥员,它能将多个输入信号(如键盘按键或中断请求)转换成精简的二进制编码,同时根据预设优先级处理同时发生的信号。今天我们就来深入剖析这款经典的 TTL 芯片——74LS147,手把手带您避开初学时的那些坑。

一、为什么选择 74LS147?
当我们需要处理最多 9 个输入信号(实际为 10 线,包括隐含的 0 状态)时,通常会面临几种选择:
- 普通编码器 :如 74LS148,但无法处理同时输入的多个有效信号
- CPLD 方案 :灵活性高但成本陡增,杀鸡用牛刀
- 74LS147:优先编码特性 +5V TTL 电平兼容,性价比之王
举个真实案例:在 DIY 机械键盘扫描电路时,用两片 74LS147 级联就能处理 18 个按键,成本不到 10 元,而同样功能的 CPLD 方案仅芯片就要 30 元以上。
二、芯片引脚全解析
先看这个灵魂示意图:
+-----+--+-----+
EI ----|1 16|--- VCC
| |
I8 ----|2 15|--- EO
... | |
I1 ----|9 8 |--- A3
| |
EO ----|10 7 |--- A2
| |
GS ----|11 6 |--- A1
| |
I0(隐含)|12 5 |--- A0
| |
GND ---|13 4 |--- (NC)
+-----------+
关键引脚三兄弟:
- EI(Enable Input):低电平有效,就像总开关(接 GND 启用)
- EO(Enable Output):级联时连接下级 EI,形成优先级链
- GS(Group Select):任何输入有效时变低,相当于 ” 有信号 ” 指示灯
三、优先级背后的数学之美
来看这个反常识的真值表(输入低有效,输出为 BCD 反码):
| 有效最高输入 | I8 | I7 | … | I1 | A3 | A2 | A1 | A0 |
|---|---|---|---|---|---|---|---|---|
| I8 | 0 | X | … | X | 0 | 1 | 1 | 1 |
| I7 | 1 | 0 | … | X | 1 | 0 | 0 | 0 |
| … | … | … | … | … | … | … | … | … |
| 无输入 | 1 | 1 | … | 1 | 1 | 1 | 1 | 1 |
发现了吗?当 I8= 0 时,无论其他输入如何,输出始终对应 8(0111 是 1000 的反码)。这就是优先级编码的精髓——谁权位高谁先说线。
四、Proteus 仿真实战
搭建电路时记住这三个黄金法则:
- 所有输入脚必须接上拉电阻(典型值 10kΩ),防止悬空误触发
- VCC 和 GND 之间必加 0.1μF 陶瓷电容,距芯片不超过 1cm
- 级联时上位 EO 连下位 EI,形成优先级瀑布
仿真电路关键连接:
[VCC]--+--[10kΩ]--[按键]--[74LS147.I1]
|
+--[0.1μF]--[GND]
五、Arduino 读取示例
// 定义输出线连接数字引脚 2 -5
const int outPins[] = {2,3,4,5};
void setup() {for(int i=0; i<4; i++) {pinMode(outPins[i], INPUT_PULLUP); // 启用内部上拉
}
Serial.begin(9600);
}
void loop() {
int code = 0;
// 防抖采样(连续 3 次读数相同才确认)for(int i=0; i<3;) {
int current = 0;
for(int j=0; j<4; j++) {current |= (!digitalRead(outPins[j])) << j;
}
if(current == code) i++;
else {code = current; i=0;}
delay(5); // 每次采样间隔 5ms
}
// 转换为真实值(取反 + 1 因为输出是 BCD 反码)int realValue = (~code & 0xF) + 1;
Serial.println(realValue);
}
六、血泪经验总结
- 上拉电阻选择 :
- 5V 系统用 4.7kΩ-10kΩ
- 3.3V 系统用 2.2kΩ-4.7kΩ
-
值太小耗电,太大易受干扰
-
级联延迟问题 :
- 每级增加约 22ns 传输延迟
-
三级以上级联需要加 74LS245 缓冲
-
电源去耦玄学 :
- 每个芯片配 0.1μF 陶瓷电容
- 每 5 个芯片加 1 个 10μF 电解电容
- 电容引脚越短越好,优先使用贴片封装
七、三个烧脑思考题
- 如果需要处理 16 个输入,怎样用两片 74LS147 实现?提示:需要外加或门
- 当多片级联时,如何确保高位的优先级绝对高于低位?想想 EO 和 GS 的妙用
- 对比 74LS148,为什么说 147 更适合处理键盘扫描?从输入有效电平和输出编码方式思考
经过这次深度折腾,我发现 74LS147 就像数字电路界的瑞士军刀——简单但足够强大。下次做项目时,当您需要在有限预算下实现优先级编码,不妨给它一个表现的机会。毕竟,经典之所以成为经典,自有其道理所在。
正文完
