微机原理与接口技术课程总结 | 10道汇编编程 + 灯光控制器设计(附完整代码与仿真方案)

微机原理与接口技术课程总结 | 10道汇编编程 + 灯光控制器设计(附完整代码与仿真方案) 前言本文是对《微机原理与接口技术》课程作业的完整总结包含两部分内容程序设计专题10 道 8086 汇编语言编程题涵盖字符串输出、BCD 码转换、分支结构、移位运算、四则运算、补码、分段函数、数组搜索、十六进制输出、键盘输入等核心知识点。课程设计大作业基于 8086 最小系统 8255A 可编程并行接口芯片的灯光控制器设计支持 6 种灯光模式、数码管显示、一键复位等扩展功能使用 Proteus 进行电路仿真。所有程序均在 DOSBox MASM 5.0 环境下编译运行通过电路仿真使用 Proteus 8.17。仓库地址12367257321/Proteus-8086-LED: 8086的微机原理灯光控制器设计 能利用8086进行LED小灯亮灭控制 能用8个以下按键/开关控制8个小灯的亮灭 能实现对小灯单独和整体组合的控制 绘制电路图编写相应的控制程序 其他扩展功能。一、开发环境搭建1.1 DOSBox MASM 5.0DOSBox 是运行 16 位 DOS 程序的模拟器MASM 5.0 是微软经典的 8086 宏汇编编译器。安装步骤下载并安装 DOSBox 0.74创建工作目录例如 D:\DosBox\MASM将 MASM 相关文件MASM.EXE、LINK.EXE、DEBUG.EXE放入该目录修改 DOSBox 配置文件通常在 C:\Users\用户名\AppData\Local\DOSBox\dosbox-0.74.conf在末尾添加ini12mount c D:\DosBox\MASMc:可选修改显示参数让窗口更大ini12windowresolution1280x960outputopengl1.2 编译运行流程asm1MASM XXX.ASM; ; 汇编生成 .OBJ 文件LINK XXX.OBJ; ; 链接生成 .EXE 文件XXX.EXE ; 运行程序23部分简单程序如纯输出程序可以跳过 LINK 步骤直接用 DEBUG 调试。1.3 Proteus 8.17Proteus 用于硬件电路仿真支持 8086 系列 CPU 和常用外设芯片。在 Proteus 中搭建电路后将汇编程序编译生成的 HEX 文件加载到 ROM 芯片中即可运行仿真。二、程序设计专题10 道编程题2.1 题目总览序号 文件 题目 核心知识点1 A.asm 输出姓名拼音 字符串定义DB、INT 21H 的 09H 功能2 B.asm 单位 BCD 码转 ASCII BCD 码拆分、ASCII 码转换3 C.asm 小写字母转大写 CMP JA/JB 分支结构4 D.asm 多位 BCD 码移位输出 SHR 移位、AND 掩码、BCD 拆分5 E.asm 多位加减乘除 MUL/DIV 指令、子程序调用、进制转换输出6 F.asm 双字负数补码 NOT 取反 ADC 进位传递7 G.asm 分段函数求 Y 三级分支X0 / X10 / X108 H.asm 数组寻目标数据 LOOP 循环 CMP JE 线性搜索9 I.asm 多位十六进制输出 ROL 循环左移 AND 掩码 条件转换10 J.asm 键盘缓冲输入 INT 21H 的 0AH 功能缓冲输入2.2 各题详解第 1 题输出姓名拼音A.asm功能在屏幕上显示字符串 wangyilin。核心代码思路asm12345678910111213DATA SEGMENTMSG DB wangyilin, 0DH, 0AH, $ ; 定义字符串$ 结尾DATA ENDSCODE SEGMENTMOV AX, DATAMOV DS, AXMOV DX, OFFSET MSG ; DX 指向字符串首地址MOV AH, 09H ; INT 21H 的 09H 功能输出字符串INT 21HMOV AH, 4CH ; 退出程序INT 21HCODE ENDS要点DS 寄存器需要先指向数据段字符串必须以 $ 结尾。第 2 题单位 BCD 码转 ASCIIB.asm功能将压缩 BCD 码 05H 转换为 ASCII 码 35H 并显示。核心思路BCD 码的每一位0~9加上 30H 即为对应的 ASCII 码。asm12345MOV AL, 05H ; BCD 码 05ADD AL, 30H ; 转为 ASCII35H → 字符 5MOV DL, ALMOV AH, 02H ; INT 21H 的 02H 功能输出单字符INT 21H第 3 题小写字母转大写C.asm功能输入小写字母 a输出大写 A。核心思路利用 CMP 条件跳转实现分支结构。小写字母减 20H 即为大写。asm1234567891011MOV AH, 01H ; 读键盘输入INT 21HCMP AL, a ; 比较是否为小写JB NOT_LOWER ; 低于 a 则跳转CMP AL, z ; 比较是否超出小写范围JA NOT_LOWER ; 高于 z 则跳转SUB AL, 20H ; 小写转大写NOT_LOWER:MOV DL, ALMOV AH, 02H ; 输出字符INT 21H第 4 题多位 BCD 码移位输出D.asm功能将 0506H 拆分为各个 BCD 位并以十进制形式显示。核心思路通过 SHR 右移 4 位取高半字节AND 0FH 取低半字节分别加 30H 转 ASCII。asm123456789101112MOV AX, 0506HMOV BL, AH ; 取高字节 05HMOV CL, 4SHR BL, CL ; 右移 4 位 → 0AND BL, 0FH ; 掩码取低 4 位ADD BL, 30H ; 转 ASCIIMOV BH, AL ; 取低字节 06HMOV CL, 4SHR BH, CL ; 右移 4 位 → 0AND BH, 0FHADD BH, 30H踩坑记录8086 中 SHR AL, 4 是非法指令移位次数 1 时必须用 CL 寄存器需要先 MOV CL, 4 再 SHR AL, CL。第 5 题多位加减乘除E.asm功能实现多位数的四则运算并输出结果。核心思路使用 ADD/SUB/MUL/DIV 指令进行运算编写 PRINT_HEX 子程序将结果以十六进制或十进制形式输出。asm1234567891011121314; 加法示例MOV AX, 1234HMOV BX, 5678HADD AX, BX ; AX 68ACH; 乘法示例无符号MOV AL, 12 ; 被乘数MOV BL, 5 ; 乘数MUL BL ; AX AL × BL 60; 除法示例无符号MOV AX, 100 ; 被除数MOV BL, 7 ; 除数DIV BL ; AL 商 14, AH 余数 2第 6 题双字负数补码F.asm功能对 32 位双字数据求补码。核心思路补码 取反 1。对于双字数据低 16 位取反加 1高 16 位取反后加进位ADC。asm12345; 假设双字数据在 DX:AX 中DX 高位AX 低位NOT AX ; 低 16 位取反NOT DX ; 高 16 位取反ADD AX, 1 ; 低 16 位加 1ADC DX, 0 ; 高 16 位加进位要点ADC带进位加法是关键它把 ADD 产生的进位传递到高位。第 7 题分段函数求 YG.asm功能根据 X 的值计算分段函数Plain Text123{ -1 X 0Y { 2X1 0 ≤ X 10{ X² X ≥ 10核心思路三级分支判断使用 CMP JL/JGE 实现。asm123456789101112131415161718192021CMP X, 0JL NEGATIVE ; X 0CMP X, 10JL MIDDLE ; 0 ≤ X 10; X ≥ 10 的情况MOV AX, XMUL AX ; AX X²JMP DONENEGATIVE:MOV AX, -1JMP DONEMIDDLE:MOV AX, XMOV BL, 2MUL BL ; AX 2XADD AX, 1 ; AX 2X 1DONE:MOV Y, AX第 8 题数组寻目标数据H.asm功能在数组中查找指定数据找到则显示其位置。核心思路LOOP 循环 CMP 比较 JE 相等跳转实现线性搜索。asm123456789101112131415MOV SI, OFFSET ARRAY ; SI 指向数组首地址MOV CX, COUNT ; CX 数组长度MOV AL, TARGET ; AL 目标值SEARCH:CMP [SI], AL ; 比较当前元素JE FOUND ; 相等则找到INC SI ; 指向下一个元素LOOP SEARCH ; CX-1不为 0 则继续; 未找到的处理JMP NOT_FOUNDFOUND:; SI 当前指向目标元素计算偏移即位置第 9 题多位十六进制输出I.asm功能将 32 位数据以十六进制形式逐位输出。核心思路ROL 循环左移 4 位每次取最低 4 位判断是 0~9 还是 A~F转为 ASCII 后输出。asm123456789101112131415161718MOV CX, 8 ; 32 位 8 个十六进制位MOV BX, DATA32PRINT_LOOP:ROL BX, 4 ; 循环左移 4 位MOV AL, BLAND AL, 0FH ; 取最低 4 位CMP AL, 10JB IS_DIGIT ; 0~9ADD AL, A - 10 ; A~FJMP OUTPUTIS_DIGIT:ADD AL, 0 ; 0~9OUTPUT:MOV DL, ALMOV AH, 02HINT 21HLOOP PRINT_LOOP第 10 题键盘缓冲输入J.asm功能使用 INT 21H 的 0AH 功能接收键盘输入并回显。核心思路定义输入缓冲区首字节为最大长度次字节为实际长度之后为字符存储区。asm12345678910111213141516171819BUFFER DB 20 ; 最大输入长度DB ? ; 实际输入长度由 DOS 填充DB 20 DUP(?) ; 字符存储区; 缓冲输入MOV DX, OFFSET BUFFERMOV AH, 0AHINT 21H; 回显MOV CL, BUFFER1 ; 取实际输入长度MOV CH, 0MOV SI, OFFSET BUFFER2DISP:MOV DL, [SI]MOV AH, 02HINT 21HINC SILOOP DISP三、灯光控制器课程设计3.1 设计目标基于 8086 最小系统和 8255A 可编程并行接口芯片设计一个多模式灯光控制器8 个按键控制 8 个 LED 灯支持 6 种灯光模式数码管实时显示当前模式编号支持一键复位3.2 硬件电路设计8086 最小系统芯片 作用8086 CPU 主处理器最小模式8284A 时钟发生器提供 8MHz 主频74LS373 地址锁存器锁存低 16 位地址74LS138 3-8 译码器产生片选信号74LS245 数据总线缓冲器2764 8KB EPROM存储程序8255A 接口配置端口 地址 方向 连接PA 口 2000H 输出 8 个 LED经 220Ω 限流电阻PB 口 2002H 输入 8 个按键上拉电阻 接地PC 口 2004H 输出 共阴数码管 a~g 段控制口 2006H — 写入方式控制字方式控制字82H 1000 0010BD71方式选择有效D6D500PA 口方式 0D40PA 口输出D30PC 高 4 位输出D20PB 口方式 0D10PB 口输入D00PC 低 4 位输出3.3 软件设计主程序流程Plain Text12345678910111213初始化 8255A写入控制字 82H↓循环读取 PB 口按键状态↓检测按键变化边沿检测消抖↓根据按键编号切换到对应模式↓执行对应模式的处理程序↓更新数码管显示↓返回继续检测6 种灯光模式模式 按键 实现方式0 - 正常模式 PB0 按键与 LED 一一对应按哪个亮哪个1 - 全亮模式 PB1 PA 口输出 00H低电平点亮2 - 全灭模式 PB2 PA 口输出 FFH3 - 流水灯 PB3 循环左移每次延时切换一位4 - 交替闪烁 PB4 奇偶位交替翻转55H / AAH 切换5 - 呼吸灯 PB5 软件 PWM逐渐改变亮灭时间比数码管显示PC0~PC6 连接共阴数码管的 a~g 段通过查表法获取段码asm12SEG_TABLE DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H ; 0~7DB 7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H ; 8~F显示时从表中取出对应模式编号的段码输出到 PC 口即可。一键复位PB6 PB7 同时按下时触发复位系统回到模式 0LED 全部熄灭数码管显示 0。asm123456; 检测组合键IN AL, 2002H ; 读 PB 口AND AL, 0C0H ; 取 PB6、PB7CMP AL, 00H ; 两个都按下低电平有效JNE NOT_RESETCALL RESET_ALL ; 调用复位子程序3.4 仿真结果在 Proteus 中完成电路搭建后加载程序进行仿真正常模式按下按键对应 LED 亮灭切换数码管显示 0全亮/全灭一键控制所有 LED流水灯LED 依次循环点亮效果流畅交替闪烁奇偶位 LED 交替亮灭呼吸灯通过软件 PWM 模拟亮度渐变数码管始终显示当前模式编号一键复位同时按 PB6PB7系统恢复初始状态四、踩坑记录4.1 SHR AL, 4 报错8086 指令集中移位指令的移位次数如果大于 1不能直接写立即数必须通过 CL 寄存器asm123456; ❌ 错误写法8086 不支持SHR AL, 4; ✅ 正确写法MOV CL, 4SHR AL, CL4.2 DS 寄存器未初始化很多初学者包括我会忘记将数据段地址装入 DS导致程序运行异常asm12MOV AX, DATA_SEGMOV DS, AX ; 这一步不能省4.3 DOSBox 窗口太小修改配置文件中的 windowresolution 和 output 参数ini12windowresolution1280x960outputopengl4.4 Proteus 中 8086 不运行常见原因ALE 信号未正确连接8284A → 74LS373READY 引脚未接高电平CPU 会一直等待ROM 的 EA 引脚未接高电平不会从外部 ROM 取指中断向量表未正确配置五、总结通过本次课程作业我系统掌握了以下内容8086 汇编语言编程从最简单的字符串输出到复杂的多分支、循环、子程序调用逐步建立了对汇编语言的理解。DOS 中断机制INT 21H 是 DOS 环境下最常用的中断01H/02H/09H/0AH/4CH 这几个功能号需要牢记。数据表示与转换BCD 码、ASCII 码、补码之间的转换是汇编编程的基本功。8255A 可编程接口芯片掌握了方式 0 下的输入输出配置理解了端口地址译码的原理。Proteus 电路仿真学会了搭建 8086 最小系统、连接外设芯片、加载程序进行仿真调试。软硬件协同设计灯光控制器项目让我体会到软件程序和硬件电路的配合关系——端口地址、数据流向、时序配合都需要精确设计。附录完整代码所有源代码已上传至 GitHub 仓库欢迎 Star 和 Fork。如有问题欢迎在评论区交流觉得有用的话点个赞吧