资讯动态

8255A接口实验全链路:端口地址、控制字与方式0/1排错验证

发布时间:2026/10/29 21:27:02 来源:尧图企业网站定制
简介这份微机接口实验报告围绕Intel可编程并行接口芯片8255A展开面向学习微机原理与接口技术、需要完成课程实验的高校学生尤其是使用GX-8000实验系统的读者。报告完整记录了方式0下三个基础实验A口输出学号后两位驱动8个LED静态显示、A口与B口配合读取8个逻辑开关状态并同步点亮LED、以及通过段码与位选信号控制七段数码管显示同学学号逐一给出实验思路、硬件连线图、程序流程图和带详细注释的汇编源代码并附实验现象、结论与问题分析可直接对照复现。资源包仅含1个docx文档约141KB双面打印版式含实验记录表与评分栏便于直接打印提交或作为报告撰写模板参考。目前已有809人学习下载适合课前预习、课中对照连线调试及课后整理报告时使用也能帮助读者理解控制字设置、端口地址分配与汇编程序调试的基本方法。1. 8255A 实验报告的骨架三个端口、四根控制线和一个容易算错的基址微机接口实验做到 8255A最容易卡住的地方通常是怎么解释清楚报告里那句“端口地址 280H 是怎么来的”而不是代码本身。这颗 40 脚的可编程并行接口内部其实只有四个寄存器——端口 A、端口 B、端口 C 和控制寄存器靠 A1、A0 两根地址线选中靠 /CS、/RD、/WR 三根控制线决定“读谁、写谁、什么时候动”。可一旦挂到 CPU 总线上地址译码、总线宽度、复位时序这三件事里任何一件出错现象都一样灯不亮、读回全是 FF、中断怎么都进不去人就开始怀疑程序写错了。这篇笔记顺着“硬件链路 → 方式 0 → 方式 1 与 BSR → 排错 → 验证”的顺序把一套能抄、能复现、能在报告里写出参数依据的做法讲完适合正在做微机接口实验、又不想只交一份“跑通了但说不清为什么”的报告的人。2. 从 74LS138 到控制字8255A 的地址与初始化怎么一步步定死动手写第一行汇编之前先把硬件链路固化下来。8255A 在微机接口实验平台上通常是这样接的数据线 D0~D7 挂 CPU 数据总线/RD、/WR 分别接 CPU 的读、写控制信号/CS 由一片 74LS138 译码器的一路输出提供A1、A0 接到 CPU 地址线的低位RESET 接系统复位。剩下 PA、PB、PC 三个 8 位口引到排针或实验箱的接线区。这一章要解决的就是两件事端口地址到底是多少控制字每一位到底在管什么。2.1 片选与 A1A0端口地址从原理图反推地址不是背出来的是从译码器反推出来的。74LS138 有三根选择输入 C、B、A 和三根使能输入两根低有效、一根高有效八个输出 Y0~Y7 里只有一个会被拉低。假设实验平台上 138 的 C、B、A 分别接了地址总线的 A5、A4、A3高位的 A15~A6 通过门电路参与使能那么 Y4 输出有效时对应的地址区间就是0010 1000 xxxx xxxx也就是 280H~287H 这一小段。CPU 访问这个区间里的某个地址时138 的 Y4 拉低8255A 的 /CS 有效片子才被“叫醒”。叫醒之后由 A1、A0 决定访问哪一个寄存器这四选一是硬连线没有商量余地A1A0选中对象常用助记00端口 A 数据寄存器PA01端口 B 数据寄存器PB10端口 C 数据寄存器PC11控制寄存器写控制字 / 读状态字CTRL这里藏着第一个高频翻车点8255A 的 A0、A1 接 CPU 的哪两根地址线取决于系统数据总线宽度。在 8 位总线8088 一类的系统上8255A 的 A0、A1 直接接 CPU 的 A0、A1四个端口地址连续280H、281H、282H、283H。而在 16 位总线8086 系统上为了配合按字寻址8255A 的 A0、A1 要接 CPU 的 A1、A2此时四个端口地址变成 280H、282H、284H、286H间隔为 2且都是偶地址。同一个实验箱换个 CPU 模块地址就变了代码里写死 281H 必然读到别处去。所以我的习惯是在程序头部用 EQU 把四个地址单独拎出来并在注释里写清总线宽度换平台只改这四行; 端口地址定义8 位总线8255 的 A0/A1 直连 CPU 的 A0/A1 ; 若为 16 位总线8255 的 A0/A1 接 CPU 的 A1/A2 ; 四个地址改为 0280H / 0282H / 0284H / 0286H PA_PORT EQU 0280H ; 端口 A PB_PORT EQU 0281H ; 端口 B PC_PORT EQU 0282H ; 端口 C CTRL_PORT EQU 0283H ; 控制寄存器这段定义看起来平淡但它把“硬件接法”和“软件访问”解耦了。报告里写地址来源时也不必再含糊地说“实验箱给定”而是能画出“138 的 Y4 → /CS → 280H~287HA1A0 → 四个寄存器”这条完整链路评审一眼就能看出你真的看过原理图。还有一点常被忽略138 的三根使能输入如果有一根接的是 IO/M 或者高位地址线那么这段地址在存储器空间里是“镜像”的用 MOV 指令访问内存同样能命中。做实验时无所谓但如果报告里要讨论“为什么必须用 IN/OUT 而不是 MOV”这就是现成的分析素材——IN/OUT 会拉低 /IOR、/IOW产生符合 8255A 时序要求的读写信號MOV 不会。2.2 控制字 D7~D0 逐位拆开一张表定死六种常用配置8255A 有两个控制字靠最高位 D7 区分D71 是方式选择控制字D70 是 BSR位复位/置位控制字。先讲方式选择字它的八位是这么分的D7标志位固定为 1。D6、D5A 组方式选择00方式 001方式 11x方式 2。D4端口 A 方向1输入0输出。D3端口 C 高 4 位PC7~PC4方向1输入0输出在方式 1/2 下这一位改为控制 PC6、PC7 等引脚的用途。D2B 组方式选择0方式 01方式 1。D1端口 B 方向1输入0输出。D0端口 C 低 4 位PC3~PC0方向1输入0输出方式 1 下由握手信号占用。把常用组合算成十六进制做实验时直接查表比每次现推快得多用途二进制十六进制PA、PB、PC 全部输出1000 000080HPA 输出PB 输入1000 001082HPA 输出PC 高低 4 位都输入1000 100189HPA 输入PB 输出1001 000090HPA 方式 1 输出1010 0000A0HPA 方式 1 输入1011 0000B0H注意 89H 这个值D31、D01 分别把 PC 的高 4 位和低 4 位都设成输入。做按键实验时如果漏掉 D3PC4~PC7 就是输出状态你把按键接上去读回来永远是那几个固定电平现象是“按不按都一样”非常具有迷惑性。写控制字的顺序也有讲究。8255A 上电或 RESET 有效之后所有端口都被复位成输入方式方式 0PA/PB/PC 全输入此时控制寄存器内容为 9BH。也就是说在没有写控制字之前你往 PA 口写数据是写不进去的因为它还是输入态。这就是为什么初始化必须是“先写控制字再动数据口”顺序反了第一帧数据一定丢。2.3 复位时序与首帧数据为什么初始化要留一段空转很多实验指导只写“写入控制字 80H”但不解释为什么紧接着写数据有时不生效。原因在两个地方一是 RESET 信号撤除后到内部逻辑稳定需要时间二是实验箱上的排线、锁存器、LED 驱动都有建立时间。稳妥的做法是在写控制字和第一次写数据之间插一段短延时哪怕只有几十微秒。INIT_8255: MOV DX, CTRL_PORT MOV AL, 80H ; 方式0三个口全输出 OUT DX, AL CALL SHORT_DELAY ; 等内部逻辑与外部锁存稳定 MOV DX, PA_PORT MOV AL, 00H ; 先清一次输出避免上电随机态 OUT DX, AL RET SHORT_DELAY PROC PUSH CX MOV CX, 00FFH SD1: LOOP SD1 ; 约数百微秒按主频调整 POP CX RET SHORT_DELAY ENDP这段SHORT_DELAY的循环次数不是玄学是可以标定的在实验箱上把MOV CX, 00FFH改成0FFFFH用示波器看 PA0 翻转间隔就能反推出每次 LOOP 大约几个机器周期再换算成时间。报告里如果能把这段标定过程写进去比干巴巴一句“延时约 1ms”有说服力得多。写控制字还有一个边界控制寄存器是只写的写控制字读它得到的是端口 C 的状态字。所以千万别写“读回控制字校验”那条路不通读回来的是状态位看起来像乱码很容易被误判成片子坏了。3. 方式 0 打通输入输出流水灯与按键扫描的可复现代码方式 0 是基本输入输出方式没有握手、没有中断写完数据就完事是无条件传送。绝大多数微机接口实验的第一个任务——流水灯、交通灯、数码管静态显示、独立按键读取——都跑在方式 0 上。它简单但简单不代表不容易翻车恰恰因为“没有反馈”出错时最难定位。3.1 最小初始化序列把控制字和端口访问绑在一起先约定场景PA 口接 8 个 LED低电平点亮或高电平点亮取决于实验箱的驱动电路接线前务必确认是灌电流还是拉电流PC 口高 4 位接 4 个独立按键。控制字按上一章的表取 89H——PA 输出、PB 输出、PC 全输入。; 场景PA 驱动 8 位 LEDPC4~PC7 接 4 个按键 ; 控制字 89H 1000 1001B方式0PA 出PB 出PC 高/低 4 位均入 LED_INIT: MOV DX, CTRL_PORT MOV AL, 89H OUT DX, AL MOV DX, PA_PORT MOV AL, 0FFH ; 若 LED 低电平点亮FFH 表示全灭 OUT DX, AL RETOUT DX, AL这条指令要占两个字节DX 里放的是 16 位端口地址AL 是数据。用 DX 间址而不是直接写OUT 80H, AL是因为 8086 的直接端口寻址只支持 00H~FFH 这 256 个地址而实验箱给的基址一般都在 280H 以上必须走 DX。这个细节在报告里值得点一句它解释了“为什么代码里到处是 MOV DX, xxx 再 OUT”。3.2 流水灯PA 口输出与循环移位的写法流水灯的核心就一条让一个“1”在 AL 里循环移动。用 ROL循环左移而不是 SHL逻辑左移是因为 SHL 会把移出的位丢掉、低位补 0跑完 8 次 AL 就变成 00H 再也不亮ROL 把最高位补回最低位能无限循环。FLOW_LED: MOV DX, CTRL_PORT MOV AL, 80H ; 方式0PA/PB/PC 全输出 OUT DX, AL MOV DX, PA_PORT MOV AL, 01H ; 初始只亮最低位 FLOW_LOOP: OUT DX, AL ; 送到 PA 口 CALL DELAY_200MS ROL AL, 1 ; 循环左移1 依次走过 PA0~PA7 JMP FLOW_LOOP ; ---- 约 200ms 延时循环次数需按实际主频标定---- DELAY_200MS PROC PUSH CX PUSH DX MOV DX, 0060H ; 外层计数 D1: MOV CX, 0F000H ; 内层计数 D2: LOOP D2 DEC DX JNZ D1 POP DX POP CX RET DELAY_200MS ENDP两处逻辑说明。第一ROL AL, 1放在OUT之后保证第一帧送出去的是 01H而不是移位后的值否则上电瞬间看到的是第二个灯亮波形对不上报告里画的时序图。第二延时子程序里必须先把 DX 压栈再改因为 DX 在主循环里存着 PA 口地址子程序擅自改掉它返回后下一次OUT DX, AL就写到别的端口去了——这个 bug 的现象是“灯只亮一下然后彻底没反应”我第一次做的时候就栽在这儿查了两个小时才想起来看 DX。DELAY_200MS的循环参数怎么定内层0F000H次 LOOP8086 上 LOOP 指令是 17 个时钟周期外层 60H 次粗算下来在 5MHz 时钟下大约是 0.1~0.3 秒量级。真要精确就把这段抽出来单独用示波器测把实测值和理论值一起写进报告这是加分项而非减分项。3.3 按键扫描PC 口输入的消抖与二次确认按键接在 PC4~PC7读 PC 口得到 8 位数据高 4 位是按键状态低 4 位此时也是输入控制字 D01会读到悬空电平所以必须用AND AL, 0F0H把低位掩掉再判断。SCAN_KEY: MOV DX, PC_PORT IN AL, DX AND AL, 0F0H ; 只保留 PC4~PC7 CMP AL, 0F0H ; 全 1 表示无键按下假设按下为低 JE SCAN_KEY ; 无键继续扫 CALL DELAY_20MS ; 第一次延时消抖 IN AL, DX AND AL, 0F0H CMP AL, 0F0H JE SCAN_KEY ; 抖动判为无效 ; ---- 到这里确认有键按下处理键值 ---- MOV BL, AL ; 暂存键值 WAIT_RELEASE: IN AL, DX AND AL, 0F0H CMP AL, 0F0H JNE WAIT_RELEASE ; 等待松手避免一次按下触发多次 RETAND AL, 0F0H之后CMP AL, 0F0H这两条是配套的掩码把无关位清零比较值就必须跟着改成 0F0H。如果写成CMP AL, 0FFH永远不相等程序会认为一直有键按下现象是“灯疯狂闪”或者“动作重复执行几十次”这是典型的掩码与比较值不匹配。延时消抖的时间取 10~20ms 是经验值机械按键的抖动通常在 5~10ms 内衰减。有些实验箱的按键已经带了硬件 RC 消抖或者施密特触发器这时候再加软件延时反而会让响应变迟钝报告里可以对比“加消抖”和“不加消抖”的按键响应次数用数据说话。3.4 C 语言版本outportb 复刻同一套时序不少课程要求汇编和 C 各写一版做对比。C 侧的关键是找到能直接操作 I/O 端口的函数。在 DOS 实模式的编译器里dos.h提供了outportb(port, value)和inportb(port)语义和 IN/OUT 指令一一对应。#include dos.h #include conio.h #define PA_PORT 0x280 #define PB_PORT 0x281 #define PC_PORT 0x282 #define CTRL_PORT 0x283 static void delay_ms(unsigned int ms) { unsigned int i, j; for (i 0; i ms; i) for (j 0; j 300; j) /* 空循环系数需按实测主频标定 */ ; } int main(void) { unsigned char v 0x01; outportb(CTRL_PORT, 0x80); /* 方式0三口全输出 */ outportb(PA_PORT, 0xFF); /* 先全灭 */ while (!kbhit()) { /* 按任意键退出 */ outportb(PA_PORT, v); delay_ms(200); v (unsigned char)((v 1) | (v 7)); /* 等价于 ROL */ } outportb(PA_PORT, 0xFF); /* 退出前恢复全灭 */ return 0; }(v 1) | (v 7)这一句就是汇编里ROL AL, 1的等价写法移位前先把v提升成 int 再截断是为了避免无符号数左移溢出时编译器给出警告。delay_ms的内层系数 300 不能照抄它跟编译优化等级、CPU 主频强相关正确做法是让它跑一遍、用示波器量 PA0 的实际翻转周期再反推系数。报告里如果能给出“系数 300 → 实测 210ms → 修正为 285”这样的标定记录比写“延时约 200ms”扎实得多。C 版本还有一个坑outportb依赖实模式下的 I/O 权限在受保护模式或者没有 I/O 权限的环境里编译能过、运行会直接报错或者被拦下来。做实验就在实验箱配套的实模式环境里编译别拿到别的环境里去试那不是代码问题。4. 方式 1 与 BSR握手状态字和单根引脚翻转怎么写进报告方式 0 跑通之后实验通常会往方式 1选通输入/输出推进一步同时引入 BSR 控制字来单独操作 PC 口的某一根引脚。这两块是 8255A 报告里最能拉开差距的部分因为涉及状态字和内部触发器很多人写到这里就只剩抄图了。4.1 方式 1 的控制字与状态字握手信号落在哪几根 PC 线上方式 1 下端口 A 和端口 B 借用端口 C 的若干引脚作为握手信号剩下的还能当普通 I/O 用。以端口 A 方式 1 输入为例PC4 是 /STB选通输入低有效PC5 是 IBF输入缓冲满高有效PC3 是 INTR中断请求高有效PC6、PC7 仍可作普通 I/O方向由控制字 D3 决定。控制字取 1011 0000B B0H。方式 1 输出的对应关系是PC7 是 /OBF输出缓冲满低有效PC6 是 /ACK外设应答低有效PC3 是 INTR。控制字取 1010 0000B A0H。真正让报告有含金量的是状态字。方式 1 下读端口 C拿到的不是引脚电平而是一个内部状态字位方式 1 输入方式 1 输出D7IBF_A输入缓冲满/OBF_A输出缓冲满D6INTR_AINTR_AD5INTE_AA 组中断允许INTE_AD4INTE_BB 组中断允许INTE_BD3INTR_BINTR_BD2IBF_B/OBF_B注意 D5、D4 这两位是内部中断允许触发器的状态不是引脚电平它们只能用 BSR 控制字来置位和复位写方式选择字是改不动的。这一点在报告里必须说清楚否则“为什么控制字里改了一位中断还是进不去”就解释不通。状态查询的写法如下用轮询代替中断逻辑清楚、便于观察; 方式1 输入轮询 IBF_A状态字 D7判断数据是否到位 POLL_IN: MOV DX, CTR_PORT IN AL, DX TEST AL, 80H ; 检查 D7 IBF_A JZ POLL_IN ; 为 0 表示缓冲空继续等 MOV DX, PA_PORT IN AL, DX ; 读走数据IBF 自动清零 ; ---- AL 中即为本次选通进来的字节 ---- RETTEST AL, 80H只影响标志位、不改 AL比AND AL, 80H更合适因为后面还要用 AL 的原值做判断之外的用途时会方便。读走数据后 IBF 由硬件自动清零不需要手动干预——如果报告里写“读完要写控制字清 IBF”那就是理解错了。4.2 BSR 控制字把 PC 单根引脚当 GPIO 用BSR 控制字专门干一件事对端口 C 的某一根引脚单独置 1 或清 0不影响其他七根。格式是 D70、D6D5D4000、D3D2D1 选引脚000~111 对应 PC0~PC7、D0 决定置位1还是复位0。PC 引脚D3D2D1置位字复位字PC000001H00HPC100103H02HPC201005H04HPC301107H06HPC410009H08HPC51010BH0AHPC61100DH0CHPC71110FH0EH典型用法是产生一个负脉冲去触发外部器件; PC7 输出一个宽度约 1ms 的负脉冲 PULSE_PC7: MOV DX, CTRL_PORT MOV AL, 0FH ; 0000 1111BPC7 置 1 OUT DX, AL CALL DELAY_1MS MOV AL, 0EH ; 0000 1110BPC7 清 0 OUT DX, AL CALL DELAY_1MS MOV AL, 0FH ; 恢复高电平 OUT DX, AL RETBSR 有个容易被忽略的前提它只对方式 0 下的端口 C 有效。如果端口 A 已经配成方式 1PC3、PC4、PC5 被握手信号占用这时候再用 BSR 去操作它们行为是不确定的。所以正确的顺序是先写方式选择字确定工作方式再写 BSR 字操作那些仍然是通用 I/O 的引脚。更实用的一点是方式 1 下 INTE_A、INTE_B 这两个中断允许触发器也是用 BSR 操作的A 组方式 1 输入时对 PC4 执行 BSR 置位就把 INTE_A 置 1B 组方式 1 输入时对 PC2 操作。这解释了为什么“控制字写对了但中断还是不来”——中断允许位根本不在控制字里。4.3 查询法替代中断不接 INTR 也能跑通的写法实验箱上的 INTR 通常要接到中断控制器再进 CPU接线多、配置复杂稍有不慎就卡在中断向量上。如果只是为了验证方式 1 的握手逻辑用查询法完全够用而且更容易在报告里画流程图。; 方式1 输出查询 /OBF_A状态字 D7判断外设是否取走数据 SEND_BYTE: MOV DX, CTR_PORT WAIT_OBF: IN AL, DX TEST AL, 80H JNZ WAIT_OBF ; /OBF1 表示缓冲满等外设取走 MOV DX, PA_PORT MOV AL, BL ; BL 中为待发送字节 OUT DX, AL ; 写入后 /OBF 自动变低 RET查询法的代价是 CPU 空转好处是时序完全可控、出错时现象明确。写报告时把两种方式的对比列出来——查询法占用 CPU、中断法响应及时但需要额外的中断控制器配置——这属于选型分析恰好是报告里“方案论证”一节最缺的内容。5. 8255A 实验翻车清单五个让读数与波形一起跑偏的细节下面五条都是我在实验台前真实撞过的按“现象 → 原因 → 解决”记下来照着排查能省掉大半天。第一条写进去的数据读不回来PA 口读回永远是 FF。现象是 LED 全亮或者全灭用万用表量 PA0 一直是高电平。原因八成是片选没接通或者地址算错写操作打到了没有器件的地址空间总线悬空读回 FF。解决方法是先做一次“地址自检”把控制字写到 283H然后往 280H 写 55H、往 281H 写 AAH再用飞线把 PA0~PA7 与 PB0~PB7 一一短接读 PB 看能不能读回 55H。能读回说明地址通路没问题读不回就回头查 138 的使能脚和 A1A0 接线。第二条流水灯只亮一位然后全灭再也不动。现象很典型上电第一个灯亮200ms 后所有灯灭。原因是移位用了 SHL 而不是 ROL1 移出最高位后被丢弃低位补 0八次之后 AL 变成 00H。解决方法就是把 SHL 换成 ROL如果确实需要“走到头再回来”的效果改用“移位 边界判断后重新装初值”的写法而不是依赖移位指令自动回绕。第三条按键按下去没反应或者一次按下触发十几次。两种截然不同的表现原因却常常是同一个——控制字里 PC 口的方向位没配对。按不下键是因为 D3 或 D0 写成了 0PC 高/低 4 位还在输出态读回来的是自己写出去的值触发多次是因为没有等松手就返回主循环或者消抖延时太短。解决方法是控制字统一用 89HPC 全输入并在确认按键后加一段“等待释放”的循环。第四条方式 1 中断死活进不去换成查询就能跑。现象是数据明明到了INTR 引脚却一直是低电平。原因不是控制字而是 INTE_A 这个内部触发器没置位——它在方式 1 下只能靠 BSR 控制字操作对应的 PC 引脚来打开。解决方法是紧接着方式选择字补一条MOV AL, 09H / OUT DX, AL对 PC4 置位把 INTE_A 打开。报告里把这条写清楚比抄十遍方式 1 的引脚定义都管用。第五条C 语言版本编译通过运行时直接异常退出。现象是程序一执行到outportb就崩。原因是那个函数依赖实模式下的直接 I/O 权限在受保护模式或者权限受限的环境里根本执行不了。解决方法是在实验箱配套的实模式编译环境里编译运行别拿去做跨环境测试如果一定要在别的环境验证算法逻辑就把端口读写抽成一个函数指针测试时替换成内存模拟硬件部分仍然回到实验箱上跑。6. 让数据站得住8255A 时序验证与回读自检的落地做法报告写到验证这一节最忌讳的就是“程序运行结果正确”这七个字。评委想看到的是证据你怎么知道地址没译错、怎么知道时序满足建立保持时间、怎么知道读回来的数据真的是从外部进来的而不是总线悬空。下面这套做法我每次做接口实验都会走一遍成本不高但能挡掉大部分质疑。6.1 回读自检飞线短接 PA 与 PB 跑一遍全组合最省事的验证是自环。用 8 根杜邦线把 PA0~PA7 与 PB0~PB7 一一对应短接然后把 PA 配成输出、PB 配成输入控制字取 82H。程序遍历 00H 到 FFH 共 256 个值写 PA、读 PB、比对任意一次不匹配就把出错值记下来。; 自环测试PA 输出 - 外部短接 - PB 输入回读控制字 82H SELF_TEST: MOV DX, CTRL_PORT MOV AL, 82H ; 方式0PA 输出PB 输入 OUT DX, AL MOV CX, 0100H ; 256 次 MOV BL, 00H ; 测试向量从 00H 开始 TEST_LOOP: MOV DX, PA_PORT MOV AL, BL OUT DX, AL ; 送出测试向量 MOV DX, PB_PORT IN AL, DX ; 从 PB 读回 CMP AL, BL JNE TEST_FAIL ; 不一致跳到失败处理 INC BL LOOP TEST_LOOP MOV AH, 00H ; AH0 表示全部通过 JMP TEST_END TEST_FAIL: MOV AH, 01H ; AH1 表示失败BL/AL 中为出错值 TEST_END: RET这段代码的价值在于把“地址通路 端口方向配置 数据总线”三件事一次性验证完了。256 个向量能覆盖全部数据线组合任何一根 D 线虚焊、任何一个方向位写反都会在某一轮比对中暴露出来。报告里把 256 次全通过的记录写进去或者把失败时的出错向量列出来都比一句“测试正常”有分量。6.2 逻辑分析仪抓 /CS、/WR、PA0 三条线的判读要点有逻辑分析仪就用没有就用示波器的双通道凑合。探头接三处/CS或 138 的对应输出、/WR、PA0。触发条件设成 /CS 下降沿采样率至少 1MHz抓一次 OUT 指令的完整波形。观察点正常表现异常含义/CS 与 /WR 的重叠区/WR 的低电平完全落在 /CS 低电平之内时序错位写操作可能没被识别/WR 脉宽与 CPU 主频对应的若干个时钟周期脉宽过窄8255A 采样不到PA0 跳变时刻在 /WR 上升沿之后稳定建立数据在写信号结束前就变了违反保持时间/CS 的重复触发一次 OUT 只出现一个 /CS 脉冲出现多个说明地址译码有毛刺最后一行尤其值得看。如果 138 的使能脚接了带毛刺的信号一次写操作可能产生多个片选脉冲8255A 会被写入多次现象是“数据偶尔对偶尔错”这种间歇性故障最难查逻辑分析仪一抓一个准。把这张表和图一起放进报告时序分析这一节就立住了。6.3 报告里该放什么证据我的习惯是固定放三样东西一张地址译码推导表138 输入 → 输出 → 对应地址段、一张控制字对照表用途 → 二进制 → 十六进制、一段自环测试的通过记录。这三样东西分别对应“硬件链路”“软件配置”“结果可信度”正好覆盖了接口实验最容易被追问的三个点。还有个小技巧把延时子程序的参数标定过程单独写成一小段说明“内层循环 0F000H 次实测 PA0 翻转周期 213ms反推每次 LOOP 约 17 个时钟周期与手册给出的指令周期数吻合”。这种把软件参数和硬件手册对上的动作是区分“跑通了”和“搞懂了”的关键。我自己吃过最大的亏是第一次做完实验就把接线全拆了等到写报告要补一组数据时只能凭记忆瞎写结果被问“你这个波形是在哪个引脚上抓的”时答不上来。从那以后我养成习惯接线不动先把所有要写进报告的波形和读数拍完、存好再收工。这个习惯比任何调试技巧都值钱。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