基于单片机的十字路口交通信号灯控制系统设计

  1. 基于单片机的十字路口交通信号灯控制系统设计

点击链接下载protues仿真设计资料:https://download.csdn.net/download/m0_51061483/91961175

  1. 系统总体介绍

    2.1 设计背景与意义

    随着城市道路交通压力不断增大,传统固定配时的交通信号灯系统在高峰拥堵、车流不均衡以及突发事件(如救护车、消防车等紧急车辆通行)情况下往往难以兼顾效率与安全。为提升十字路口通行能力、减少车辆等待时间,并对紧急事件快速响应,本系统设计了一套基于单片机的交通信号灯控制方案。系统以两条车道(主干道A与支干道B)为例,通过发光二极管(LED)模拟红黄绿灯状态,通过按键开关模拟车辆检测信号与人工干预操作,实现贴近真实路况的交通控制仿真。

    2.2 系统功能概述

    本系统围绕"正常轮流放行 + 车流感知优先 + 应急强制红灯"三大控制思想进行设计,具体功能如下:

    1)使用LED模拟A、B两车道交通信号灯状态;使用按键开关模拟车辆检测信号,实现路况仿真。

    2)正常模式下:A车道放行50秒(含5秒黄灯警告),B车道放行30秒(含5秒黄灯警告),两车道轮流通行。

    3)手动控制功能:

    • B车道放行期间,若A车道有车且B车道无车,按K1键可使A车道优先放行15秒。
    • A车道放行期间,若B车道有车且A车道无车,按K2键可使B车道优先放行15秒。
      4)紧急控制功能:按下K3开关,系统立即将A、B车道信号灯置为红灯,禁行20秒。
      5)系统采用12MHz晶振,响应速度快,控制精准。
      6)控制逻辑合理,兼顾主干道优先、动态调整与突发应急处理,提高交通效率与安全性。

    2.3 系统工作模式划分

    系统运行过程中主要存在以下模式:

    • 正常模式(Normal):按固定配时轮流放行,A 50秒(绿45+黄5),B 30秒(绿25+黄5)。
    • 优先放行模式(Priority A / Priority B):在满足车辆检测条件的前提下,通过K1或K2触发,插入一个15秒的优先放行阶段。
    • 紧急模式(Emergency):K3触发后立即生效,A、B均置红灯20秒,确保紧急车辆安全通过。
  2. 系统功能设计详解

    3.1 正常配时控制逻辑

    正常情况下系统遵循"主干道优先"原则,A车道通行时间长于B车道:

    • A车道放行阶段:A绿灯持续45秒,随后黄灯警告5秒,最后切换到红灯。
    • B车道放行阶段 :B绿灯持续25秒,随后黄灯警告5秒,最后切换到红灯。
      在A车道放行期间,B车道保持红灯;在B车道放行期间,A车道保持红灯,从而避免冲突放行。

    3.2 车辆检测与手动优先控制逻辑

    现实交通中经常出现支路无车、主路排队,或主路无车、支路排队的情况。为了提高效率,本系统设计了按键模拟车检信号,并配备手动干预键实现优先放行:

    • K1优先A车道放行:仅在B车道放行期间有效;若检测到A车道有车(A_detect=1),且B车道无车(B_detect=0),按下K1即可使系统插入"优先A车道放行15秒"阶段。
    • K2优先B车道放行:仅在A车道放行期间有效;若检测到B车道有车(B_detect=1),且A车道无车(A_detect=0),按下K2即可使系统插入"优先B车道放行15秒"阶段。

    这种设计的意义在于:

    • 避免一条车道无车时仍然浪费绿灯时间;
    • 在交通繁忙或车流突然变化时,人工可快速调整通行优先级;
    • 逻辑上增加了"条件约束",防止误触发造成冲突放行。

    3.3 紧急模式控制逻辑

    在紧急车辆通行时,交叉口信号应尽量简化为"全红"状态以减少冲突和事故风险。本系统通过K3紧急开关实现:

    • 按下K3后立即中断当前正常或优先流程;
    • A、B车道信号灯立刻切换为红灯;
    • 系统维持全红20秒;
    • 20秒结束后系统返回正常模式,从A车道放行阶段重新开始,以保证逻辑一致性并便于车辆流恢复。
  3. 电路设计

    4.1 硬件总体结构

    本系统硬件可划分为以下模块:

    1)单片机最小系统模块(核心控制)

    2)时钟振荡模块(12MHz晶振)

    3)复位电路模块(上电复位与手动复位)

    4)LED交通灯显示模块(A、B车道红黄绿灯)

    5)按键输入模块(车辆检测信号模拟、手动控制、紧急控制)

    6)电源模块(5V供电、滤波稳压)

    为便于说明,下文对各模块分别进行详细介绍。

    4.2 单片机最小系统模块

    单片机是整个系统的控制核心,负责读取按键输入状态、执行交通灯状态机逻辑、输出LED控制信号以及进行定时控制。

    最小系统通常包含:

    • 单片机芯片本体
    • VCC/GND供电引脚连接
    • 时钟电路(晶振与电容)
    • 复位电路(RST、上拉与电容)
    • 必要的去耦电容(0.1uF)

    单片机的I/O口分配应遵循以下原则:

    • LED输出应使用推挽输出方式,以获得稳定亮度;
    • 按键输入通常使用上拉输入方式(内部上拉或外部上拉),按键按下输出低电平更易抗干扰;
    • 紧急开关K3优先分配到可快速响应的I/O口,并在程序中具备最高优先级。

    4.3 时钟振荡模块(12MHz晶振)

    采用12MHz晶振的优势主要体现在:

    • 系统定时精度高,延时误差小;
    • 指令执行速度快,响应按键输入更及时;
    • 对交通灯这种需要严格时间控制的应用非常适合。

    典型晶振连接方式:

    • 晶振两端连接到单片机的XTAL1与XTAL2引脚;
    • 两侧各接一个小电容(常用22pF或30pF)到地,用于稳定振荡;
    • 走线尽量短,远离高电流器件与干扰源,保证时钟稳定性。

    4.4 复位电路模块

    为保证上电后单片机能进入确定的初始状态,本系统设计复位电路:

    • 上电复位:通过电容充放电形成复位脉冲,使单片机启动时自动进入初始程序;
    • 手动复位:通过按键将RST脚拉高(或拉低,视单片机复位有效电平而定),使系统可随时重启。

    复位电路的必要性:

    • 防止电源波动导致单片机启动异常;
    • 在调试阶段便于快速回到初始状态;
    • 发生逻辑错误或需要重新开始仿真时可立即恢复。

    4.5 LED交通灯显示模块

    交通灯显示模块使用发光二极管模拟真实红黄绿灯:

    • A车道:A_R(红)、A_Y(黄)、A_G(绿)
    • B车道:B_R(红)、B_Y(黄)、B_G(绿)

    设计要点:

    • LED需串联限流电阻(一般220Ω~1kΩ,根据亮度与供电选择);
    • 单片机I/O口输出高电平点亮或低电平点亮需统一规划(常见为"低电平点亮"或"高电平点亮");
    • 建议使用统一驱动方式,以简化程序设计和减少逻辑混淆;
    • 如果LED较多且电流较大,可增加三极管或驱动芯片,但在本系统仿真规模下可直接由I/O口驱动。

    4.6 按键输入模块

    本系统按键分两类:车辆检测模拟输入与控制功能输入。

    • 车辆检测模拟:A_detect、B_detect,用于模拟某车道是否有车等待。
    • 控制按键:K1、K2、K3。

    按键电路设计要点:

    • 采用上拉输入:未按下为高电平,按下接地为低电平;
    • 添加必要的软件消抖,避免按键抖动导致误触发;
    • K3作为紧急按键,应具备更强的鲁棒性,可采用硬件去抖或程序中更高频率扫描。

    4.7 电源模块

    单片机与LED系统一般使用5V供电,电源模块需要满足:

    • 电压稳定,纹波小;
    • 具备滤波电容(如10uF电解+0.1uF陶瓷)抑制瞬态波动;
    • 地线布局合理,避免按键输入受电源噪声影响。
  4. 程序设计

    5.1 软件总体结构设计思想

    本系统软件采用"有限状态机 + 定时计数 + 按键扫描"的设计框架:

    • **有限状态机(FSM)**用于描述交通灯状态切换关系;
    • 定时计数用于实现50秒、30秒、15秒、20秒等时间控制;
    • 按键扫描用于实时读取车辆检测信号和控制指令,其中紧急按键具有最高优先级;
    • 模块化编程提高可读性与可维护性,便于扩展(例如增加倒计时数码管显示、蜂鸣报警等)。

    5.2 程序模块划分

    程序可划分为以下模块:

    1)系统初始化模块

    2)IO口配置模块

    3)定时器/延时模块

    4)按键扫描与消抖模块

    5)交通灯状态机模块

    6)优先放行控制模块

    7)紧急模式控制模块

    8)主循环调度模块

    5.3 系统初始化模块

    初始化阶段主要完成:

    • 设置IO方向(LED为输出,按键为输入);
    • 默认灯态:一般设为A绿、B红,或A红、B红后再进入正常流程;
    • 定时器初始化:配置周期中断或软件延时基准;
    • 变量初始化:状态变量、倒计时变量、按键标志位等。

    5.4 定时器/延时模块设计

    在交通灯控制中,定时准确性非常关键。本系统采用12MHz晶振,可以通过以下两种方式实现定时:

    • 软件延时方式:通过循环延时实现1秒节拍,结构简单但占用CPU资源;
    • 定时器中断方式:配置硬件定时器产生1ms或10ms中断,在中断中累加计数得到1秒节拍,精度更高、CPU利用率更优。

    更推荐使用定时器中断方式,理由:

    • 能够在中断中实现稳定节拍;
    • 主循环可用于处理按键、状态机等任务;
    • 对紧急按键响应更及时,不会因长延时阻塞造成延迟。

    5.5 按键扫描与消抖模块

    按键存在机械抖动,按下或松开时可能产生多个快速跳变信号。若不消抖,会导致:

    • 优先放行被多次触发;
    • 紧急模式重复进入;
    • 车辆检测信号误判。

    常见软件消抖策略:

    • 读取到按键按下后延时10ms~20ms再次确认;
    • 或在定时器中断中进行多次采样,连续稳定N次才判定有效;
    • 对K3紧急按键可采用更短周期更高优先级处理。

    5.6 交通灯状态机模块设计

    状态机是核心逻辑。系统状态可定义为:

    • A_GREEN(A绿,B红)
    • A_YELLOW(A黄,B红)
    • B_GREEN(B绿,A红)
    • B_YELLOW(B黄,A红)
    • PRIORITY_A(A优先绿,B红)
    • PRIORITY_B(B优先绿,A红)
    • EMERGENCY_ALL_RED(全红)

    每个状态都对应固定的灯输出组合与倒计时长度,并在倒计时到0时跳转到下一状态。这样做的优势:

    • 状态清晰,避免复杂嵌套if导致逻辑混乱;
    • 便于插入优先与紧急状态;
    • 易于扩展到更多车道或加人行道信号。

    5.7 优先放行控制模块设计

    优先放行必须满足三个关键条件:

    • 当前处于允许触发的阶段(例如B放行期间才能触发K1);
    • 车辆检测条件满足(A有车且B无车 / B有车且A无车);
    • 按键K1或K2有效按下并通过消抖确认。

    优先放行实现方式建议为:

    • 在主循环或状态机更新时检测是否触发;
    • 一旦触发,将当前状态保存(可选),或直接强制切入PRIORITY_A/PRIORITY_B;
    • 优先放行持续15秒;
    • 结束后回到正常轮换流程(建议回到被打断的相反方向黄灯或直接进入下一相位,本文设计为回到正常顺序,保证通行节奏稳定)。

    5.8 紧急模式控制模块设计

    紧急模式优先级最高,设计原则是:

    • 任何时刻检测到K3触发,立即进入全红;
    • 清除其他优先标志,避免紧急结束后进入异常状态;
    • 全红持续20秒后恢复正常模式,并从A_GREEN开始。

    5.9 主循环调度模块

    主循环负责:

    • 读取按键输入(车辆检测 + K1/K2/K3);
    • 检查紧急模式是否触发;
    • 根据状态机与倒计时进行灯态输出;
    • 处理优先放行插入逻辑;
    • 更新倒计时显示(如果未来扩展数码管可在此加入)。
  5. 参考程序(示例代码,C语言,适用于51单片机思路)

