手把手教你用8255和8254芯片在TPC-ZK-USB实验箱上实现交通灯倒计时(含紧急状态处理)

张开发
2026/4/10 16:57:47 15 分钟阅读

分享文章

手把手教你用8255和8254芯片在TPC-ZK-USB实验箱上实现交通灯倒计时(含紧急状态处理)
从零构建基于8255与8254的智能交通灯控制系统硬件准备与实验箱配置TPC-ZK-USB实验箱作为经典的微机接口教学平台其模块化设计非常适合进行硬件接口编程实践。在开始编码前我们需要完成以下硬件准备工作芯片定位与功能确认8255并行接口芯片负责LED灯组和数码管的控制8254定时器芯片提供精确的计时功能LED模块模拟交通信号灯数码管模块显示倒计时信息关键接线配置表信号源目标接口功能说明8255 PC7L7 (红灯)南北方向红灯控制8255 PC6L6 (黄灯)南北方向黄灯控制8255 PC5L5 (绿灯)南北方向绿灯控制8255 PC4L2 (红灯)东西方向红灯控制8255 PC3L1 (黄灯)东西方向黄灯控制8255 PC2L0 (绿灯)东西方向绿灯控制8255 PC1S1数码管十位选通8255 PC0S0数码管个位选通8255 PA0-PA7a-h段数码管段选信号8254 CLK01MHz时钟定时器基准时钟输入8254 OUT0CLK1级联定时器通道8254 OUT1MIRQ3中断请求信号输出地址分配确认8255基地址288H-28BH8254基地址280H-287H提示接线时建议使用不同颜色的导线区分信号类型电源线(红色)、地线(黑色)、数据线(绿色)、控制线(黄色)等可大幅降低接错概率。芯片初始化与基础功能实现8255工作模式配置8255作为整个系统的核心控制芯片需要正确设置其工作模式。我们采用模式0——基本输入输出模式所有端口设置为输出mov dx, 28Bh ; 8255控制端口地址 mov al, 80h ; 控制字10000000b out dx, al ; 设置PA、PB、PC口均为输出模式8254定时器配置8254需要配置两个通道实现精确计时和中断触发; 通道0配置 mov dx, 283h ; 8254控制端口 mov al, 36h ; 00110110b - 通道0方式3二进制计数 out dx, al mov ax, 1000 ; 计数初值 mov dx, 280h out dx, al ; 先写低字节 mov al, ah out dx, al ; 再写高字节 ; 通道1配置 mov dx, 283h mov al, 76h ; 01110110b - 通道1方式3二进制计数 out dx, al mov ax, 1000 ; 计数初值 mov dx, 281h out dx, al ; 先写低字节 mov al, ah out dx, al ; 再写高字节基础交通灯状态机实现交通灯的正常工作流程遵循严格的状态转换机制我们可以用状态表来描述; 交通灯状态表 DENG db 30h, 50h, 10h, 50h, 10h, 50h, 10h ; 南北绿东西红状态序列 db 84h, 88h, 80h, 88h, 80h, 88h, 80h ; 南北红东西绿状态序列 db 0FFh ; 结束标志状态控制逻辑的核心代码mov bx, N ; 获取当前状态索引 mov al, DENG[bx] ; 读取对应状态值 mov dx, 28Ah ; 8255端口C地址 out dx, al ; 输出控制信号 cmp al, 0FFh ; 检查是否到达结束标志 jz reset_state ; 重置状态机中断服务与倒计时显示中断向量设置硬件中断是系统实时响应的关键需要正确配置中断向量; 保存原中断向量 mov ax, 350Bh ; 获取0Bh号中断向量 int 21h mov intseg, es mov intoff, bx ; 设置新中断处理程序 cli ; 关中断 push ds mov dx, offset intproc mov ax, seg intproc mov ds, ax mov ax, 250Bh ; 设置0Bh号中断向量 int 21h pop ds ; 允许8259中断 in al, 21h mov intimr, al and al, 0F7h ; 开启IRQ3 out 21h, al sti ; 开中断数码管动态显示技术两位数码管显示需要采用动态扫描技术关键实现如下段码表定义led db 3Fh, 06h, 5Bh, 4Fh, 66h, 6Dh, 7Dh, 07h, 7Fh, 6Fh ; 0-9段码动态显示实现; 显示十位数 mov bl, buf ; 十位数值 mov bh, 0 mov al, led[bx] ; 获取对应段码 mov dx, 288h ; 8255端口A out dx, al ; 输出段码 mov al, 2 ; 选择十位数码管(PC1) mov dx, 28Ah out dx, al call delay ; 短暂延时 ; 显示个位数 mov bl, buf1 ; 个位数值 mov bh, 0 mov al, led[bx] ; 获取对应段码 mov dx, 288h out dx, al ; 输出段码 mov al, 1 ; 选择个位数码管(PC0) mov dx, 28Ah out dx, al call delay ; 短暂延时倒计时逻辑实现中断服务程序中实现倒计时逻辑intproc proc sti push ax push ds mov ax, data mov ds, ax cmp flag, 0 ; 判断当前是否为绿灯状态 jnz yellow ; 不是则跳转到黄灯处理 ; 绿灯状态倒计时处理 mov al, buf1 ; 个位数 dec al ; 减1 cmp al, 9 ; 检查是否需要借位 jb no_borrow mov al, 9 ; 重置为9 dec buf ; 十位数减1 no_borrow: mov buf1, al ; 保存个位数值 jmp update_display yellow: ; 黄灯状态处理 inc N ; 切换到下一个灯状态 mov al, buf1 dec al cmp al, 6 ; 黄灯特殊处理 jae update_display mov al, 6 ; 保持最小值 not flag ; 切换状态标志 update_display: mov buf1, al ; 更新显示值 mov al, 20h ; 中断结束命令 out 20h, al pop ds pop ax iret intproc endp紧急状态处理与系统健壮性紧急状态响应机制系统需要处理三种紧急状态全红灯状态Enter键触发南北绿灯常亮1键触发东西绿灯常亮2键触发键盘检测与响应代码check_keyboard: mov ah, 06h mov dl, 0FFh int 21h ; 检测键盘输入 jz no_input ; 无输入则继续 cmp al, 13 ; Enter键 je emergency_all_red cmp al, 1 ; 1键 je emergency_ns_green cmp al, 2 ; 2键 je emergency_ew_green cmp al, ; 空格键 je return_normal no_input: jmp continue_normal emergency_all_red: mov dx, 28Ah mov al, 90h ; 10010000b - 两方向红灯 out dx, al jmp check_return emergency_ns_green: mov dx, 28Ah mov al, 30h ; 00110000b - 南北绿东西红 out dx, al jmp check_return emergency_ew_green: mov dx, 28Ah mov al, 84h ; 10000100b - 南北红东西绿 out dx, al check_return: mov ah, 06h mov dl, 0FFh int 21h cmp al, ; 检查空格键 jne check_return jmp return_normal return_normal: ; 恢复正常状态处理 mov N, 0 ; 重置状态索引 mov buf, 3 ; 重置倒计时十位 mov buf1, 0 ; 重置倒计时个位 mov flag, 0 ; 重置状态标志系统稳定性保障措施中断保护机制关键代码段使用CLI/STI指令保护保存和恢复现场寄存器正确发送EOI命令状态一致性检查定期校验灯状态与倒计时一致性设置状态异常恢复机制抗干扰设计按键消抖处理异常输入过滤状态机自恢复注意实际调试时建议添加状态指示灯或调试输出便于快速定位问题。遇到异常时首先检查硬件连接然后是中断配置最后排查软件逻辑。

更多文章