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

  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晶振保证了定时精度与响应速度,控制逻辑清晰可靠,具有良好的扩展性与工程应用价值。

相关推荐
渡我白衣2 小时前
计算机组成原理(10):逻辑门电路
android·人工智能·windows·嵌入式硬件·硬件工程·计组·数电
清风6666662 小时前
基于单片机的雨量检测智能汽车雨刮器模拟系统设计与实现
单片机·嵌入式硬件·汽车·毕业设计·课程设计·期末大作业
少一倍的优雅2 小时前
hi3863 (ws63) 智能小车 (二)信息交互
单片机·嵌入式硬件·交互·harmonyos·hi3863
三佛科技-187366133973 小时前
LP2177B(输出电压可调3.3V/5V 400mA)兼容BP2525电源芯片方案
单片机·嵌入式硬件
llilian_1613 小时前
总线授时卡 CPCI总线授时卡的工作原理及应用场景介绍 CPCI总线校时卡
运维·单片机·其他·自动化
禾仔仔14 小时前
USB MSC从理论到实践(模拟U盘为例)——从零开始学习USB2.0协议(六)
嵌入式硬件·mcu·计算机外设
+VX:Fegn089515 小时前
计算机毕业设计|基于springboot + vue宠物寄养系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计·宠物
The Electronic Cat16 小时前
树莓派使用串口启动死机
单片机·嵌入式硬件·树莓派
先知后行。18 小时前
常见元器件
单片机·嵌入式硬件