c 复制代码
#include <REGX52.H>

// ===================== IO定义(示例) =====================
// A车道信号灯
sbit A_R = P2^0;
sbit A_Y = P2^1;
sbit A_G = P2^2;

// B车道信号灯
sbit B_R = P2^3;
sbit B_Y = P2^4;
sbit B_G = P2^5;

// 车辆检测信号(按键或拨码开关模拟)
sbit A_DET = P3^0;   // A车道有车:按下为0(低电平有效)
sbit B_DET = P3^1;   // B车道有车:按下为0

// 控制按键
sbit K1 = P3^2;      // B放行期间优先A
sbit K2 = P3^3;      // A放行期间优先B
sbit K3 = P3^4;      // 紧急全红

// ===================== 状态定义 =====================
typedef enum {
    ST_A_GREEN = 0,
    ST_A_YELLOW,
    ST_B_GREEN,
    ST_B_YELLOW,
    ST_PRIORITY_A,
    ST_PRIORITY_B,
    ST_EMERGENCY_ALL_RED
} TrafficState;

volatile unsigned int ms_count = 0;
volatile bit tick_1s = 0;

TrafficState state = ST_A_GREEN;
unsigned char sec_left = 0;

// ===================== 定时器0:1ms中断 =====================
// 12MHz晶振下,定时器计数1ms:TH0/TL0装载 65536-1000 = 64536 (0xFC18)
void Timer0_Init(void)
{
    TMOD &= 0xF0;
    TMOD |= 0x01;        // 定时器0方式1(16位)
    TH0 = 0xFC;
    TL0 = 0x18;
    ET0 = 1;
    EA  = 1;
    TR0 = 1;
}

