基于8255/8253/8259的交通信号灯控制系统设计与实现

发布时间:2026/9/17 18:06:44
基于8255/8253/8259的交通信号灯控制系统设计与实现 简介面向计算机、电子类专业的微机接口技术课程设计报告紧扣十字路口交通信号灯控制系统的设计与实现适合正在学习或完成相关课程设计的学生参考。报告以定时加中断控制为总体思路围绕红绿灯变换的典型时序系统讲解8255并行接口、8253计数器、8259中断控制器的工作原理与应用并结合软硬件定时、多位LED动态显示等关键技术给出了硬件连接、控制字设置、软件流程图及完整汇编源代码。压缩包内包含1个doc文档约250KB文档结构清楚涵盖设计目的、硬件与软件总体设计、结果分析和参考文献便于阅读、打印或二次修改。目前已有135人学习下载参考价值较高可帮助读者快速掌握交通信号灯的控制逻辑、定时中断编程方法及常见调试思路能够直接用于同类课程设计或实验报告的撰写。1. 交叉口时间参数改不动才是这个信号灯课题真正要解决的问题固定时序的交通信号灯有个很尴尬的处境平峰时段南北方向 60 秒绿灯空放东西方向排队车辆却要等完整个红灯周期。做过路口调研的人都知道真实车流是高度非线性、随机的定时控制本质上是在用最坏情况去套所有时段参数固化在单片机里以后想调一个方向的绿灯时间就得重新烧程序。这篇微机接口课程设计给出的方案是把定时从“写死”改成“阈值驱动”用 8253 把 1MHz 基准频率级联分频成 1Hz 秒脉冲8259 产生中断驱动一个秒计数器灯状态不再由 delay 循环决定而是由计数器区间映射时间参数改一个立即数就能生效同时保留数码管倒计时显示。对正在做 8255/8253/8259 实验、或者想把汇编里定时逻辑换成可配置方案的读者来说这份报告里的端口分配和状态机划分可以直接抄作业。2. 硬件链路梳理8255端口分配、8253级联定时与8259中断通道2.1 三个芯片各自承担什么这个系统的分工很清晰8255 并行接口是输出中枢C 口低 6 位直接驱动六只 LED 信号灯PA 口输出数码管段码PC1/PC0 做两位数码管的位选8253 计数器负责时间基准把实验箱提供的 1MHz 时钟分频到 1Hz8259 中断控制器则把秒脉冲转成中断请求让 CPU 不用轮询计数只在每秒进入一次中断服务程序修改计数变量。定时信号源选 8253 而不是纯软件 delay原因在于 delay 的延时长度依赖 CPU 主频换个机器时间就飘了而且 delay 期间 CPU 不能响应其他事情。8253 是独立硬件计数器分频比由初值决定时钟频率稳定时输出方波就是准确的 1Hz中断服务程序里做秒递减计时与 CPU 主频完全解耦。2.2 8255 的端口分配表六只信号灯接在 PC7~PC2三只一组对应南北、东西两个方向。这种接法不是随手选的8255 的 C 口支持按位置位/复位控制字后续如果想单独点亮某只灯而不影响其他灯一条控制字就能做到。两位数码管的位选占用了 PC1、PC0段码走 PA0~PA6。接线关系整理如下端口位连接对象功能说明PC7L7 红灯南北方向红灯1 点亮PC6L6 黄灯南北方向黄灯1 点亮PC5L5 绿灯南北方向绿灯1 点亮PC4L2 红灯东西方向红灯1 点亮PC3L1 黄灯东西方向黄灯1 点亮PC2L0 绿灯东西方向绿灯1 点亮PC1数码管 S1十位片选PC0数码管 S0个位片选PA6~PA0数码管 a~g七段码输出8255 的三个端口都工作在方式 0纯输出。初始化时往控制端口写 80H含义是方式 0、A 口输出、C 口输出B 口未使用也设置为输出。这种方式下端口就是简单的锁存器写入什么电平就保持什么电平非常适合直接驱动 LED 这种开关量负载。2.3 8253 级联从 1MHz 到 1Hz8253 有三个独立计数器这里用了两个做级联。单计数器最大分频比受限于初值范围16 位计数器最大数 655351MHz 直接分频到 1Hz 需要的分频系数是 1000000超出了单级能力所以先分 1000 倍到 1kHz再分 1000 倍到 1Hz。计数器输入时钟计数初值工作方式输出计数器 0CLK0 1kHz 或 1MHz1000方式 3方波OUT0 1kHz计数器 1CLK1 OUT01000方式 3方波OUT1 1Hz初始化代码如下先写控制字再写计数初值; 8253 初始化 mov dx, 283h ; 8253 控制字端口 mov al, 36h ; 00110110: 计数器0, 先低后高, 方式3, 二进制 out dx, al mov ax, 1000 ; 计数器0 初值 1000 mov dx, 280h ; 计数器0 端口 out dx, al ; 先写低字节 mov al, ah out dx, al ; 再写高字节 mov dx, 283h mov al, 76h ; 01110110: 计数器1, 先低后高, 方式3, 二进制 out dx, al mov ax, 1000 ; 计数器1 初值 1000 mov dx, 281h ; 计数器1 端口 out dx, al mov al, ah out dx, al控制字 36H 的位含义是D7D6 00 选择计数器 0D5D4 11 表示先读/写低字节再读/写高字节D3D2D1 011 选择方式 3D0 0 表示二进制计数。76H 对应计数器 1格式相同。注意初值 1000 对应十六进制 03E8H必须分两次写入先低后高顺序和控制字里的 RW 位约定保持一致。两个计数器的 GATE 都要接 5V保证计数始终使能。计数初值的计算公式是输出频率 输入频率 / 初值方式 3 输出是占空比接近 50% 的方波适合直接作为下一级计数器的输入时钟。2.4 8259 中断通道与地址映射OUT1 输出的 1Hz 方波接到 8259 的中断请求输入端代码里处理的是 0B 号中断向量对应 IR3 通道。不同实验箱的中断请求线可能不同但处理流程一致先获取原中断向量保存再设置新中断向量然后修改 IMR 中断屏蔽寄存器的对应位开放中断。实验箱上各芯片的 I/O 地址映射如下芯片端口地址8255A 口288H8255B 口289H8255C 口28AH8255控制口28BH8253计数器 0280H8253计数器 1281H8253控制口283H地址由译码电路决定更换实验箱时要先确认这段地址范围否则初始化代码写入的端口根本不对应到目标芯片。初始化顺序建议先把 8255 和 8253 配置好最后再开中断避免定时器已经跑起来但中断还没接管出现计数丢失。3. 软件状态机设计counter阈值划分与数码管刷新逻辑3.1 六状态不是六个case而是四个区间加奇偶交通灯完整变化过程看起来有六个阶段南北绿/东西红 30 秒南北黄闪/东西红 10 秒南北红/东西绿 30 秒南北红/东西黄闪 10 秒其中两个黄灯阶段又分成亮和灭两个子状态。代码没有为每个状态写独立计数器而是把整个周期 80 秒映射到一个不断递减的 counter 变量上。状态划分如下counter 区间南北方向东西方向持续时间阶段80 ~ 51绿灯亮红灯亮30 秒状态 150 ~ 41黄灯闪烁红灯亮10 秒状态 240 ~ 11红灯亮绿灯亮30 秒状态 310 ~ 1红灯亮黄灯闪烁10 秒状态 4四个区间对应四条比较跳转指令黄灯闪烁效果靠 counter 的奇偶判断实现奇数秒写亮灯状态偶数秒写灭灯状态。所以代码里每个黄灯阶段都拆成两个子程序一个是亮灯输出一个是灭灯输出。counter 初值设成 80 的来源是一个完整周期 30 10 30 10 共 80 秒8259 每秒触发一次中断counter 减一次减到 0 时重新开始。状态切换只是比较 counter 落在哪个区间而不是用状态号去跳转。好处是增加相位时长不需要重写状态机调整初值和阈值即可。3.2 主循环先扫数码管再调灯状态主循环 circle 做了两类事先判断当前处于南北绿灯还是东西绿灯刷新数码管倒计时然后根据 counter 区间调用对应的灯状态子程序。这样设计的原因是数码管显示的是剩余时间只有当某个方向绿灯亮起时驾驶员才需要看到倒计时红黄灯阶段显示数字没有意义。数码管刷新代码circle: mov dx, 28ah in al, dx ; 读取 C 口当前状态 test al, 00100000B ; 检查南北绿灯 PC5 是否亮 jnz Begin1 ; 南北绿灯亮刷新数码管 test al, 00000100B ; 检查东西绿灯 PC2 是否亮 jz Begin2 ; 两个绿灯都不亮跳过显示 Begin1: mov dx, 28ah mov al, 02h ; PC1 1选中十位数码管 out dx, al mov ax, mins ; 待显示倒计时值 mov bl, 10 div bl ; al 十位数字ah 个位数字 mov bl, al mov bh, 0 mov al, ledtb[bx] ; 查表取十位段码 mov dx, 288h out dx, al ; PA 口输出段码 call delay ; 保持十位显示 mov dx, 28ah mov al, 01h ; PC0 1选中个位数码管 out dx, al mov bl, ah mov bh, 0 mov al, ledtb[bx] ; 查表取个位段码 mov dx, 288h out dx, al call delay这段代码的关键在于查表法。ledtb 数组存放 0~9 的共阴数码管段码3FH 代表数字 006H 代表 15BH 代表 2以此类推。div bl 指令把倒计时值拆成十位和个位余数放在 ah商放在 al然后用 bx 索引段码表取出对应的七段编码。先送段码还是先送位码在这个程序里体现出的顺序是先置位 PC1 选中十位再输出十位段码延时保持然后再置位 PC0 选中个位输出个位段码。由于 PC1、PC0 在 C 口同一字节里写入 02H 时会把 PC7~PC2 全部置 0也就是六只信号灯瞬间全灭但这不影响最终状态因为主循环接着会调用状态子程序重新写入灯状态。3.3 mins与counter需要两个计数变量的原因counter 管状态切换从 80 减到 0全程 80 秒mins 管数码管显示只反映绿灯剩余时间。两者各自独立中断服务程序里同时减但作用完全不同。new0B proc sti push ax push si push ds mov ax, data mov ds, ax ; 中断环境 DS 不确定必须重新装载 dec counter ; 状态计时减 1 dec mins ; 显示倒计时减 1 cmp mins, 0 jne h mov mins, 40 ; 减到 0 后重置为 40 h: mov al, 20h out 20h, al ; 向 8259 发送 EOI 结束中断命令 pop ds pop si pop ax iret new0B endpmins 初始化 30第一个绿灯周期显示 30 递减到 0归零后重置为 40。40 这个值和东西绿灯阶段对应南北绿灯结束后进入南北黄闪 10 秒此时东西红灯继续保持再把东西绿灯的 30 秒加上这 10 秒正好是 40。也就是说黄灯阶段数码管就已经预显示下一个绿灯的完整剩余时间 40绿灯亮起时从 40 继续往下减。这种显示策略不是标准交通灯的常见做法但在实验演示里能直观看到倒计时跨阶段连续变化也方便检查定时是否准确。4. 汇编实现细节初始化顺序、中断向量设置与灯状态子程序4.1 初始化顺序为什么是DS→8255→8253→8259汇编程序里初始化顺序有讲究不能随意换。程序入口先要把 DS 指向数据段否则访问 counter、mins 这些变量时拿到的地址是错的。然后是 8255 控制字让各端口进入输出方式接着配置 8253 分频链路此时定时器开始输出 1Hz 方波但中断还没打开8259 收到请求也不会响应最后替换中断向量、修改 IMR、开中断。start: mov ax, data mov ds, ax ; DS 指向数据段 mov dx, 28bh ; 8255 控制字端口 mov al, 80H ; 方式0A口C口输出 out dx, al ; 8253 初始化代码见前文此处省略 ; 中断向量替换 mov ax, 350Bh ; INT 21H 功能 35H取中断向量 int 21h push es ; 保存原中断向量 push bx cli ; 替换期间关中断 push ds mov ax, seg new0B mov ds, ax mov dx, offset new0B mov ax, 250Bh ; INT 21H 功能 25H设置中断向量 int 21h pop ds in al, 21h ; 读取 IMR 中断屏蔽寄存器 push ax and al, 0f7h ; 只清 IR3 对应位其他保持 out 21h, al mov counter, 80 ; 初始化状态计数值 mov flag, 0 mov mins, 30 sti ; 开中断IMR 操作只改一位保留其他中断的屏蔽状态。and al, 0f7h把第 3 位清 0其他位原样保留0F7H 对应的二进制是 11110111BIR3 位被放行。如果直接写mov al, 这样会反而会把其他设备的中断设置全部冲掉实验箱上可能还有键盘、串口设备依赖这些位所以先读后改再写是对的。4.2 保存与恢复现场写中断服务程序的固定套路中断服务程序开头先开中断允许嵌套高优先级中断然后保存用到的寄存器。这里只压了 ax、si、ds说明服务程序内实际用到的寄存器就这三个够用即可。ds 必须重设这是汇编中断里最容易忽略的坑中断随时可能发生主程序执行到任何一条指令时ds 可能指向任意数据段不重设的话dec counter操作的就是错误地址。打断主程序时的寄存器状态也要考虑。主程序在circle循环里会用 bx 查表、用 ax 做 div这些值在中断回来之后还要继续用所以服务程序里不能碰 bx或者碰了就要压栈保护。原代码压了 si 但没有压 bx这在实际运行时有一定风险调试时如果发现偶然的死机或显示错乱首先要检查的就是中断服务和主程序之间有没有寄存器使用冲突。EOI 命令是中断服务程序的收尾动作。mov al, 20h; out 20h, al向 8259 的主片发送中断结束命令通知它当前中断处理完毕可以响应下一次中断请求。漏掉这条命令8259 会一直认为中断还在处理中后续 IRQ 全部被阻塞最直观的表现就是倒计时停住、灯状态不再变化。4.3 灯状态子程序与置位/复位的关系灯状态子程序直接向 C 口写入整个状态字节。比如南北绿灯、东西红灯时写 00110000BPC7 东西红灯是 0PC6 南北黄灯是 0PC5 南北绿灯是 1PC4 东西红灯是 1PC3 东西黄灯是 0PC2 东西绿灯是 0。Green_Red proc ; 南北绿灯东西红灯 mov dx, 28AH mov al, 00110000B out dx, al call delay ret Green_Red endp Yellow_Red proc ; 南北黄灯亮东西红灯 mov dx, 28AH mov al, 01010000B out dx, al call delay ret Yellow_Red endp这种一次性写入六位状态的写法简单直接一个字节就确定了全部灯的组合可读性也高。代价是每次写入都会把 PC1、PC0 也一起覆盖数码管位选会被清掉。在这个程序里这不是 bug因为主循环的执行顺序是先刷新数码管、再调用状态子程序状态子程序在最后执行数码管的位选信号被冲掉后下一次循环进入数码管刷新又会重新选中位。如果要让数码管显示和黄灯闪烁在同一时刻互不干扰就需要用 8255 的 C 口按位置位/复位控制字只操作指定的一位不动其他位。控制字格式是 D7 0 表示置位/复位模式D3D2D1 选择位号D0 决定置 1 还是清 0。比如点亮南北黄灯可以写mov al, 0EH即 0 000 111 0选择 PC6 位置 1这样 PC 口其他七位保持不变。两种写法各有适用场景状态多但变化组合固定时用字节写入更清晰需要精细控制某个位时用置位/复位更安全。中断服务程序里还有一个值得注意的细节cmp mins, 0; jne h; mov mins, 40这段没有写注释的位置容易让人误以为是把分钟重置。结合显示逻辑看这是把显示倒计时从 0 重新设为下一个绿灯阶段的起始值40 刚好覆盖黄闪 10 秒加绿灯 30 秒。修改这个数值可以控制倒计时显示范围比如只想显示绿灯本身的 30 秒就把 40 改成 30。5. 倒计时数码管动态扫描与定时方案的拓展5.1 数码管动态扫描调试的三个关键点两位数码管共用 PA 口的段码线靠 PC1、PC0 分时选中十位和个位这是典型的动态扫描驱动方式。人眼看到的连续数字其实是两个位以一定频率交替点亮的结果频率太低会看到闪烁频率太高段码切换跟不上下一个位选信号会出现拖影或者亮度不均。现象可能原因处理建议数字明显闪烁扫描频率低于 50Hz缩短 delay 延时提高切换频率高位比低位亮两个位选导通时间不等检查 PC1、PC0 对应的 delay 参数是否一致数字出现残影段码切换发生在位选切换之前先关位选再换段码最后开新位选倒计时跳数异常中断和扫描存在寄存器冲突检查中断服务程序压栈寄存器是否完整这几个问题在实验报告里往往一笔带过实际调试时最容易卡住的是残影问题。常见做法是把段码输出的时序换成先写位选码关闭所有位再输出新段码最后再写位选码打开目标位这样段码在位选有效前就已经稳定不会出现上一个数字的余光叠在新数字上。5.2 把固定定时改成动态定时这个系统的时间参数集中在两处mov counter, 80是周期总秒数四个比较阈值 50、40、10 是各相位分界点。想调整某一相位的长度只需要改对应阈值。例如把南北绿灯从 30 秒加到 45 秒则周期变成 95 秒counter 初值改为 95状态 1 的阈值从 50 改成 65状态 2 的起始值 50 保持不动整个状态机逻辑不需要改一行跳转代码。接入车流量检测的思路就是把固定阈值变成变量。地磁传感器或红外对射管给出方向占用信号中断服务程序里根据一定时间窗口内检测到的车辆数抬高或降低阈值无需改硬件电路。和纯模糊控制方案相比这种做法的优势在于保留了数码管实时倒计时驾驶员能看到明确的剩余秒数而不是只知道绿灯在闪。传感器信号需要经过整形滤波再接入 8255 的输入端口8255 的方式 0 本身就支持输入模式修改控制字把 A 口设为输入即可其余电路不动。如果只是想把绿灯时间调长一点不用改状态机找到mov counter, 80那一行把 80 改成你想要的周期秒数再同步调整状态划分的四个比较值即可。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询