单片机实战:交通灯控制程序实现及完整源码解析
基于AT89C51单片机的智能交通灯控制系统设计与实现
一、项目概述
1.1 项目背景
随着城市化快速发展,城市道路交通日益复杂,车辆与行人数量持续上升。为维持交通秩序、保障道路安全,交通信号灯的科学控制成为城市智能交通管理系统的重要组成部分。而交通灯控制系统的逻辑设计正是自动控制系统与嵌入式系统应用的典型实例。
本项目利用51系列中的 AT89C51 单片机,设计并实现一个简易的智能交通灯控制系统,旨在帮助初学者理解单片机的控制逻辑、电路连接以及编程实现方式。
1.2 项目目的与意义
本项目的目的有三个:
-
熟悉AT89C51单片机的基本结构与IO控制方式;
-
通过交通灯系统了解状态机控制、延时控制和多IO协调;
-
为后续实现更复杂的交通控制系统(如智能交通、感应式红绿灯)打下基础。
其意义在于通过一个实际的项目帮助读者将理论知识与实操能力结合,完成从“会写”到“会做”的转变。
1.3 项目功能需求
模拟十字路口的交通信号灯(南北、东西两个方向);
灯光控制包括:红灯、黄灯、绿灯依次变换;
每个方向通行时间可设置(如绿灯30秒,黄灯3秒,红灯为另一方向通行时);
简洁、稳定、可拓展。
二、相关知识与技术
2.1 单片机基础知识
单片机(Microcontroller Unit, MCU)是一种集成了CPU、存储器(ROM、RAM)、定时器、I/O接口、串口等功能于一体的芯片。适用于控制类嵌入式设备。
2.2 AT89C51简介
AT89C51是ATMEL公司生产的一款基于Intel 8051内核的8位单片机,具有以下特点:
4KB Flash存储器;
128B RAM;
32个可编程I/O口;
2个16位定时器;
串行通信口;
支持中断系统;
稳定可靠,适合初学者使用。
2.3 交通灯控制原理
红绿灯系统的基本控制原理是通过状态机方式控制各个时间段内不同方向的通行灯颜色。通常一个方向为绿,另一方向为红,交替通行,中间使用黄灯作为过渡提示。
2.4 数字电路基础
高电平/低电平:通过单片机输出高或低电平控制LED亮灭;
延时控制:通过软件延时或定时器控制灯光亮灭时间;
状态转换:不同的灯光状态之间以固定顺序循环。
2.5 嵌入式C语言编程
使用Keil C51进行开发;
主要涉及I/O控制、延时函数、流程控制;
编译后使用仿真器或烧录器加载到单片机运行。
三、系统总体设计
3.1 系统结构框图
+----------------------------+
| AT89C51 单片机 |
+----------------------------+
| P1.0 ~ P1.5 控制6个LED灯 |
| P3口保留做拓展(如按键) |
+----------------------------+
3.2 硬件组成与选型
主控芯片:AT89C51
灯光指示器:LED(红、黄、绿)
驱动电路:限流电阻
电源模块:+5V 稳压供电
晶振电路:11.0592MHz 晶振+电容
其他:面包板或PCB、杜邦线
3.3 软件架构设计
模块化编程思想:
main()
主流程控制
init()
初始化灯光和系统
delay_ms()
毫秒延时函数
delay_s()
秒延时函数(封装调用delay_ms)
ns_go()
控制南北绿灯通行
ew_go()
控制东西绿灯通行
3.4 时序与状态机设计
交通灯周期如下:
阶段 | 南北灯 | 东西灯 | 时长 |
---|---|---|---|
南北通行 | 绿 | 红 | 30秒 |
南北警告 | 黄 | 红 | 3秒 |
东西通行 | 红 | 绿 | 30秒 |
东西警告 | 红 | 黄 | 3秒 |
四、硬件设计与实现
4.1 电路原理图详解(文字描述)
P1.0 接 南北红灯,P1.1 接 南北黄灯,P1.2 接 南北绿灯;
P1.3 接 东西红灯,P1.4 接 东西黄灯,P1.5 接 东西绿灯;
每个LED串联限流电阻(220Ω);
单片机通过输出低电平控制LED点亮。
4.2 元器件清单
元件 | 数量 | 说明 |
---|---|---|
AT89C51 | 1 | 主控芯片 |
LED(三色) | 6 | 红绿黄各两组 |
电阻 220Ω | 6 | 限流用 |
电容 30pF | 2 | 晶振匹配 |
晶振11.0592MHz | 1 | 系统时钟 |
面包板或PCB | 1 | 搭建原型电路 |
电源5V模块 | 1 | 稳压供电 |
五、软件设计与实现思路
5.1 模块划分
模块名称 | 主要功能 |
---|---|
初始化模块 | 初始化端口状态、电平、电源 |
延时模块 | 控制红绿灯持续时间 |
状态切换模块 | 控制红黄绿灯依次变换 |
主程序 | 调用函数,控制整体交通灯流程 |
5.2 初始化模块
所有灯初始化为灭(高电平);
可拓展为支持外部中断初始化逻辑。
5.3 延时模块
采用软延时方式实现秒级、毫秒级延迟,避免过多依赖定时器资源。
5.4 灯光控制模块
封装每个方向的灯光流程,例如绿-黄-红转换,提升程序可读性与维护性。
5.5 状态切换与中断设计
当前版本采用轮询方式,未加入中断;
后期可扩展行人按键、中断触发控制。
5.6 主程序流程图(文字表示)
Start →
初始化 →
循环开始 →
南北通行 → 延时 →
南北警告 → 延时 →
东西通行 → 延时 →
东西警告 → 延时 →
重复
六、实现代码(整合版+详细注释)
#include <reg51.h> // 包含AT89C51寄存器定义
// --- 灯光定义 ---
sbit RED_NS = P1^0; // 南北红灯
sbit YELLOW_NS = P1^1; // 南北黄灯
sbit GREEN_NS = P1^2; // 南北绿灯
sbit RED_EW = P1^3; // 东西红灯
sbit YELLOW_EW = P1^4; // 东西黄灯
sbit GREEN_EW = P1^5; // 东西绿灯
// --- 延时函数 ---
void delay_ms(unsigned int ms) {
unsigned int i, j;
for(i = 0; i < ms; i++) {
for(j = 0; j < 120; j++); // 空循环实现延时
}
}
void delay_s(unsigned int s) {
while(s--) delay_ms(1000);
}
// --- 初始化灯状态 ---
void system_init() {
RED_NS = YELLOW_NS = GREEN_NS = 1; // 熄灭所有南北灯
RED_EW = YELLOW_EW = GREEN_EW = 1; // 熄灭所有东西灯
}
// --- 熄灭所有灯 ---
void all_off() {
RED_NS = YELLOW_NS = GREEN_NS = 1;
RED_EW = YELLOW_EW = GREEN_EW = 1;
}
// --- 南北方向通行灯流程 ---
void ns_go() {
all_off();
GREEN_NS = 0; // 南北绿灯亮
RED_EW = 0; // 东西红灯亮
delay_s(30); // 通行30秒
GREEN_NS = 1;
YELLOW_NS = 0; // 黄灯提示
delay_s(3);
YELLOW_NS = 1;
RED_NS = 0; // 南北红灯
}
// --- 东西方向通行灯流程 ---
void ew_go() {
all_off();
GREEN_EW = 0;
RED_NS = 0;
delay_s(30);
GREEN_EW = 1;
YELLOW_EW = 0;
delay_s(3);
YELLOW_EW = 1;
RED_EW = 0;
}
// --- 主程序入口 ---
void main() {
system_init(); // 初始化
while(1) {
ns_go();
delay_s(1); // 红灯缓冲时间
ew_go();
delay_s(1);
}
}
七、代码解读
7.1 延时模块
通过软延时方式实现程序延迟,采用空循环对时间精度要求不高的小项目较为适用。
7.2 初始化模块
关闭所有LED,确保程序初始状态明确;可扩展为对定时器和外设的初始化。
7.3 通行模块(ns_go 与 ew_go)
这两个函数分别封装了两组方向通行流程,便于调用和调试。
7.4 主函数流程
主程序是一个死循环,交替控制两个方向的通行逻辑,模拟真实交通灯。
八、项目总结
8.1 项目回顾
本项目实现了一个简洁、稳定的交通灯控制系统,通过51单片机控制6个LED实现交通流控制。项目采用模块化设计思想,使得代码结构清晰,逻辑简单,便于初学者理解与学习。
8.2 技术收获
掌握了AT89C51的I/O口使用方法;
了解了嵌入式软件延时与状态控制;
熟悉了软硬件结合的开发流程。
8.3 存在不足
未使用定时器中断,系统效率不高;
无外部输入支持,如行人按钮;
没有倒计时显示、音响提示等人性化交互。
8.4 拓展建议
使用中断/定时器 替代 delay 提升精度;
引入LCD或数码管 显示倒计时;
加入红外/超声波传感器 检测车辆流量,实现动态配时;
扩展到STM32或Arduino平台,增加功能;
作者:Katie。