void Timer0_ISR(void) interrupt 1
{
    TH0 = 0xFC;
    TL0 = 0x18;

    ms_count++;
    if(ms_count >= 1000)
    {
        ms_count = 0;
        tick_1s = 1;
    }
}

// ===================== 工具函数:设置灯态 =====================
void Set_All_Red(void)
{
    A_R = 1; A_Y = 0; A_G = 0;
    B_R = 1; B_Y = 0; B_G = 0;
}

void Set_A_Green(void)
{
    A_R = 0; A_Y = 0; A_G = 1;
    B_R = 1; B_Y = 0; B_G = 0;
}

void Set_A_Yellow(void)
{
    A_R = 0; A_Y = 1; A_G = 0;
    B_R = 1; B_Y = 0; B_G = 0;
}

void Set_B_Green(void)
{
    A_R = 1; A_Y = 0; A_G = 0;
    B_R = 0; B_Y = 0; B_G = 1;
}

void Set_B_Yellow(void)
{
    A_R = 1; A_Y = 0; A_G = 0;
    B_R = 0; B_Y = 1; B_G = 0;
}

// ===================== 按键消抖读取(低电平有效) =====================
bit Key_Down(sbit key)
{
    if(key == 0)
    {
        unsigned int t = 0;
        while(t < 20)   // 约20ms消抖(粗略依赖系统节拍)
        {
            if(tick_1s) tick_1s = 0; // 避免影响主逻辑(示例简化)
            t++;
        }
        if(key == 0)
        {
            while(key == 0); // 等待松手
            return 1;
        }
    }
    return 0;
}

