8086+8255+8253 交通灯仿真:Proteus 8.7 完整电路与汇编代码解析
在微机原理与接口技术的学习中,交通灯控制系统是一个经典的实践项目。本文将详细介绍如何使用Proteus 8.7仿真软件,结合8086微处理器、8255并行接口和8253定时器,构建一个完整的十字路口交通灯控制系统。不同于常见的单片机实现方案,本设计采用x86架构的8086处理器,更能体现计算机系统底层硬件控制原理。
1. 系统架构设计
交通灯控制系统需要精确控制四个方向的信号灯状态转换,并实现倒计时显示功能。系统硬件架构主要由以下部分组成:
- 8086微处理器:作为系统核心,负责执行控制逻辑和协调各外设工作
- 8255并行接口芯片:用于控制LED信号灯和数码管显示
- 8253定时器/计数器:提供精确的时间基准
- 74HC573锁存器:用于地址译码和信号锁存
- 共阳极数码管:显示各方向剩余时间
系统工作流程如下图所示(文字描述替代图示):
- 8253定时器产生固定频率的中断信号
- 8086响应中断并更新交通灯状态
- 通过8255输出控制信号驱动LED和数码管
- 循环检测紧急按钮状态
2. Proteus电路设计
在Proteus 8.7中搭建仿真电路时,需要特别注意各芯片的连接方式:
2.1 核心器件连接
| 器件 | 连接说明 | 关键引脚配置 |
|---|---|---|
| 8086 | 最小系统配置 | CLK(10MHz), RESET(高电平有效) |
| 8255 | 端口地址分配 | PA(信号灯), PB(数码管段选), PC(数码管位选) |
| 8253 | 定时器配置 | CLK0(1MHz), OUT0(接8086 IRQ) |
2.2 地址译码电路
使用74HC138译码器实现芯片选择:
; 端口地址定义 PORT_8255_CTRL EQU 0FF06H ; 控制端口 PORT_8255_A EQU 0FF00H ; PA端口 PORT_8255_B EQU 0FF02H ; PB端口 PORT_8255_C EQU 0FF04H ; PC端口 PORT_8253_CTRL EQU 0FF0EH ; 8253控制端口2.3 信号灯与数码管连接
- 东西南北各方向配置红、黄、绿三色LED
- 使用4位共阳极数码管显示倒计时
- 8255端口负载能力不足时需添加驱动三极管
注意:Proteus中数码管需正确设置共阳/共阴属性,否则无法正常显示
3. 汇编程序设计
程序采用模块化设计,主要包含以下功能模块:
3.1 初始化代码
ORG 1000H START: ; 初始化8255 MOV DX, PORT_8255_CTRL MOV AL, 10000000B ; PA/PB输出, PC输出 OUT DX, AL ; 初始化8253 MOV DX, PORT_8253_CTRL MOV AL, 00110110B ; 计数器0, 方式3, 二进制 OUT DX, AL MOV DX, PORT_8253_0 MOV AX, 1000 ; 定时1ms(假设CLK=1MHz) OUT DX, AL MOV AL, AH OUT DX, AL ; 设置中断向量 CLI MOV AX, 0 MOV ES, AX MOV DI, 08H*4 ; IRQ0中断向量 MOV AX, OFFSET TIMER_ISR STOSW MOV AX, CS STOSW STI3.2 主控制逻辑
系统状态机实现五种工作模式切换:
- 全红状态(2秒)
- 南北绿灯+东西红灯(55秒)
- 南北黄灯+东西红灯(5秒)
- 东西绿灯+南北红灯(35秒)
- 东西黄灯+南北红灯(5秒)
STATE_MACHINE: CMP [CURRENT_STATE], 1 JE STATE1 CMP [CURRENT_STATE], 2 JE STATE2 ; 其他状态处理... JMP STATE_END STATE1: ; 全红状态 MOV AL, 00001001H ; 东西南北红灯 MOV DX, PORT_8255_A OUT DX, AL MOV [COUNTDOWN], 200 ; 2秒计时 JMP STATE_END3.3 中断服务程序
TIMER_ISR PROC FAR PUSH AX PUSH DX DEC [COUNTDOWN] JNZ EXIT_ISR ; 状态转换 INC [CURRENT_STATE] CMP [CURRENT_STATE], 6 JNE UPDATE_STATE MOV [CURRENT_STATE], 1 UPDATE_STATE: CALL STATE_MACHINE EXIT_ISR: MOV AL, 20H ; EOI信号 OUT 20H, AL POP DX POP AX IRET TIMER_ISR ENDP4. 关键问题解决
在实现过程中,以下几个问题需要特别注意:
4.1 数码管动态显示
采用分时复用技术实现4位数码管显示:
DISPLAY: MOV SI, OFFSET DIGITS ; 显示缓冲区 MOV CL, 0FEH ; 位选初始值 NEXT_DIGIT: MOV AL, CL MOV DX, PORT_8255_C ; 位选端口 OUT DX, AL MOV AL, [SI] ; 段选数据 MOV DX, PORT_8255_B OUT DX, AL CALL DELAY_1MS ; 保持显示 INC SI ROL CL, 1 ; 移位选择下一位 JNC NEXT_DIGIT RET4.2 定时精度调整
8253定时器参数计算公式:
定时初值 = 输入时钟频率 / 所需中断频率 例如:1MHz时钟,1ms中断 → 初值=10004.3 紧急模式处理
通过独立按键检测实现紧急控制:
CHECK_EMERGENCY: MOV DX, PORT_8255_C IN AL, DX TEST AL, 80H ; PC7连接紧急按钮 JZ NORMAL_MODE EMERGENCY_MODE: MOV AL, 00001001H ; 全红状态 MOV DX, PORT_8255_A OUT DX, AL JMP CHECK_EMERGENCY5. 仿真调试技巧
在Proteus中进行调试时,可以采用以下方法提高效率:
分模块验证:
- 先单独测试8253定时功能
- 再验证8255端口输出
- 最后整合完整系统
调试工具使用:
- 利用Proteus逻辑分析仪观察时序
- 设置断点单步执行汇编代码
- 监控关键内存单元值变化
常见问题排查:
- 数码管不亮:检查共阳/共阴配置
- 灯状态错误:验证8255初始化方式字
- 定时不准:调整8253计数初值
实际项目中,我们发现在状态切换时添加50ms的消抖延时能有效避免误动作。此外,使用查表法替代复杂的计算可以显著减少代码执行时间。