又到数电课程设计的扎堆季,出租车计价器几乎是每年必现的“保留题目”。但真正动手的时候,很多同学才发现:这个题目看着简单,真拆起来涉及计数、译码、预置、分频、组合逻辑判幅、信号消抖,一整套东西全串在一起,远不是“接几个计数器”就能交差的。这篇文章就把我做这个课设的完整思路、芯片选型、电路设计、调试踩坑全部写出来,给正在被这个题目折磨的同学一份能直接落地的参考。
1. 先把计价规则吃透:从需求到设计指标
1.1 计价器到底要完成什么功能
出租车计价器表面上看就是“显示里程和金额”,但拆开来看,它要同时处理三种完全不同的信号流:
第一路是里程信号。车轮每转一圈,传感器输出若干个脉冲,这些脉冲经过整形和分频后,变成“每公里一个脉冲”或者“每0.1公里一个脉冲”。计数器对脉冲累加,就是行驶里程。
第二路是时间信号。出租车低速行驶或停车等待时,计价器要按“等待时间”计费,这需要有一个稳定的时基脉冲,通常是1Hz的秒脉冲,再通过分频产生“每5分钟一个脉冲”的等待计费信号。
第三路是金额信号。金额不是单纯计数,它包含起步价、超程单价、等待单价分段计算。起步价是固定预置进去的,超程和等待的费用则要按规则累加。
把这三路信号梳理清楚,课程设计的基本轮廓就出来了:里程计数模块、时间计数模块、起步判幅模块、计费脉冲生成模块、费用计数显示模块、清零复位模块。每个模块各司其职,最后在数码管上呈现结果。
1.2 课程设计版本的需求简化
实际出租车计价器的计价规则非常复杂,有夜间加价、燃油附加费、低速等待与正常行驶的状态切换等等。如果完全复制真实规则,一个课设做不完。我做课设时采用的是一套“简化但不失原理”的规则,这也是大多数教材和题目默认的方案:
| 项目 | 规则 |
|---|---|
| 起步价 | 3公里以内统一收费8元 |
| 超程计费 | 超过3公里后,每公里加收2元 |
| 等待计费 | 每等待5分钟加收2元 |
| 里程脉冲 | 每公里产生1个脉冲(通过传感器+分频实现) |
| 时间脉冲 | 1Hz秒脉冲,每300秒产生1个等待计费脉冲 |
| 显示范围 | 里程两位(0-99公里),金额两位(0-99元) |
这个方案的优点是每个模块的逻辑都很清晰,计数器的位数可控,演示效果直观。按下“模拟里程按钮”一次,里程加1公里;里程超过3公里后,金额开始按每公里2元累加;按下“模拟等待按钮”一次,相当于过了5分钟,金额加2元。
如果你拿到的题目要求精度到0.1公里,问题也不大。只需要把里程计数器的位数加长一位,并且把“3公里起步”的判幅逻辑对应改成“30个脉冲”,计费脉冲的倍率同步调整。文章后面会专门讲这个升级方案。
1.3 整体方案选型:分立芯片还是FPGA
做课程设计首先面临路线选择:用74系列/4000系列分立芯片搭,还是用FPGA写Verilog实现。两条路都能完成题目,但侧重点完全不同。
分立芯片方案是我推荐优先考虑的。原因在于数电课设的核心考察点就是组合逻辑和时序逻辑的实际运用,用CD4518做计数、CD4511做译码、74LS192做预置计数、555做时基,每一步都能跟教材上的知识点一一对应。老师验收时问“你这个进位怎么实现的”“预置端为什么接这个电平”,你都能指着电路图讲清楚。
FPGA方案的优势是灵活、修改方便、代码复用性好,但劣势也很明显:如果题目要求“使用中小规模集成电路设计”,FPGA属于超纲;如果实验箱的数码管驱动方式比较特殊,还要花时间调引脚约束和显示刷新逻辑,反而比搭面包板更容易卡住。
对于大多数学校的大纲要求,分立芯片方案最稳妥、最好讲、也最容易拿高分。如果你对FPGA感兴趣,可以等分立方案做完后,用Verilog把同一个功能重新写一遍做对比,写在课设总结里反而是加分项。
2. 系统架构与模块裁剪
2.1 以“脉冲-计数-显示”为主线的整体架构
出租车计价器的本质是“脉冲进来,数字出来”。我把整个系统分成五条主要链路:
- 里程计数链路:外部里程脉冲进入两位BCD计数器,计数结果同时送数码管显示和超程判幅电路。
- 起步判幅链路:当里程计数达到3时,判幅电路输出一个“起步完成”信号,用RS触发器锁存这个状态。锁存的意义在于:大于3公里的所有时刻,超程计费都有效,而不是只在等于3的那一刻有效。
- 超程计费脉冲链路:起步完成后,里程每再来一个脉冲,就通过倍频电路产生2个计费脉冲,输入到费用计数器。
- 等待计费链路:1Hz时基脉冲经过300分频后,每5分钟产生一个脉冲,同样经过倍频电路产生2个计费脉冲。
- 费用计数显示链路:费用计数器采用可预置芯片,上电或按下复位键时预置数字8,之后每收到计费脉冲就加1,实时的金额显示通过译码器送到数码管。
整体思路就这么简单:计程靠计数器,判起步靠组合逻辑,计费靠预置加法计数,等待靠分频。各模块之间的信号流向是单向的,不存在复杂的反馈控制,这对用分立芯片搭电路非常友好。
2.2 每个模块选什么芯片、为什么
芯片选型是整个设计里最体现“经验值”的部分。我最终确定的清单如下:
| 模块 | 芯片 | 选择理由 |
|---|---|---|
| 里程计数 | CD4518 | 双BCD加法计数器,一片管两位,级联方便 |
| 起步判幅 | 74LS85 或 门电路 | 比较里程是否达到3公里 |
| 起步状态锁存 | 74LS74 | 双D触发器,用Q端输出起步完成标志 |
| 计费脉冲倍频 | 74LS74 或 RC延时+与非门 | 将1个输入脉冲扩展为2个输出脉冲 |
| 费用计数 | 74LS192 | 可预置BCD加减计数器,预置端实现起步价8元 |
| 译码驱动 | CD4511 | BCD转七段码,驱动共阴数码管 |
| 时基脉冲 | 555定时器 | 产生1Hz基准信号 |
| 分频 | CD4060 或 74LS90 | 将1Hz分频为每300秒1个脉冲 |
| 消抖 | 双输入与非门构成RS触发器 | 消除机械按键抖动 |
有几个选型细节值得多说一句。CD4518虽然便宜好用,但它只能加法计数,没有预置端,所以费用计数不能用它来做。费用计数必须能预置起步价,所以要用74LS192。74LS192的预置是异步的,只要PE端拉低,数据立刻从D0-D3进入计数器,这在复位时非常方便,不需要等待时钟边沿。
CD4511译码器要注意是驱动共阴数码管的,如果你实验箱上配的是共阳数码管,就需要换CD4513或者加反相驱动。这个细节如果搞反了,数码管要么不亮,要么显示乱码。
2.3 最容易被忽略的三个信号调理环节
很多同学的电路原理图看着没问题,一上电就各种乱跳,问题几乎都出在信号调理上。这里分享三个我反复踩过坑的环节。
第一个是机械按键消抖。课程设计里模拟里程脉冲和等待信号,基本都是通过按键手动产生。机械按键在按下和释放的瞬间会产生毫秒级的抖动,直接接到计数器时钟端,一次按压可能被计成3到5次。解决方法是按键信号先经过由两个与非门交叉反馈构成的RS触发器消抖,或者并联一个0.1uF电容做RC硬件消抖。RS触发器消抖效果最好,响应也快,推荐优先用。
第二个是TTL与CMOS混用电平匹配。74LS系列是TTL电平,CD4000系列是CMOS电平,两者的输入输出高电平阈值不一样。TTL输出高电平最小为2.7V,CMOS在高电源电压下要求输入高电平接近VCC。如果CD4518的电源接5V,74LS74输出直接连过去,有时候会出现“逻辑高但就是触发不了”的奇怪问题。稳妥做法是把CMOS芯片和TTL芯片尽量放在同一条信号链路上,必要时在TTL输出端加上拉电阻到5V。
第三个是计数器异步清零端的防干扰处理。CD4518的Cr端是高电平清零,如果这个引脚悬空,很容易感应噪声导致计数器莫名其妙归零。所有不用的清零端、置数端、使能端,一律要接到确定的电平上,不能悬空。这个习惯能帮你少排查一半的诡异故障。
3. 核心电路设计:一步一步焊出来
3.1 里程计数与“3公里起步”判幅电路
里程计数部分很直接:CD4518内部有两个独立的BCD计数器,把第一个计数器个位的进位输出(Q4)接到第二个计数器的时钟输入端,就构成了两位十进制计数。CD4518是上升沿触发,所以级联时要用低位的Q4输出,而不是Q4取反。接反了的话,个位从9跳变到0的下降沿不会触发十位计数,十位就永远不走。
判幅电路是实现“3公里起步”的关键。里程是两位BCD码,个位和十位都是4位二进制。要判断“是否大于等于3”,分情况讨论:
- 十位大于0,说明里程已经超过9公里,必然大于3;
- 十位等于0且个位大于等于3,说明里程在3到9公里之间;
- 十位等于0且个位小于3,未达到起步里程。
用门电路实现时,我用了最简单的方案:把个位BCD码的8、4、2、1位分别引出,判断“个位大于等于3”等价于“(Q2为1)或(Q1为1且Q4为1)”,这里的Q4是BCD码的8位,Q1是BCD码的2位,Q2是BCD码的1位。这个组合逻辑加上十位非零的判断,一起接到74LS74的D端,当条件满足时,在时钟作用下把Q置1,以后一直保持。
实际搭建时有个更巧妙的做法:不用74LS85比较器,直接用一片74LS74的D触发器。把里程计数器输出的“等于3”译码信号接D端,时钟端再接一个固定脉冲。当里程到达3公里时,D端为高,触发后Q输出高电平“起步完成”标志。这个标志一方面打开超程计费的与门,另一方面反向后可以点亮一个LED指示灯,演示时很有仪式感。
3.2 超程“每公里加2元”的倍频电路
起步完成后,里程计数器每收到1个脉冲,费用计数器要加上2元。但费用计数器只有一个时钟端,来一个脉冲只能加1。所以必须设计一个倍频电路,把1个里程脉冲变成2个费用计数脉冲。
倍频的做法有很多种,我实验后觉得最稳定的是“延时+异或”方案。核心思路:把输入脉冲分成两路,一路直接送,另一路经过RC延时约几毫秒后再送,两路信号经过异或门后,由于边沿时间错开,每个输入脉冲会产生一正一负两个输出沿。再配合整形电路,就得到了两个间隔几毫秒的计数脉冲。
如果你手头有74LS74,也可以用双D触发器搭一个简单的“双沿输出”电路。把输入脉冲接到两个D触发器的时钟端,一个触发器的Q端输出到费用计数时钟,另一个触发器的Q非端输出,利用上升沿和下降沿分别触发,等效于每个输入脉冲产生两个输出脉冲。
无论用哪种方案,都需要注意:倍频出来的两个脉冲之间要有足够的时间间隔(至少几微秒),确保74LS192在一个脉冲的建立保持时间内完成计数,否则第二个脉冲可能丢失。RC延时的阻容参数建议取1kΩ和1uF,延时约1毫秒,实测足够稳定。
3.3 费用计数与起步价8元的预置实现
费用计数部分,我选用两片74LS192级联,形成两位十进制加法计数器。74LS192的预置端是低电平有效的PE,D0-D3是预置数据输入。把十位的D3D2D1D0接成0000,个位的D3D2D1D0接成1000,也就是十进制8。
复位逻辑这样设计:按下清零按键时,一方面给里程计数器CD4518的Cr端一个高电平,让里程清零;另一方面给74LS192的PE端一个低电平,把8预置进去;同时把起步标志触发器清零。因为预置是异步的,所以在按下按键的瞬间,费用显示就会立刻变成“08”,效果非常直观。
等待计费的自检方法是:费用预置为8之后,手动给等待计费倍频电路输入一个脉冲,费用立刻变成10;再输入一个,变成12。每5分钟加2元的规则在演示时,只需口头说明“这个脉冲是由秒脉冲经过300分频产生的”,然后把一个模拟按键接到分频输出端就可以反复演示。
如果你希望费用计数器的进位显示更清晰,还可以把十位74LS192的借位/进位输出接一个LED,当金额超过99元时提示溢出。课程设计演示中一般不会跑到这么多钱,但加上这个输出可以作为冲刺满分的细节。
3.4 显示驱动与数码管接口
显示部分最关键的一步,是确认你手头的数码管是共阴还是共阳。CD4511只能驱动共阴数码管。如果是共阳管,需要将公共端接VCC,并且用CD4511的输出经过PNP三极管或者用OC门反相器驱动。
CD4511有3个控制引脚,实际使用时必须处理正确。LT(灯测试)要接高电平,否则数码管全灭;BI(消隐)要接高电平,否则所有段都被强制关闭;LE(锁存使能)要接低电平,否则数据被锁存后不更新,显示会凝固在旧值上。这三个引脚只要有一个接错,显示就出问题,而且是那种“看起来电路都对但就是没反应”的隐形故障。
里程显示和费用显示各需要两位数码管,一共四位。CD4511的驱动电流不大,但驱动四位数码管完全够用。需要注意的是,多个CD4511并联在同一个5V电源上,每个译码器工作时会有几毫安的电流脉冲,电源线要尽量粗一点,避免公共阻抗耦合导致显示亮度波动。
4. 实操调试与常见问题排查
4.1 推荐调试顺序:先分模块,再联调
拿到电路板或面包板,不要急着把所有模块一次接通。联调时一旦出问题,信号链路长,排查范围大,很容易心态崩溃。我习惯按照从简单到复杂的顺序分步调试。
第一步,先调时基电路。用示波器看555输出端,确认1Hz方波正常,频率可调。如果没有示波器,用万用表测平均电压,1Hz方波接LED可以看到明显的闪烁,肉眼可判断。
第二步,单独调里程计数。把按键消抖电路接到CD4518时钟端,每按一次,观察里程数码管加1。连续按10次,十位从0变1,个位归0,说明级联正确。
第三步,调费用计数预置。接通复位按键,确认费用显示为08。然后手动给费用计数时钟端加脉冲,每来一个脉冲,费用加1,说明74LS192加法方向正确。
第四步,调判幅与倍频联动。先把里程手动加到3,观察起步标志LED是否点亮。再继续加到4、5,观察费用是否正确按“每公里加2元”的规律增加。
第五步,联调等待计费。按下“等待按键”,确认费用加2元。最后把所有信号接成自动模式,让555时基驱动整个系统做全自动演示。
4.2 高频故障速查表
调试过程中,故障集中出现在几个固定位置,我把高频问题整理成一张速查表,遇到类似现象可以直接对号入座。
| 故障现象 | 可能原因 | 处理方法 |
|---|---|---|
| 数码管全灭 | 电源未通/公共端接错/译码器LT或BI引脚电平错误 | 查5V供电,确认共阴管公共端接地,LT、BI接高 |
| 数码管显示乱码、笔画错乱 | BCD输入线顺序接反/译码器型号与数码管类型不匹配 | 核对A、B、C、D与CD4511引脚的对应关系 |
| 按键按一下计数多次 | 机械抖动未消除 | 加RS触发器消抖或RC滤波 |
| 计数器不计数 | 时钟端信号未到达/清零端悬空导致一直复位 | 用示波器测CP端波形,Cr端接确定电平 |
| 十位不进位 | CD4518级联方式错误 | 确认个位Q4接到十位CP端,且是上升沿触发 |
| 里程到了3费用不增加 | 起步判幅输出未锁存/倍频电路没工作 | 检查74LS74 Q端电平,用LED监测中间信号 |
| 倍频只输出一个脉冲 | RC延时时间不够/异或门输入翻转太快 | 增大RC常数到1ms以上 |
| 复位后费用不显示8 | 74LS192预置数据端接错/PE端电平时序不对 | 核对D0-D3的接线,确认按下复位时PE确实拉低 |
4.3 几个我踩过的坑
第一个坑是CD4511的LE引脚悬空。我做第一版的时候,只关注了LT和BI,LE没接,结果数码管显示“8”,但怎么按键数字都不更新。查了半天才发现,LE悬空在某些芯片内部等效为高电平,数据一直处于锁存状态。这个教训之后,我所有控制引脚一律强制接高或接低,绝不悬空。
第二个坑是倍频脉冲“丢失一半”。用RC延时+异或门做倍频时,第一次测试发现每公里费用只加1元,说明第二个脉冲没进去。后来用示波器一看,两个输出脉冲的间隔只有几十纳秒,74LS192根本来不及响应。把RC改大到1kΩ加1uF后,两个脉冲间隔约1毫秒,计数稳定。
第三个坑是TTL和CMOS混用时的高电平不够。74LS74的输出直接连CD4518的时钟端,低速时看起来正常,一旦脉冲频率提高,偶发漏计。用万用表量到TTL高电平只有3.2V左右,而CD4518在5V供电下要求高电平至少3.5V。解决办法是在74LS74输出端对5V接一个2.2kΩ上拉电阻,电平拉到接近5V,问题立刻消失。
5. 这个设计还能怎么升级
5.1 从1公里精度升级到0.1公里精度
很多题目的验收要求显示到0.1公里,这时把里程计数器扩展为三位BCD计数即可,显示格式是“XX.X”公里。起步判幅条件从“等于3”改为“等于30个脉冲”,超程计费改为每0.1公里加0.2元。这个改动需要把计费倍频从“1脉冲变2脉冲”改为“每5个里程脉冲产生2元”,用模5计数器配合组合逻辑可以实现。
5.2 增加日间/夜间切换和低速等待判断
更贴近真实计价器的扩展方案是增加日间夜间模式切换。白天超程单价2元每公里,夜间3元每公里。用拨码开关控制倍频电路的倍率即可,夜间模式把倍频从“输入1脉冲出2脉冲”切换为“输入1脉冲出3脉冲”。低速等待判断则相对复杂,需要引入车速信号与设定阈值比较,产生“低速模式”信号后,里程计数暂停,时间计数开始。这个扩展可以用两片74LS85比较器实现。
5.3 用Verilog/FPGA重做的思路
如果后续想用FPGA实现,核心模块可以用三段式状态机来做出租车计价器的控制逻辑。里程计数、费用累加、显示刷新各写一个always块,然后用一个顶层模块例化。相比分立芯片,FPGA方案最大的好处是修改计价规则只需要改代码里的状态转移条件,不用动硬件。唯一需要注意的是数码管显示要做动态扫描,避免多位数码管同时点亮时电流过大。
6. 个人体会与最后一点建议
这个出租车计价器题目,表面上是做电路,实际上是在训练你把一个真实问题拆解成若干可实现的数字电路模块的能力。我做完之后最大的体会是:不要急着焊板子,先在纸上把计价规则写清楚,再把规则翻译成“什么信号触发什么动作”,最后才落成芯片和连线。这三步走完,电路图自然就出来了,调试也顺得多。
最后再分享一个实用的小技巧:如果时间允许,先用Multisim或者Proteus把完整电路仿真一遍再动手做实物。仿真时可以把里程脉冲、等待脉冲都用信号源设置成固定频率,观察数码管的时序变化。仿真通过后,实物的成功率会高很多,因为你在软件里已经把逻辑关系理清楚了,剩下的就主要是硬件焊接和电平匹配的体力活。祝大家的课设一次通过。