
简介这份实验指导书面向高校电子信息、自动化等专业学生及嵌入式初学者系统梳理了单片机实验的完整流程与规范要求。资源包共1个doc文档约965KB内容围绕6个实验展开从实验目的、设备、原理环境到内容、步骤及报告格式均有明确说明。其中实验一以Keil C51汇编语言为例讲解工程建立、源文件添加、编译连接、软件模拟与硬件仿真等开发过程并给出在P1.0、P1.1输出1Hz方波的具体案例实验二则涉及十六进制与十进制转换的顺序结构编程。文档还细化了预习报告、实验报告及成绩评定要求便于读者按步骤完成实验、理解调试思路并规范撰写报告。目前已有338人学习下载适合作为课程配套练习与自学参考。1. 一份把 8051 从“点亮一个灯”带到“键盘显示ADC”闭环的实验手册很多人学 8051 卡在一个尴尬位置书上的寄存器都认识真给一块实验箱却不知道从哪根线接起。这份《嵌入式系统实验指导书6 个实验》就是冲着这个断层来的——它不铺理论直接给六个递进实验Keil C51 建工程与汇编方波、十六进制转十进制、8 段 LED 动态扫描、4×4 矩阵键盘、ADC0809 采样最后把显示和采样串成一个电压表。整套流程围绕一块 8051 实验箱和 Keil C51 展开硬件接口地址、字形码表、键值表、子程序入口出口都写死在正文里属于“照着接线、照着敲、能跑出波形和数字”的落地型资料。适合课程设计赶进度的人、带实验课的助教以及想补一遍裸机汇编手感的老手。下面按“资源怎么拆→工程怎么建→外设怎么调→坑在哪”走一遍。2. 把指导书拆成可执行工程Keil C51 建工程与汇编骨架这份资料的第一价值不是某个算法而是它把“一个 8051 工程从零到 HEX”的每一步都固定下来了。实验 1 给的是完整菜单路径Project→New Project→选 Atmel 89C51→晶振改 12MHz→Output 勾选生成 HEX→新建 .asm→Add Files to Group→Build。看着啰嗦但新手翻车恰恰集中在这些“啰嗦”的地方。我一般会先把这套流程在纯软件仿真下跑通再接硬件避免一上来就怀疑是线接错了。2.1 工程参数与目标配置指导书明确要求晶振 12MHz这不是随便写的。后面所有软件延时0.5ms 显示延时、0.5s 移位延时都是按 12MHz、每条指令 1μs 量级估算出来的。你改成 11.0592MHz显示会略闪、移位会略快虽然不一定“坏”但和文档预期对不上排错时容易误判。工程配置里真正要盯的就三处配置项取值为什么必须这样DeviceAtmel 89C51决定 SFR 定义和存储器空间Xtal(MHz)12延时循环的基准改了延时全偏Output→Create HEX File勾选不勾就没有可烧/可仿真的 HEXDebug 页软件仿真 / 硬件仿真二选一决定程序跑在 PC 还是实验箱建工程时把工程文件和 .asm 放同一目录指导书用 E:\TEST后面 Add Files 才不会因为路径带空格或中文找不到文件。这一点在 Windows 上尤其容易踩路径里有中文Keil 老版本偶发编译报错但错误信息指向行号是乱的。2.2 汇编骨架与方波程序实验 1 的核心程序不长但把 8051 汇编的几个关键点都带出来了起始地址、位操作、循环延时、无条件跳转。原程序如下我补了注释ORG 0000H ; 复位入口必须从 0000H 开始 AGAIN: CPL P1.0 ; P1.0 取反产生方波翻转 MOV R0,#10 ; 外层循环 10 次配合内层凑 0.5s LOOP1: MOV R1,#100 LOOP2: MOV R2,#250 DJNZ R2,$ ; 内层空转 250 次 DJNZ R1,LOOP2 DJNZ R0,LOOP1 SJMP AGAIN ; 回到翻转形成 1Hz 方波 END逻辑说明CPL P1.0 每执行一次电平翻转一次一个完整方波周期需要翻转两次所以两次翻转之间的延时就是半个周期 0.5s。三层 DJNZ 嵌套是 8051 上最经典的软件延时写法$表示当前指令地址DJNZ R2,$就是原地减到零。参数上R0/R1/R2 的初值决定了延时长度12MHz 下大致按“每层循环指令周期数×次数”估算实际会有偏差示波器量出来偏个 10% 很正常别死磕。实验 1 的第二个任务是 P1.0 和 P1.1 输出同频反相方波。最省事的改法不是写两套延时而是在翻转 P1.0 后立刻翻转 P1.1AGAIN: CPL P1.0 CPL P1.1 ; 与 P1.0 反相因为两次 CPL 之间无延时 ; ...原延时循环不变... SJMP AGAIN这样两个口在同一时刻被取反天然反相。如果你分别写延时再翻转两个口的相位会差出指令周期示波器上一看就露馅。这是我在带实验时见得最多的“结果对但波形不对”的情况。2.3 软件仿真与硬件仿真的切换指导书把两种调试方式讲得很清楚程序不驱动硬件就走软件仿真Debug→Start/Stop Debug Session有硬件动作就接实验箱走硬件仿真。硬件仿真前有两个动作不能省拨位开关 K10 拨到 B 端以及按一次复位键 SS10。退出硬件连接也要按 SS10。这不是形式主义——8051 实验箱的仿真串口在切换瞬间状态不确定不复位直接重连经常出现“程序明明改了却跑的是旧逻辑”也就是所谓的玄学现象本质是仿真器没真正复位。3. 数制转换与动态扫描两个必须吃透的底层套路实验 2 和实验 3 是这份资料里技术密度最高的两节。一个练“顺序结构单步观察存储器”一个练“定时刷新查表端口分时复用”。把这两个吃透后面键盘和 ADC 基本是拼装。3.1 十六进制转十进制除以权值法实验 2 要求把片内 RAM 30H 里的 2 位十六进制数转成 3 位十进制按高位到低位放进 31H33H也就是非压缩 BCD 码。原理是“除以权值”先除以 100 得百位余数除以 10 得十位最后余数为个位。8051 没有除法指令之外的捷径标准做法是用 DIV ABMOV A,30H ; 取待转换的十六进制数 MOV B,#100 DIV AB ; A百位, B余数 MOV 31H,A ; 存百位 MOV A,B MOV B,#10 DIV AB ; A十位, B个位 MOV 32H,A MOV 33H,B SJMP $ ; 原地停住便于单步观察逻辑说明DIV AB 执行 A/B商进 A、余数进 B正好对应“取商存高位、余数继续除”。参数上30H 的取值范围是 00HFFH0255所以结果最多 3 位31H33H 各存一个 09 的数字不是 ASCII别拿去直接送显示——送显示前要查字形表。指导书要求用单步方式跑就是为了让你在 Memory Window 里盯着 31H33H 一个个变。存储器窗口的地址前缀要记牢d:片内低 128 字节和 SFRi:片内间接寻址区c:程序存储器x:片外 RAM。改值用右键 Modify Memory at连续多个单元用逗号隔开。这里有个容易忽略的边界如果 30H 里放的是 0AH 这种“看起来像十进制”的值转换结果会是 10而不是报错。汇编不会帮你校验输入合法性预习时自己心里要有数。3.2 8 段 LED 动态扫描0.5ms 与 50Hz 的关系实验 3 是整个资料里最值得反复读的一节。实验箱 6 位 8 段 LED 采用动态驱动同一时刻只亮一位靠刷新够快让人眼以为全亮。指导书给的硬指标是刷新频率不小于 50Hz也就是每位点亮时间不超过 20ms它选的是每位 0.5ms6 位一轮 3ms刷新率约 333Hz余量很足。这个数字不是拍脑袋0.5ms 既够亮又不会因为单管电流过大发热。硬件连接关系必须背下来8255 的 A 口地址 4000H驱动位选低电平有效B 口4001H驱动段选低电平点亮C 口 4002H、控制口 4003H。字形码表按 0F、0.F.、-、灭排列比如 0 是 C0H、1 是 F9H、灭是 FFH。显示子程序的入口约定是待显示数00H1FH放 20H25H对应左起第 16 位出口是每位显示 0.5ms 后返回占用 R0、R1、R2、A、PSW、DPTR。按流程图落成代码核心循环是这样DISP: MOV R0,#20H ; 显示数地址指针 MOV R2,#0FEH ; 位码初值左起第一位低电平 MOV DPTR,#SEGTAB ; 字形表首址 DLOOP: MOV A,R0 ; 取待显示数 MOVC A,ADPTR ; 查字形码 MOV DPTR,#4001H MOVX DPTR,A ; 段码送 B 口 MOV A,R2 MOV DPTR,#4000H MOVX DPTR,A ; 位码送 A 口 LCALL DELAY5 ; 延时 0.5ms MOV A,#0FFH MOVX DPTR,A ; 关全部位消隐防串影 MOV A,R2 RL A ; 位码左移指向下一位 MOV R2,A INC R0 CJNE R0,#26H,DLOOP RET逻辑说明先送段码再送位码顺序不能反反了会出现瞬间错位亮。每点亮一位后必须“关全部位”再切下一位否则上一位的段码会残留在下一位上表现为数字发虚、重影——这就是动态扫描的经典“鬼影”。参数上R2 初值 0FEH 是二进制 11111110最低位为 0 选中第一位RL 左移让 0 逐位左移。字形表 SEGTAB 按指导书给的顺序定义即可。实验 3 的第三个内容是“0F 连续左移”本质是把 20H25H 当成一个滑动窗口每次把 21H→20H、22H→21H……25H→24H然后 25H 加 1 并和 0FH 相与再调用显示子程序 330 次凑约 1 秒。这里 330 次是双重循环实现的指导书特意提醒计数单元不能和显示子程序冲突——显示子程序占了 R0/R1/R2你的外层延时就得换别的寄存器或直接压栈保护否则移位速度会莫名其妙变快或卡死。4. 矩阵键盘与 ADC0809把输入输出接成闭环实验 4 和实验 5 开始出现“系统感”键盘是输入LED 是输出ADC 是模拟量入口。指导书在这两节的接线和地址约定最细也最容易因为一根线接错而全盘不动。4.1 4×4 矩阵键盘列扫描二次确认松手检测键盘接在 8255 的 PC 口PC0PC3 是 4 行输入PC4PC7 是 4 列驱动。扫描思路是“逐列拉低、读行判断”某一列拉低、其余列拉高读行输入若该列有键按下对应行位就是 0。指导书给的键值表是 00H0FH 按行排列配合查键值子程序 KEY20 使用。KEY20 的入口约定很关键A 的高 4 位是列驱动码被扫描列为 0低 4 位是行状态按下位为 0出口 A 是键码占用 R1、A、PSW、DPTR。扫描子程序必须做三件事缺一个就会“按一下出好几个数”KEY: MOV R2,#0FEH ; 第 1 列低其余高 KCOL: MOV DPTR,#4002H MOV A,R2 MOVX DPTR,A ; 输出列驱动码到 PC 口 MOVX A,DPTR ; 读回 PC 口行状态 ANL A,#0F0H ; 只保留高 4 位行信息 CJNE A,#0F0H,KYES ; 非全 1 说明有键 MOV A,R2 RL A MOV R2,A CJNE R2,#0EFH,KCOL; 四列扫完 MOV A,#0FFH RET ; 无键返回 FFH KYES: LCALL DELAY20 ; 延时 20ms 去抖 MOVX A,DPTR ANL A,#0F0H CJNE A,#0F0H,KGET ; 二次确认仍按下 SJMP KEY KGET: ; 此处拼列码与行码调 KEY20 查表逻辑说明第一次读到非全 1 不能立刻认定按键必须延时 20ms 再读一次两次一致才算数这是机械按键抖动的标准处理。ANL A,#0F0H是为了滤掉低 4 位——PC 口低 4 位是输出列码读回来不代表行状态不滤就会误判。松手检测则是反复读直到行状态全 1否则按住不放会连续触发。指导书特别强调“只有低 4 位有效高 4 位不定要滤掉”这条在实机上不滤十次有八次读出错值。主程序把键盘和显示串起来初始化 8255 控制字 10000001BA、B 口方式 0 输出C 口高 4 位输出、低 4 位输入循环调 DISP 和 KEY有键就把 20H24H 依次前移、新键值放 25H实现“从右端移入”。这里 8255 控制字写错一位整个 C 口方向就反了表现是键盘完全无反应或 LED 全亮排错时先回头核对这个字节。4.2 ADC0809 采样与电压显示实验 5 把电位器 W1 分压后的 05V 送到 ADC0809 的 IN4启动转换是“写任意数到 8004H”取结果是“读 8004H”EOC 经反相器接到 P1.0所以查询逻辑是等 P1.0 变有效。转换结果是 8 位二进制00HFFH 对应 05V再套用实验 2 的除以权值法转成 3 位十进制送 LED 第 46 位显示。MOV DPTR,#8004H MOVX DPTR,A ; 写任意数启动转换 WAIT: JNB P1.0,WAIT ; 等 EOC 经反相后的有效电平 MOVX A,DPTR ; 读转换结果 ; 后续A 中 00H~FFH 按 255 对应 5V 换算 ; 再走除以 100/10 的 BCD 拆分送 23H~25H逻辑说明EOC 经反相器后极性翻转所以查询条件要按实际电平写指导书说“查询 P1.0 状态”具体是 JNB 还是 JB 取决于反相器接法实机上先用单步看 P1.0 在转换前后的变化再定别照抄。换算上8 位结果满量程 255 对应 5.00V要显示两位小数得先做乘法再拆分直接除以权值只能得到整数部分——这是很多人做出来“只有整数没有小数”的原因。显示子程序直接复用实验 3 的 DISP把结果放 23H25H 即可前三位留空或显示固定符号。5. 避坑与排查六个实验里最容易翻车的五处5.1 编译通过但硬件无反应现象Build 显示 0 Error接实验箱后 LED 不亮、方波不出。原因多半是没生成 HEX或 Debug 页还停在软件仿真。解决Project→Options for Target→Output 确认 Create HEX File 勾选Debug 页切到硬件仿真改完配置重新 Build 再连接。改程序后不重新编译就重连跑的还是旧 HEX这是最高频的“假故障”。5.2 显示重影、数字发虚现象6 位 LED 同时隐约看到相邻位的段。原因切换位码前没有关断全部位上一位段码残留。解决每位延时结束后先向 A 口写 FFH 消隐再送下一位位码。另外检查 0.5ms 延时是否被改得太长超过 20ms 单管就会明显闪烁。5.3 键盘按一下出多个键值现象按一次键显示器连续移入好几个相同数字。原因缺 20ms 去抖或缺松手检测。解决二次读确认 循环等待行状态恢复全 1同时确认读回值做了ANL A,#0F0H滤低位。若仍连发检查 8255 控制字是否把 PC 低 4 位配成了输出。5.4 存储器窗口改值不生效现象在 Memory Window 改了 30H程序跑起来还是旧值。原因地址前缀写错改到了别的存储空间或程序里对 30H 有初始化覆盖。解决片内 RAM 用d:30H改完确认窗口显示的是同一空间检查程序开头是否有清零或赋值指令把 30H 冲掉。5.5 ADC 读数恒定或跳变剧烈现象无论怎么拧电位器显示不变或乱跳。原因启动转换的写地址不是 8004H、EOC 查询极性写反、或 IN4 那路电位器没接好。解决先用单步确认写 8004H 后 P1.0 有翻转再确认读的是同一地址最后查 W1 分压是否真的落在 05V。读数跳变则考虑在软件里做几次采样取平均别拿单次结果直接显示。6. 把六个实验串成一台“最小电压表”验证与进阶技巧单跑每个实验只能证明“这段代码能跑”真正检验理解的是把它们拼起来实验 3 的 DISP 做显示、实验 4 的 KEY 做输入、实验 5 的 ADC 做采样主循环里键盘负责切换“显示原始 HEX / 显示电压值”两种模式。拼装时最先崩的往往不是逻辑而是资源冲突——DISP 占了 R0/R1/R2 和 DPTRKEY 也占 R1 和 DPTRADC 换算又要用 B 和 DPTR。我的习惯是进每个子程序先 PUSH 现场、RET 前 POP 恢复宁可多几条指令也不让寄存器互相踩。验证方法上别只盯着“看起来对”。方波用示波器量周期是不是 1s、占空比是不是 50%LED 用手机慢动作拍一下看有没有某一位明显偏暗偏暗说明该位点亮时间被别的位挤占键盘把 16 个键全按一遍记录有没有重码或漏码ADC 用万用表量 W1 分压点和显示值对一下误差在 ±0.05V 内算正常差太多先查换算系数而不是怀疑芯片。下面这张对照表可以贴在实验台前实验关键观测量合格判据常见偏差来源1 方波周期、电平1s 周期两路反相晶振设错、延时层数改错2 数制转换31H33H与 30H 十进制一致除权顺序反、未用 DIV3 动态显示亮度、重影6 位均匀无鬼影未消隐、延时过长4 键盘键值唯一性16 键一一对应未去抖、未滤低位5 ADC显示电压与万用表差 ≤0.05V满量程系数、EOC 极性进阶一点的做法是把软件延时换成定时器中断刷新显示。现在 DISP 靠 0.5ms 死等主程序在显示期间干不了别的键盘响应会发钝。用 T0 定时 0.5ms 中断里推进位码主循环只负责扫描键盘和采样显示就彻底“后台化”了。这一步做完你会发现六个实验其实是一套东西端口分时复用、查表、状态机换到别的 8 位平台上套路一模一样。从那以后我每次带人做这套实验都强制先纯软件仿真跑通数制转换和显示再接硬件最后才拼电压表——顺序反了排错时你永远分不清是代码错还是线错。希望帮到你。本文还有配套的精品资源点击获取