☰
基于数字电路的出租车计价器设计与实现
2026/10/5 4:54:21 网站建设 项目流程

从数电课设抽到“出租车计价器”那一刻起,很多人心里就开始打鼓:这玩意儿不是单片机写几行代码就能收工吗?但偏偏课程要求只能用 555、计数器、译码器、逻辑门这些“老古董”把系统搭出来。我当年做这个题,从拿到题目到仿真跑通用了整整一周,中间烧过芯片、接过反电平、也对着乱码数码管发过呆。但现在回头看,这个题目其实是数电里少有的能把组合逻辑和时序逻辑揉在一起考综合能力的题型。做完它,你对计数器、比较器、译码器、定时器的理解基本就盘活了。

这篇文章我会按自己实际做过的方案来讲:从计价规则的制定,到模块拆分,再到每一个模块的芯片选型和连线思路,最后是仿真、实物焊接、常见问题排查和答辩避坑。目标很直接——你拿到这篇文章,照着搭,能做出一个能演示、能答辩、还能说出为什么这么设计的计价器。

1. 先搞清楚计价器到底要“算”什么

1.1 计价规则是设计的源头,不是随便定的

很多同学一上来就翻芯片手册,这是本末倒置。数电课设的计价器,第一步是先把计价规则定下来,而且规则必须围绕“能不能用数字电路方便实现”来定。

我当时和老师确认后采用了一套很经典的规则:

  • 起步价 10 元,包含 3 公里;
  • 超过 3 公里后,每公里加收 2.5 元;
  • 车辆停车等待时,每满 10 秒加收 1 元(演示档位;实际出租车一般按分钟计费,这里是为了课堂演示缩短时间);
  • 金额取整显示,单位是元;里程显示精度到 0.1 公里;
  • 支持新单起步、行程中累计、停车复位。

为什么这样定?关键是所有收费都能通过“脉冲个数”映射成数字电路里的计数事件。里程用一个脉冲代表 0.1 公里,起步里程就是 30 个脉冲;超出后每 4 个脉冲产生一次“加 1 元”的动作,正好对应 2.5 元/公里。等待计费用一个 1Hz 秒脉冲,每 10 个秒脉冲产生一次“加 1 元”的动作。于是整个计价器就抽象成了两路脉冲各自计数、最后汇总到金额计数器的数字逻辑问题。

1.2 把规则翻译成电路功能

把上面规则拆开,计价器需要完成下面几个功能:

  • 产生稳定的时钟/脉冲源,既能模拟车轮转动,又能量化等待时间;
  • 对里程脉冲计数,并判断是否已经超过起步里程;
  • 对等待时间计数,达到阈值后产生一次加钱信号;
  • 把起步价预置到金额计数器里,之后每收到一个“加钱脉冲”就累加 1 元;
  • 译码显示金额、里程,以及可选的等待时间。

换句话说,整台计价器就几个字:计数、比较、分频、累加、显示。只要沿着这条线走,后面所有电路模块都是在回答“这个功能用什么芯片、怎么接”的问题。

2. 整体方案与模块划分:别一上来就焊板子

2.1 用模块化思维拆解整机

我在动手之前先把整机画了一张模块框图。这个习惯帮我省了很多事,因为计价器一旦接错线,是全系统互相牵连的,没有模块化设计,查错查到崩溃。

整机被我拆成了六个模块:

模块核心功能建议芯片
脉冲源与分频产生里程模拟脉冲和 1Hz 秒脉冲NE555、CD4060
里程计数对 0.1km 脉冲计数并显示CD4518 或 74LS160
起步里程判断判断里程是否超过 3km74LS85 比较器
里程加钱脉冲每 4 个里程脉冲产生 1 个加钱脉冲74LS74 双 D 触发器
等待计费每 10 秒产生 1 个加钱脉冲74LS192 可预置计数器
金额累加预置起步价,按加钱脉冲累加74LS192 级联
译码显示显示金额、里程CD4511 + 共阴数码管

模块化的第二个好处是调试顺序非常明确:先电源,再脉冲源,再计数,再比较/分频,最后显示。哪一级出问题,用万用表和逻辑笔一量就知道在哪。

2.2 为什么选这些芯片而不是其他芯片

这里有一个很现实的问题:课设题目允许的芯片范围通常是 74 系列和 4000 系列,那么怎么选?

我的选择原则是“优先选同步计数器、避开异步计数器”。以里程计数为例,很多人第一反应用 74LS90,因为它单芯片就能实现十进制计数。但 74LS90 是异步计数器,输出存在明显的级联毛刺,下一级如果直接用它做译码显示,数码管容易闪出乱码。我最终选了 CD4518 双 BCD 同步加计数器,一片能顶两个十进制位,级联时毛刺小得多,调试体验完全不一样。

金额累加部分选 74LS192 则是因为它带异步预置端。起步价 10 元可以直接“打进”计数器,后面的加钱脉冲只要不断触发 CPU 端就能实现逐元累加。如果你用 74LS160 做金额,还得外加预置电路,麻烦很多。

3. 核心模块设计与参数计算

3.1 脉冲源:NE555 的频率到底怎么算

计价器需要一个模拟车速的脉冲源,也要一个 1Hz 的秒脉冲给等待计费用。最省事的方案是用两片 NE555 分别产生,一片频率调到 1~2Hz 左右模拟“行驶”,另一片用 32768Hz 晶振加 CD4060 分频得到精确 1Hz。如果嫌晶振麻烦,第二片 NE555 也可以直接调出 1Hz。

NE555 无稳态振荡频率公式是:

f = 1.44 / ((R1 + 2*R2) * C)

我当时要一个大约 1Hz 的秒脉冲,取 C = 10μF,R1 = 1kΩ,R2 = 50kΩ 可调电阻,代入算一下:

f = 1.44 / ((1k + 2*50k) * 10μF) = 1.44 / (101k * 10μF) ≈ 1.43 Hz

实际焊接后可以通过可调电阻微调到 1Hz。注意 555 的输出驱动能力虽然能带几个 TTL 门,但如果你后面接了一长串计数器和数码管驱动,建议在 555 输出端加一个 74LS04 非门做缓冲整形,既提升驱动能力,又能让波形更干净。

3.2 里程计数:一个脉冲代表 0.1km

里程脉冲来源有两种:一种是用 555 连续产生脉冲模拟车辆行驶,另一种是手动按键每按一次产生一个脉冲,方便演示“每按一下就是 0.1 公里”。我建议两个都做,中间用开关切换,演示时既可以用自动模式让它自己跑,又可以用手动模式一块钱一块钱地加给老师看。

里程计数我用两片 CD4518 级联成两位 BCD 计数器。第一片的 CLK 接里程脉冲,输出作为“十分位公里”;第一片计数到 9 后再来一个脉冲时,通过外接的与门检测“个位计数器的 8 和 1 同时为 1”,产生进位信号给第二片,第二片代表“整公里”。第二片再往上可以加第三片,代表十公里,这样里程显示能做到 99.9 公里。

这里要特别注意:CD4518 是上升沿计数,但它的 Enable 端用法和 74 系列不太一样。我在面包板上犯过的错是把 Enable 悬空,结果计数器乱跳。正确做法是把 Enable 接高电平,脉冲从 CLK 进。

3.3 起步里程判断:74LS85 比较器阈值设成 30

起步价包含 3 公里,折合 30 个里程脉冲。所以必须有一个电路来判断“当前里程是否已经超过 30”,只有超过之后,后续的里程脉冲才能触发加钱。

最直接的方案是用两片 74LS85 四位数码比较器级联,把里程计数器的 8 位 BCD 输出接到 A 端,B 端固定接成 30,也就是二进制 0x30。这里 B 端的高四位(十位)接 0011,低四位(个位)接 0000。级联时低四位比较器的 A>B、A=B、A<B 输出分别接到高四位比较器的级联输入端,高四位那片的 A>B 输出就是最终判断结果。

为什么用比较器而不是用一大堆门电路去检测“十位等于3且个位大于0”?因为后者的逻辑表达式很长,稍微化简错一个与门,整个系统就废了。比较器一片才十几根引脚,级联关系清晰,出了问题也容易量。

还有一个细节:74LS85 比较器的最低一级级联输入不能悬空,必须把 I(A=B) 接高、I(A>B) 和 I(A<B) 接低,否则结果会莫名其妙。

3.4 里程加钱脉冲:为什么要模 4 分频

计价规则里超出起步里程后是 2.5 元/公里。一个里程脉冲是 0.1 公里,那么 4 个脉冲就是 0.4 公里,对应 1 元。所以里程加钱脉冲就是一个 4 分频器:每当收到 4 个里程脉冲,就输出 1 个加钱脉冲。

我用了两片 74LS74 双 D 触发器搭模 4 计数器。第一个 D 触发器 Q0 翻转频率是输入的一半,第二个 D 触发器 Q1 再翻一半。在状态 3(Q1=1,Q0=1)时用与门输出一个高电平脉冲,这个脉冲就是“加 1 元”信号。为什么取状态 3?因为模 4 计数器的四个状态是 00、01、10、11,状态 3 只维持一个输入时钟周期,正好输出一个单脉冲。

有同学问:能不能直接拿 Q1 的输出当 4 分频后的信号?严格来说 Q1 的频率确实是输入的 1/4,但 Q1 的波形占空比是 50%,直接用它的上升沿会触发在输入的第二个脉冲上,而不是第四个。所以要么用“状态 3 与门输出”取单脉冲,要么用 Q1 的反相输出沿,我建议用与门方案,更直观,也好跟老师解释。

3.5 等待计费:用 74LS192 做可预置减法计数器

等待计费我的方案是用两片 74LS192 构成两位 BCD 可预置减法计数器。预置值是 10(代表 10 秒),秒脉冲从高位?不对,是低位片的 CPD(减计数时钟)输入,每来一个秒脉冲减 1。当计数减到 0 后,再来一个秒脉冲时,74LS192 的借位输出 TCD 会产生一个低电平脉冲。

这个低电平脉冲非常关键:把它反相后,一路作为“等待加钱脉冲”送给金额计数器;另一路接到 74LS192 的 LD(预置使能,低电平有效),在借位瞬间重新把 10 装入计数器。这样就实现了“每 10 秒自动加 1 元并自动重置”的循环,完全不需要额外的比较器。

这里有一个实操要点:74LS192 的 TCD 是低有效,接金额计数器之前必须经过一级非门,把它变成上升沿信号。我第一次做的时候直接把 TCD 接到 74LS192 的 CPU,结果金额计数器纹丝不动,查了半天才发现是电平极性反了。

另外,等待计费需要加一个“等待开关”控制秒脉冲是否进入计数器。车在行驶时,等待开关断开,秒脉冲进不来,等待费用不计;一旦停车或拥堵,拨到等待档,秒脉冲开始减计数。

3.6 金额累加:起步价预置与逐元累加

金额计数器是整个系统的“钱袋子”,我用了三片 74LS192 级联,实现 0~999 元的显示范围。第一片是个位,第二片是十位,第三片是百位。级联关系是个位片的加计数进位输出 TCU 接到十位片的 CPU,十位片的 TCU 再接百位片的 CPU。

“起步价 10 元”的预置方法:三片 74LS192 的预置数据端 D0~D3 分别接成个位 0、十位 1、百位 0。用一个“新单”按键接到所有 74LS192 的 LD 端。按下按键时,LD 为低,10 被异步打入三片计数器;松开后 LD 恢复高,此后每来一个加钱脉冲,个位片的 CPU 上升沿触发一次,金额自动加 1,十位和百位通过级联进位自动刷新。

如果你细想会发现一个问题:起步价预置时,里程计数器和等待计数器也应该清零。所以我把“新单”按键同时接到所有计数器的复位端。按下新单按钮,金额被预置成 10,里程和等待时间全部清零,整台计价器进入新的一单状态。这是整机设计里很关键的一个联动。

3.7 译码显示:CD4511 驱动共阴数码管的接法

显示部分我用 CD4511 BCD 七段锁存译码驱动器,驱动共阴数码管。每个数码管配一片 CD4511,这样是静态显示,亮度高、无闪烁,比动态扫描适合课设演示。

CD4511 的注意点有几个:

  • 4 位 BCD 输入 D、C、B、A 分别接计数器的对应位输出;
  • 输出是高电平有效,直接接共阴数码管;
  • 每个段输出串一个 330Ω 限流电阻,否则数码管会过亮甚至烧坏;
  • LT(灯测试)和 BI(消隐)必须接高电平,LE(锁存使能)接地,否则显示会不正常。

里程显示的小数点怎么做?我的里程显示是“十位公里、个位公里、十分位公里”三只数码管,也就是显示 12.5 这样的数值。中间那只数码管的 dp 引脚通过一个 330Ω 电阻接 VCC,让小数点常亮,视觉上就是“公里.十分位公里”。金额显示的三只数码管不需要小数点,整数值直读。

4. 仿真先行:Multisim 验证逻辑的正确性

4.1 仿真阶段该搭什么、看什么

