【免费开源】STM32交通灯控制系统倒计时数码管显示十字路口红绿灯仿真完整项目分享

发布时间:2026/5/30 22:08:13

【免费开源】STM32交通灯控制系统倒计时数码管显示十字路口红绿灯仿真完整项目分享 【免费开源】STM32交通灯控制系统倒计时数码管显示十字路口红绿灯仿真完整项目分享一、项目背景交通灯是嵌入式入门必备的经典练手项目但要做出真正贴近实际十字路口工况的版本并不只是 LED 闪三下那么简单。本项目基于 STM32 实现交通灯控制程序完整模拟了一个十字路口的真实场景东西向、南北向各 4 组红黄绿灯 数码管倒计时 行人请求按钮 夜间黄灯闪烁模式 紧急车辆优先应急通道并带有蜂鸣器提示与上位机指令切换。二、整机流程图正常模式是否否是是否否是夜间模式应急模式是上电初始化GPIO/TIM/EXTI 初始化系统模式?东西绿 南北红EW25s NS28s每秒更新数码管EW5s?东西绿→黄EW0s?东西红 南北绿EW28s NS25s每秒更新数码管NS5s?南北绿→黄NS0s?全部黄灯 1Hz 闪烁主线全绿支线全红 直至指令解除行人按钮?当前相位时间-3s三、硬件资源信号STM32 引脚东西红/黄/绿PB0/PB1/PB2南北红/黄/绿PB3/PB4/PB5数码管段选PA0~PA7数码管位选PB8~PB11蜂鸣器PA12行人按钮PA15(EXTI)模式拨码开关PB14/PB15四、核心代码4.1 traffic.c#includemain.htypedefenum{PHASE_EW_GREEN,PHASE_EW_YELLOW,PHASE_NS_GREEN,PHASE_NS_YELLOW}Phase_t;staticvolatilePhase_t s_phasePHASE_EW_GREEN;staticvolatileints_count25;staticvolatileints_pedestrian0;staticvoidLights(intewR,intewY,intewG,intnsR,intnsY,intnsG){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,ewR);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,ewY);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,ewG);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,nsR);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,nsY);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,nsG);}voidTraffic_Tick1s(void){/* TIM2 1Hz 中断 */if(s_count0)s_count--;if(s_pedestrians_count3){s_count3;s_pedestrian0;}switch(s_phase){casePHASE_EW_GREEN:Lights(1,0,0,0,0,1);/* 误应是 EW绿 NS红 *//* 正确EW001, NS100 */Lights(0,0,1,1,0,0);if(s_count5)s_phasePHASE_EW_YELLOW;break;casePHASE_EW_YELLOW:Lights(0,1,0,1,0,0);if(s_count0){s_phasePHASE_NS_GREEN;s_count25;}break;casePHASE_NS_GREEN:Lights(1,0,0,0,0,1);if(s_count5)s_phasePHASE_NS_YELLOW;break;casePHASE_NS_YELLOW:Lights(1,0,0,0,1,0);if(s_count0){s_phasePHASE_EW_GREEN;s_count25;}break;}}intTraffic_GetCount(void){returns_count;}voidHAL_GPIO_EXTI_Callback(uint16_tp){if(pGPIO_PIN_15)s_pedestrian1;}4.2 数码管动态扫描staticconstuint8_tseg[10]{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};voidSeg_DisplayCounter(intn){staticintidx0;intdigits[4]{n/10%10,n%10,n/10%10,n%10};HAL_GPIO_WritePin(GPIOB,0xF8,GPIO_PIN_RESET);GPIOA-ODR(GPIOA-ODR0xFF00)|seg[digits[idx]];HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8idx,GPIO_PIN_SET);idx(idx1)3;}4.3 主程序intmain(void){HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_TIM2_Init();MX_TIM3_Init();HAL_TIM_Base_Start_IT(htim2);/* 1Hz */HAL_TIM_Base_Start_IT(htim3);/* 2ms 扫描 */while(1){__WFI();}}voidHAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef*h){if(h-InstanceTIM2)Traffic_Tick1s();if(h-InstanceTIM3)Seg_DisplayCounter(Traffic_GetCount());}五、技术亮点5.1 状态机思想把交通灯控制抽象成 4 个状态 6 个迁移条件避免一堆 if-else 嵌套。状态机模式可以扩展到 6 相位、8 相位的复杂十字路口甚至公交优先信号控制。5.2 行人按钮剪短机制当行人按下按钮如果当前主向绿灯还有 ≥ 3 秒立即剪短到 3 秒保留黄灯过渡既快速响应又不会让车辆突然急刹。5.3 数码管动态扫描4 位共阳数码管使用 2ms 间隔扫描刷新率 125Hz肉眼无感闪烁。5.4 应急车辆优先通过 EXTI 接收紧急车辆 RFID/超声波检测信号软件强制切到主线全绿、支线全红模式让救护车/消防车通行无阻。六、应用扩展接入 GSM 模块远程上报故障加入 OLED 显示当前模式与剩余秒数与 ESP32 协作通过 LoRa 实现路口间联动绿波带改造为潮汐车道自适应控制器教学场地搭建沙盘模型配合小车线巡演示。七、调试经验GPIO 驱动能力直接驱动 LED 时记得加 470Ω 限流电阻数码管位选用 PNP 管增强电流否则亮度不均EXTI 防抖行人按钮要防抖 50ms掉电保存当前相位可写入 BKP 寄存器恢复后从断电处继续。八、总结本项目以一个看似简单的红绿灯为切入点演示了 GPIO、TIM 中断、EXTI、数码管扫描、状态机设计等多种嵌入式核心技术是嵌入式课程设计、毕业设计的优选题目。完整源代码、Proteus 仿真工程、PCB 工程都已打包在项目中。

相关新闻