一、项目背景与核心需求
1. 项目意义
交通灯是城市道路通行的核心设施,本项目基于 51 单片机设计简易交通灯控制系统,模拟实际路口交通指挥逻辑,兼具红绿灯循环显示、数码管倒计时、紧急模式切换三大核心功能,适合单片机入门级课程作业,能帮助巩固 GPIO 口控制、定时器中断、数码管动态扫描等核心知识点。
2. 功能需求明细
功能模块 | 具体要求 |
红绿灯循环 | 东西方向(红→黄→绿)与南北方向(绿→黄→红)交替,默认绿灯 30 秒、黄灯 5 秒、红灯 35 秒 |
倒计时显示 | 用 2 位共阳数码管分别显示两个方向剩余通行时间,倒计时精度 1 秒 |
紧急模式 | 通过独立按键触发,启动后所有方向红灯常亮,暂停循环(再次按下恢复正常) |
状态指示 | 每个灯组对应 LED 指示灯(红 / 黄 / 绿),直观展示当前通行状态 |
可扩展性 | 预留参数修改接口(如通过按键调整红绿灯时长),便于后续功能拓展 |
二、硬件选型与电路设计
1. 硬件清单(性价比优先,适合学生采购)
部件名称 | 型号规格 | 用途说明 | 数量 |
单片机核心板 | STC89C52RC 最小系统板(5V 供电) | 系统控制核心,处理定时器中断、IO 口驱动 | 1 块 |
数码管 | 2 位共阳数码管(共阳型更易驱动,适合新手) | 显示倒计时时间(0-99 秒) | 2 个 |
LED 灯 | 红色、黄色、绿色 LED(5mm) | 模拟交通灯信号指示 | 各 2 个 |
按键 | 独立按键(轻触开关) | 触发紧急模式 | 1 个 |
电阻 | 220Ω 碳膜电阻(限流,保护 LED)、10kΩ 电阻(按键上拉) | 电路限流、按键电平稳定 | 若干 |
辅助部件 | 面包板、杜邦线(公对母 / 公对公)、5V USB 电源 | 电路搭建、接线、供电 | 1 套 |
2. 核心电路设计与接线说明
(1)总体电路框架
graph LR A[STC89C52单片机] --> B[红绿灯LED组] A --> C[2位数码管显示模块] A --> D[紧急模式按键] E[5V电源] --> A E --> B E --> C
硬件模块 | 单片机 IO 口 | 接线说明 |
东西方向红灯 | P1.0 | 高电平点亮(LED 串联 220Ω 电阻到 GND) |
东西方向黄灯 | P1.1 | 同上 |
东西方向绿灯 | P1.2 | 同上 |
南北方向红灯 | P1.3 | 同上 |
南北方向黄灯 | P1.4 | 同上 |
南北方向绿灯 | P1.5 | 同上 |
数码管段选(a-g) | P0.0-P0.6(P0 口需外接 10kΩ 上拉电阻) | 控制数码管显示数字(段选信号) |
数码管位选 | 东西方向时间:P2.0;南北方向时间:P2.1 | 控制哪个数码管点亮(位选信号) |
紧急模式按键 | P3.2(外部中断 0 引脚) | 按键一端接 IO 口,一端接 GND,10kΩ 上拉电阻接 VCC |
注意:51 单片机 P0 口为开漏输出,驱动数码管时必须外接上拉电阻(10kΩ),否则数码管显示模糊或不亮;LED 灯串联 220Ω 电阻,防止电流过大烧毁 IO 口。
三、软件实现(代码框架 + 关键逻辑)
1. 开发环境
- 编译软件:Keil uVision5(支持 C51 内核,版本 V5.31)
- 下载工具:STC-ISP(将程序烧录到 STC89C52 单片机)
- 语言:C 语言(兼顾可读性与执行效率,适合课程作业)
2. 核心代码框架(含详细注释)
3. 代码关键逻辑说明
- 定时器中断:采用定时器 0 实现 1 秒计时,通过中断服务函数更新倒计时数值,避免主函数阻塞,保证计时精度。
- 数码管动态扫描:通过快速切换两个数码管的位选信号,利用人眼视觉暂留效应,实现 “同时显示” 效果,避免闪烁。
- 按键消抖:中断服务函数中添加 20ms 延时和 “等待按键松开” 逻辑,解决机械按键的抖动问题,确保触发稳定。
- 状态机逻辑:交通灯控制函数通过判断倒计时数值,切换不同灯组的亮灭状态,实现 “绿→黄→红” 的循环逻辑。
四、调试过程与常见问题解决
1. 调试步骤
- 仿真调试:先用 Proteus 搭建电路仿真(无需实物),验证代码逻辑是否正确(如红绿灯切换、倒计时是否正常)。
- 实物焊接:在面包板上按接线表搭建电路,注意 IO 口对应关系,避免接反(尤其是数码管段选和位选)。
- 程序烧录:用 STC-ISP 工具将编译后的.hex 文件烧录到单片机,接通 5V 电源。
- 功能测试:分别测试正常循环、倒计时显示、紧急模式触发三大功能,记录异常情况。
2. 常见问题与解决方案
问题现象 | 可能原因 | 解决方案 |
数码管不亮 | P0 口未接下拉电阻;位选 / 段选接线错误 | 给 P0 口添加 10kΩ 上拉电阻;核对 IO 口接线 |
LED 灯亮度暗或不亮 | 限流电阻过大(超过 220Ω);IO 口输出低电平 | 更换 220Ω 电阻;检查代码中 LED 控制逻辑(共阳 LED 低电平点亮) |
倒计时跳变异常 | 定时器初值计算错误;中断未开启 | 重新计算定时器初值(50ms 中断:TH0=0x3C, TL0=0x00);确保 EA=1、ET0=1 |
按键触发无响应 | 按键未接下拉电阻;中断优先级设置错误 | 给按键添加 10kΩ 上拉电阻;确认外部中断 0 开启(EX0=1) |
红绿灯切换逻辑混乱 | 倒计时重置逻辑错误;灯组 IO 口定义错误 | 检查 Traffic_Light_Control 函数中的条件判断;核对 LED 灯的 IO 口定义 |
五、效果展示与拓展方向
1. 效果展示(博文必备)
- 实物照片:拍摄电路搭建完成后的实物图(正面 + 侧面),清晰展示单片机、数码管、LED 灯组的连接方式。
- 功能视频:录制 1 分钟短视频,演示 “正常循环(红绿灯切换 + 倒计时)→ 按下紧急按键(全红灯)→ 再次按下(恢复正常)” 的完整流程。
- 数据截图:仿真时截图 Proteus 中的电路状态,标注当前倒计时数值和灯组状态(如 “东西方向绿灯,剩余 25 秒”)。
2. 拓展方向(提升作业亮点)
- 时长可调:增加 2 个按键,分别调整绿灯和黄灯时长(如按一次加 1 秒,长按快速加减)。
- 语音提示:添加 ISD1820 语音模块,倒计时剩 3 秒时播放 “即将红灯,请停车” 提示音。
- 多路口扩展:增加一组数码管和灯组,实现双路口交通灯控制(如东西 / 南北 + 左转 / 右转)。
- LCD 显示:将数码管替换为 LCD1602,显示更丰富的信息(如当前模式、剩余时长、日期时间)。