我习惯先用 Multisim 把整机搭一遍,确认逻辑正确再焊实物。仿真阶段最大的优势是可以随时看波形、改连线,不用承担烧芯片的风险。

仿真搭机顺序和实物一样:先搭脉冲源,再搭里程计数和比较器,看比较器输出是否在里程大于 30 之后变高;再搭模 4 分频器,用逻辑分析仪看状态 3 的输出脉冲;接着搭等待计费,观察 74LS192 借位输出;最后搭金额累加和译码显示。

有一个很实用的仿真技巧:用 Multisim 的逻辑分析仪同时观察里程脉冲和加钱脉冲,确认“每 4 个里程脉冲输出 1 个加钱脉冲”。如果发现加钱脉冲数量不对,重点查 74LS74 的复位端和与门连接,通常是复位信号没接对导致计数器没有从 0 开始。

4.2 仿真能通过的陷阱,实物也会踩

仿真跑通不代表实物就能一次成功。我遇到过的最典型情况是:仿真里一切正常,面包板上电后金额计数器从 10 开始乱跳,完全没有规律。后来排查发现是 5V 电源纹波太大,加上 74LS192 的 LD 端悬空被噪声干扰,导致计数器不断被预置。处理方法是给每片芯片的电源脚就近加 0.1μF 退耦电容,LD 端不用时通过上拉电阻接 VCC,问题立刻消失。

所以从仿真切换到实物之前,一定要把“所有不用的输入引脚不能悬空”这条铁律刻在脑子里。TTL 芯片悬空输入相当于接了高电平,但抗干扰能力很差;CMOS 芯片悬空则更危险,可能直接导致芯片工作异常。无论哪种,该上拉的上拉,该下拉的下拉。

5. 从面包板到万用板:焊接布局与调试心得

5.1 面包板阶段:模块分区比好看重要

面包板搭棚阶段,我建议按模块分区排布:电源区、脉冲区、计数区、比较区、显示区各自占一块区域。好处是排查故障时能快速锁定位点。电源线和地线用不同颜色区分,信号线用同一色系,飞线尽量横平竖直,压线宁可多绕一点也不要斜插穿透。

焊接前务必先给数字芯片的电源引脚统一接上退耦电容。我当时在每片芯片的 VCC 和 GND 之间就近焊了一个 0.1μF 瓷片电容,整机稳定性好了很多。这个细节很多教程不会提,但实物能不能稳定跑起来,很大程度上取决于它。

5.2 上电调试顺序:先电源,再脉冲,再计数

我一贯的调试顺序是“从电源到显示逐级点亮”:

  1. 先不上芯片,用万用表检查电源电压,确认 5V 输出正常、无短路;
  2. 插上 555,用示波器或逻辑笔测试 555 输出波形,确认脉冲频率正确;
  3. 接上里程计数器和显示,用手动按键逐个输入脉冲,观察数码管是否按 0.1km 递增;
  4. 接比较器和模 4 分频器,观察超过 30 个脉冲后是否开始输出加钱脉冲;
  5. 接等待计费,拨到等待档,观察每 10 秒是否加 1 元;
  6. 最后接金额累加和起步价预置,完整走一遍流程。

这里有个很常见的问题:手动按键产生脉冲时,机械抖动会一次蹦出好几个脉冲,导致里程一次跳好几格。解决方法是给按键加一个 RC 低通滤波加施密特整形,或者用 74LS00 构成 RS 触发器消抖。如果只是演示用,也可以用连续脉冲源代替手动按键,省掉消抖问题。

5.3 参数计算与元件选型的一点补充

整机元件清单大概包括:

  • NE555×2(脉冲源和秒脉冲);
  • CD4518×2~3(里程计数);
  • CD4511×6~7(三只金额数码管、三只里程数码管,可选两只等待时间数码管);
  • 共阴数码管若干;
  • 74LS74×1(模 4 分频);
  • 74LS85×2(起步里程比较);
  • 74LS192×3~5(金额累加、等待计费);
  • 逻辑门若干(74LS08、74LS32、74LS04);
  • 按键、拨码开关、电阻、电容、晶振等。

元件选型时尽量统一用 74LS 系列和 4000 系列混搭没问题,但要注意电平兼容。74LS 的高电平输出约 3.4V,CD4518 在 5V 供电下输入高电平阈值大约是 3.5V,两者刚好卡在临界值。稳妥做法是 4000 系列也统一用 5V 供电,必要时在关键信号线上加 1kΩ 上拉电阻提升高电平幅度。

6. 常见问题与排查技巧实录

