资讯详情

资讯详情

基于51单片机的交通灯控制系统设计与实现

简介这份毕业设计论文面向电子信息、自动化等专业的学生与单片机初学者围绕基于MSC-51系列ATSC51单片机与8255A可编程并行I/O接口芯片的交通灯控制系统展开解决传统固定配时信号灯难以适应动态车流的问题。压缩包内为1个doc文档约257KB完整收录了论文正文涵盖交通灯发展沿革、8051内部结构与引脚说明、硬件原理图与接口电路分析、初始化与状态切换等单片机源程序以及系统测试与结果讨论。文档还涉及红绿灯配时编程、倒计时剩5秒黄灯闪烁警示、闯红灯报警和绿灯时段车流量检测显示等具体功能实现可作为毕业设计写作范本与课程设计参考。目前已有1011人学习下载适合需要软硬件结合案例、借鉴论文结构与程序思路的读者查阅。1. 从一份 27 页的毕业设计说起这套 51 单片机交通灯到底能跑出什么十字路口最怕的不是车多而是灯“不讲理”。我拿到这份基于单片机控制交通灯的设计资料时第一反应不是它有多先进而是它把一套交通灯该有的逻辑全塞进了一颗 8051 里红绿灯循环、倒计时显示、黄灯闪烁警示、闯红灯报警、绿灯期间车流量检测一个都没落下。整套方案以 MCS-51 系列单片机加 8255A 可编程并行接口芯片为核心PA 口驱动红黄绿三组灯PC 口和 PB 口拼出两位共阴数码管显示倒计时P1 口用来设定红绿灯初始时间P2.0 接车流量检测开关P3.0 控制工作与初始化状态。对正在做课程设计、毕业设计或者想拿一块开发板把“定时器中断 并行接口扩展 数码管动态扫描”这条链路走通的人来说这份资料的价值不在于论文写得多漂亮而在于它给了一套能照着焊、照着烧、照着改的完整闭环。下面我就按“它是什么、怎么跑起来、哪里容易翻车、怎么二次开发”的顺序把这套东西拆开讲。2. 系统架构与硬件选型一颗 8051 怎么同时管灯、管时间、管报警2.1 为什么是 8051 8255A 这个组合这套设计选的是 8031/8051 这一类经典 51 内核外挂一片 8255A 做 I/O 扩展。原因很直接8051 虽然有 P0 到 P3 四组 8 位口但 P0 和 P2 通常要拿去做外部地址和数据总线P3 又复用了中断、串口、计数这些第二功能真正能自由支配的只剩 P1。而交通灯系统要同时驱动 6 只灯东西南北各红黄绿、两位数码管段码加位选、键盘输入、蜂鸣器报警端口根本不够用。8255A 提供 PA、PB、PC 三个 8 位端口和一个控制口正好把“灯”和“显示”分开PA 口输出灯色控制字PB 口和 PC 口拼起来输出数码管段码和位选。这种“单片机做逻辑、接口芯片做驱动”的分工是那个年代最标准的做法放到今天拿来做教学板依然清晰。硬件清单里还有几样值得注意的器件74LS373 做地址锁存因为 8051 的 P0 口是地址/数据分时复用的访问外部 8255 时必须先把低 8 位地址锁住74LS07 做驱动缓冲增强端口带负载能力MAX692 看门狗负责程序跑飞时复位7805 三端稳压给整板供 5V。这套外围看着杂其实每一片都有明确职责缺一个系统就不稳。2.2 8255A 的端口分配与地址译码8255A 在系统里的地址分配是理解整个程序的关键。设计里用 P0.7 做片选P0.1 和 P0.0 做端口选择于是得到四个地址地址对应端口用途00HPA 口红黄绿信号灯输出01HPB 口数码管段码低 8 位02HPC 口数码管位选/段码高位03H控制口写入方式控制字初始化时往控制口写 80H含义是D71 标志位有效D6D500 选 A 口方式 0D40 表示 A 口输出D30 表示 C 口高 4 位输出D20 表示 B 口方式 0D10 表示 B 口输出D00 表示 C 口低 4 位输出。翻译成人话就是三个端口全部工作在方式 0 基本输出模式不需要握手信号写什么引脚就输出什么电平。交通灯这种纯输出场景用方式 0 最省事这也是我一般会建议新手先吃透方式 0 再碰方式 1 的原因。; 8255 初始化三个端口全部设为方式 0 输出 MOV DPTR, #0003H ; 指向 8255 控制口 MOV A, #80H ; 方式控制字A/B/C 口均输出方式 0 MOVX DPTR, A ; 写入控制字完成初始化这段代码只有三行但它是后面所有灯和数码管能正常工作的前提。MOVX是访问外部数据存储器的指令8255 挂在外部总线上所以必须用MOVX而不是MOV。地址 0003H 不是随便写的它由片选和 A1A0 共同决定改片选线就得同步改这个地址否则写进去的控制字落到别的端口上现象就是灯全乱或者数码管不亮。2.3 灯色控制字的位定义PA 口输出的控制字直接决定哪几盏灯亮。设计里用的是共阳极接法端口输出低电平对应的灯才亮所以控制字是“0 有效”。以东西红灯、南北绿灯这个状态为例控制字是 0DDH拆成二进制是 1101 1101低 6 位里对应东西红和南北绿的位被拉低。黄灯闪烁阶段用 0D4H 和 0DDH 交替输出形成亮 0.5 秒灭 0.5 秒的效果。东西绿灯、南北红灯时是 0EBH。这几个十六进制数看着像玄学其实对着原理图一位一位对就能推出来我在改造时习惯先把位定义写成注释贴在代码顶上后面改灯序就不会抓瞎。3. 软件主循环拆解定时器、状态机与显示扫描怎么咬合3.1 一秒是怎么来的T0 定时 10ms 加软件计数51 的定时器在 12MHz 晶振下方式 1 最大只能定 65.5ms直接定 1 秒不现实。这套程序的做法是让 T0 每 10ms 溢出一次在中断里对一个寄存器累加累到 100 次就是 1 秒。中断服务程序里先重装初值再INC R4、INC R5然后判断 R5 是否到 0FAH250到了就清零并让倒计时寄存器 R3 减一。这里有个细节R4 和 R5 两个寄存器配合实际是在做更细的计数分频保证 1 秒的节拍尽量准。IT0_INT: MOV TL0, #9AH ; 重装 T0 低字节10ms 定时初值 MOV TH0, #0F1H ; 重装 T0 高字节 INC R4 INC R5 CJNE R5, #0FAH, T01 ; 未到 250 次跳去刷新显示 MOV R5, #00H ; 计满清零 DEC R3 ; 倒计时减一 DEC R2 ; 报警计时减一 T01: ACALL DISP ; 每次中断都刷新一次数码管 RETI初值 0F19AH 对应 10ms 是怎么算的方式 1 是 16 位计数器模值 6553612MHz 晶振下机器周期 1us10ms 需要 10000 个机器周期初值就是 65536 - 10000 55536换成十六进制是 0F19AH高字节 0F1H、低字节 9AH。这个数如果晶振换成 11.0592MHz机器周期变了初值也得跟着重算不然倒计时会明显偏快或偏慢这是很多人烧录后觉得“时间不对”的第一个坑。3.2 主程序的状态流转主程序从 0000H 起步先设堆栈指针到 50H开中断IE8EH 允许 T0、T1 和外部中断 1设 TMOD51H 让 T1 做计数、T0 做定时且都在方式 1然后给 8255 写控制字。接着进入 AGAIN 循环用 P3.1 判断是否要设定初值P3.1 为 1 就跳去正常工作流程为 0 就读 P1 口设定红绿灯时间。设定分支里再用 P1.7 区分是设红灯还是绿灯读进来的值存到 R0绿灯和 R7红灯同时调 DISP1 显示出来。正常工作流程是一个典型的状态机N00 段东西红南北绿倒计时走完进 N1 黄灯闪 5 秒再进 N2 东西绿南北红倒计时走完进 N3 再闪 5 秒然后SJMP N00回到起点。每个状态段里都用CJNE R3,#00H判断倒计时是否归零归零才切换。这个结构虽然用汇编写显得跳转标签满天飞但逻辑是清楚的改成 C 语言就是一个switch(state)加几个if(count0)。N00: MOV A, 76H ; 取东西红灯时间 MOV R3, A ; 装入倒计时寄存器 MOV DPTR, #0000H ; 指向 8255 PA 口 MOV A, #0DDH ; 东西红、南北绿 MOVX DPTR, A N01: JB P2.0, B0 ; 检测 P2.0低电平表示有车闯红灯 N02: SETB P3.0 CJNE R3, #00H, N01 ; 倒计时未完继续循环这段里JB P2.0, B0是闯红灯检测的入口P2.0 接的是检测开关按下为低电平就跳去报警程序 B0。报警程序把 R2 置 3循环拉低 P3.0 驱动蜂鸣器3 秒后回到 N02 继续倒计时。注意报警期间倒计时并没有停这是设计上的取舍实际路口如果要求报警时冻结计时得在 B0 里加保护逻辑。3.3 数码管动态扫描与段码表显示部分用的是两位共阴数码管段码通过查表得到。程序里MOV DPTR,#TAB加MOVC A,ADPTR就是标准查表动作TAB 里存的是 0 到 9 的七段码3FH、06H、5BH、4FH、66H、6DH、7DH、07H、7FH、6FH。十位和个位分时点亮先送十位段码再送位选 0F7H延时后再送个位段码和位选 0FBH靠人眼视觉暂留合成两位数字。位选码 0F7H 和 0FBH 分别对应拉低某一位的公共端具体哪一位取决于硬件接线改板子时这两位要跟着原理图调。DISP: MOV B, #0AH MOV A, R3 ; R3 是当前倒计时值 DIV AB ; A 得十位B 得个位 MOV 79H, A MOV 7AH, B DIS: MOV A, 79H MOV DPTR, #TAB MOVC A, ADPTR ; 查十位段码 MOV DPTR, #0002H ; PC 口输出段码 MOVX DPTR, A MOV DPTR, #0001H ; PB 口输出位选 MOV A, #0F7H MOVX DPTR, A LCALL DELAYDIV AB这条指令把 R3 的值除以 10商在 A、余数在 B正好拆出十位和个位比写一堆比较分支干净。查表用的 TAB 必须放在程序存储器里且地址对齐如果 TAB 跨了 256 字节页边界MOVC的偏移计算会出问题这是汇编查表的一个老坑表短的时候不容易碰到表一长就得注意。4. 避坑与排查烧录后灯不亮、时间不准、报警乱响的常见原因4.1 灯全不亮或常亮先查 8255 控制字和片选现象是上电后六只灯要么全灭要么全亮数码管也没反应。原因多半是 8255 控制字没写进去或者片选地址对不上。解决方法是拿万用表量 8255 的 CS 脚确认访问时确实被拉低再确认MOV DPTR,#0003H这个地址和实际译码一致。如果片选接的是 P0.7那地址高字节必须保证 P0.7 为 0 才选中程序里地址写成 0003H 意味着高 8 位全 0P0.7 自然是低逻辑成立一旦硬件把片选改到别的引脚地址就得重算。4.2 倒计时明显偏快或偏慢晶振频率和定时初值不匹配现象是设定 60 秒实际三四十秒就走完。原因是定时初值按 12MHz 算的板上焊的却是 11.0592MHz 晶振机器周期从 1us 变成约 1.085us累计误差被放大。解决办法是二选一换 12MHz 晶振或者按实际频率重算初值。重算公式还是 65536 减去“定时时间除以机器周期”算完记得高低字节别写反。4.3 黄灯闪烁节奏不对延时循环被中断打断现象是黄灯该亮 0.5 秒灭 0.5 秒实际闪得忽快忽慢。原因是闪烁段用的是CJNE R4,#7DH,$这种空转延时而 T0 中断一直在后台跑中断一来延时就被拉长。解决方法是把闪烁计时也交给定时器节拍来做用状态机里的计数器判断而不是靠空转。我一般会把所有时间相关的逻辑统一挂到那个 10ms 节拍上避免两套时间基准打架。4.4 闯红灯报警误触发P2.0 上拉和抖动没处理现象是没车闯红灯蜂鸣器也偶尔响一下。原因是 P2.0 接的检测开关没有上拉电阻或者没有消抖悬空时电平漂移被程序当成低电平。解决办法是硬件上加 10K 上拉软件上在JB P2.0,B0之前连续采样几次确认或者加一个短延时再判一次。报警这种带声音的输出误触发一次就够烦人的消抖不能省。4.5 数码管显示重影位选和段码切换顺序错了现象是两位数字叠在一起看着像乱码。原因是先换了段码没关位选或者两位之间延时太短。解决方法是严格按“送段码、开位选、延时、关位选”的顺序来两位之间留 1 到 2ms。共阴数码管位选是拉低有效关位选就是把对应位拉高这一步漏了就会串影。5. 二次开发把固定配时改成车流量自适应以及我踩过的那个坑这套设计的扩展点其实论文里已经埋了P2.0 接车流量检测开关绿灯期间每按一次 R7 加一计到 64H 清零数码管显示车流量。但原程序只是“检测并显示”并没有真正拿这个数去调绿灯时长。要做成自适应思路是把绿灯基础时长和检测到的车流量做加权车越多下一次绿灯配时越长同时给一个上限防止某方向一直占着灯。具体改法分三步。第一步在 N2 段绿灯倒计时期间把 P2.0 的检测结果累加到一个独立寄存器比如 R6而不是只丢给 R7 显示。第二步绿灯结束进入黄灯前用 R6 去修正下一次的绿灯初值可以写成“基础值 车流量系数 × 检测数”系数取小一点避免一次调整过猛。第三步把修正后的值夹在上下限之间比如最短 30 秒、最长 90 秒防止极端情况。下面是一段示意性的 C 伪代码方便从汇编迁移// 绿灯配时自适应示意base 为基础时长flow 为检测到的车流量 unsigned char adapt_green(unsigned char base, unsigned char flow) { unsigned int t base flow * 2; // 每检测到一辆车增加 2 秒 if (t 90) t 90; // 上限保护 if (t 30) t 30; // 下限保护 return (unsigned char)t; }参数说明base是键盘设定的绿灯初始值flow是绿灯期间累计的检测数系数 2 和上下限 30/90 都可以按实际路口调。这段逻辑放进状态机切换点调用一次即可不需要改中断。验证方法是拿信号发生器或者手动按开关模拟车流观察下一次绿灯时长是否跟着变同时确认总周期没有超过路口能接受的范围。我在这类改造上翻过一次车当时图省事直接在定时器中断里做车流量累加和配时计算结果中断里除法指令耗时太长把 10ms 节拍撑破了数码管开始闪。血泪经验是中断里只做计数和标志位所有带乘除的运算挪到主循环里做。从那以后我每次往中断里加逻辑之前都会先算一遍最坏执行时间确认不会超过节拍周期再动手。这套交通灯资料本身不复杂但“时间基准只有一个、所有耗时逻辑不能进中断”这条规矩放到今天任何嵌入式项目里都成立。希望帮到你。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →