8086+8253+8255 Proteus 8.6 电子秒表:0.1秒精度与3按键中断控制实现

8086+8253+8255 Proteus 8.6 电子秒表:0.1秒精度与3按键中断控制实现

8086+8253+8255 Proteus 8.6 电子秒表:0.1秒精度与3按键中断控制实现

在微机原理与接口技术的学习中,电子秒表是一个经典的综合实验项目。本文将详细介绍如何在Proteus 8.6仿真环境中,使用8086微处理器配合8253定时器和8255并行接口芯片,实现一个精度达到0.1秒的电子秒表系统,并通过NMI非屏蔽中断处理三个独立按键(开始、暂停/继续、复位)的控制逻辑。

1. 系统设计与核心组件

1.1 硬件架构概述

本系统采用8086微处理器作为控制核心,搭配以下关键外设芯片:

  • 8253可编程定时器:负责产生精确的0.1秒时间基准
  • 8255可编程并行接口:实现7段数码管动态扫描显示
  • 74HC154译码器:用于地址译码和片选信号生成
  • 共阳极7段数码管:4位显示,分别表示小时、分钟、秒和0.1秒

系统硬件连接示意图如下:

8086 CPU → 地址总线 → 74HC154译码器 → 8253/8255片选 ↘ 数据总线 → 8253控制端口/8255数据端口 ↘ 控制总线 → NMI中断请求

1.2 关键芯片功能分配

芯片功能描述端口地址
8253通道0产生10ms定时,通道2扩展为1秒400H-406H
8255端口A控制段选,端口B控制位选200H-203H
74HC154生成8253和8255的片选信号基于A12-A9译码

2. 8253定时器精确配置

2.1 定时器参数计算

要实现0.1秒(100ms)的定时精度,需合理配置8253的工作模式和计数初值。假设系统时钟频率为100kHz:

  1. 通道0配置

    • 工作模式:模式3(方波发生器)
    • 输入时钟:100kHz → 周期T=10μs
    • 计数初值:N0 = 100 → Tout0 = 100×10μs = 1ms
  2. 通道2配置

    • 工作模式:模式0(中断计数)
    • 输入时钟:通道0输出(1ms周期)
    • 计数初值:N2 = 100 → Tout2 = 100×1ms = 100ms

实际配置代码如下:

; 8253初始化 MOV DX, 406H ; 控制端口 MOV AL, 00110110B ; 通道0,模式3,二进制 OUT DX, AL MOV DX, 400H ; 通道0 MOV AX, 100 ; 计数初值 OUT DX, AL ; 写入低字节 MOV AL, AH OUT DX, AL ; 写入高字节 MOV DX, 406H MOV AL, 10110000B ; 通道2,模式0,二进制 OUT DX, AL MOV DX, 404H ; 通道2 MOV AX, 100 OUT DX, AL MOV AL, AH OUT DX, AL

2.2 定时误差补偿技巧

在实际应用中,需考虑以下因素来保证定时精度:

  • 时钟源稳定性:使用晶体振荡器而非RC振荡
  • 中断响应延迟:在中断服务程序中尽快重装定时器
  • 累计误差消除:定期同步系统时间基准

3. 8255数码管动态显示

3.1 显示原理与硬件连接

采用4位共阳极数码管动态扫描方式,通过8255的端口A输出段码,端口B输出位选信号:

  • 端口A(200H):连接数码管段选(a-g,dp)
  • 端口B(201H):连接位选信号(位0-位3)
  • 工作模式:8255设置为模式0,端口A、B输出,端口C输入

配置代码示例:

; 8255初始化 MOV DX, 203H ; 控制端口 MOV AL, 10000010B ; 模式0,A出,B出,C入 OUT DX, AL

3.2 动态扫描实现

数码管显示需要不断刷新以避免闪烁,典型刷新频率为50-100Hz。显示缓冲区结构:

DISPLAY_BUFFER DB 4 DUP(0) ; 存储4位数码管的段码 SCAN_INDEX DB 0 ; 当前扫描位索引

动态扫描中断服务程序:

DISPLAY_ISR: PUSH AX PUSH DX ; 关闭当前位显示 MOV DX, 201H MOV AL, 0FFH OUT DX, AL ; 更新扫描索引 MOV AL, [SCAN_INDEX] INC AL CMP AL, 4 JL @NO_WRAP MOV AL, 0 @NO_WRAP: MOV [SCAN_INDEX], AL ; 输出段码 MOV SI, OFFSET DISPLAY_BUFFER ADD SI, AX MOV DX, 200H MOV AL, [SI] OUT DX, AL ; 开启当前位显示 MOV DX, 201H MOV AL, 11111111B MOV CL, [SCAN_INDEX] SHR AL, CL OUT DX, AL POP DX POP AX IRET