6.1 问题速查表

现象可能原因排查思路
数码管不亮CD4511 的 LT/BI 接错、电源没到先测 VCC,再逐个测 CD4511 的输入和输出
数码管显示乱码计数器输出非 BCD 码,或有毛刺用逻辑笔逐位检查计数器输出,确认是否出现 A~F
里程跳数/一次跳好几个脉冲按键抖动、555 频率过高加消抖电路,或改用连续脉冲演示
金额计数器一上电乱跳LD 悬空、电源纹波大LD 上拉,芯片电源脚加退耦电容
起步价预置不生效新单按键没接对,或 LD 电平太短暂检查按键是否给到低电平,必要时加 RC 延时
里程超过 30 后仍不加钱74LS85 级联输入没接默认值检查 I(A=B) 是否接高,I(A>B)、I(A<B) 是否接低
等待时间到了不加钱TCD 极性接反74LS192 借位输出是低有效,必须反相后接 CPU
金额到了 99 不往百位进位十位片 TCU 没接百位片 CPU检查级联方向是否正确

6.2 三次翻车经历,帮你避掉同样的坑

第一次翻车是 74LS192 起步价预置不生效。我按下新单按键后,金额一直从 0 开始,而不是 10。查了很久发现是新单按键直接接 GND 形成低电平的瞬间太短,芯片来不及完成异步预置。后来在按键两端并联了一个 100μF 电容,利用电容放电拉长低电平时间,问题解决。这个改法简单粗暴,但非常有效。

第二次翻车是里程计数到 30 后没有加钱信号。用逻辑笔量 74LS85 的 A>B 输出一直是低。仔细一看,两片比较器级联时我把低四位的输出接到了高四位的数据端而不是级联端。这个错误在仿真里不容易发现,因为仿真模型对级联端的处理有时候比较宽容,但实物电路就立刻露馅。所以搭实物之前一定要把数据手册上的级联图看仔细。

第三次翻车更诡异:等待计费无论怎么拨开关都不触发。最后发现是秒脉冲没接到 74LS192 的 CPD 端,而是接到了 CPU 端,导致它在“加计数”而不是“减计数”。看似只是 A/B 端互换,实际上整个逻辑完全反了。所以拿到 74LS192 这类双时钟计数器,第一件事就是分清 CPU(加)和 CPD(减),再查 TCU 和 TCD 分别对应哪个方向。

7. 答辩加分项与扩展思路

7.1 把“为什么这么设计”讲清楚

答辩时老师不只听你讲“我做出来了”,更想听“你怎么想到这么做”。所以准备几个关键问题很有必要:

  • 为什么里程计费用 CD4518 而不是 74LS90?答:同步计数毛刺小,级联简单,显示稳定。
  • 为什么起步价用 74LS192 预置而不是用加法器累加?答:可预置计数器天然适合“固定起步价+后续累加”的业务场景,而且出租车调价只需要改预置数据,不需要改电路。
  • 如果里程和等待同时触发加钱怎么办?答:实际场景中行驶和等待互斥,等待时里程脉冲不产生,所以不会同时触发;如果要做更严格的系统,可以把两路加钱脉冲送到加法器再统一加到金额计数器。

这些问题的答案,其实就是前面每一节里的“为什么”。平时搭电路时多想一步,答辩时就不至于语塞。

7.2 后续还能怎么改

如果做完基础版还想再加分,可以往这几个方向扩展:

  • 增加金额小数点显示,把“元”的显示精度提高到 0.1 元,满足更精细的计价规则;
  • 用 CD4060 加 32768Hz 晶振替代 555 产生精确秒脉冲,提高等待计时的准确度;
  • 增加“暂停”功能,在等待时不显示里程和金额变化,或者增加一个“多位显示”功能,按一下切换显示总额/里程/等待时间;
  • 把整机做成 PCB,在 Altium Designer 里画原理图和版图,焊接后整机体积更小,演示效果也更专业。

我个人始终觉得,课设的价值不在于把电路焊得多漂亮,而在于你能否从“需求”出发,一步步翻译成“电路语言”。计价器这个题目之所以经典,就是因为它把现实世界里的公里、秒、元,变成了脉冲、计数器和译码显示。你把这个过程走通一遍,再看其他数电题目,会发现底层思路都一样。做完这一套,后面无论遇到抢答器、密码锁还是电子钟,你至少能一眼看出它大概由哪几个模块组成——这种感觉,比焊接技术本身重要得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询