ARTICLE DETAIL

资讯详情

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

74LS161实现7进制计数器:反馈清零与反馈置数法详解

74LS161实现7进制计数器:反馈清零与反馈置数法详解 不知道你是不是也遇到过这种情况好不容易把一片74LS161接上电、给上时钟数码管倒是欢快地数起来了——0、1、2、3……一路冲到15然后翻回0。可你想要的明明是数到6就归零做一个7进制计数器。网上搜出来的方案翻来覆去就两个词“反馈清零法”“反馈置数法”可照着抄完要么完全没反应要么数字乱跳要么干脆数到5就提前归零。这篇文章就从这颗芯片的内部逻辑讲起把两种改进制方案彻底说透再给出一套可以直接照着接的完整电路和接线表最后把我踩过的坑、帮别人排查过的故障一并列出来。不管你是刚接触TTL芯片的学生还是想做课程设计、电子小制作的爱好者照着这篇文章走7进制计数器一次点亮。1. 74LS161这颗芯片到底能干什么1.1 4位二进制同步计数器的能力边界74LS161是一颗4位二进制同步计数器这行字拆开看有两层意思一是“4位二进制”表示它内部有4个触发器输出Q0到Q3组成一个4位二进制数从0000开始每个时钟上升沿加1加到1111也就是十进制15后再来一个脉冲就翻回0000这是一个天然的模16计数器二是“同步”指的是内部4个触发器在同一个时钟沿同时翻转不会像异步计数器那样出现行波延迟所以它在高速计数时波形更干净。这颗芯片诞生于上世纪70年代的TTL逻辑家族到今天已经五十多年了。为什么教材、课程设计、竞赛项目里还在用它因为它太经典了——引脚功能完整清零、预置数、使能、进位输出一应俱全改造成任意进制计数器非常方便。理解了它后面再看74LS163、74LS190、74HC161这些同族芯片几乎零成本迁移。可以说74LS161是学习“可编程计数逻辑”的最佳入门标本。1.2 引脚逐个看这两个引脚是分水岭DIP-16封装的引脚定义如下表所示接电路前建议把这张表抄在手边引脚号名称功能关键特性1MR清零低电平有效异步2CP时钟上升沿触发3D0数据输入预置数最低位4D1数据输入预置数5D2数据输入预置数6D3数据输入预置数最高位7CEP计数使能高有效8GND地接0V9PE预置数使能低电平有效同步10CET计数使能高有效11Q3输出最高位12Q2输出—13Q1输出—14Q0输出最低位15TC进位输出计数到15时为高16VCC电源接5V重点看1脚和9脚MR是异步清零只要它被拉低输出立刻全部变0不用等时钟沿相当于一个“急刹车”PE是同步预置数它被拉低后并不马上起作用而是要等下一个时钟上升沿到来时才把D0~D3上的数据装进输出。这个“异步清零”和“同步预置”的区别是后面所有改进制方案的分水岭也是一个极其经典的考点和坑点。1.3 两个使能端和TC什么时候才用得上74LS161有CEP和CET两个计数使能端二者都是高电平芯片才会计数只要有一个是低时钟来了也纹丝不动。为什么要设计两个主要是为了级联。做多片计数器时低位片的TC进位输出喂给高位片的CET这样低位片还没计满15时高位片收到低电平不计数一旦低位片到15TC变高高位片在下一个时钟沿加1就实现了多位级联。这个机制在做大模数计数器、频率计、分频器时非常有用。TC引脚还有一个细节很容易被忽视TC Q0·Q1·Q2·Q3·CET也就是说它不只在计数到15时为高还要求CET本来就是高。如果CET被你接了低电平TC永远输出不了高电平。我见过有人在级联时把CET悬空结果高位片完全不动查了半天才发现是这个问题。2. 把16进制改成7进制核心逻辑与方案之争2.1 问题本质让计数器提前“回头”7进制计数器的要求很明确输出状态只允许出现0000到0110也就是0到6共7个状态计数到6之后下一个时钟脉冲应该让它回到0而不是进入7。问题就变成了怎么让一个默认从0数到15的计数器在走到某个特定状态时被强制“回头”所有方案的核心都是同一个思路——反馈。把输出端的一部分信号引出来做逻辑判断再把判断结果接回清零端或预置端从而干预芯片的下一步行为。至于判断哪个状态、接回哪个引脚就分成了“反馈清零”和“反馈置数”两大流派。这两派在原理和实操上的感受差别很大我最常看到新手在这二者之间来回纠结。2.2 反馈清零法异步清零的瞬间过程反馈清零法的思路最直接既然MR低电平能立刻清零那我让计数器数到某个值N时把MR拉低它不就跳回0了吗具体来说用一个与非门检测输出端的状态当检测到目标状态时与非门输出低电平接到MR脚触发清零。这里有个极其重要的逻辑点很多人栽在这上面因为清零是异步的计数器到达目标状态N后并不会在N这个状态稳定停留而是在极短时间纳秒级内就被清零了。所以从外部看可见的稳定状态只有0到N-1N本身相当于“一闪而过”的毛刺。这就意味着用清零法做模7计数器检测的应该是70111而不是60110。如果检测6就去清零那可见状态变成0到5实际做出来的是模6计数器。这就好比你喊人“数到7就停”可那个人性子特别急听到“7”的瞬间就立刻蹲下你根本来不及看清他数到7的样子。你能观察到的只有他喊的0到6。2.3 反馈置数法同步预置数更干净反馈置数法换了一条路既然PE是同步预置那我让计数器数到某个状态K时把PE拉低这时计数器并不会立刻跳变而是在当前状态K稳稳地待满一个时钟周期等下一个上升沿到来时把D0~D3上的数据装进去。如果D0~D3接的是0000那就相当于完成了一次“6→0”的跳变。置数法比清零法少踩一个坑因为置数是同步动作检测到的状态K会完整地出现在输出序列里并持续一个完整时钟周期。所以要做模7计数器检测60110即可可见状态序列是0、1、2、3、4、5、6然后回到0正好7个状态。同样用那个走路类比这次那个人听到“数到6”之后会先稳稳站住等下一声口令才开始重数。你全程都能看清他数到了6所以数到的最大值是几模数就是几加一。2.4 为什么“检测6清零”其实是6进制——一个常见误区网上有大量资料写“反馈清零法做7进制检测0110”还附了原理图。如果照做数码管显示会是0、1、2、3、4、5然后跳回0是标准的模6计数。这些资料为什么会这么写我推测有两种可能一是作者把异步清零的瞬间状态也当成了一个“有效状态”觉得“第6个脉冲到来时到达6然后清零”于是认为这是7进制二是他们实际用的是置数法但文字描述串了。在仿真软件里这个差别还可能被掩盖掉。很多仿真模型对清零毛刺的时间尺度模拟得不明显你在软件里看波形6那个状态好像“出现了一下”不容易意识到在真实器件里它根本稳定不住。等到焊好实物数码管只显示0到5你才会发现不对劲。所以我的原则是清零法检测N置数法检测N-1这个公式背下来比临时查资料可靠。2.5 实战中选哪种方案我的建议是默认优先用反馈置数法。理由有三点第一置数法的输出序列干净稳定检测状态K会完整保持一个时钟周期不会产生可见的毛刺示波器上波形更好看。第二置数法检测逻辑更简单——做7进制只需要检测Q2和Q1同时为1用一个两输入与非门74LS00就够不需要三输入与非门。第三置数法的预置数端是灵活可控的同一个小改动就能做其他模数比如把D0~D3接成00113就能做从3到6的模4计数器玩法更多。清零法也不是一无是处它胜在概念直观适合做演示教学另外电路中如果已经有74LS10这类三输入与非门也能顺手用上。只是从工程稳定性角度置数法更香。3. 电路图与完整接线从零搭一套3.1 器件清单动手前先备齐东西清单如下74LS161一片建议买两片这种老芯片偶发损坏或接反电源烧掉很常见74LS00一片内含四个两输入与非门用于置数法的反馈检测74LS10一片可选内含三输入与非门用于清零法的反馈检测5V直流电源最好用稳压模块供电不要用电脑USB口直接怼按键开关一个或者用555振荡器产生自动时钟LED共4只配330Ω限流电阻用于显示Q0~Q3面包板一块跳线若干0.1μF去耦电容一个必须10kΩ上拉电阻两支用于按键消抖和引脚保护3.2 反馈置数法完整接线推荐方案这是我最推荐新手复刻的方案逻辑最清晰元器件最少。完整连接关系如下74LS161引脚连接到16 VCC5V8 GNDGND2 CP时钟源按键或555输出7 CEP5V10 CET5V1 MR5V9 PE74LS00输出检测Q2·Q13 D0GND4 D1GND5 D2GND6 D3GND14 Q0LED0灌电流接法13 Q1LED1同时接到74LS00的1脚12 Q2LED2同时接到74LS00的2脚11 Q3LED315 TC悬空或接示波器74LS00部分的接法任选一个与非门比如1A、1B、1Y把1A和1B分别接到Q1和Q21Y接到74LS161的9脚PE。逻辑关系是当Q1Q21时与非门输出0PE被拉低预置数请求发出下一个时钟上升沿D0~D3上的0000被装入输出计数器回到0。注意D0~D3全部接地相当于预置数0000。如果以后想做其他模数比如模5可以改成检测到4就置0思路完全一样。3.3 反馈清零法完整接线如果你坚持要用清零法或者手头有74LS10可以这样接74LS161引脚连接到16 VCC5V8 GNDGND2 CP时钟源7 CEP5V10 CET5V1 MR74LS10输出检测Q2·Q1·Q09 PE5V3 D0~6 D3任意建议接地13 Q174LS10的1A12 Q274LS10的1B14 Q074LS10的1C11 Q3LED74LS10部分接法取一个三输入与非门三个输入分别接Q2、Q1、Q0输出接到MR。当状态为0111时三个输入全为1输出低电平芯片立刻清零。这里的检测值是01117不是01106再次强调。如果手头只有74LS00也能搭出三输入与非门先用第一个与非门把Q1和Q0相与输出是(Q1·Q0)再用第二个与非门把该输出和Q2相与输出是Q1·Q0·Q2等价于三输入与非门。多一个门逻辑不变。3.4 输出显示怎么接显示部分最容易出低级错误。接LED时推荐灌电流方式LED阳极接5V阴极串联330Ω电阻后接到想要看的输出脚。当输出为低电平时电流从5V经LED和电阻流入芯片引脚LED点亮输出为高电平时LED熄灭。为什么不用拉电流方式因为74LS系列是TTL门电路拉电流能力弱输出高电平驱动LED会明显发暗而灌电流方式芯片承受能力好得多几个毫安完全没问题。如果要做成数码管显示不用自己费力做译码。最省事的方法是加一片74LS47共阳数码管或74LS48共阴数码管把Q3~Q0接到它的A、B、C、D输入输出端接数码管。想更现代一点也可以用7段数码管驱动芯片CD4511加上限流电阻即可。数码管显示的好处是能直接看到0到6的跳动LED二进制方式还要在脑子里转换一次。3.5 手工电路图怎么画才不容易乱用面包板搭的时候我建议在纸上先画一个“引脚连接草稿图”左边画74LS161的方框右边画74LS00中间画反馈线再把每个引脚的走向标清楚用不同颜色的笔区分电源线、时钟线、反馈线、输出线。连线顺序上我的习惯是先接电源和地再接使能端和复位端该上拉的上拉最后接反馈网络和输出显示。这样即使后面接错排查范围也小很多。4. 仿真先行在Proteus和Multisim里先跑通4.1 Proteus找元件和连线很多人的第一个74LS161项目都是在Proteus里完成的。打开元件库搜索“74LS161”注意认准DIP16封装防止误选成表面贴装型号。74LS00和74LS10同理。放置后按前面表格的接线方式连线。Proteus里的连线非常直观点一下引脚再点目标引脚即可电源和地可以用右侧的“POWER”和“GROUND”端子不用直接连到芯片脚上图纸更清爽。时钟源的设置很多人卡住。Proteus左侧工具栏里找“Generator Mode”里面有“DCLOCK”数字时钟放置后双击设置频率。做手动逐拍观察时把频率设置在0.5Hz到2Hz最合适如果想看波形可以设到1kHz以上再配合虚拟示波器观察。注意DCLOCK的“Digital”和“Analogue”选项一般选Digital避免不必要的模拟仿真开销。4.2 虚拟仪器与波形的观察技巧仿真中观察计数结果有两种手段一是直接挂LED指示灯看亮灭组合二是放一个逻辑探针实时显示高低电平。想更直观可以放一个“7SEG-BCD”数码管组件直接显示0~6的数字不过它默认是BCD输入正好对应Q3~Q0很方便。如果想把时序关系看清楚用虚拟示波器同时观察CP和Q0、Q1、Q2的波形。正常情况下Q0的频率是时钟的一半Q1是四分之一Q2在7进制里不是严格的八分之一了因为它会在某些周期提前归零。这也是验证7进制是否成功的一个快速手段看Q2是不是每隔7个时钟脉冲才出现一个高电平周期。4.3 仿真通过不代表实物一定通过这里说个仿真和实物的经典差异Proteus对74LS161的异步清零毛刺模拟得相对“宽容”你在仿真里用清零法检测0110很可能看到0到5循环甚至偶尔能看到6闪一下。有些教程的仿真截图里清零法做着做着就变成“0、1、2、3、4、5、6、0”看起来像7进制但实际焊出来只有0到5。所以仿真通过后务必要再想一想这个方案在真实芯片的纳秒级时序下是否依然成立Multisim的操作逻辑类似元件库搜索74LS161同样能找到虚拟仪器里用Logic Analyzer观察时序非常跟手。它的仿真模型对异步清零的处理比Proteus更严格经常能提前暴露出清零法检测值选错的问题从这个角度看Multisim反而更适合验证清零法。4.4 仿真文件怎么组织更高效我习惯把“基础计数测试”和“反馈改模测试”分开建两个仿真文件。第一个文件只验证芯片能否正常从0数到15排除接线和芯片选型问题第二个文件再加反馈网络。这样一旦第二个文件跑不通能快速判断问题出在反馈逻辑上而不是芯片本身不会计数。这种“分步验证”的思路整整能帮你省下大量排错时间。5. 实物搭建与调试全流程5.1 上电前的检查清单仿真跑通后进入实物环节。面包板搭电路前对照这份清单检查一遍能避免90%的低级错误芯片方向74LS161的缺口或圆点朝哪边第1脚在哪插反会直接烧芯片。电源和地VCC必须接5VGND必须接0V确认没有接反、没有短路。电源引脚旁边有没有放0.1μF去耦电容电容尽量贴近芯片的VCC和GND引脚。CEP、CET、MR、PE这四个引脚在不用反馈的情况下是否都接到了确定的电平悬空是TTL电路的大忌。时钟源是否就绪用按键点动的话是否加了消抖电路LED限流电阻是否都接了直接把LED跨接在输出和地之间轻则亮度异常重则拉低输出电平影响计数逻辑。5.2 电源和时钟的处理细节74LS161工作在5V实测4.75V到5.25V都能正常工作但前提是供电稳定。面包板上的长导线电阻不小如果整个电路吃电流比较大远端芯片的电源电压可能会塌下去波形乱七八糟。建议电源模块直接接在芯片附近的电源轨上再从同一轨扇出去给其他器件。时钟部分如果你用的是机械按键一定要加消抖。机械按键在按下和释放的瞬间会产生几毫秒到十几毫秒的抖动如果不处理一次按压可能被芯片识别成好几个上升沿计数器乱跳。最省事的消抖方案是RC低通滤波施密特整形按键一端接5V另一端串联一个10kΩ电阻到GND然后在按键输出点并联一个10μF电容输出接到74LS14施密特触发器的输入74LS14输出再作为CP。没有74LS14的话也可以用555搭建单稳态电路做消抖。5.3 调试顺序从慢到快实物接线完毕严格按照这个顺序调试第一步先不接反馈网络MR和PE都上拉到高电平给芯片一个慢速时钟确认它能从0正常数到15并循环。这一步过了说明电源、时钟、芯片本身都没问题。第二步接上反馈网络但保持时钟很慢比如手动按键逐拍观察输出状态变化。对于置数法方案应该看到0→1→2→3→4→5→6→0的序列。如果序列不对断掉反馈单独测与非门手动把Q1、Q2拨成高电平看与非门输出是否为低。第三步确认手动模式稳定后再切换到555自动时钟看能否长时间稳定运行。这一步同时验证了时钟频率变化后电路不受影响。5.4 用示波器和万用表做验证有示波器的话测量非常直观CH1接CPCH2接Q0CH3接Q1CH4接Q2。正常7进制计数器Q0的频率是CP的1/2Q1是1/4Q2不是严格的1/8而是每7个周期出现一次类似“分频”的波形。用示波器的频率测量功能还能直接读出分频比如果读到7倍左右说明7进制成功。没有示波器也能验证用万用表测Q0引脚的平均电压当输出在0和1之间快速切换时平均值约等于2.5V乘以高电平占空比。虽然精确度一般但能大致判断输出是否有翻转。最直观的还是接上数码管看着数字从0跳到6再跳回0一切正常一目了然。6. 避坑指南遇到这些问题怎么排查6.1 故障现象一按一次按键计数器连跳好几个数这是最典型的按键抖动问题。机械按键的簧片在接触瞬间会弹跳多次产生一串窄脉冲74LS161每个上升沿都会计数所以明明按了一次却加了3到5个数。解决办法在前面已经说过用RC滤波施密特触发器消抖或者用555电路做单稳态。如果项目里本身有单片机也可以利用单片机的软件消抖但纯逻辑电路还是老老实实加硬件消抖。6.2 故障现象二输出永远停在某一状态不再计数优先检查CEP和CET这两个使能端有一个是低电平芯片就不会计数。再用万用表量一下MR和PE的电压MR应该恒为高5V附近PE在反馈生效时应该有规律地出现低脉冲。如果PE一直被拉低说明反馈门的逻辑反了比如你把与非门的输出接成了正逻辑如果MR一直被拉低说明清零脚上方导线和某个地短路了或者MR引脚和GND之间搭锡。一个隐蔽的坑是反馈信号接到了“不用”的引脚上。比如置数法方案有人把PE接到了Q3而Q3在7进制计数过程中永远是0导致PE也一直是0计数器不停地把数据装入而不计数。这个错误查起来很迷惑因为看起来PE电平是正常的恒为低但芯片为什么不动其实就是因为你把数据装载和计数使能搞混了。6.3 故障现象三上电后直接归零或者随机跳数多半和悬空引脚有关。74LS161的MR和PE都是低电平有效如果这两个脚内部的上述电阻比较弱外部悬空时噪声很容易把它们拉低或拉高导致芯片在上电瞬间执行一次意外清零或置数。正确的做法是不用这两个功能时把MR和PE直接接5V不要悬空。CEP和CET同理也要接确定的电平。另外如果电源上电瞬间有较大的浪涌也可能触发不确定状态。解决办法是电源端并一个10μF电解电容再加0.1μF瓷片电容给上电过程一个缓冲。6.4 故障现象四芯片烫手芯片发烫通常意味着电流过大最常见的原因是电源接反、输出引脚直接短路到地或5V、或者某引脚接了超过芯片承受能力的负载。立刻断电摸一下芯片温度如果烫到手指不能停留大概率已经损伤。用万用表二极管档检查VCC和GND之间的正反向压降正常的TTL芯片会有0.5V到0.8V左右的PN结压降如果测出来接近0说明内部已经击穿换一片吧。这也是我建议你多备一片的原因。6.5 排查的通用链路遇到问题不要慌按这条链路逐级缩小范围绝大多数故障半小时内能定位先确认供电和地线正常用万用表量芯片VCC引脚和GND之间电压是5V然后量时钟引脚确认CP上有脉冲信号用万用表频率档或示波器接下来断开反馈网络单独测试芯片能否完成0到15自由计数确认芯片没毛病后再单测反馈逻辑——用跳线手动把检测对象引脚拉到高电平量与非门输出是否变低最后把反馈网络接上逐拍观察状态序列。只要每一步都验证过问题永远出在“你还没验证的那一步”。6.6 一个容易被忽略的细节反馈信号的毛刺与“打一拍”清零法生成的清零脉冲很窄宽度等于与非门传播延时大约20到30纳秒这个毛刺有时候会通过输出端的寄生电容耦合到其他地方尤其是当你在面包板上用的跳线很长时。更麻烦的是如果你把TC或清零信号再接给后级电路这个毛刺可能被后级当成一个有效时钟沿引起连锁误动作。工程上应对毛刺的标准办法是“打一拍”把反馈控制信号先送进一片D触发器比如74LS74用时钟同步后再接回MR或PE。这样同步后的信号宽度和时钟周期一致不会再产生亚稳态毛刺。当然做单芯片7进制计数器时这个冗余设计不是必须的但如果你以后做多级级联或者往频率计、分频器方向扩展一定要把毛刺问题放在心上。6.7 最后的扩展思路7进制计数器只是起点。掌握反馈清零和反馈置数之后任何N进制计数器都是一道填空题N小于16用单芯片改N大于16用两片级联低位片产生的进位信号作为高位片的使能信号。你还可以把74LS161换成都市逻辑家族的74LS163同步清零版的161或者换成可逆计数器74LS191玩法立刻多一倍。甚至你在学Verilog时写的那个always块里的计数器思路也是从这颗小芯片一脉相承的。我自己在实际项目中用74LS161最多的地方其实是做分频器和秒表计时器把晶振频率分频出1Hz基准信号。每当有人跟我说TTL芯片过时了我都会笑笑能把一颗五十年前的芯片玩得明明白白再去碰FPGA和单片机很多底层逻辑你会豁然开朗。希望这篇实战记录能帮你在面包板上把7进制计数器一次点亮。
返回列表