4. 按键中断控制实现

4.1 硬件电路设计

三个功能按键通过或门连接到8086的NMI引脚,实现非屏蔽中断触发:

  • 开始键:按下时启动计时
  • 暂停/继续键:暂停或恢复计时
  • 复位键:清零计时器

电路设计要点:

  • 按键需添加硬件消抖电路(RC滤波)
  • NMI信号需保持足够宽度以确保CPU捕获

4.2 中断服务程序设计

NMI中断服务程序需要识别具体按键并执行相应操作:

NMI_ISR: PUSH AX PUSH DX ; 读取8255端口C状态 MOV DX, 202H IN AL, DX ; 检测开始键(PB0) TEST AL, 01H JZ @START_PRESSED ; 检测暂停键(PB1) TEST AL, 02H JZ @PAUSE_PRESSED ; 检测复位键(PB2) TEST AL, 04H JZ @RESET_PRESSED JMP @NMI_EXIT @START_PRESSED: ; 启动定时器逻辑 CALL START_TIMER JMP @NMI_EXIT @PAUSE_PRESSED: ; 切换暂停/继续状态 CALL TOGGLE_PAUSE JMP @NMI_EXIT @RESET_PRESSED: ; 复位计时器 CALL RESET_TIMER @NMI_EXIT: POP DX POP AX IRET

5. Proteus仿真调试技巧

5.1 常见问题排查

  1. 定时不准确

    • 检查8253时钟源频率设置
    • 验证计数初值计算是否正确
    • 确认工作模式配置(模式3用于周期性定时)
  2. 数码管显示异常

    • 确认共阳/共阴类型匹配
    • 检查段码表是否正确
    • 调整动态扫描频率(通常5-10ms刷新一次)
  3. 按键无响应

    • 测量NMI引脚信号是否正常产生
    • 检查8255端口C输入配置
    • 验证中断向量表设置

5.2 性能优化建议

  • 中断响应优化

    ; 快速保存现场(仅保存必要寄存器) NMI_ISR: PUSH AX PUSH DX ; 中断处理逻辑 POP DX POP AX IRET
  • 显示刷新优化

    • 使用查表法替代实时计算段码
    • 建立显示缓冲区减少IO操作
  • 定时精度提升

    • 在中断服务程序开始处立即重装定时器
    • 使用更高精度时钟源(如1MHz)

6. 完整系统集成与测试

6.1 系统初始化流程

  1. 配置8253定时器
  2. 初始化8255显示接口
  3. 设置NMI中断向量
  4. 清零时间计数变量
  5. 启用中断

示例代码框架:

ORG 1000H START: ; 设置数据段 MOV AX, @DATA MOV DS, AX ; 初始化8253 CALL INIT_8253 ; 初始化8255 CALL INIT_8255 ; 设置NMI中断向量 MOV AX, 0 MOV ES, AX MOV WORD PTR ES:[8], OFFSET NMI_ISR MOV WORD PTR ES:[10], CS ; 初始化显示 CALL CLEAR_DISPLAY ; 主循环 STI MAIN_LOOP: JMP MAIN_LOOP INIT_8253: ; 8253初始化代码 RET INIT_8255: ; 8255初始化代码 RET NMI_ISR: ; 中断服务程序 IRET ; 其他子程序...

6.2 测试方案设计

建议按照以下步骤验证系统功能:

  1. 定时器测试

    • 单独验证8253各通道输出波形
    • 检查中断触发周期是否准确
  2. 显示测试

    • 编写测试模式显示固定数字
    • 检查各段各位的显示效果
  3. 按键功能测试

    • 逐个验证开始、暂停、复位功能
    • 测试按键消抖效果
  4. 系统集成测试

    • 完整运行秒表功能
    • 长时间运行检查累计误差

7. 进阶功能扩展

基于当前系统框架,可进一步扩展以下功能:

  1. 多模式计时

    • 分段计时(Lap Time)
    • 倒计时功能
  2. 显示增强

    • 添加冒号闪烁效果
    • 低电压提示
  3. 通信接口

    • 通过串口输出时间数据
    • 连接PC进行数据分析

扩展功能示例代码框架:

; 倒计时模式实现 COUNTDOWN: MOV CX, [TARGET_TIME] ; 设置目标时间 COUNTDOWN_LOOP: CMP CX, 0 JE @COUNTDOWN_END CALL UPDATE_DISPLAY CALL DELAY_100MS DEC CX JMP COUNTDOWN_LOOP @COUNTDOWN_END: ; 倒计时结束处理 RET

实际开发中,建议先在Proteus中完成基本功能验证,再逐步添加扩展功能。遇到问题时,可采用分模块调试策略,先确保各独立模块工作正常,再进行系统集成。