
数电课程设计选出租车计价器这个题目的人是真不少但我发现很多同学做完之后其实还是一头雾水——仿真图能跑电路也能亮老师一问“你这个计费脉冲是怎么来的”“为什么起步价要这样处理”就答不上来了。这篇文章我不打算给你一份干巴巴的参考电路图就完事而是把这套设计从需求拆解、模块电路原理、仿真调试到实物焊接的完整链路都过一遍。计价器这东西之所以适合做数电课设是因为它把组合逻辑电路和时序逻辑电路几乎都用上了脉冲产生、分频、计数、译码、显示、控制逻辑一个不落。你把这套东西吃透比背十个实验报告都管用。文章会尽量按我当年实际做的过程来写包括踩过的坑和后来想明白的道理。适合正在做这个课设、或者打算用 FPGA / 纯数字芯片两条路线来做计价器的同学参考。纯芯片方案我用的是 74 系列 555FPGA 方案我在最后会简单对比一下原理是通的。1. 计价规则先于电路设计这一步定错了后面全是白干很多同学拿到题目第一反应是打开 Multisim 开始找芯片这是典型的“还没想清楚就动手”。出租车计价器的核心是计价规则规则不同后面的电路结构完全不同。课设题目一般不会给你详细收费标准所以第一步是自己定义一套合理且能够用数字电路实现的规则。1.1 我采用的计价规则与信号约定参考市面上常见的出租车计费逻辑我做了一套简化的规则既能体现设计工作量又不会复杂到在面包板上崩溃起步价3 公里内含 3 公里收费 10 元超过部分按每公里 2 元递增等待计时停车等待时间每满 1 分钟加收 1 元有的地方叫低速等待费这部分可以用一个独立计数器实现里程信号用一个模拟脉冲源模拟车轮转速约定每 100 个脉冲代表 1 公里显示范围金额最大显示 99.9 元里程显示最大 99.9 公里所以用三位数码管就够了。这里有一个很关键的设计决策金额和里程都要显示小数后一位意味着显示模块要处理小数点而计数模块要对脉冲个数做十进制分频映射。把“每 100 个脉冲 1 公里”这个约定想清楚后续分频和计数电路才有依据。如果不定义这个关系你的计数器就不知道“数到什么数算一公里”。1.2 组合逻辑和时序逻辑在这个设计里的分工要理解计价器的电路先分清两类逻辑的分工这是数电课设的隐藏考点时序逻辑电路负责“数数”里程脉冲计数、等待时间计数、金额累加都需要触发器构成计数器这是整个系统的骨架组合逻辑电路负责“判断和计算”起步价是否已满足、超出里程部分每公里加多少钱、何时给出一个加钱脉冲这些都用组合逻辑门实现译码显示电路属于组合逻辑的应用把 BCD 码变成数码管的段码。换句话说计价器 计数器时序 判断/累加组合 译码显示组合输出。老师问你这道题考了什么数电知识点你就把这套分工讲清楚比背概念有用得多。1.3 一个容易被忽略的约束输入信号去抖和脉冲整形如果真实系统中里程信号来自霍尔传感器或光电编码器波形绝对不是干净的方波可能存在毛刺。课设中我们一般用 555 多谐振荡器模拟脉冲源但如果你用按键模拟单步脉冲必须处理机械按键抖动。我的做法是按键输出先经过一个由与非门组成的 RS 触发器或单稳态电路消抖再送到计数器时钟端。这是实物调试能否稳定的分水岭后面我还会单独展开。2. 模块电路核心设计分频、计数与加钱判断是怎么串起来的这部分是整个设计的硬核区域我按信号流向逐个模块讲。你如果已经有一个参考电路图对照这篇文章看会更容易明白每个芯片放在那里的原因。2.1 秒脉冲发生器与分频链设计计价器需要一个稳定的“时间基准”用来算等待时长也用来给里程模拟脉冲提供参考。最简单的方案是 555 定时器接成多谐振荡器输出 1Hz 方波。计算方式用 555 产生 1Hz 频率公式是 f 1.44 / ((R1 2R2) * C)。我实际取 C 10uFR1 4.7kΩR2 68kΩ算出来接近 1Hz。用示波器实测会有偏差调整 R2 或 C 可以微调。如果是实物没有示波器你就用秒表看数码管秒位跳变是否准多试几次电阻值。如果是 FPGA 方案分频就简单了开发板晶振一般 50MHz写一个 50_000_000 分频计数器即可得到 1Hz 信号但要留意分频计数器本身就是时序逻辑和纯芯片方案里“用加法器做分频”的思路完全不同。基础不好的同学往往在这里卡住——写分频器的时候位数不够、复位时序不对秒脉冲就出不来。2.2 里程计数模块脉冲怎么变成里程数前面约定 100 个脉冲 1km所以需要一个 100 分频计数器也就是“每计满 100 个脉冲输出 1 个进位脉冲”。这个进位脉冲送给里程个位计数器。100 分频不能用单个 74LS160 完成需要两片级联一片做十进制个位一片做十进制十位利用两片级联实现 00~99 计数在第 100 个脉冲到达时通过反馈清零并产生进位。这里有一个设计细节清零信号要用异步清零端并且要根据“计数到 99 后下一个脉冲到达时清零”不能等状态变成 100 再清零否则会出现短暂毛刺。实现方式可以是个位十进制计数器十位十进制计数器当十位计数到 9 且个位计数到 9 时用与非门产生一个清零信号同时输出一个进位脉冲作为“1km 标志”。注意这个进位脉冲宽度和你计数时钟有关如果太窄可能导致后面金额计数采不到需要加一个单稳电路或者 D 触发器展宽。这个坑我当年在仿真里根本没发现实物调试时金额偶尔不动查了好久。2.3 起步价判断与超公里加钱逻辑现在到了组合逻辑发挥威力的地方。起步价 10 元对应“3km 内”所以我们要判断“已经跑过的里程是否大于等于 3km”。这一步不需要复杂的比较器用简单的组合门就能做里程个位、十位的 BCD 码出来后判断逻辑是“十位大于 0 或十位等于 0 且个位大于等于 3”。实际设计中我们可以把里程计数器输出的十位非零信号、个位大于等于 3 的信号用 4 输入与非门对 Q3、Q2、Q1、Q0 的组合进行译码做一个或运算输出一个“已超起步里程”标志信号。但更稳妥的做法是不只判断一次而是“超过起步里程后每满 1km 产生一个加钱脉冲”。所以你在 100 分频进位输出后面要加一个由起步标志控制的与门——只有起步标志为高里程进位脉冲才能通过否则就被拦下。这个与门就是组合逻辑控制时序脉冲的典型用法。2.4 金额累加电路让数字越加越大的计数器金额累加我不想用全加器阵列手算而是直接用一个可预置数的 BCD 计数器每收到一个脉冲就加一次。因为金额范围是 0~99.9 元需要三位角位、元个位、元十位。每一位用一个 74LS160 实现十进制加法计数低位计数器的进位输出接到高一位的时钟输入形成行波进位计数链。这里的关键是起步价的 10 元不需要“加”进去而是在系统启动时预置进去。74LS160 有同步预置端上电后通过一个短暂的高电平脉冲把“10.0”这个 BCD 码装入计数器启动后初始显示就是 10.0 元。这个预置方法是课设里比较讨巧又很合理的做法比用加法器把 10 和其他加数相加要简单得多。如果要用加法器方案也可以一块 74LS283 做 BCD 加法再加一个校正电路处理十进制进位。但调试难度明显上升我个人建议用可预置计数器方案。2.5 等待时间计费一个独立的分钟计数器停车等待的计费逻辑可以和里程计费完全独立用秒脉冲继续分频产生 1 分钟脉冲然后同样接到金额计数器的时钟端。也就是说金额累加模块有多个脉冲来源超起步里程的里程脉冲、等待时间的分钟脉冲。多个脉冲不能直接“或”在一起就完事要注意脉冲宽度和频率关系不然会产生竞争-冒险。我的做法是把两个计数脉冲先经过一个或非门组成的脉冲混合电路然后统一送到金额计数器的时钟端。这里有一个容易被忽视的关键点两个脉冲不能同时到达时钟端否则同一时刻产生两个边沿计数器行为不可预测。实际系统中可以把分钟脉冲和里程脉冲设计成不同相位或者在混合电路前加 D 触发器做同步。等待计费也可以用独立的一位数码管显示等待累计分钟数我当时加了一个独立的分钟计数显示方便验收时给老师演示“按下等待按键每分钟跳 1 元”。3. 显示与驱动动态扫描不是简单地把引脚并起来就完事计价器要显示金额和里程我用 6 个数码管金额 3 位 里程 3 位。显示驱动有这么几个层次静态显示、动态扫描、以及是否需要锁存。课设里常见的是动态扫描方案这个方案你要是没搞懂“刷新率”和“消隐”这两个概念实物就等着闪烁吧。3.1 共阴共阳选型与限流电阻计算先决定数码管类型。我用的是共阴数码管选择 74LS48 作为 BCD-七段译码驱动器注意 74LS48 驱动共阴管输出高电平有效如果误接共阳管数字就会乱。74LS48 内部集成上拉电阻一般可以直接接数码管但为了亮度均匀建议每个段再加一个 330Ω 左右的限流电阻。如果是共阳数码管就得用 74LS47输出低电平有效。这两个型号长得像引脚定义不同实物焊接前一定卡好数据手册。我在实验室见过至少三个组把 74LS48 插到共阳管上显示出来一堆乱码还以为是芯片坏了。限流电阻的计算逻辑很简单数码管工作电流一般取 5~10mA红色 LED 压降约 1.8V电源 5V所以限流电阻 R (5 - 1.8) / 0.01 ≈ 330Ω。如果你用的不是红色数码管压降不同电阻要重算但 330Ω 是个比较通用的起点。3.2 动态扫描原理与刷新频率的计算6 个数码管如果每一位都用独立译码器芯片数量会很大。动态扫描的思路是所有数码管的段选线并联位选线分别控制让它们轮流显示利用人眼视觉暂留效应看起来像是同时亮的。动态扫描的核心参数是刷新频率。人眼不觉得闪烁的最低频率约 50Hz也就是每位数码管每秒至少亮 50 次。6 位数码管扫描一轮要 6 个周期所以扫描频率至少要 300Hz也就是每位显示时间约 3.3ms 以内。实际做的时候我一般把位选扫描频率做到 500Hz~1kHz留足余量。扫描发生器可以用 555 产生一个较高频率的方波或者直接从秒脉冲分频链中取一个高频信号经过 74LS138 译码产生 6 路位选信号。注意 74LS138 当选通端工作时输出是低电平有效所以要做反相后再接三极管驱动位选。如果直接用门电路驱动共阴数码管的公共端电流不够亮度会很暗。3.3 我踩过的动态扫描大坑切换瞬间的串扰仿真阶段动态扫描看着一切正常一到实物就出问题数字边缘发虚甚至相邻位出现“鬼影”。原因是位选信号和段选信号切换不同步——位选已经切到第 3 位了但段选数据还是第 2 位的这一瞬间第 3 位会显示出第 2 位的内容。解决办法有两个我是两个都做了位选和段选之间加一个很小的延迟让段选数据先稳定再切换位选通常用 RC 延迟或者几级与非门延迟就能实现在切换瞬间先消隐也就是让段选输出全 0等 1~2μs 再点亮下一位。这个思路在 FPGA 里就是“在状态切换时插入一个空状态”。很多参考电路图根本不会体现这个细节但实物调试必然会遇到。你在 Proteus 里仿真看不出来因为理想器件没有开关延迟。4. 仿真通过不等于实物能跑几个必须单独处理的工程问题这一章是我最想写的内容。说实话课设的电路图大部分人都能画出来但从 Proteus/Multisim 到面包板中间隔着一道“工程鸿沟”。下面几个问题是仿真永远模拟不出来的也是老师考察你是否真懂电路的分水岭。4.1 竞争冒险为什么显示数字偶尔会多跳一个组合逻辑电路中的竞争冒险是数电教材里必讲的内容但很多人觉得它只存在于理论题里计价器里最容易出现竞争冒险的地方是里程分频计数器清零时产生的毛刺起步价判断组合门的输入信号不同时到达导致输出出现瞬时错误多个计数脉冲混合时门电路传播延迟不一致导致同一时钟周期出现多个边沿。我遇到最典型的案例里程计数器从 99 清到 00 的时候进位脉冲上有一个很窄的毛刺这个毛刺刚好被金额计数器当成一个有效时钟沿导致金额偶尔多跳 0.1 元。排查方式是用示波器看进位脉冲把时基调到 1μs/div 就能看到毛刺。解决方式是在进位脉冲后面加一个 RC 低通滤波R 100ΩC 0.1μF让窄毛刺被吸收。但要注意低通滤波会把脉冲边沿变缓后面最好再加一个施密特触发器整形。这一套“滤波整形”组合拳在实物调试里非常常用。4.2 按键抖动与单脉冲电路计价器一般需要几个按钮启动、清零、模拟单步里程。按键是机械结构按下和松开的瞬间会有约 5~20ms 的抖动形成一连串脉冲。如果直接把按键接到计数器时钟按一下可能计数 3~5 次。消除抖动最可靠的是硬件消抖用 555 构成单稳态触发器按键触发后输出一个固定宽度的脉冲抖动过程中不再触发或者用双稳态触发器两个与非门交叉耦合锁存第一次电平变化。我在设计里增加了一个“单步里程”按键用的就是两个与非门组成的 RS 触发器消抖电路。这个电路只用了半块 74LS00成本很低但非常有效。FPGA 方案更简单按键信号打两拍做同步再加一个边沿检测就能输出单脉冲。但纯芯片方案没有现成的“打拍”寄存器所以硬件消抖是必须的。4.3 电源去耦与芯片损坏预防面包板/洞洞板上的 5V 电源要特别注意。74LS 系列芯片在插拔瞬间可能被静电击穿或者在电源波动较大时工作不稳定。我的建议是每 3~4 片芯片的电源引脚和地之间并联一个 0.1μF 陶瓷电容做高频去耦总电源输入端加一个 10~100μF 电解电容滤除低频纹波芯片不要直接从面包板上热插拔断电后再操作用万用表确认电源与地没有短路后再上电。我见过不少同学因为没加去耦电容电路单独调试没问题一接上数码管就疯狂乱跳就是因为数码管动态扫描的瞬间电流很大几十毫安级在电源线上产生噪声干扰了计数器的时钟。加电容后立刻稳定。这个经验实验报告里不会写但面试或者答辩时你提一嘴老师就知道你真的调过电路。5. 两种实现路线对比与最终调试记录前面主要讲的是纯 74 系列芯片方案。但我后来也用 FPGA 重写过一版计价器用的开发板是 Altera 的 Cyclone IV这里简单对比一下两条路线的差异帮你做选择。两个方案我都跑通过各有优劣。5.1 纯芯片方案 vs FPGA 方案的选择建议对比维度纯 74 系列芯片方案FPGA 方案电路复杂程度高芯片数量多、连线多低主要在代码层面调试难度高需要示波器逐级找信号中等靠仿真和 SignalTap计价规则灵活性低改一次计费标准要改硬件高改代码即可数电知识点覆盖覆盖广组合时序都动手练到偏数字系统设计制作周期长约 2~3 周短约 1 周答辩优势可以讲很多硬件层面的细节可以讲状态机和分频架构如果你所在课程侧重“搭电路”选纯芯片如果课程同时教了 VerilogFPGA 方案的容错率更高毕竟在电脑上改代码比在面包板上拔线要舒服得多。5.2 FPGA 版本的顶层模块划分思路用 FPGA 做计价器代码结构其实就是上面电路图的“翻译版”。我当时划分的 Verilog 模块如下供你参考clk_div.v50MHz 晶振分频产生 1Hz 秒脉冲、扫描脉冲、分钟脉冲mile_counter.v里程脉冲计数每 100 个脉冲产生一个 1km 进位fee_logic.v判断起步价与超里程产生加钱脉冲fee_counter.v金额累加寄存器支持预置 10.0 元display_scan.v动态扫描位选和段选输出debounce.v按键消抖与单脉冲生成。写代码的时候要特别注意一个地方跨时钟域的脉冲处理。里程脉冲可能是外部异步信号不能直接作为时序逻辑的时钟需要先打两拍同步再检测上升沿。这一点和硬件方案里“脉冲整形”是同一个问题只是解决手段从 RC 滤波变成了 D 触发器打拍。5.3 我的实测记录一次完整调试图的经验复盘最后分享一段我自己的调试记录可能比前面所有理论内容都更能帮你建立信心。上电后所有数码管全亮但不跳字。我先用万用表量 555 的输出引脚发现没有方波再排查发现 555 的复位脚第 4 脚悬空了。74LS 系列和 555 的不使用的输入引脚不能悬空复位脚要接高电平才能工作。这是一个很初级的错误但在面包板上就是会很隐蔽。修好后秒脉冲有了但里程计数不走。用示波器从 555 的输出端一路往后查555 输出正常74LS160 的时钟引脚有波形但输出端 Q0~Q3 全是低电平。再看手册发现 74LS160 的清零端和预置端是高电平有效我把它们接到了地。正确的做法是清零端接低电平不工作预置端接高电平不预置这两个引脚一旦接反计数器就什么都不干。这两个问题解决后系统能跑了但又出现金额偶尔多跳的现象。按照前面 4.1 节的方法加了滤波和整形问题消失。整套系统稳定工作之后我做了一次连续 20 分钟的老化测试用固定频率的模拟里程脉冲跑每 5 分钟记录一次显示金额和理论值对比。最终误差为 0只有一次记录的金额少了 0.1 元排查发现是那一次供电电压降到 4.8V数码管亮度下降但计数没丢。这个现象提醒我计价器这类数字系统对电源稳定性相当敏感后来我换了一个输出电流更大的 5V 适配器再没出现过问题。6. 写在最后几个能让答辩加分的小细节如果说上面是“做完”这个项目那下面就是“做好”这个项目的一些加分操作。课设答辩时老师通常不会只看你的电路能不能跑还会问你几个“为什么这样设计”的问题。先把项目亮点整理清楚计价规则自定义、起步价预置实现、动态扫描刷新频率可调、硬件消抖方案、竞争冒险处理这些都是你可以主动讲给老师听的。我是这样组织汇报逻辑的先讲需求计价规则再讲方案选型为什么用 74LS160 而不是 74LS161、为什么动态扫描而不是静态显示然后现场演示并指出设计中的难点和解决过程最后展示实测数据。这个顺序其实把整个课设的思考过程串起来了比对着 PPT 念强很多。另一个小技巧把计价规则打印出来贴在实验箱旁边演示时老师一看就知道你的设计是有完整功能逻辑的而不是随便接了个电路让数码管乱闪。最后是写给纯芯片方案的同学的心里话如果仿真阶段一切正常但实物一塌糊涂千万别灰心。我在实验室熬了三个晚上真正改对的其实就是几个引脚的问题。数电课设最大的价值不在那个分数而在你学会用示波器、万用表、数据手册这三样东西去解决一个真实问题的过程。计价器这个题目恰好把所有这些技能都串起来了做完之后你对组合逻辑和时序逻辑的理解绝对比刷十套题都深。