十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

8255并行接口十字路口交通灯课程设计:从端口地址到软件延时全解析

8255并行接口十字路口交通灯课程设计:从端口地址到软件延时全解析 简介微机原理十字路口交通灯课程设计报告面向电气工程及其自动化等专业学生适用于微机接口技术课程实践和课程设计参考。报告以可编程并行接口芯片8255为控制核心围绕十字路口红绿灯控制展开包含设计要求东西方向放行60秒、黄灯闪烁5秒等、延时设计、8255引线结构、电路接线图、程序流程图及汇编代码实现覆盖了从硬件设计到软件编程的完整流程。针对定时控制“固定间隔、不能适应车流量变化”的缺陷报告还分析了模糊控制等智能化改进方向体现了理论与实践结合的设计思路。资源为单个PDF文档大小约250KB内容为完整的课程设计报告书含前言、摘要、目录与设计总结便于按章节查阅或打印。已有426人学习浏览适合需要快速完成微机原理课程设计、掌握8255接口应用或理解交通灯控制逻辑的读者借鉴。1. 微机原理十字路口交通灯课程设计一块 8255 芯片的完整控制链路十字路口交通灯大概是微机原理与接口技术课程里被拆得最多、也最容易被低估的题目。表面看只是让 16 个 LED 按东西放行 60 秒 → 黄灯闪烁 5 秒 → 南北放行 20 秒 → 黄灯闪烁 5 秒循环往复真动手才发现 8255 的端口寻址、工作方式控制字、LED 位映射、软件延时的时间标定每一环都会卡人。这套 8086 8255 方案把并行接口从会做概念题推进到会写状态字、会算地址、会调时序的层面东西 60 秒与南北 20 秒的不对称放行也已经是在向真实路口的潮汐车流靠拢。做课程设计、复习 8255 并行接口或者想看看汇编怎么组织一个状态机的工程师都能从这里拆到可复用的东西。2. 8255 端口地址推导与方式控制字 80H 的位含义8255 可编程并行接口芯片有 A、B、C 三个 8 位端口和一个控制寄存器CPU 访问它们靠两根地址线 A1、A0 区分。看起来简单但地址怎么算、控制字怎么写恰恰是第一个分水岭。2.1 从 IOY0 到四个寄存器地址×4 偏移怎么来的课程设计报告给出的地址符号定义如下IOY0 EQU 0DA00H ; 片选 IOY0 对应的端口起始地址 MY8255_A EQU IOY000H*4 ; 8255 的 A 口地址 MY8255_B EQU IOY001H*4 ; 8255 的 B 口地址 MY8255_C EQU IOY002H*4 ; 8255 的 C 口地址 MY8255_MODE EQU IOY003H*4 ; 8255 控制寄存器地址把表达式展开四个地址分别是寄存器地址表达式实际地址A 口0DA00H 0×40DA00HB 口0DA00H 1×40DA04HC 口0DA00H 2×40DA08H控制寄存器0DA00H 3×40DA0CH这里最容易困惑的是 ×4。8255 内部只有 A1、A0 两根选择线A1A0 00、01、10、11 分别选中 A 口、B 口、C 口和控制寄存器如果 A1、A0 直接接 8086 的 A1、A0四个寄存器地址应该连续排列。实验箱上常见做法是把 8255 的 A1、A0 接到地址总线的 A3、A2于是每两个寄存器之间空出 4 个字节也就出现了 ×4 这种写法。移植到自绘板子时务必先看原理图上 A1、A0 接的是哪两根线接错了控制字写进数据口现象就是灯完全不动或者写 A 口时 B 口跟着变。提示自绘板子上 8255 的 A1、A0 接哪两根地址线直接决定端口地址表达式动手前务必先对原理图。2.2 方式控制字 80H每一位在决定什么8255 的初始化只有三条指令MOV DX, MY8255_MODE ; 指向控制寄存器 MOV AL, 80H ; 方式控制字 OUT DX, AL ; 写入80H 1000 0000B按 8255 控制字格式逐位拆解位值含义D71本字节是方式控制字为 0 时被解释成 C 口按位置位/复位D6 D500A 口工作于方式 0基本输入/输出D40A 口方向为输出D30C 口高 4 位输出设计未用D20B 口工作于方式 0D10B 口方向为输出D00C 口低 4 位输出设计未用选方式 0 的理由很直接交通灯控制里 A、B 口只是单向输出电平既不需要握手也不需要选通C 口完全闲置。方式 1 和方式 2 要把 C 口拆成 STB、IBF、OBF 这类联络信号对这个场景是纯开销。另一个必须记住的坑是 D7如果初始化时把 80H 错写成 00H8255 不会把端口配成输出而是把 00H 当成对 C 口第 0 位复位的置位/复位命令A、B 口方向保持不变后面的 OUT 指令全部无效。另外要留意 8255 上电或 RESET 后所有端口默认是输入方式输出锁存器内容不确定所以初始化必须写在任何 LED 输出之前否则上电瞬间可能看到几个灯乱闪。3. 16 个 LED 的位映射与六个状态字的编码推导硬件连线一旦定了软件里唯一要保证正确的事情就是往 A、B 口写的字节每一位都精确对应一个灯。这一章把状态字的编码过程完整推一遍后面写代码就是查表。3.1 A 口与 B 口如何分管东、南、西、北实验箱上有 16 个发光二极管编号 D15D0。课程设计规定A 口 8 位接 D15D8负责东、南两个方向B 口 8 位接 D7D0负责西、北两个方向。每个方向用两位 LED 控制一位给红灯、一位给绿灯黄灯不单设 LED用红灯 绿灯同时点亮表达。对应关系如下A 口位D15D8方向灯B 口位D7D0方向灯PA7 PA6D15 D14东红 ERPB7 PB6D7 D6西红 WRPA5 PA4D13 D12南红 SRPB5 PB4D5 D4北红 NRPA3 PA2D11 D10东绿 EGPB3 PB2D3 D2西绿 WGPA1 PA0D9 D8南绿 SGPB1 PB0D1 D0北绿 NG黄灯表达式为东黄 EY ER EG南黄 SY SR SG其余方向类推。这种做法的好处是 8 位口只够覆盖两个方向两个口合计 16 位刚好放下四个方向的 8 盏实体灯代价是每两位必须保持同步——写数时脑子里要按每两位一组来组织而不是按单个 bit。3.2 状态字 3CH / 0FCH / 0C3H 的逐位推导以第一个状态东西方向绿灯亮、南北方向红灯亮为例只看 A 口东、南。要求东红灭、南红亮、东绿亮、南绿灭按 PA7 到 PA0 逐位写东红灭 → PA7 PA6 00南红亮 → PA5 PA4 11东绿亮 → PA3 PA2 11南绿灭 → PA1 PA0 00拼起来是 0011 1100B 3CH。B 口的西、北方向与东、南完全镜像西绿亮、北红亮所以 B 口写同一个 3CH 即可。其余状态同理推导写在程序里就是一份状态字定义; 状态字查表定义A/B 口共用同一字节红绿黄 STATE_EW_GREEN EQU 3CH ; 东西绿亮南北红亮 STATE_EW_Y_ON EQU 0FCH ; 东西黄亮红绿同亮南北红亮 STATE_EW_Y_OFF EQU 30H ; 东西灭南北红亮 STATE_NS_GREEN EQU 0C3H ; 南北绿亮东西红亮 STATE_NS_Y_ON EQU 0F3H ; 南北黄亮红绿同亮东西红亮 STATE_NS_Y_OFF EQU 0C0H ; 南北灭东西红亮六个状态完整枚举如下状态A/B 口数据二进制东红 南红 东绿 南绿灯效东西放行3CH00 11 11 00东、西绿亮南、北红亮东西黄灯亮半周0FCH11 11 11 00东、西红绿同亮黄南、北红亮东西黄灯灭半周30H00 11 00 00东、西灭南、北红亮南北放行0C3H11 00 00 11东、西红亮南、北绿亮南北黄灯亮半周0F3H11 11 00 11东、西红亮南、北红绿同亮黄南北黄灯灭半周0C0H11 00 00 00东、西红亮南、北灭这张表是整个程序唯一需要的数据字典。做扩展时比如加左转箭头灯按同一套两位一组规则往空位里填不会破坏已有状态。4. 主循环、黄灯闪烁与软件延时子程序的时序拆解汇编程序没有函数库一切靠段、标号和子程序组织。这一章先看主循环怎么在四段状态间切换再单独拆延时子程序——课程设计里最容易看起来能跑、实际时间全不对的部分。4.1 主循环三段式结构与按键退出机制主循环用 LOOP1、L1、L2 三个标号构成一个完整周期LOOP1 负责东西放行L1 负责东西黄灯闪烁随后切到南北放行L2 负责南北黄灯闪烁最后检测按键决定是回到 LOOP1 还是退出到 DOS。LOOP1: MOV DX, MY8255_A MOV AL, 3CH ; 东西绿、南北红 OUT DX, AL MOV DX, MY8255_B MOV AL, 3CH ; 西绿、北红镜像 OUT DX, AL CALL DALLY1 ; 放行延时 MOV CX, 5 ; 黄灯 5 个亮灭周期 L1: MOV DX, MY8255_A MOV AL, 0FCH ; 东黄亮东红东绿同亮 OUT DX, AL MOV DX, MY8255_B MOV AL, 0FCH OUT DX, AL CALL DALLY2 ; 亮半周 MOV DX, MY8255_A MOV AL, 30H ; 东黄灭南红保持 OUT DX, AL MOV DX, MY8255_B MOV AL, 30H OUT DX, AL CALL DALLY2 ; 灭半周 LOOP L1 MOV DX, MY8255_A MOV AL, 0C3H ; 东西红、南北绿 OUT DX, AL MOV DX, MY8255_B MOV AL, 0C3H OUT DX, AL CALL DALLY3 ; 南北放行延时 MOV CX, 5 ; 同样 5 个亮灭周期 L2: MOV DX, MY8255_A MOV AL, 0F3H ; 南黄亮南红南绿同亮 OUT DX, AL MOV DX, MY8255_B MOV AL, 0F3H OUT DX, AL CALL DALLY2 MOV DX, MY8255_A MOV AL, 0C0H ; 南黄灭东红保持 OUT DX, AL MOV DX, MY8255_B MOV AL, 0C0H OUT DX, AL CALL DALLY2 LOOP L2 MOV AH, 1 ; BIOS 键盘查询功能号 INT 16H ; ZF1 表示无按键 JZ LOOP1 ; 无按键继续循环 QUIT: MOV AX, 4C00H ; 有按键则结束进程 INT 21H与课程设计原报告相比这里做了一处必要修正L1、L2 前显式装入 MOV CX, 5。原报告的两个内循环直接 LOOP而 CX 在前面没有任何赋值进入 L1 时 CX 是上一个子程序 PUSH/POP 后的残留值闪烁次数完全不可控这是软件延时最经典的坑。按键退出用的 INT 16H AH1 是非阻塞查询无按键时 ZF1JZ 跳回 LOOP1有按键时落入 QUIT用 INT 21H 的 4C00H 功能返回 DOS。4.2 三级嵌套延时与 60:20:5 的时间比例自洽性延时部分采用三级嵌套DALLY 是基础单元DALLY1、DALLY2、DALLY3 通过不同外层循环次数放大它DALLY PROC NEAR ; 基础延时单元 PUSH CX PUSH AX MOV CX, 0FFFH ; 外层 4095 次 D1: MOV AX, 0FFFFH ; 内层 65535 次 D2: DEC AX JNZ D2 LOOP D1 POP AX POP CX RET DALLY ENDP DALLY1 PROC NEAR ; 放行延时60 秒档 MOV CX, 1EH ; 30 个基础单元 D3: CALL DALLY LOOP D3 RET DALLY1 ENDP DALLY2 PROC NEAR ; 黄灯亮/灭半周期 MOV CX, 02H ; 2 个基础单元 D4: CALL DALLY LOOP D4 RET DALLY2 ENDP DALLY3 PROC NEAR ; 放行延时20 秒档 MOV CX, 0AH ; 10 个基础单元 D5: CALL DALLY LOOP D5 RET DALLY3 ENDP先算比例DALLY1 是 30 个基础单元DALLY3 是 10 个比值 3:1对应设计要求里 60 秒对 20 秒这部分自洽。麻烦出在黄灯一次完整闪烁 亮半周 灭半周 2 2 4 个基础单元如果按 60 秒 30 个单元推算每个单元是 2 秒一次闪烁就是 8 秒和5 秒对不上。也就是说原报告的倍数关系只保证 60:20没有保证 5 秒。要让三者同时成立需要把基础单元、外层倍数和内循环次数一起重定。子程序/循环修改后参数基础单元数目标时间DALLY 基础单元内层 AX 初值按实测标定原 0FFFFH 仅作参照10.5 秒标定目标DALLY1CX 78H12012060 秒DALLY3CX 28H404020 秒DALLY2半周期CX 01H10.5 秒L1/L2 循环次数CX 555 秒这套参数下比例完全闭合120:40:5×2 60:20:5。注意只需要缩 DALLY 的 AX 值来调基础单元绝对时长各层倍数关系保持不变主循环的逻辑一行都不用改。另外原报告的 DALLY1、DALLY3 注释互相写反了——DALLY1 实际用在东西放行 60 秒段DALLY3 用在南北放行 20 秒段看注释对不上实现时不要慌以调用位置为准。注意修改延时参数时只调 DALLY 的 AX 初值各层外循环倍数保持不动60:20:5 的相对比例才不会走样。4.3 黄灯复用红绿 LED 的编码技巧把红、绿两盏灯同时点亮做黄灯是这个设计里最巧也是最容易误读的一处。好处是不占额外 I/OA、B 口 16 位刚好覆盖四个方向坏处是状态字可读性下降0FCH 和 0F3H 这类值不对照位映射表根本看不出含义。建议在源码注释里直接写红绿黄的等价关系并保留一张 3.2 节那样的数据字典。真实路口灯盘上红、黄、绿是独立灯具到时要把黄灯拆成独立位这是离开实验箱后第一个要动手改的地方。5. 时间标定实操秒表校准与 8253 硬件定时改造5.1 两轮秒表标定法软件延时的绝对精度完全由 CPU 主频决定换了机器必须重标。操作流程先按 4.2 的参数装好程序用秒表测东西绿灯从亮到灭的时长 T。设目标 60 秒实测偏长就把 DALLY 内层 AX 初值按新 AX 旧 AX × 60 ÷ T 写回偏短同理反向缩放。改完重测一轮通常两轮能收敛到秒级误差。黄灯 5 秒周期不需要单独标因为各层倍数是线性关系基础单元准了全链路就准。5.2 从软件延时换 8253 的改造点追求精确实时应该换成 8253 定时/计数器。常见做法是用通道 0 工作于方式 3方波发生器通过计数初值产生秒级基准脉冲再用中断服务程序对脉冲计数到达 60、20、5 的边界时切换状态字CPU 空转循环彻底取消MOV DX, CTRL_ADDR ; 8253 控制寄存器地址按译码电路填写 MOV AL, 00110110B ; 通道 0方式 3先低字节后高字节 OUT DX, AL MOV DX, CNT0_ADDR ; 通道 0 计数器地址 MOV AX, 50000 ; 计数值 定时周期 ÷ 时钟周期 OUT DX, AL MOV AL, AH OUT DX, AL其中 50000 只是示意正确值由实验箱时钟频率决定计数值 × 时钟周期 基准时间。计数值超过 65535 时改用通道级联或降低基准粒度在 ISR 里累加计数再把 4.1 主循环改成一个状态机每个边界只改 AL 值写两个口比空转 CPU 干净得多。验证时用示波器同时挂 A 口与 B 口任意两路 LED 驱动引脚直接比对 60、5、20、5 四个边沿间隔比肉眼数灯更快定位时序偏差。本文还有配套的精品资源点击获取
返回列表