数据选择器实战:从74LS151/74LS153真值表到16选1扩展

发布时间:2026/10/7 5:53:13
数据选择器实战:从74LS151/74LS153真值表到16选1扩展 做多路数据采集时我第一个想到的不是让单片机开十个ADC而是数据选择器。手里正好有74LS151和74LS153这两颗经典芯片我把从真值表到16选1扩展的整套流程从头到尾跑了一遍中间踩了不少坑也终于把MUX的原理彻底搞明白了。如果你最近也在为“通道不够用”发愁或者上课学到数据选择器却不知道怎么落地这篇文章大概率能帮上忙。我会把真值表怎么读、153和151的内部结构差异、两片151级联成16选1的接线方式、以及实测中遇到的各种诡异问题全部展开讲尽量写得像实验笔记一样可以直接照着复现。先交代一下背景。我需要把16路传感器信号分时送到同一个ADC输入口数据选择器是这个场景最顺手的方案。74LS151是8选174LS153是双4选1两颗芯片正好覆盖了“单通道选通”和“双通道同步切换”两类典型需求。用使能端做高位地址扩展之后8选1变成16选1原理上还能继续往32、64路推。整条链路下来最值钱的经验其实不在芯片本身而在扩展时那几根使能线的接法和输出合并方式。下面直接进入正题。1. 数据选择器怎么选项目整体设计思路1.1 多路开关的工程定位以及它和锁存器的分工数据选择器Multiplexer简称MUX在数字电路里干的事说白了就是一个多路开关从多个输入信号中选出一路送到输出。名字很唬人实际行为跟老式电话交换机的接线员一样某根地址线报一个号码它就接通对应的那一对触点。与之相对的是数据分配器DEMUX一根输入线分到多路输出方向恰好相反很多教材把这两个放在一起讲实战时别搞混。MUX最常见的应用场景是数据采集前端。比如你要监控16个温度点但MCU只有一个ADC引脚最土的办法是手动切换传感器供电体面一点的办法就是用MUX通过地址码轮流把16路信号接到ADC上。另一个场景是总线共享多个设备复用一组数据线谁想发数据谁就获得选通权。函数发生器里的波形查表、LED点阵屏的行列扫描本质上也在用MUX做信号切换。这里要顺带提一下锁存器。MUX负责“选哪一路”锁存器负责“把这一路的值稳住”两者经常前后脚出现。ADC采样需要一定的采样时间如果MUX输出端信号还在跳变你就得在MUX后面放一个采样保持电路锁存器就是最典型的数字采样保持方案。锁存器有自己的真值表行为是“使能时跟随禁止时保持”和MUX“按地址选路”是两个完全不同的逻辑形态。理解这一点后面遇到MUX锁存器组合电路的时候就不会发懵。1.2 74LS153和74LS151的选型对比芯片家族里为什么是它俩74系列逻辑芯片家族庞大光数据选择器就有不少型号。74LS153是双4选1一枚芯片里封装了两个独立的4选1共享两根地址线各有各的使能端。74LS151是8选1单通道三根地址线选一路带正反两个互补输出。选它们俩做项目主要是因为教科书覆盖率最高、资料最多、结构最规整适合把MUX的原理彻底吃透。尤其是151的互补输出端在扩展成16选1的时候是个关键设计点。选型时还要留意74LS和74HC、74HCT之间的差异。74LS系列是TTL工艺供电标准5V输入高电平阈值大约2.0V输出驱动能力强但功耗偏大。74HC是CMOS工艺工作电压范围宽2V到6V3.3V系统也能跑。74HCT是TTL兼容输入的CMOS可以直接被5V TTL信号驱动。实测下来如果你用的是3.3V单片机去控制74LS151高电平输出可能勉强卡在阈值边缘噪声一大就容易误触发。这种情况直接换74HC151或者74HCT151更稳引脚完全兼容不用改板子。另外别把数字MUX和模拟开关混为一谈。CD4051这类芯片虽然也叫8选1但它传输的是模拟信号导通电阻几十欧适合音频、传感器这类连续信号。74LS151只能传数字电平输入要求是明确的逻辑0或逻辑1。用数字MUX去切模拟量轻则精度崩坏重则芯片发烫。1.3 从真值表到16选1的完整技术路线很多人拿到芯片先看引脚图这个习惯没错但比引脚图更该先看的是真值表。真值表是芯片行为的完整说明书引脚图只告诉你哪个脚在哪真值表告诉你这个芯片到底怎么干活。74LS153和74LS151都属于组合逻辑器件输出完全由当前输入决定没有存储功能所以真值表是组合逻辑全覆盖的没有任何“保持上一状态”的行。而锁存器一类的时序逻辑器件真值表里就会多出“使能无效时输出保持”这种行。这两种真值表的读法不一样后面我会专门对比。我这次项目的技术路线分四步走第一步读懂153和151各自的真值表搞清楚使能端优先级、地址码和通道号的对应关系第二步单芯片搭最小验证电路用拨码开关和LED把真值表实测一遍第三步利用使能端做高位地址把两片151级联成16选1或者用153配合译码器实现同样的功能第四步整机联调观察波形排查故障。全程用真值表作为分析工具每遇到一个症状都先回到真值表推一遍再动万用表排查速度快很多。这里多说一句“温度计译码真值表”。温度计码是ADC/DAC领域常用的一种编码码值从0000开始每增加一个单位就往高位补一个1形如0000、0001、0011、0111、1111像水银柱上升一样层层叠高所以叫温度计码。它也有对应的真值表。接触过这种真值表之后你会发现数字电路里“按表办事”的思想是通用的MUX的真值表、译码器的真值表、锁存器的真值表本质都是对“输入组合→输出状态”的映射。能把真值表读熟任何组合逻辑芯片拿到手都能自己推个八九不离十。2. 看懂核心74LS153与74LS151真值表深度拆解2.1 74LS153双4选1两个独立通道共享地址使能低有效74LS153封装里有A、B两组4选1A组的输出是1YB组是2Y。两组共享两根选择端S1、S0或者说B、A但使能端完全独立分别是1E和2E都是低电平有效。所谓低电平有效就是引脚上给低电平时功能才生效给高电平时整个通道罢工。这个“低有效”是新手最容易翻车的地方后面实操部分我会专门强调。74LS153第1组真值表如下第2组完全一样只是信号名换成2C0~2C3、2E、2Y使能1E选择S1选择S0输出1YHXXLLLL1C0LLH1C1LHL1C2LHH1C3可以看到使能端优先级最高只要1E为高哪怕S1S0随便怎么拨输出都是固定低电平。只有当1E为低时输出才跟着S1S0的二进制组合走。S1S000选中1C001选中1C110选中1C211选中1C3。X表示该信号对输出没影响。153最有意思的一点是“一片顶两片”。两个4选1共享地址线意味着你可以用同一组地址同时控制两个独立的数据流。比如一个8位数据总线要分高低字节拆开处理或者两路传感器需要同步切换153就非常合适。网上很多例子只把它当两个独立的4选1用其实“双通道同步选通”才是这颗芯片的隐藏价值。2.2 74LS151 8选1三根地址选八路互补输出是扩展关键74LS151是单8选18个数据输入端D0~D7三根地址选择端C、B、AC是最高位一个选通端STROBE有的资料标E低有效还有两个互补输出端Y和YY是Y的反相输出。74LS151真值表按标准写法如下选通ECBAYYHXXXLHLLLLD0/D0LLLHD1/D1LLHLD2/D2LLHHD3/D3LHLLD4/D4LHLHD5/D5LHHLD6/D6LHHHD7/D7注意两个细节。一个是选通端高电平时Y被强制拉低、Y被强制拉高输出Y“看起来像选了个低电平输入”但那是禁止状态不是真的选中了某一路。另一个是Y和Y互为反相这个互补输出在扩展16选1时是天然的“片选完成标志”也是我把使能端逻辑玩明白的关键伏笔。151还可以降级使用。比如把C引脚固定接地它就变成一个4选1把C、B都固定接地就变成一个2选1。反过来如果想把8选1的通道做满只需要保证三根地址线都确实受控不要悬空就行。2.3 读真值表防迷糊的三个技巧含锁存器真值表对比技巧一地址的二进制数就是通道号。CBA101二进制是5那么输出就是D5S1S010是2153上就是C2。这个换算关系记牢了真值表基本不用背看地址码就能口算出选中哪一路。拨码开关调地址的时候先在心里把二进制转成十进制能少走很多弯路。技巧二使能端的优先级高于地址。凡是带使能端的芯片真值表第一行永远是“使能无效输出固定”。MUX是这样锁存器也是这样甚至存储芯片的片选也是这样。调试时如果输出纹丝不动先查使能端是不是没放到有效电平再查地址线。技巧三区分“有效电平”和“输出电平”。151禁止态输出Y为低很多新手以为这是故障其实芯片设计如此。同理153禁止态输出也是低电平。真正需要警惕的是“禁止态输出高电平”的情况那意味着普通TTL推挽输出不能直接并联否则两片芯片会打架。锁存器真值表和MUX真值表的区别正好做个对比。拿74LS373八D锁存器举例当使能G为高时输出Q跟随输入D当G为低时输出Q保持之前的值。它真值表里有一行是“DX、GL、Q不变”这就是时序逻辑的特征。MUX是组合逻辑没有“保持”这一说输出一定等于某个输入拷贝只是拷贝哪个由地址决定。把这两类真值表放在一起看数字电路里“选择”和“存储”两大基本操作就都齐了。3. 实战核心16选1扩展的两种接线方案3.1 扩展的核心思想把使能端当作最高位地址8选1要变16选1最直观的想法是再加一片151凑成16个数据输入但地址线只有三根怎么区分两片芯片答案就是“片选”。把使能端当作最高位地址DD0时第一片工作D1时第二片工作两片各管8路合起来就是16路。听起来很简单实际操作时最容易被绕进去的是使能端的极性。151的STROBE是低有效也就是要让某片工作必须往它的使能端送低电平。那么D0时希望片1工作片1的使能端就需要等于0所以片1的STROBE应该直接接DD1时希望片2工作片2的STROBE需要等于0但此时D1所以要加一级反相器让片2的STROBE接D的反相信号。一句话总结片1使能接原码片2使能接反码中间需要一颗反相器比如74LS04。用使能端做高位地址是数字电路里非常经典的扩展套路。16选1用1根高位地址32选1用2根高位地址加一个2-4译码器64选1用3根高位地址加一个3-8译码器。扩展的本质就是把“字扩展”变成“片选铺开”和内存条插槽的扩展原理一模一样。3.2 两片74LS151加一个反相器级联16选1这是我在实际项目中采用的方案器件最少接线也直观。具体步骤如下第一步两片151的地址端C、B、A全部并联由低三位地址同时控制。这一步保证了两片芯片内部选中的通道号一致比如低三位是101两片内部都在看各自的D5。第二步数据输入分配。片1的数据输入D0~D7接16路信号的低8路片2的数据输入D0~D7接高8路。第三步最高位地址D接到片1的STROBED同时进反相器74LS04反相后的信号接到片2的STROBE。第四步两片151的Y输出直接短接在一起作为整个16选1的输出端。输出直接短接这件事我一开始是存疑的怕两片推挽输出互相打架。实际分析一下D0时片1的STROBE为低片1正常工作Y精确输出选中那一路片2的STROBE为高处于禁止态Y被强制拉低。两片输出短接片2的低电平不会影响片1的输出因为片1在正常驱动信号。D1时情况反转片2正常输出片1禁止输出低电平。所以这个接法是成立的但前提是151禁止态输出确实是低电平而且不是高阻态。高阻态反而不能直接并联因为悬空节点电平不确定。级联后的逻辑可以用一张表总结最高位D低位CBA选中的通道0000D00001D1.........0111D71000D81001D9.........1111D15细心的朋友会发现这里我复用“D”这个字母既当最高位地址又当数据输入容易混淆。实际接线时建议把16路输入改名为IN0~IN15最高位地址改叫S3避免沟通时鸡同鸭讲。这是我踩过的沟通坑代码和图纸里命名规范一点能省很多事。3.3 用74LS153组合实现16选1的拓展方案如果你手里没有151只有一堆15316选1也能做只是器件要多一些。思路是把16路信号分成4组每组4路先用低两位地址在组内选路再用高两位地址决定哪一组负责输出。具体做法用两片74LS153正好凑出4个4选1通道。低两位地址S1S0并接到所有4选1的选择端高两位地址S3S2经过一个2-4译码器74LS139产生4个低有效使能信号分别接到4个4选1的使能端。那4个4选1的输出再短接得到最终的16选1输出。这个方案比两片151多了一个译码器但有一个独家优势74LS153一片自带双通道两片153其实就是“双路16选1”。如果你需要同时选择两路独立信号比如立体声音频切换、双通道同步采样151方案需要两套级联电路4片151加2个反相器153方案只需要2片153加一个译码器省了一半器件。所以选型时别只盯着集成度还要看系统到底需要几路同步输出。3.4 配锁存器和温度计译码真值表能玩出什么花样16选1扩展完成之后一个很自然的升级方向是在输出端加锁存器。MUX输出在地址切换瞬间会出现毛刺或中间态因为地址线到达时间有快有慢高低位可能瞬间出现一个错误的中间组合。在MUX输出后面接一个74LS373之类的锁存器让ADC只在锁存器稳定后采样就能把毛刺挡在外面。这个用法里锁存器真值表“跟随/保持”的二元行为成了天然的采样窗口。温度计译码真值表在这个场景里也有用武之地。如果用温度计码驱动MUX的地址线每次步进只有一位变化不像二进制码那样多位同时翻转从根源上减少了竞争冒险。比如把温度计码输出接到151的地址端就可以实现按温度阈值逐级选通不同增益的网络这在可编程增益放大器里是真实存在的设计。真值表在这里起的作用就是“编码格式和电路结构之间的翻译器”看懂了这张表你就能把一个看似普通的MUX设计出很多花样。4. 实操记录从单芯片验证到16选1联调4.1 器件准备与面包板搭建TTL芯片的接线禁忌这次实操我用的器件清单如下74LS151两片、74LS04一片只用了其中一个反相器、74LS153两片做对比方案、面包板一块、拨码开关两组、发光二极管若干、330欧电阻若干、5V稳压电源一台、万用表一个。有示波器或逻辑分析仪更好没有的话LED也能凑合验证大部分逻辑。TTL芯片接线有几条铁律违反任何一条都可能直接把芯片送走。第一电源极性绝不能反74LS151的VCC和GND一脚之差反接瞬间芯片就烫手报废。第二所有输入引脚不允许悬空TTL输入端悬空会飘到一个不确定电平大概率被解读成高电平导致选通逻辑完全错乱。第三电源线和地线要粗一点面包板上尽量就近引线减少压降。第四芯片插面包板之前先确认跨接槽方向很多面包板中间凹槽两侧是不连通的插错了信号全断。拨码开关引脚必须加下拉电阻到GND。拨码开关拨到OFF时引脚悬空如果不加下拉TTL输入悬空会默认高电平地址码就乱了。我用的做法是每组拨码开关的公共端接VCC输出端经10千欧电阻接地这样拨到ON时读高电平OFF时读低电平干净利落。4.2 单颗74LS151选通验证5分钟跑通真值表先不做16选1把单颗151的功能验证一遍。D0~D7接拨码开关或者直接接固定的高/低电平组合为了方便观察我建议做成“隔一个高一个”的规律电平D0H、D1L、D2H、D3L、D4H、D5L、D6H、D7L。这样输出高还是低一眼就能跟通道号对上。具体操作步骤给芯片供电GND和VCC接好STROBE引脚直接接地让使能始终有效。地址端C、B、A接另一组拨码开关。输出端Y经过330欧电阻接一个LED到GNDLED亮代表Y为高电平。拨动地址拨码从000开始每拨一个值观察LED状态。记录下LED亮灭和地址的关系跟真值表对照。我实测的预期结果是CBA000时输出D0LED亮CBA001时输出D1LED灭CBA010时输出D2LED亮以此类推。实际测试中经常出现的问题是拨码开关换挡时LED闪烁不定这是因为拨码开关机械抖动导致地址瞬间跳变正常现象不用慌稳定后再看结果。验证完基本选通再把STROBE接到VCC高电平。此时无论地址怎么拨LED都保持熄灭输出被强制拉低。这一步很多人会误以为芯片坏了实际上正是真值表里第一行写的“使能无效时输出低电平”的实测验证。接着用软件或者按键周期性地给STROBE一个低脉冲你会发现输出只在低脉冲期间“透传”数据这就是后面用使能端做高位地址的雏形。如果手边有单片机这段Arduino代码可以直接用来扫描地址省去手动拨码int addrPins[4] {9, 10, 11, 12}; // S3,S2,S1,S0 void setAddr(int addr) { for (int i 0; i 4; i) { digitalWrite(addrPins[i], (addr i) 1); } } void setup() { for (int i 0; i 4; i) pinMode(addrPins[i], OUTPUT); Serial.begin(9600); } void loop() { for (int addr 0; addr 16; addr) { setAddr(addr); delay(200); Serial.println(addr); } }代码里的setAddr函数把4位地址逐位写到GPIO低三位走MUX地址端最高位走使能端刚好是16选1的完整地址映射。4.3 16选1整机联调地址扫描与波形观察单芯片验证通过之后按照3.2节的接线把两片151级联成16选1。实测时我建议先把16路输入设成规律电平比如IN0~IN15依次是0101010101010101这样输出波形自带规律一眼能判断选通顺序对不对。接好之后手动拨S3S2S1S0从0000到1111依次拨动观察LED亮度变化。正常情况下地址每加1输出就跳到下一路输入的电平。如果哪一路出现了“地址加了但输出没变”的情况大概率是那一路的输入悬空或者接线虚搭。用示波器抓输出端波形时会发现一个很有意思的现象地址切换瞬间输出总会出现一个窄的毛刺宽度几纳秒到几十纳秒。这其实是竞争冒险。比如地址从0111跳到1000四根地址线不可能绝对同时到达瞬间可能出现0100、1101这类中间状态MUX就会在一个极短的时间内选中一个本不该选的通道。如果这个毛刺被后级ADC采到就会变成跳变的噪声。解决办法有三个最简单的就是加锁存器。在MUX输出端接一个74LS373用地址稳定后的信号作为锁存时钟让数据在稳定窗口内被捕获。第二个办法是用温度计码/格雷码这类相邻码只有一位变化的编码驱动地址线从根源上消除多位同时翻转。第三个办法是降低地址切换速率给后级电路足够的稳定时间。实际工程中我一般锁存器和编码优化配合用。5. 避坑指南常见故障与排查实录5.1 故障现象速查表从现象定位原因实操过程中我踩过的坑和观察到的同学翻车现场整理成了一张速查表遇到问题先查表别急着拆线。故障现象可能原因排查方法输出始终为低STROBE悬空或接高电平使能极性搞反万用表测STROBE电压确认接地输出始终为高输出端接法错误LED限流电阻过大用万用表量Y脚电平区分逻辑电平和驱动能力问题地址变化但输出不变地址线悬空拨码开关没接地万用表逐脚量CBA电压确认高低电平正确总是选中固定一路数据输入端悬空TTL默认高电平未用的数据输入全部接GND或VCC芯片发热严重电源接反输出端直接短路到地立刻断电检查VCC/GND和输出负载3.3V单片机控制失灵74LS系列TTL输入高电平阈值偏高换74HC/HCT系列引脚兼容切换瞬间输出毛刺严重地址线竞争冒险输出加锁存器或改用格雷码地址顺序5.2 三个我踩过最深的坑逐个说清楚第一个坑拨码开关悬空导致地址随机。我一开始图省事把拨码开关一端接VCC另一端直接接芯片地址脚OFF状态下地址脚悬空。结果TTL输入悬空时电平飘忽不定芯片偶尔选中D0偶尔选中D5折腾了半小时以为芯片坏了最后用万用表一量才发现是悬空电平。从那以后凡是机械开关进芯片一律加下拉电阻再无这种玄学现象。第二个坑使能端极性接反。扩展16选1时我把反相器装在片1那一侧结果地址最高位为0时选中的是D8~D15拨到1反而选了D0~D7高低8路完全对调。接线本身没错是“片选逻辑和地址极性没对齐”。后来我习惯在图纸上先写出“S30时片1工作、片1使能需要低电平所以片1使能S3”“S31时片2工作、片2使能需要低电平所以片2使能/S3”再动手接线。逻辑表写出来错不了。第三个坑输出端直接并联的心理负担。我一开始不敢把两个151的Y脚直接短接怕推挽输出冲突于是加了一个与门做合并结果发现多此一举。原因前面分析过禁止态输出强制低电平跟工作态输出并联不会打架。当然这里有个前提确认芯片是图腾柱输出而且禁止态确实是低电平而不是高阻。如果换了三态输出的MUX比如74HC251禁止态是高阻直接并联反而没问题但需要额外上拉电阻稳定电平。不同输出结构的芯片合并策略完全不同这点必须在选型时就想清楚。5.3 排查方法与逻辑分析怎么用万用表和示波器定位排查MUX电路我的固定套路是从输出往输入倒推。先用万用表量输出Y的电平确认当前是高还是低再回过头看这个电平对应真值表里的哪一行反推出地址端和数据端应有的状态然后顺着地址线量过去很快就能定位问题。具体来说比如现象是“输出恒为低”。先量STROBE如果它是高电平那一切正常问题不在芯片而在使能控制逻辑如果STROBE是低电平再看地址端把CBA电压记下来换算成二进制地址看看到底选中了哪一路输入然后去量那一路输入的电压。如果输入电压也对那就是芯片本身挂了换一片再试。示波器主要用于观察切换瞬态。把探头夹在输出端固定地址不动输出波形应该是一条干净的高低电平线来回切换地址就能看到毛刺。如果毛刺宽到肉眼可见说明地址切换速度太快或者地址线走线太长后级电路被干扰的概率很高。此时再往锁存器的数据端和时钟端分别夹一根探头能看到锁存时钟边沿如果刚好落在毛刺区间就会采到错误数据这时候要么把锁存时钟往后移要么调整地址输出时序。逻辑分析仪在这个场景里属于锦上添花但如果你有强烈建议接上。它能同时抓4根地址线加1根输出线你可以在电脑上看到地址从0111跳到1000时输出在中间经历了几次不稳定的跳变比示波器更直观。抓完波形再回来看真值表整个芯片的行为就彻底透明了。整套流程跑下来我最想强调的就一句话数字电路的坑八成出在悬空和使能上。输入悬空、使能悬空、使能极性接反这三个问题占了MUX调试故障的大部分。所有输入都固定到明确的电平所有使能端都按真值表核对极性你的电路基本就稳了。至于16选1这个能力边界后续还可以继续往32路、64路扩展方法就是把高位地址变多用译码器代替一个一个反相器原理跟我这次做的一模一样。最后再分享一个小技巧所有数据输入在接入之前先统一编上IN0~IN15的丝印号码跟地址码对应起来排查时你会感谢自己当初的细心。