ARTICLE DETAIL

资讯详情

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

微机原理与接口技术课设实战:四位可预置位选倒计时器设计与实现

微机原理与接口技术课设实战:四位可预置位选倒计时器设计与实现 简介这是一份微机原理与接口技术课程设计报告主题为基于8255A并行接口与TD-PIT实验系统的倒计时器设计面向计算机、机械等专业本科生及课程设计初学者。报告从设计功能讲起梳理了两位8段共阴数码管显示、开关K0暂停/启动、K1复位、倒计时结束后LED跑马灯、按键设定初值与退出等完整逻辑随后给出系统总设计原理和硬件框架原理图详细介绍8255A内部结构、引脚功能、工作方式控制字及C口置位/复位控制字并划分8255A初始化、显示、延时、控制、LED点亮等程序模块附录含系统硬件框架与程序流程图。资源为1个PDF文件大小487KB内容排版规范、图文与代码结合既可作为课程设计报告模板也可帮助理解并行接口、数码管与LED显示、键盘扫描等软硬件协同方法。平台目前已有204人浏览学习适合正在完成倒计时项目或需要8255A应用参考的读者。 每年到这个时间就有不少电子信息、自动化、计算机专业的同学被“微机原理与接口技术课程设计”折腾得够呛尤其是“倒计时”这个题目。你拿到手的可能只是一份PDF任务书上面写着“四位可预置位选倒计时电路”然后要求用微机原理的知识把它实现出来。很多人的第一反应是这不就是个电子秒表吗但真正动起手来才发现这里面的坑真不少。这篇文章我打算从需求拆解、硬件选型、电路设计、软件编程到调试排错把一个基于8086/8088系列CPU的倒计时器完整地讲一遍。整个方案围绕“微机原理”和“接口技术”两个核心展开用到8253定时计数器、8255A并行接口、数码管动态扫描和矩阵键盘最后能实现四位数字显示、按键预置初值、倒计时到零自动报警。无论你是正在赶课设、准备答辩还是单纯想把接口芯片用明白这篇都值得当一份实战参考。1. 设计思路先把题目拆成一张需求表1.1 “四位可预置位选”到底在说什么“四位可预置位选倒计时电路”这句话看起来绕拆开其实就三个关键词四位、可预置、位选。“四位”是指显示部分支持4位十进制数字常见形式是4个LED数码管可以显示0000到9999。倒计时的时间范围一般用秒为单位比如预置90秒显示“0090”然后每秒减1一直减到“0000”。“可预置”指倒计时不是从固定值开始用户可以通过键盘输入任意初始值比如设置60秒、300秒。这一点很关键它决定系统必须有人机交互接口不能只在上电时写死一个数。“位选”这个词有两层含义。第一层是硬件上的位选信号动态扫描显示时需要轮流选中千位、百位、十位、个位四个数码管第二层是操作上的位选预置时间时你按一下位选键当前可修改的位数会切换被选中的那一位显示闪烁方便逐位输入。所以课设的实际需求可以整理成下面几条上电后显示一个默认初值或显示“0000”通过矩阵键盘进入预置模式逐位设置初始时间按下启动键系统按秒递减并实时刷新显示计到0时停止计时并驱动蜂鸣器报警按下暂停/复位键能暂停或重新开始。这些功能看起来简单但放到“微机原理与接口技术”的背景下全部要通过CPU、并行接口、定时器和汇编程序来协同完成难度一下子就不一样了。1.2 方案选型为什么是8086 8253 8255A既然课程名叫“微机原理与接口技术”设计核心就应该落在可编程接口芯片的使用上而不是简单的logic电路搭一个倒计时器。如果你用74LS192加555定时器做虽然速度更快、成本更低但和课程目标完全跑偏。我当时做的方案是8086 CPU最小工作模式、8253/8254定时计数器、8255A并行接口、4个共阴数码管、4x4矩阵键盘、蜂鸣器和若干逻辑门、三极管。这套方案里每个芯片都有明确分工8086负责运行程序进行中断处理、数据运算和I/O控制8253产生精确的时间基准通过定时中断驱动秒计数8255A扩展并行I/O口A口输出段码B口输出位选C口接键盘行列线74LS138端口地址译码给8253和8255A分配独立I/O地址数码管和键盘完成显示和人机交互蜂鸣器倒计时结束时输出报警提示。为什么不用8259A中断控制器这个课设只有一个定时中断源8086的INTR引脚直接接8253的OUT0信号就够了8259A属于加分项不是必须项。如果你想在报告里体现更深的理解加上8259A做中断优先权管理也可以但基础功能用不上。1.3 系统整体结构系统的数据流向大体是这样8253的计数器0工作在方式3输出方波或周期脉冲信号接8086的INTR引脚每到一个固定时间间隔触发一次中断。中断服务程序里维护一个软计数器累计到1秒就对倒计时剩余时间减1。显示部分由8255A的A口出段码、B口出位选主循环不断刷新4个数码管。键盘扫描通过C口完成按下按键后在相应变量中修改预置值或控制状态。听上去不复杂但真正到实现环节有两件事最容易翻车一是定时初值算错导致“一秒”其实变成了0.8秒甚至2秒二是动态扫描时序处理不好数码管要么全亮乱码要么亮度不均。下面我把硬件和软件分开讲。2. 硬件电路设计三个关键模块的接线与参数计算2.1 定时/计数器8253时间基准怎么产生倒计时最核心的就是“秒”这个基准。8253内部有3个独立的16位计数器每个计数器都有CLK时钟输入、GATE门控输入和OUT输出。很多新手在这里第一反应是让8253直接定时1秒不就行了这个想法在理论上没问题但8253的计数初值只有16位最大是65536。如果CLK输入是1MHz要定时1秒初值需要1,000,000远远超出16位能表示的范围。所以实际做法是让8253产生一个较短的中断周期比如10ms然后在中断服务程序里用软件累计100次凑够1秒。这样设计的好处是中断周期短即使后面要扩展毫秒级计时、计时精度更高也完全够用同时初值在16位范围内计算不会溢出。初值计算公式很简单初值 输入时钟频率 / 期望中断频率假设给8253的CLK0输入频率是1MHz希望每10ms进一次中断那么中断频率是100Hz初值 1000000 / 100 10000计数器0的控制字设计为36H含义是选择计数器0先写低8位再写高8位工作在方式3二进制计数。方式3是方波发生器OUT端输出连续的方波方波周期就是10ms上升沿或下降沿都可以触发中断请求。接线方面8253的OUT0接到8086的INTR引脚。这里要注意8086的中断输入是电平或边沿触发8253方式3输出的是方波高电平时INTR一直有效处理不当会导致中断反复进入。稳妥做法是通过一个8259A或者用单稳电路把OUT0的上升沿转成一个短暂脉冲。如果实验箱上已经做了边沿触发处理直接用即可。我当时在Proteus里仿真没问题到硬件上就出现了“中断风暴”后来在OUT0和INTR之间加了一个单稳触发器才解决。2.2 8255A 数码管动态扫描显示的实现细节显示模块用4个共阴极数码管用动态扫描方式。所谓动态扫描就是同一时刻只点亮一位数码管轮流刷新千位、百位、十位、个位利用人眼视觉暂留让4位数看起来是同时亮的。8255A的A口接到4个数码管的段选端a到dpB口接到位选端。这里有一个非常关键的设计点段选输出是高电平还是低电平取决于数码管是共阴还是共阳。共阴极数码管段码为高电平时对应段点亮位选端通常加PNP三极管驱动位选为低电平时选通某一位。动态扫描的时序可以用下面这个过程描述先关闭全部位选防止当前显示内容残留到下一个位A口输出当前位的段码B口输出位选选中目标位延时约1到2毫秒切换下一位。4位刷新一轮大概需要4到8毫秒刷新率约125到250Hz肉眼看不到闪烁。如果低于50Hz就能明显看到闪动。段码表也要提前准备好。共阴极数码管显示0到9的段码如下数字段码(Hex)03F10625B34F46656D67D70787F96F我踩过的一个坑是段码表里小数点dp位默认是0显示数字没问题但做预置模式“闪烁”效果时如果想让某一位的小数点点亮作为选中标记需要单独对段码做“或上80H”的处理别改错位置。2.3 键盘输入与“位选”预置电路键盘用4x4矩阵键盘这样8根线就能扩展16个按键。键盘的行线接8255A的C口低4位列线接C口高4位。扫描方式很经典先把所有行线输出低电平读取列线电平判断有没有按键按下再逐行输出低电平读取列线确认具体是哪个键。16个按键的功能分配我建议这样规划数字键0到9用于输入预置时间“设置”键进入或退出预置模式“位选”键切换当前要修改的位“启动暂停”键开始倒计时或中途暂停“复位”键停止倒计时并恢复初值。在预置模式下按下“位选”键当前编辑位在千、百、十、个之间循环。为了直观当前位的显示可以做“闪亮”效果比如每0.5秒熄灭0.5秒提示用户这里正在修改。这个闪烁用软件里的一个标志位就可以实现不必额外电路。另外按键消抖一定不能省。机械按键按下和松开的瞬间会有抖动持续时间通常几毫秒到十几毫秒。我当时的做法是检测到按键状态变化后延时10ms再读一次两次结果一致才认定为有效按键。3. 软件流程与汇编实现让硬件按你的思路跑起来3.1 主程序框架中断只做计时主循环负责显示和键盘软件架构上我建议把功能拆成三块主循环负责键盘扫描、预置状态处理、显示刷新定时中断服务程序只维护系统节拍和倒计时变量初始化模块设置8255A工作方式、8253工作方式和中断向量。这里有一个很重要的设计原则中断服务程序尽量短。有些人习惯在中断里顺便刷新显示、扫描键盘结果导致中断占用时间太长主循环反而没机会干活。实际上定时中断只需要做两件事把10ms计数加1当累计到100次时把倒计时秒数减1并更新状态。显示和键盘全部放到主循环里轮询这样逻辑清晰也方便调试。主循环的伪代码类似下面这样初始化8255A 初始化8253 设置中断向量 开中断 主循环 调用键盘扫描子程序 根据按键更新预置值或运行状态 调用显示子程序刷新数码管 如果倒计时到0启动蜂鸣器报警 循环3.2 中断服务程序中的秒递减逻辑中断服务程序的执行过程是这样的每次进入中断先保护现场把当前计数值加1。如果当前计数值小于100直接恢复现场返回如果等于100说明已经过去1秒把计数值清零同时把倒计时剩余秒数减1再判断是否减到0。注意倒计时剩余秒数在内存里最好拆成“十进制的千位、百位、十位、个位”存储不要只存一个二进制数。因为显示子程序和位选修改都要单独取每一位如果只存二进制数每次显示还得做除法转十进制既慢又容易出错。我当时是定义了一个4字节数组比如COUNT_DATA分别存千、百、十、个位的数字。判断到0的条件也不能马虎。假如你预置的是15秒中断100次减一次减到0后要立即清掉运行标志同时可以置一个报警标志让主循环去驱动蜂鸣器。如果不清运行标志中断会继续对0做递减出现“负数倒计时”数据显示成乱码。3.3 显示刷新与键盘扫描的配合显示刷新很简单每次取出4个位的数字查段码表然后按动态扫描的流程输出到8255A。为了提高亮度每个数码管的导通时间不要太短我常用2ms也就是一帧8ms刷新率125Hz。键盘扫描和显示最好做成“非阻塞式”。什么意思就是按一次键程序只处理一次不要因为主循环跑得快一次按键被识别成几十次。我的处理方法是设置一个“按键按下标志”检测到新按键时先把标志置位并保存键值主循环处理完这次按键后再清除标志。如果按键还没松开即使再次扫描到也不重复处理。预置闪烁的实现也放在显示子程序里。当处于预置状态时把当前选中位的显示数据在某些周期置为全灭比如用一个软件计数器控制0到25次刷新正常显示25到50次刷新显示熄灭这样就能看到“闪烁”的效果。3.4 关键汇编代码8253与8255初始化及中断处理这里给出最核心的三段代码其他部分可以根据环境调整。第一段是8253初始化假设控制字地址为43H计数器0地址为40H输入时钟1MHz定时10ms; 8253初始化 MOV AL, 36H ; 计数器0先低后高方式3二进制 OUT 43H, AL MOV AX, 10000 ; 初值 1MHz / 100Hz 10000 OUT 40H, AL ; 先写低8位 MOV AL, AH OUT 40H, AL ; 再写高8位第二段是8255A初始化假设控制字地址为63HA口、B口、C口都工作在方式0输出; 8255A初始化 MOV AL, 80H ; 方式0A/B/C口全部输出 OUT 63H, AL第三段是中断服务程序节选核心逻辑如下; 假设系统时钟中断周期为10msCOUNT_1S为秒计数变量, TIMER_CNT为10ms累加变量 INTERRUPT: PUSH AX PUSH DS MOV AX, DATA MOV DS, AX INC TIMER_CNT ; 10ms计数加1 CMP TIMER_CNT, 100 ; 是否到1秒 JNE INT_EXIT MOV TIMER_CNT, 0 ; 清零节拍计数 CMP COUNT_1S, 0 ; 是否已经到0 JE INT_EXIT DEC COUNT_1S ; 秒数减1 INT_EXIT: POP DS POP AX IRET这段代码里有一个细节先判断是否到0再减1。如果当前已经是0就不做递减避免出现负值。4. 调试实录常见问题、排查步骤与避坑心得4.1 常见问题速查表下面这张表是我在课设和帮同学调试过程中遇到频率最高的问题基本覆盖90%的“倒计时器不工作”情况。现象可能原因排查与解决数码管全亮且乱码段码表错误或位选没关断先验证段码表再检查扫描程序是否先熄灭全部位选显示数字正常但明显闪烁动态扫描刷新率过低缩短每位导通时间确保完整扫描周期小于20ms计时偏快或偏慢8253初值算错或输入时钟频率不对用示波器实测CLK频率重新按公式计算初值按键没反应行/列线与8255C口接反检查硬件接线软件扫描时先输出全0再读列线按一次键执行多次没有做消抖或没有按键释放判断软件10ms延时消抖增加按键释放检测倒计时到0后继续减中断服务程序没有判断零值在递减前判断当前秒数是否已经为0运行中按启动没反应主循环被某个子程序卡住检查是否有死等延时显示和键盘必须轮询执行4.2 现场排查思路示波器、单步和断点很多同学在Proteus里仿真一切正常一上硬件就全部失灵这里我分享一个排查思路。先把系统拆成独立的模块逐个验证。第一步只给数码管程序看是否能正常显示固定数字第二步给8253单独写一个测试程序让OUT0接一个LED或示波器看输出方波频率是否符合预期第三步再测键盘最后才把中断和倒计时逻辑加入。调试中断时最容易出问题的是中断向量没有设置正确。8086的中断向量表在内存0000H到03FFH区域每个中断向量占4个字节低2字节放偏移地址高2字节放段地址。很多实验机上使用DOS的INT 08H或用户自定义中断号必须确认实际挂载的中断号与你CPU响应的是同一个。示波器在这个排查过程中作用非常大。先看CLK0波形是否干净再看OUT0频率是否为100Hz然后用逻辑分析仪同时抓位选和段码看扫描顺序是否符合“千位-百位-十位-个位”的循环。如果位选波形正常但段码波形不对问题一定出在段码表和数据组织反过来则可能出在三极管驱动或数码管类型判断上。4.3 我的几点实操体会这个课设做完我最大的体会是硬件上“能响能亮”不是终点稳定才是。数码管动态扫描看似简单驱动电流不够时亮度不均匀驱动电流太大又可能拉低8255A输出电平导致别的口线工作异常。所以每个段选线上该加限流电阻就加位选三极管不要省这是保证长时间运行不发热、不乱码的前提。第二个体会是汇编中的变量组织和中断现场保护。课程设计报告里评审老师特别喜欢问“中断服务程序里为什么先PUSH寄存器”“为什么不在中断里调用DOS功能调用”。这些问题本质上考察你是否理解中断会打断任意主程序状态。中断里只做最少的操作所有寄存器用前先保存、用后恢复这是底线。最后说一个偏门但很实用的小技巧如果你在实验箱上做端口地址未必和我上面一致。有的实验箱把8255设在0600H地址段有的8253在0040H段。拿到设备第一件事先查原理图确认片选地址再写程序。地址写错所有初始化代码都等于白写还容易查半天查不出来。这个课设做完之后你会发现“接口技术”这门课里学的很多零碎知识点真的能串起来端口译码、定时器初值计算、并行输入输出、中断向量、键盘消抖、动态显示全都在一个系统里协同工作。如果你还有余力可以在这个基础上加一个秒表模式或者用8259A把按键中断也做进去报告和答辩的含金量会明显提升。最后再分享一个我在答辩时被问过的问题“如果要把倒计时精度提高到毫秒级软件架构哪里要改”答案其实很简单把8253的中断周期改成1ms中断服务程序里的秒累加阈值从100改成1000主循环里的显示和键盘逻辑完全不用动。这也是我把中断周期设计为10ms而不是直接定时1秒的原因——系统留有余量扩展起来才不伤筋动骨。本文还有配套的精品资源点击获取
返回列表