// ===================== 状态进入函数(统一设置倒计时) =====================
void Enter_State(TrafficState st)
{
    state = st;

    switch(st)
    {
        case ST_A_GREEN:
            Set_A_Green();
            sec_left = 45;  // A绿45秒
            break;
        case ST_A_YELLOW:
            Set_A_Yellow();
            sec_left = 5;   // A黄5秒
            break;
        case ST_B_GREEN:
            Set_B_Green();
            sec_left = 25;  // B绿25秒
            break;
        case ST_B_YELLOW:
            Set_B_Yellow();
            sec_left = 5;   // B黄5秒
            break;
        case ST_PRIORITY_A:
            Set_A_Green();
            sec_left = 15;  // A优先放行15秒
            break;
        case ST_PRIORITY_B:
            Set_B_Green();
            sec_left = 15;  // B优先放行15秒
            break;
        case ST_EMERGENCY_ALL_RED:
            Set_All_Red();
            sec_left = 20;  // 全红20秒
            break;
        default:
            break;
    }
}

// ===================== 优先触发条件判断 =====================
bit A_HasCar(void) { return (A_DET == 0); }
bit B_HasCar(void) { return (B_DET == 0); }

// ===================== 主程序 =====================
void main(void)
{
    Timer0_Init();
    Enter_State(ST_A_GREEN);

    while(1)
    {
        // 1) 紧急按键最高优先级
        if(Key_Down(K3))
        {
            Enter_State(ST_EMERGENCY_ALL_RED);
        }

        // 2) 在允许的阶段判断优先放行触发
        // B放行期间:A有车且B无车,按K1 -> A优先15秒
        if(state == ST_B_GREEN || state == ST_B_YELLOW)
        {
            if(A_HasCar() && !B_HasCar())
            {
                if(Key_Down(K1))
                {
                    Enter_State(ST_PRIORITY_A);
                }
            }
        }

        // A放行期间:B有车且A无车,按K2 -> B优先15秒
        if(state == ST_A_GREEN || state == ST_A_YELLOW)
        {
            if(B_HasCar() && !A_HasCar())
            {
                if(Key_Down(K2))
                {
                    Enter_State(ST_PRIORITY_B);
                }
            }
        }

        // 3) 1秒节拍更新倒计时与状态转换
        if(tick_1s)
        {
            tick_1s = 0;

            if(sec_left > 0)
            {
                sec_left--;
            }

            if(sec_left == 0)
            {
                // 状态跳转逻辑
                switch(state)
                {
                    case ST_A_GREEN:
                        Enter_State(ST_A_YELLOW);
                        break;
                    case ST_A_YELLOW:
                        Enter_State(ST_B_GREEN);
                        break;
                    case ST_B_GREEN:
                        Enter_State(ST_B_YELLOW);
                        break;
                    case ST_B_YELLOW:
                        Enter_State(ST_A_GREEN);
                        break;

                    case ST_PRIORITY_A:
                        // 优先A结束后,进入A黄灯警告再切B绿(保持流程安全)
                        Enter_State(ST_A_YELLOW);
                        break;

                    case ST_PRIORITY_B:
                        // 优先B结束后,进入B黄灯警告再切A绿
                        Enter_State(ST_B_YELLOW);
                        break;

                    case ST_EMERGENCY_ALL_RED:
                        // 紧急结束后从A绿开始恢复交通
                        Enter_State(ST_A_GREEN);
                        break;

                    default:
                        Enter_State(ST_A_GREEN);
                        break;
                }
            }
        }
    }
}
  1. 程序设计要点补充说明

    7.1 为什么优先放行结束后加入黄灯过渡

    在真实交通控制中,信号切换通常需要黄灯作为过渡提示,避免驾驶员在绿灯结束瞬间误闯路口。本系统将优先放行结束后也安排进入对应方向黄灯,再切换到下一相位,这样可以:

    • 提升仿真真实性;
    • 避免优先阶段突然结束导致逻辑突变;
    • 与正常模式保持一致的切换节奏。

    7.2 为什么紧急模式结束后从A绿开始

    紧急模式属于强制中断逻辑,如果恢复时回到被打断的状态,可能导致倒计时混乱或优先标志残留。恢复到A绿能够:

    • 保证系统回到确定的起点;
    • 保持"主干道优先"的交通策略;
    • 便于测试与维护。

    7.3 可扩展方向

    本设计为基础仿真系统,后续可拓展:

    • 增加数码管倒计时显示,提高可视化效果;
    • 增加蜂鸣器,在黄灯或紧急模式时报警提示;
    • 增加更真实的车检方式,如红外对射、霍尔传感器或超声波检测;
    • 扩展为四方向十字路口,并加入行人信号灯与斑马线按钮控制;
    • 加入串口通信或无线通信,实现多路口协调控制与上位机监控。
  2. 总结

    本文设计了一套基于单片机的十字路口交通信号灯控制系统,利用LED实现交通灯状态显示,利用按键实现车辆检测模拟与手动优先控制,并加入紧急车辆通行时的全红应急模式。系统在正常模式下实现主干道A放行50秒、支干道B放行30秒的轮流通行机制,同时支持在车流不均衡时通过K1/K2进行15秒优先放行调整,并在紧急情况按K3实现20秒全红禁行,充分体现了"主干道优先 + 动态调整 + 应急优先"的智能交通管理思想。采用12MHz晶振保证了定时精度与响应速度,控制逻辑清晰可靠,具有良好的扩展性与工程应用价值。

