ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

74HC148两片级联,手把手搭建16线-4线优先编码器(附电路图)

74HC148两片级联,手把手搭建16线-4线优先编码器(附电路图) 手把手教你用74HC148搭建16线-4线优先编码器附电路图详解做过单片机外扩按键、做过拨码开关矩阵的朋友都知道最烦的就是I/O口不够用。16个按键如果一个个接直接吃掉16个GPIO遇到引脚紧张的单片机简直想哭。用编码器可以大幅压缩输入线数量而74HC148就是干这个的经典芯片——一颗芯片处理8路输入输出3位二进制编码两片级联就能实现16线输入、4位编码输出I/O占用直接从16根降到4根。这篇文章就把16线-4线优先编码器的完整搭建过程拆开讲从74HC148的引脚逻辑、真值表到两片芯片的级联方式、或门合并细节再到调试和排查全部覆盖。适合电子爱好者、课程设计选手以及所有想把“按键数量翻倍但I/O不加”的嵌入式开发者。内容偏实操我会把原理和接线都说透保证你看完能直接抄作业。1. 先把74HC148吃透引脚、真值表和优先级逻辑1.1 引脚功能速览74HC148是高速CMOS八输入优先编码器封装形式常见的有DIP-16和SOIC-16看下面这张引脚清单就明白了。引脚编号名称方向功能说明1-3D4、D5、D6输入编码输入低电平有效4D7输入编码输入低电平有效优先级最高5A2输出编码输出反码最高位6A1输出编码输出反码7A0输出编码输出反码最低位8GND电源接地9EO输出输出使能无有效输入时输出低电平10GS输出组信号有有效输入时输出低电平11A0输出编码输出反码12A1输出编码输出反码13A2输出编码输出反码14D0输入编码输入低电平有效优先级最低15D1输入编码输入低电平有效16Vcc电源正电源范围2V-6V这个表看着有点绕因为DIP封装下芯片引脚顺序是逆时针排列所以数据手册里的引脚图和上面的表格感觉像“对不上号”。实际动手时先认准凹口方向凹口朝上左上角是D4第1脚右下角是Vcc第16脚就错不了。网上好多接线图把引脚画得五花八门以数据手册为准最稳。1.2 真值表与反码输出为什么偏偏要低电平有效74HC148的输出是反码这一点非常容易踩坑。它的完整逻辑是这样当EI输入使能低有效为高电平时芯片被禁用A0-A2全部输出高电平EO为高GS为高。当EI为低电平时芯片正常工作但所有输入D0-D7也是低电平有效。也就是说你按下按键使其接地低电平才会触发编码。无任何输入全部为高时EO输出低电平GS输出高电平A0-A2输出高电平表示无编码。有输入时GS输出低电平表示“本组有有效编码输入”A0-A2输出对应编号的反码。截取核心部分如下输入低有效A2A1A0GSEOD0 011101D1 011001D2 010101D3 010001D4 001101D5 001001D6 000101D7 000001全为111110以D3输入有效为例A2A1A0输出100这是数字3的按位取反把它再取反一次就得到正常的0011。所以很多人第一次用这芯片发现输入3号键竟然输出电平“100”还以为芯片坏了其实就是反码的锅。为什么要设计成低电平有效和反码输出原因很实际TTL/CMOS电路里灌电流驱动能力通常比拉电流强低电平有效的输入可以简化驱动电路。反码输出则方便直接驱动LED显示LED共阳极一端接Vcc另一端经限流电阻接输出脚输出为低电平时LED点亮亮灯的引脚组合刚好就是逻辑“0”对应的位置非常直观。在级联扩展时反码输出也让高位组与低位组的合并变得更加顺理成章后面会看到。1.3 三个关键控制脚EI、EO、GS在级联中分别干什么EI、EO、GS这三个脚是74HC148的精华也是能不能玩转级联的关键。EIEnable Input输入使能低电平有效。EI为高时芯片完全“罢工”输出全为高GS和EO也不反映任何输入状态。EI为低时芯片才执行编码。EOEnable Output输出使能当EI为低且没有任何有效输入时EO输出低电平其他情况EO输出高电平。换句话说EO可以通俗理解为“本组芯片是否处于空闲状态”的低有效指示。用空闲状态去控制后面一片的EI就能实现“前一组没输入后一组才允许工作”的级联。GSGroup Select组信号当EI为低且有有效输入时GS输出低电平表示“本组有输入并且正在编码”无输入或芯片禁用时GS输出高电平。GS在级联扩展中用来产生高位编码同时也能区分“当前有输入”和“当前无输入”两种状态。一句话总结EO管“我空不空”GS管“我有没有货”EI管“允不允许我干活”。把这三脚的关系理顺16线的级联方案就成功了一半。2. 两片级联的整体方案设计从8线到16线的思路2.1 为什么不能直接把两片输出并在一起既然一片74HC148只能处理8路输入那两片加起来正好16路最直接的想法就是把两片A0-A2对应短接共用一组输出线。这个想法方向对但操作上是错的。74HC148的A0-A2属于CMOS推挽输出结构高电平由上面的PMOS导通提供低电平由下面的NMOS导通提供。两片芯片的输出直接并联一旦一片输出高、另一片输出低两个管子就会形成从Vcc到GND的低阻通路轻则逻辑混乱重则芯片过热甚至烧毁。正确的做法是在每路编码输出之间加“或门”合并。因为两片148在工作时是互斥的——同一时刻只有一片真正输出有效编码另一片处于禁用状态输出全为高。把两片的A0相或、A1相或、A2相或结果就等于有效工作的那一片的输出。74HC32是一片四路2输入或门刚好用三个门搞定三路合并还剩一个门空着特别合适。或者也可以用3输入或门74HC4075但没必要74HC32更常见。2.2 主从式使能级联让高8位整体优先16线扩展的经典连接方式是把两片74HC148分成“主芯片”和“从芯片”。主芯片接高8位输入X15-X8EI直接接地也就是始终处于使能状态。从芯片接低8位输入X7-X0EI不接地而是接主芯片的EO。主芯片的GS经过一级反相作为编码输出的最高位Y3。逻辑过程是这样的当高8位没有任何输入时主芯片空闲EO输出低电平从芯片的EI被拉低从芯片开始工作对低8位输入编码。当高8位一旦有任何一个输入有效主芯片立刻工作EO变高从芯片EI变高被禁用低8位的输入全部被屏蔽。这保证了高8位的优先级整体高于低8位做到了16线范围内“编号越大优先级越高”。这个设计有一个好处不管有没有输入主芯片始终在上电监测高8位从芯片只是被动地等待主芯片“让位”。整体的响应延迟路径很短实际测试从输入有效到输出稳定大概也就是几十纳秒完全满足按键扫描这类低速应用就算做信号源选择器也没问题。2.3 输出编码如何组合成16线-4线三路或门的输出只是低3位还需要第4位来表示“当前编码来自高8位还是低8位”。这时候GS就派上用场了。主芯片的GS逻辑是高8位有输入时GS0无输入时GS1。因此第4位Y3可以通过反相器把GS取反得到也就是高8位有输入时Y31低8位输入有效时Y30。这和16进制编码的规则完全一致——X8-X15对应Y31X0-X7对应Y30。这里还要注意反码的处理。74HC148输出的A0-A2是反码所以完整电路里在或门合并之后再接三个反相器把A0-A2取正。最终得到的Y3Y2Y1Y0就是一个正码的4位二进制数直接对应有效输入的编号。举例来说X10按下主芯片编码D2对应反码101取反后低3位为010Y31合成1010也就是十进制10正好对上。如果用不到正码比如后级单片机也支持读反码可以省掉这三个反相器后面我再讲这个取舍。3. 手把手接线完整电路图详解与器件清单3.1 器件清单为了搭建这个16线-4线优先编码器需要准备的材料如下器件数量说明74HC1482片U1主芯片高8位U2从芯片低8位74HC321片四路2输入或门用于合并编码输出74HC041片六反相器用于取反GS和A0-A210kΩ电阻16个输入上拉电阻确保空闲时为高电平220Ω电阻4个LED限流电阻0.1uF瓷片电容2个芯片电源去耦电容10uF电解电容1个电源入口滤波电容按键或拨码开关16个输入信号源LED4个编码结果显示面包板或PCB1块搭建平台5V直流电源1个整板供电选74HC系列不是因为只有它能用而是因为74HC系列是CMOS工艺功耗低、输入阻抗高、电源范围宽2V到6V都能工作跟5V单片机系统是最佳搭档。74LS148作为TTL老型号也能用但功耗更大输入高电平阈值更高不建议新设计使用。3.2 电源、去耦与输入电路设计电源是整个电路稳定工作的基础。5V电源入口先接一个10uF电解电容再在每个74HC148的Vcc和GND之间就近跨接一个0.1uF瓷片电容。去耦电容要尽量靠近芯片电源引脚这样能吸收电源线上的高频噪声防止芯片逻辑误翻转。面包板搭建时很多新手容易忽略这一步结果就是电路工作不稳定输出偶尔乱跳。16路输入统一接10kΩ上拉电阻到Vcc按键的另外一端接GND。按键按下时对应输入脚被拉低形成有效低电平。之所以必须加上拉电阻是因为CMOS芯片的输入不能悬空悬空状态下引脚电平不定静电或噪声都可能让芯片以为有输入。10kΩ算是折中值——静态功耗小抗干扰能力也够实际用4.7k到20k之间都可以手头有什么用什么是常态。LED指示电路方面4个LED采用共阳极接法LED正极统一接Vcc负极串220Ω限流电阻后接到Y0-Y3。这样输出低电平时LED点亮正好可以用“亮0、灭1”的逻辑来读数。测试时看到LED灯组合就能直接判断编码对不对比拿万用表点来点去快太多。3.3 主从级联与输出合并的详细接线下面这张文字版电路图把16线编码器的连接关系都标清楚了照着接线即可。5V | ---------- | | 10uF | | | GND --- | -------- | 0.1uF | | | --------- | ------------------------------------ | | U1: 74HC148(主/高8位) U2: 74HC148(从/低8位) | | X15 ---- D7 X7 ---- D7 X14 ---- D6 X6 ---- D6 X13 ---- D5 X5 ---- D5 X12 ---- D4 X4 ---- D4 X11 ---- D3 X3 ---- D3 X10 ---- D2 X2 ---- D2 X9 ---- D1 X1 ---- D1 X8 ---- D0 X0 ---- D0 EI ---- GND EI ---- U1.EO Vcc ---- 5V Vcc ---- 5V GND ---- GND GND ---- GND A0 ---- 74HC32(1A) A0 ---- 74HC32(1B) A1 ---- 74HC32(2A) A1 ---- 74HC32(2B) A2 ---- 74HC32(3A) A2 ---- 74HC32(3B) GS ---- 74HC04(4A) EO ---- U2.EO(悬空) EO ---- U2.EI GS ---- 悬空/指示LED 74HC32: 1Y 1A OR 1B - 74HC04(1A) - Y0 2Y 2A OR 2B - 74HC04(2A) - Y1 3Y 3A OR 3B - 74HC04(3A) - Y2 74HC04: 4Y NOT 4A (即NOT U1.GS) - Y3有几处接线要特别提醒U1的EI必须直接接GND主芯片始终工作不能悬空。悬空状态下CMOS输入电平不定整个电路逻辑就是乱的。U2的EI接U1的EO不要搞反。U1空闲时EO0U2才被允许工作U1有输入时EO1U2被锁死。这个跨接关系是整个级联的核心。U1的GS经过反相后作为Y3。U2的GS在这个方案里用不上可以悬空也可以接一个LED作为“低8位有输入”的指示。U2的EO悬空即可不需要接任何东西。74HC32的三个或门分别合并U1和U2的A0、A1、A2顺序别接错否则编码全乱。3.4 完整原理逻辑图数据流视角如果从数据流的角度看整个系统可以分成三级。第一级是输入采集。16个按键信号经过上拉电阻稳定成高电平按键按下时拉低送入两片74HC148的D0-D7。这里X15-X8对应主芯片X7-X0对应从芯片。第二级是编码与级联。主芯片的EI接地持续工作它的EO控制从芯片的EI。没有高8位输入时从芯片接管低8位的编码任务高8位有输入时从芯片立刻罢工主芯片负责全部编码。两片芯片各自的编码结果在或门合并得到有效的3位反码。第三级是正码换算与显示。三路反码经过反相器得到正码主芯片GS再取反得到最高位最后拼成一个4位二进制数驱动LED或送往单片机读取。整条链路逻辑清晰每个环节都可以单独测量排查问题时很好下手。4. 调试与功能验证从静态电平到动态测试4.1 上电前的基础检查不要在面包板上搭完线就急着上电先花两分钟做静默检查。用万用表蜂鸣档确认Vcc和GND之间没有短路芯片的凹口朝向一致电源正负极没有接反。74HC148的Vcc和GND在芯片两侧跟74HC32、74HC04也不一样新手上电前最容易犯的错就是把电源接到输出脚上。确认无误后上电用万用表测U1的EO对地电压正常应接近0V因为U1处于空闲状态。测U2的EI对地电压也应是0V左右说明U2已经被使能。如果这两个电平不对顺藤摸瓜检查电源和地线的连接。实际上最省事的方式是先单独测试一片74HC148。把一片芯片的EI接地D0-D7全部通过10k电阻上拉A0-A2分别接LED。然后逐个按下对应按键观察三颗LED的组合是否等于反码。单芯片验证通过再开始级联这样能把问题范围缩小避免两片芯片一起出错时不知道从哪里排查。4.2 用按键和LED逐项验证优先级与编码16路输入接好之后我建议按“单输入验证、组间优先级验证、组内优先级验证”三个步骤来测试。第一步单输入验证。只按X0理论上输出Y3Y2Y1Y00000也就是四颗LED全亮只按X8输出1000第三颗LED灭其余亮具体亮灭取决于你的接线顺序。其他输入逐一测试对照二进制编码表确认。第二步组间优先级验证。同时按下X2和X9由于高8位整体优先输出应该是1001也就是X9的编码。这一步验证的是U1的EO对U2的EI的禁用逻辑是否生效。如果输出变成0011X2说明U2没有被正确禁用重点查U1的EO到U2的EI这根线。第三步组内优先级验证。同时按下X1、X3、X5低8位组内X5优先级最高所以输出0101。再测试主芯片组内同时按X10、X12、X15输出应该锁定为1111X15。这三步走完芯片的优先级逻辑基本就确认无误了。如果你的应用需要“低编号优先”方向会相反这个后面单独说。4.3 用Multisim仿真先跑一遍实物焊接之前先仿真能省一大笔时间。Multisim元件库里直接搜74HC148在“74HC”目录下面能找到74HC32和74HC04同样拖出来。仿真里用逻辑电平开关代替按键用电压探针或者数码管代替LED按实物电路的逻辑连一遍按F5运行仿真。仿真有一个好处可以同时按下多个开关直接用探针观察输出逻辑的变化不会像实物那样出现接触不良或噪声干扰。我在仿真里测过按下X9时Y3Y2Y1Y01001按下X2时Y3Y2Y1Y00010逻辑完全正确。把仿真跑通了再上实物故障率会低很多。如果用的是Proteus方法和Multisim类似。74HC148在Proteus里位于“74HC”库也可以直接用74LS148替代逻辑功能相同仿真输出一致。5. 实测踩坑与常见问题排查5.1 输入悬空导致误触发这是新手最常遇到的现象上电之后什么都没按LED偶尔闪一下或者编码器乱输出。绝大多数原因是输入端悬空。CMOS芯片输入阻抗极高悬空引脚会像一根天线一样捕捉周围的电磁干扰尤其面包板上一堆飞线噪声源太多了。解决方法就是每个输入端接10kΩ上拉电阻到Vcc确保静态时引脚稳定在高电平。有些同学想省电阻觉得“不接按键的时候反正没有人碰它”这个想法是错的尤其是工作环境有开关电源、电机、继电器这些干扰源时悬空输入能把整个系统带崩。16个电阻虽然多一点但这是保证稳定性的底线。5.2 输出编码看起来“倒过来了”测试时可能会发现按下X3LED显示的是1100而不是预期的0011。这不是芯片坏了是74HC148输出反码。解决方案有两种。一是按反码表对照也省掉反相器。单片机读取时做一次取反运算即可比如读到一个字节的低3位是0b100按位取反得到0b011就是3。二是硬件上补充反相器也就是我前面电路图里那种74HC04取反的做法。两种方案各有适用场景——如果输出要直接驱动7段数码管或后级逻辑电路判断“1”表示有效建议硬件取反如果输出进单片机完全可以在软件里取反省一片芯片。另外还有一个容易混淆的点74HC148优先级最高的是D7不是D0。同时按下D1和D3输出的是D3的编码。有些学生误以为“编码器应该输出编号最小的那个”这是对优先编码器含义的理解偏差。普通的编码器只允许一个输入有效优先编码器则允许同时多个输入并且只对最高优先级的那个输入进行编码。74HC148是后者它解决的是“几个按键同时按下怎么办”的问题。5.3 机械按键抖动导致输出不稳定机械按键按下去的瞬间簧片并不是一次接触到位通常会抖动几个毫秒。对于编码器这种组合逻辑电路抖动会造成输出的编码毛刺表现为按下一次按键LED快速闪烁好几个数字。处理抖动有三种思路。第一种是RC低通滤波在每个按键输入口串100Ω电阻、并0.1uF电容到地把抖动产生的瞬态电平变化抹平。第二种是用施密特触发器比如74HC14整形把缓慢变化的边沿变成干净的陡峭边沿。第三种是在后级单片机读数据时做软件消抖比如连续采样两次间隔10ms一致才采用。如果是纯硬件电路直接带显示RC滤波加施密特整形的组合最稳妥。机械抖动对于“按一下键读取一次编码”的场景影响不大因为人的手指按下时间远大于抖动时间。但如果你打算用这个编码器做旋钮编码、拨码开关等快速切换应用消抖就不是可选项而是必选项了。5.4 高频和动态输入时的毛刺处理如果输入信号不是来自按键而是来自其他数字电路或传感器就要考虑信号跳变时的竞争冒险问题。74HC148从输入到输出的延迟数据手册典型值在几十纳秒两片级联再加或门和反相器整体延迟大概100纳秒左右。在这段延迟窗口内如果输入信号快速变化输出可能出现短暂的中间态毛刺。这个问题的关键在于应用场景。如果后级是单片机或锁存器通常在特定时刻读取编码结果只要读取时刻避开输入跳变毛刺不影响结果。建议在单片机端加一个“数据有效”握手信号比如利用GS的电平变化触发中断去锁存编码这样就能彻底避开毛刺窗口。如果用这个编码器直接驱动组合逻辑电路做实时控制最好在输出端加一级74HC373或74HC574锁存器用输入跳变沿触发锁存让毛刺产生期间锁存器保持旧数据不变直到输出稳定后才更新。这个做法相当于给电路加了一个“快照”功能牺牲一点点延迟换来稳定输出非常实用。5.5 常见问题速查表现象可能原因排查方法上电后无任何输出Vcc或GND接反、芯片电源引脚虚接用万用表逐个芯片测Vcc对GND电压个别按键无效该路输入上拉电阻脱落、按键接线错误万用表测该输入脚空闲时是否为高电平高8位和低8位互相干扰EO到EI的级联线接错或虚接测U1.EO和U2.EI之间的电压是否随输入变化输出编码是反码未取反、或门合并顺序错误对照反码真值表确认必要时加74HC04输出显示非有效编号两片芯片的D0-D7接线顺序对调检查X15-X8是否全接U1、X7-X0是否全接U2同时按下多个键输出乱跳按键抖动、输出竞争冒险加RC滤波或锁存器软件端做消抖U1空闲时U2仍不工作U1.EO到U2.EI断线、U1.EI未接地测U1.EO应为低电平U2.EI应为低电平6. 从16线继续扩展走向32线、64线的设计思路16线编码器做出来之后很多朋友会问如果我的应用有32个按键或者更多输入这套方案还能继续往上叠吗答案是可以但拓扑结构会从“两片级联”变成“树形级联”。我简单说一下方向方便大家在现有电路基础上继续扩展。32线-5线编码器的思路是先用两层结构。第一层4片74HC148分别处理8组输入共32路。这4片芯片的GS信号分别代表“这一组是否有输入”把4个GS信号作为第二层一片74HC148的输入进行二次编码得到组号。第一层4片芯片的编码输出通过多路选择或门合并再加上第二层的组号组合成5位输出。这里有几个细节要注意各组之间的优先级分配、第一层芯片的EO级联顺序、以及跨芯片的或门合并线会明显增多。布线难度比16线高一个数量级建议直接上PCB而不是面包板。64线则在这个基础上再加一层。8片第一层芯片、2片或3片第二层芯片组成三级树形结构。层数越多端到端延迟越大74HC148级联后的传输延迟可能需要几百纳秒。对于按键扫描这种低速场景完全够用但如果要处理高速编码信号就不如直接上FPGA或者CPLD了。另外层级增加也会带来编码信号对齐的问题低层芯片的编码输出和高层组号信号到达合并点的时间会有差异严重时需要加寄存器同步。如果只是要处理更多按键还有一个更实用的替代方案矩阵扫描。16个按键用4x4矩阵加4个I/O就够32个按键用4x8矩阵也只需要12个I/O。不过矩阵扫描依赖单片机不断轮询占用CPU时间编码器方案则是纯硬件实时输出不需要软件参与在“实时性强、后级为纯逻辑电路、不希望占用CPU”的场景下更合适。两种技术路线各有利弊按需取舍。我个人的建议是16到32路输入之间74HC148级联方案性价比最高超过32路认真评估一下矩阵扫描或者移位寄存器方案会更省事。这套16线的电路和调试经验是整个扩展路径的基础把优先级逻辑和三脚级联原理吃透了后面无论做几层都是换汤不换药。最后分享一个实际操作中的小心得如果你准备把这套电路量产或者长期使用面包板上验证通过之后一定要重画PCB。面包板的寄生电容和接触电阻在高频或者震动环境下会让人抓狂而74HC148本身是高速CMOS芯片PCB布局注意一点每个芯片电源就近放去耦电容输入走线短而粗16线编码器的稳定性会非常好我也确实在项目里用这套电路扛住了长时间不间断运行。
返回列表