ARTICLE DETAIL

资讯详情

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

数电实训必做:基于74系列芯片的万年历设计全解析

数电实训必做:基于74系列芯片的万年历设计全解析 1. 为什么万年历是数电实训里最值得做的题目每年实训题目清单发下来大家第一眼看到万年历三个字多数人反应是这玩意儿是不是太复杂了毕竟其他题目光看名字就知道要干嘛什么四人表决器密码锁交通灯都是单个功能模块。万年历乍一看确实像个全家桶——要显示年月日时分秒得处理大小月、闰年、星期的跳转还要考虑校时、进位、显示刷新脑子里的线一多就容易打退堂鼓。但我的看法恰恰相反如果你只想选一个题把数电这一整门课都串起来练一遍万年历就是最合适的那道题。做表决器你练的是组合逻辑做计数器你练的是时序逻辑做万年历组合逻辑和时序逻辑全都要用上而且不是简单拼凑是一层一层互为条件地配合。做完这个题你对一个数字系统是怎么从无到有搭起来的会有一个完整的体感这是做三个小题目都换不来的。再说实用价值。万年历这东西人人都见过需求不需要额外解释正常走时、能校时、能正确切换大小月和闰年、能把时间用数码管显示出来。需求越明确你验证自己做得对不对就越容易。到答辩现场老师一问2月应该显示多少天今年是平年还是闰年你怎么判断的你都能用电路逻辑实打实地回答上来而不是背稿子。很多同学做完这个题之后的普遍反馈是实训周前看教材晕晕乎乎的时序逻辑异步清零BCD译码到实训结束的时候突然就通了——因为你亲手把所有概念都用了一遍。这篇文章我就拿自己当时的完整项目来做复盘从方案选型、分频链设计、日历判断逻辑到最后的实物调试把思路和踩过的坑一起写出来。内容面向的是已经学过数电基础、正要或正在做同类实训的同学也欢迎想拿这个题目练手的爱好者参考。每个环节我都尽量写清楚为什么这么做而不是只给一张接线图让你抄。2. 方案选型中小规模芯片搭建全数字日历2.1 为什么不用单片机或FPGA先说选型。现在很多人一听说做万年历第一反应是拿单片机或者FPGA做一个MCU加一个时钟芯片程序一写完事了。如果你只是想做个电子钟这么干完全没问题但放到数电实训的语境里这种做法其实绕开了这门课真正要训练的东西。数电实训考察的核心是用门电路、触发器、计数器、译码器这些中小规模数字芯片搭出一个能工作的数字系统重点在你对逻辑电路本身的理解不在于你会不会写代码。FPGA同理虽然它也是数电但实训用的是硬件描述语言最后烧进芯片里和用74系列芯片一个个连线、看波形、调时序思路完全是两套。不是说FPGA不好而是在这门实训课的考核框架下用中小规模集成电路搭出来的电路才能让老师清楚地看到你对每一个进位、每一个清零条件都理解到位了。所以我当时的方案非常复古全部用74LS系列和CD4000系列的中小规模数字芯片搭一个纯硬件数字万年历。时基部分用32.768kHz石英晶体加CD4060做分频计数部分用74LS90十进制计数器、74LS92十二分频计数器和74LS93十六进制计数器组合出六十进制、二十四进制和各种日历计数显示部分用CD4511做七段译码配合动态扫描驱动共阴数码管。这套方案的好处是全部都是实训室里最常见、最便宜的芯片坏了几毛钱一片随便换。每一级功能都能用示波器单独看到波形排查问题非常直观。逻辑关系全部是看得见的哪一根线送的是秒进位哪一组逻辑决定月末清零全在电路图上摆着。2.2 系统框图与时序主线整个万年历可以拆成这么几条大的逻辑主线时基产生32.768kHz晶振 → CD4060内部14级分频 → 得到稳定的秒脉冲1Hz。秒计数两个计数器级联成60进制每秒走一个字计满60产生一个进位脉冲送给分计数。分计数同样60进制计满60进位给时计数。时计数24进制或者做成12/24可切换计满24清零同时产生日的进位。日/月/年计数日计数在当前月最后一天的晚上24点清零并进位给月月在12月结束进位给年年计数要参与闰年判断反过来决定日计数在2月时是清零到29还是28。显示译码把时分秒和年月日的BCD码经CD4511译码驱动6位或8位甚至更多位数的数码管动态显示。校时模块用按键产生快速进位脉冲可以分别对时、分、日、月、年每一位进行手动调整。这七条线里面最容易理解的是秒分时这条时间主线最考验逻辑思维的是日历部分因为它不是简单的固定进制循环——每个月的天数不一样还得考虑闰年。我建议做的时候先从秒分时开始搭这部分跑通了整个项目就算完成了一半。2.3 芯片选型清单这里整理一下我实际用到的芯片和用途供参考芯片功能在本项目中的用途CD406014级二进制计数器/振荡器配合32.768kHz晶振分频得到1Hz秒脉冲74LS90十进制计数器秒个位、分个位、日个位、月个位等74LS92十二进制计数器配合反馈复位实现秒十位、分十位、日十位等74LS93十六进制计数器经过反馈清零构成各种模数计数器74LS00四重二输入与非门各种清零、置数条件判定逻辑74LS08四重二输入与门多条件与组合如日31且月在大月74LS32四重二输入或门多条件或组合如大小月判断74LS04六反相器信号取反、脉冲整形CD4511BCD七段锁存/译码/驱动器将BCD码译成数码管段码74LS48BCD七段译码器共阴/共阳适配替代CD4511亦可8位数码管共阴或共阳显示年月日时分秒如果实训室只有74LS系列没有CD4060也可以用555定时器 RC振荡先做一个接近1Hz的可调脉冲源顶替但精度会差一些而且温漂明显只适合验证逻辑不适合做长期走时。有条件的话还是建议用晶振的方案。3. 秒脉冲与分频链万年历的心跳从哪来3.1 为什么偏偏是32.768kHz万年历的第一件事是得有稳定的秒。秒从哪来最省事的是用一个1Hz的信号源。但实际晶振很少有做成1Hz的因为晶体振荡器的频率越高、物理尺寸越小、成本越低而且石英晶体在某个特定频率点上的压电谐振特性最稳定。32.768kHz这个频率不是随便定的——它是2的15次方。这意味着只要用15级二分频就能十分规整地从32.768kHz得到1Hz。CD4060内部自带14级分频再加上一个外部触发器补一级刚好凑满15级。32.768kHz的晶振因为功耗极低也是电子表的标准晶振随手就能买到这就是万年历的心跳为什么选它的原因。CD4060的接法不复杂。它内部既包含振荡器配合外部的晶振和两个小电容工作又包含14级二进制分频链。从OSC引脚接入晶振再从不同分频输出脚引出信号比如Q4是2048Hz、Q14正好是2Hz。再把这个2Hz接给一个74LS74双D触发器做一次二分频就得到了标准的1Hz方波。这个1Hz信号要接到秒计数器的CP端作为整个系统的时钟源。3.2 秒进位链的搭建细节秒计数器由两个74LS90级联组成秒个位 秒十位。秒个位工作在十进制计数模式也就是QA、QB、QC、QD正常输出0到9。QA作为个位计数器的最高位变化频率是9→0时产生一个下降沿直接用QA接到秒十位计数器的CP端就能实现每10秒进一次位。秒十位理论上需要0到5共6个状态但74LS90本身是十进制直接计数会数到9。怎么办标准的做法是让74LS90从0计数到5然后当状态变成6的那一刻立刻清零回0。也就是把QB和QC引出来经过一个与门或直接用74LS90自带的异步清零端R0(1)、R0(2)把0110这个编码回馈给复位端。这里要注意清零是异步的一出现0110就被打回0000所以实际上你永远看不到6这个状态稳定存在屏幕上的十位只显示0到5。有的同学用手动复位的方式也就是数到5之后给一个手动脉冲清零这在验证逻辑时可以用但长期走时不准因为手动清零的时机和计数器本身不同步会多跑一小段时间。必须用反馈清零。3.3 分十位的习惯做法74LS92的偷懒方案做的时候我还发现一个更方便的组合秒十位和分十位可以直接用74LS92它是十二进制计数器天然数到0到11。我说的是天然数到9的逻辑对吧这里稍微绕一下74LS92内部实际上不能直接构成模6但它可以配合外部反馈在需要的时候清零。实操中的常见方案是用74LS92的QA对应1、QB对应2、QC对应4三个输出让它在0到5之间循环。当计数器状态是5二进制0101之后接下来它内部继续翻转会在某些引脚上瞬时出现一个高电平组合我们不去管它内部怎么走的只要检测到第6个脉冲到来后任一时刻出现需要清零的特征状态就用与非门把R0端拉高强制它回到0。不过说实话这种反馈清零设计最稳妥的做法还是统一用74LS90数据手册里的真值表大家都熟反馈条件不会因为内部结构差异出现意外。如果你手头74LS92多用它也可以但一定要用示波器确认清零瞬间没有产生多余的毛刺脉冲——这个问题我在第7节会专门讲。3.4 秒脉冲不是一定精确1Hz才叫秒这里想说一个关键认知万年历的秒精度取决于时基源。用32.768kHz晶振频率误差大约在±20ppm折算下来一天误差可能不到1秒连续跑一个月也不会差出1分钟。用555振荡器的话误差可能到几十分之一秒每秒累计下来几天就不准了。如果做完实物后发现走时偏快或偏慢可以在晶振两端并联一个5到30pF的微调电容。容量加大振荡频率略微降低容量减小频率略微升高。调到什么程度算好让万年历走24小时配合手机上的时间服务或者标准秒表对一下差在1到2秒以内就算合格。4. 时分秒计数链逢六十进一的工程实现4.1 六十进制级联的两种接法我推荐第二种秒和分都是60进制所以秒个位 秒十位和分个位 分十位的接法是完全一样的。这里就要把60进制计数器设计成一个可以反复复用的模块后面分和秒都直接照搬。60进制有两种实现思路第一种把秒十位的QB取出来作为进位信号接到分个位的CP端。因为秒十位每秒只在个位从9翻到0的时候才进一位所以QB的频率正好是每10秒一次也就是十分频。第二种也是我更推荐的不做级联进位脉冲的二次加工而是用6进10出的结构。具体说就是秒个位计数到9产生一个进位借位信号En这个En是宽度为1个秒周期的脉冲秒十位在En为高电平时加1。这样两级计数器是同步工作的避免了异步级联中因为信号传播延迟产生的毛刺。但在中小规模芯片实训中大多数人还是用异步级联因为芯片连线少、思路直观。我当时的做法是秒个位的进位脉冲取的是秒个位最高位QA接到秒十位的CP秒十位计数到5并清零时取它的QB对应十位权值输出作为分进位。这样每60秒产生一个上升沿给分个位的CP。分个位再级联分十位同理每60分产生一个进位给时个位。有兴趣可以对比一下两种接法的波形差异异步级联时进位信号会存在几个纳秒到十几个纳秒的传输延迟但对万年历这种秒级操作的系统来说完全无感。真正的风险点不在这而在清零瞬间毛刺会不会误触发下一级这个后面单独说。4.2 二十四进制和它背后的余数思维时计数器是24进制意味着小时的显示范围是00到23。常见的实现方案时个位仍然是十进制计数时十位则只需要在0、1、2之间变化。当时间走到23:59:59下一秒应清零到00:00:00。设计思路是这样的时十位用一片74LS90反馈清零让它只走0、1、2三个状态。时个位走0到9但当时十位2且时个位3时整个时计数器清零。怎么判断2和3同时出现从十位上引QC等于十进制2从个位引QB等于十进制2和QA等于十进制1三者在74LS08与门里做逻辑与输出接到所有计数器清零端。这就是逢24清零的硬件表达。这里要注意的是清零动作发生在23:59:59之后的那一个秒脉冲也就是24点整的时刻电路应当瞬间跳回0。但由于清零是异步的它可能在一个非常短暂的时刻先把时十位清零了而时个位还没有清零导致出现一个极短的不稳定状态。我在示波器上确实抓到过时十位已经变0、时个位还显示9的瞬间。这个不稳定状态虽然肉眼看不出来但如果它恰好被日计数器当成进位脉冲采到日期就会莫名其妙多加一天。规避方法有两个而且都很实用给进位脉冲加一个RC延迟或者施密特整形确保它只在计数器稳定后采样。时计数器清零后用一个单稳态电路或RC微分电路从清零信号中提取一个下降沿作为日计数器的进位CP保证进位发生在24:00:00之后的第一瞬间而不是清零毛刺期间。4.3 校时电路的两种思路校时看起来简单实际是很多人的翻车点。因为你不能在校时的时候把走时弄乱而且按键按下的时候还伴随着机械抖动处理不好就是按一下跳好几次。一种常用的校时思路叫快调法把校时按键按下去的时候把一个高频脉冲比如1024Hz直接接到对应计数器CP端计数器以极快速度加数手一松高频信号被切断计数器又恢复到秒脉冲驱动。这种方法的优点是电路简单缺点是你得一直按着按久了手酸而且很容易调过头。另一种是单步加一法每按键一次硬件消抖后产生一个单脉冲让目标计数器只加1。单步法精准适合精确校准到某一个时刻。但消抖电路必不可少——按键从按下到稳定通常有5到10毫秒的机械抖动如果不消抖一次按键会被当成多次。消抖方案我建议不要用软件延时因为这是纯硬件电路没有CPU直接用RC低通滤波加施密特触发器。RC时间常数取10毫秒左右施密特触发器用74LS14一片里面有6个反相器顺便还能对毛刺做整形。我当时把校时设计成分键位选择 单步加一一个四位拨码开关选择当前要调的是时、分、日、月、年然后一个公共按键负责加一。这样整个校时模块只占用一个按键和一个拨码开关逻辑非常清晰答辩的时候也好讲。5. 日历逻辑大小月、闰年与月末复位的硬骨头5.1 日期计数的复位条件才是整个题目的灵魂如果说秒分时是计数器的堆砌那日/月/年就是逻辑判断的艺术。日计数器不像时计数器那样固定24进制。它可能是28进制、29进制、30进制或者31进制取决于当前是哪个月、以及如果是2月的话是不是闰年。所以日计数器不能用固定清零必须在每个时刻都根据月和年的信息来动态决定清零条件。我们把日计数器的清零条件拆成下面几个逻辑分支如果当前月份是大月1、3、5、7、8、10、12日计数到31后清零并向月计数器进位。如果当前月份是小月4、6、9、11日计数到30后清零并向月计数器进位。如果当前月份是2月再判断今年是否闰年是闰年日计数到29清零不是闰年日计数到28清零。这个分支用硬件怎么实现核心是用穷举法写逻辑方程先把所有日31的条件编码出来再和月份编码组合。任何一个信号都不是凭空出现的它们都是计数器输出经过与门、或门组合出来的。5.2 闰年判断的组合逻辑方程闰年判断规则大家应该都知道能被4整除但不能被100整除的年份为闰年能被400整除的年份也算闰年。在硬件上实现整除判断其实就是判断一个二进制数末两位是不是0——因为能被4整除的数它的二进制最低两位必然是0。年计数器的设计通常只需要表示年份的后两位因为万年历主要显示的是月日时分秒显示完整四位年份需要太多数码管很多实训要求只显示后两位。那么能被4整除就等价于看年十位的QB和年个位的QB这两位同时为0说明这一年的二进制末两位为0即能被4整除。如果用标准四位年份整除4的判断仍然是看最低两位整百年份如1900、2000的判别则需要知道是否世纪年再判断能否被400整除。做完整版的时候可以加一个世纪寄存器但大部分实训做到后两位已经足够。得到闰年使能信号后2月的清零条件逻辑就清楚了平年2月日计数器到28清零。闰年2月日计数器到29清零。用逻辑表达式写就是日清零信号 (月1 且 日31) 或 (月3 且 日31) 或 ... 或 (月2 且 闰年0 且 日28) 或 (月2 且 闰年1 且 日29)这个表达式看起来长但实际分解到74LS系列芯片上也就是几片与门、或门的事。我当时是把月编码对应的输出端和日编码对应的输出端分别接进74LS08再把各路的输出接进74LS32最后得到一个总的清零信号同时送到日计数器的清零端和月计数器的CP端。5.3 星期几的计算和显示有的题目要求顺便显示星期。日期和星期之间的关系是给定一个基准日期往后每过一天星期数加1到7就归1。这个规律在硬件里做起来不难难的是初始校准上电时你得手动把今天是星期几设置进去。所以星期计数器其实就是一个模7计数器它每天也就是日计数器进位的那一瞬间加1到7之后回1有的用0到6表示显示时再映射成1到7。星期计数器可以用74LS90反馈清零构建模7也可以用3个D触发器自己搭一个模7状态机。我当时直接用了74LS90因为它自带清零端反馈态是0111对应7时立刻清零回0001保证显示1到7。这里有一个很容易忽略的点星期计数器的CP必须是日进位信号但这个进位信号过了月判断逻辑之后波形可能已经带了毛刺。稳妥的做法是在星期计数器前面加一级二分频或单稳态整形确保每24小时只接收一个干净的脉冲。反正日计数器清零和月计数器进位是同时发生的如果你发现星期跳得不准或者一天跳了两次多半就是毛刺问题。5.4 月份天数译码的另一种实现查表式组合逻辑手工推导那一大堆日清零条件的表达式容易漏项。我自己第二版方案里改用了查表式的组合逻辑把月份的BCD码作为输入用一个只读存储器或者用二极管矩阵译码器直接输出本月最大日数的BCD码。日计数器计数到这个数值后用一个比较器74LS85比较相等输出清零信号。这种做法从思路上更像软件里的查表法工程上更优而且调错更容易因为在只读存储器上改一个二极管位置就等于改了一条规则。不过用只读存储器的做法在实训答辩时可能会被追问原理你得能解释清楚二极管矩阵每一位的编码含义。如果你只想快速通过老老实实用与或门推导也完全没问题两种方案我用下来最大的差距是查表方案改起来快与或门方案讲起来直观。6. 显示驱动动态扫描与七段译码的时序细节6.1 数码管直接静态显示最费IO动态扫描省一半万年历要显示的位数很多年两位、月两位、日两位、时两位、分两位、秒两位一共12位。如果每一位都用一片CD4511单独锁存驱动需要12片译码器而且每片都要占4根BCD数据线板子上的走线会非常恐怖。所以绝大多数方案都采用动态扫描显示。动态扫描的原理一句话人类眼睛的视觉暂留效应。12个数码管其实不是同时亮的而是以一个很快的速度轮流点亮每一时刻只有一位在亮但因为扫描速度达到几百赫兹肉眼看到的就是12位同时常亮。具体实现把所有数码管的段选线a到g共7根加小数点dp就是8根并联在一起接到同一组CD4511译码输出每一位数码管的公共端位选单独引出来由位选译码器控制。显示某个数字时先把对应BCD码送上数据线再让该位公共端导通保持一小段时间然后切换到下一位。6.2 扫描频率和刷新率的工程取舍扫描频率不是越高越好。太高了每一位点亮时间太短亮度会明显下降太低了人眼会看到闪烁。经验值总扫描频率在500Hz到1kHz之间比较合适12位轮流扫的话每一位的刷新率大概在40到80Hz已经超过人眼闪烁融合频率。我当时直接用CD4060分频链里现成的信号做扫描时钟取1024Hz作为扫描节拍用一个3位二进制计数器循环产生000到101六个状态对应前6位再用另外几个状态切换后6位。这里要注意一个原则数据线和位选必须同步切换如果数据先变了、位选还没切或者反过来显示上就会出现极其短暂的重影。为了减少重影很多设计会在CD4511的输出端和数码管段选之间加一组三态缓冲门74LS245在移位瞬间先禁止输出等数据线和位选都稳定了再打开。这个细节对显示质量影响非常大。我当时第一版没有加数码管上的数字边缘总是有淡淡的鬼影怎么查都查不出来后来才想到是切换瞬间的串扰。6.3 共阴和共阳的选择以及限流电阻数码管有两种共阴和共阳对应的英文也经常简写为CC和CA。共阴极数码管的公共端接地段选端给高电平点亮共阳极则相反。CD4511只能驱动共阴极数码管因为它的输出是锁存的高电平段码信号。如果你手里是共阳极数码管可以用74LS48集电极开路输出加外接上拉电阻或者用PNP三极管做位选驱动、CD4511输出经过反相器再接段选。千万别把限流电阻省了。CD4511的输出能力看起来能直接点亮LED但长期满负荷工作会发热而且不同段之间的电流不一致会导致数字亮度不均匀。标准做法是每根段选线上串一个220欧到330欧的限流电阻。经验值是电源电压5VLED压降约2V取220欧时每段电流约13mA亮度已经非常够用。如果是动态扫描每一位的点亮时间是1/N所以平均亮度低了可以适当减小限流电阻到100到150欧提高瞬时电流来补偿。但要注意不要超过芯片数据手册给出的最大输出电流。6.4 显示内容的BCD切换万年历内部计数的BCD码分布在很多片计数器上但CD4511的数据输入端只有一组。所以显示部分的核心是一个多路选择器把年、月、日、时、分、秒各位的BCD码作为输入由扫描计数器选通其中一组送给CD4511。如果用74LS157四重二选一来搭一片只能切换2路4位BCD码12位需要11片。这个数量看起来多但74LS157便宜且引脚规整。我用的另一个方案是用两片74LS151八选一分别传输BCD码的低两位和高两位。因为每个BCD码是4位所以需要4个八选一开关并行工作分别对应bit0、bit1、bit2、bit3。这样只需要4片74LS151加一位八选一译码器就能实现12路BCD码的切换。选择信号直接用扫描计数器的输出这样哪一位数码管亮和哪一组BCD码送上去天然同步不需要额外的同步逻辑。7. 仿真与实物调试那些必须踩一遍的坑7.1 仿真通过不等于实物能跑我先在Multisim里把整个电路图搭了一遍逻辑上完全正确分频、计数、清零、显示全都没问题。但等实物焊接完上电第一秒就发现秒个位乱跳有的数字跳过去直接看不见有的数字停留时间特别长。排查了一圈原因发现Multisim仿真里所有门电路都是理想器件没有延迟而实物芯片呢74LS系列的传输延迟是十几纳秒CD4000系列几十纳秒。不同芯片延迟不一样导致异步清零信号到达各个计数器的时间不一致出现了竞争冒险。这个问题的典型表现就是清零瞬间产生毛刺。理论上计数到某个值应该立即清零但由于清零信号从多个与门、或门组合出来不同路径延迟不同可能在信号到达之前计数器又多走了一拍。解决方案前面已经提过在清零信号的路径上加入适当的RC延迟让所有计数器清零端同时收到信号或者用同步置数代替异步清零。7.2 毛刺是万年历最隐蔽的敌人毛刺不仅影响计数还会沿着进位链传递。比如日计数器和星期计数器它们的CP信号都是上一级清零时刻产生的脉冲。如果这个脉冲带有毛刺星期计数器可能一天跳两次。我在排查星期偶尔跳成别的数这个问题时用示波器挂在星期计数器的CP端观察确实看到在正常的日进位脉冲两边各有一个只有几十纳秒宽的小尖峰。后来在每个进位脉冲后面加了一级RC低通加施密特整形毛刺全部被滤掉问题彻底消失。建议在做实物之前先拿示波器把所有级间进位信号都看一遍。正常的进位应该是A处B处波形都是干净的单脉冲下降沿明显无多余抖动。如果看到毛刺不要在逻辑设计层面死磕直接用整形电路解决更高效。示波器是实物调试的第一工具比万用表好用十倍。7.3 晶振不起振是新手最容易懵的问题接好晶振和CD4060后上电发现整个电路没有任何走时迹象。拿示波器测CD4060的输出发现完全没波形。新手很容易怀疑是不是CD4060坏了但真正的罪魁祸首往往是晶振两端的负载电容没接或者接错。CD4060的数据手册要求晶振两端各接一个20到30pF的对地电容。如果你图省事只把晶振接在OSC1和OSC2之间没有对地电容振荡器很可能起振不了或者起振后频率严重偏离。另外晶振和芯片之间的连线越短越好太长的话分布电容会改变振荡条件。我当时把晶振焊在面包板上引线长达5厘米结果也是起振困难缩短导线后才稳定。如果示波器只能看到几十毫伏的微弱正弦波不算起振成功必须看到CD4060输出端有整幅的方波才说明分频链真正工作。7.4 数码管段选和位选接反的经典症状数码管不显示或者乱显示九成是段选和位选搞反了。段选是控制显示什么数字的7条线位选是控制哪一位亮的公共端。共阴数码管的公共端是com脚一般有1到2个需要接地或接位选驱动共阳则相反。一个快速判断方法把位选强制接成只有一位导通然后用一根导线依次短接段选线到电源或到地观察对应段是否点亮。如果点亮顺序和datasheet给出的段顺序一致说明引脚定义没搞错。这个操作花5分钟能省后面2小时的排查。我踩过的具体问题是位选用了PNP三极管驱动但三极管的基极需要低电平才能导通我从74LS138译码器出来的是高电平选中结果一上电所有位都不亮。后来在74LS138和三极管之间加了一级反相器才解决。这种电平极性不匹配的错误靠想是想不出来的必须用万用表测三极管的基极电压才能定位。7.5 电源滤波电容一个都不能省最后一个大坑电源噪声。实训台上的5V稳压电源输出本身是干净的但面包板或自制PCB上导线很长芯片翻转时瞬间电流会在电源线上产生压降导致同一块板子上别处的逻辑电平被拉低尤其是数码管点亮的瞬间电流能到几十毫安电源线上会瞬间掉电。解决方式靠近每一排芯片的电源引脚处加0.1μF去耦电容在板子总电源入口加一个100μF到470μF的电解电容。数字电路设计中每个芯片电源引脚旁一个104电容是基本功但很多同学嫌麻烦结果就是系统不稳定、现象千奇百怪。加完这些电容之后我把之前时好时坏的毛病根治了。如果你在做实物时遇到重新上电后状态不同不按规则走时请先怀疑电源再去怀疑逻辑。8. 可扩展与答辩加分项如果你做完基础版还想加点深度这几个方向实操性很强而且答辩时老师一听就觉得你是真懂电路。整点报时是最自然的扩展时计数器的进位脉冲正好是每小时一个把它接到一个单稳态触发器上驱动蜂鸣器响一到两秒就完成了整点报时。如果想做几点响几声需要一个把小时的数值转换成对应个数脉冲的逻辑这个可以用计数器预置数来实现原理不难但很体现功力。带闹钟的万年历是另一个方向需要额外一组预设时间寄存器和比较器当时钟计数器的输出和预设值相同时输出一个匹配信号触发蜂鸣器。74LS85比较器可以级联把时分秒各位的BCD码并行送去比较。这个扩展不仅实用还能把存储 比较 控制这条完整的数据通路串起来。再加一个温度显示用DS18B20温度传感器加一片简单的译码显示电路把当前温度同时显示在数码管上。这个扩展其实更偏单片机但如果你在数字电路板上实现了能说明你具备把模拟量采集和数字显示打通的能力。我在最终版里做了整点报时和闹钟两个功能。整点报时用了CD4098双单稳态触发器闹钟用两片74LS85级联比较时和分预设值用拨码开关设置。整个扩展部分花了不到一个晚上但答辩时老师明显对预设值比较这部分更感兴趣多问了将近十分钟的细节。最后说一个实际体会万年历这个题最花时间的不是接线不是代码而是排查那些看起来一个地方错了但源头在另一个地方的问题。不要怕出错出错越多你对异步清零竞争冒险电平极性这些概念的理解就越深。做完这个题再回头看课本上那些好像很抽象的原理你会发现它们其实全都在你的电路板上活生生地跑着。
返回列表