相关推荐
来杯@Java8 小时前
学生选课管理系统(基于springboot+vue前后端分离的项目)计算机毕业设计java
java·spring boot·spring·vue·毕业设计·maven·mybatis
清风6666669 小时前
基于单片机与DAC0832的双路波形信号发生系统设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
azwsm10 小时前
电路元器件和GPIO控制器
单片机·嵌入式硬件
kebidaixu13 小时前
FreeRTOS 移植到 STM32F407VETX 记录(一)
stm32·单片机·嵌入式硬件
CSDN官方博客14 小时前
「谁说嵌入式只是调包和焊板子?」—— 2026嵌入式全栈技术征锋令
嵌入式硬件·物联网·embedding
点灯小铭14 小时前
基于单片机的数码管定时插座设计与定时开关功能实现
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
云栖梦泽15 小时前
玩转RK3506SDK
linux·嵌入式硬件
数智工坊16 小时前
机器人四大主控板系统分层选型指南:树莓派、ESP32、STM32与Arduino的能力边界与实战定位
stm32·嵌入式硬件·机器人
进击的小头17 小时前
第8篇:IGBT 从零到精通:核心原理、关键参数、选型指南与工业级应用要点
经验分享·嵌入式硬件·学习
点灯小铭17 小时前
基于单片机的多模式智能洗衣机设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业