news 2026/5/30 22:08:06

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

作者头像

张小明

前端开发工程师

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

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

一、项目背景

交通灯是嵌入式入门必备的"经典练手项目",但要做出真正贴近实际十字路口工况的版本,并不只是 LED 闪三下那么简单。本项目"基于 STM32 实现交通灯控制程序"完整模拟了一个十字路口的真实场景:东西向、南北向各 4 组红黄绿灯 + 数码管倒计时 + 行人请求按钮 + 夜间黄灯闪烁模式 + 紧急车辆优先(应急通道),并带有蜂鸣器提示与上位机指令切换。

二、整机流程图

正常模式

夜间模式

应急模式

上电初始化

GPIO/TIM/EXTI 初始化

系统模式?

东西绿 + 南北红
EW=25s NS=28s

每秒更新数码管

EW=5s?

东西绿→黄

EW=0s?

东西红 + 南北绿
EW=28s NS=25s

每秒更新数码管

NS=5s?

南北绿→黄

NS=0s?

全部黄灯 1Hz 闪烁

主线全绿
支线全红 直至指令解除

行人按钮?

当前相位时间-3s

三、硬件资源

信号STM32 引脚
东西红/黄/绿PB0/PB1/PB2
南北红/黄/绿PB3/PB4/PB5
数码管段选PA0~PA7
数码管位选PB8~PB11
蜂鸣器PA12
行人按钮PA15(EXTI)
模式拨码开关PB14/PB15

四、核心代码

4.1 traffic.c

#include"main.h"typedefenum{PHASE_EW_GREEN,PHASE_EW_YELLOW,PHASE_NS_GREEN,PHASE_NS_YELLOW}Phase_t;staticvolatilePhase_t s_phase=PHASE_EW_GREEN;staticvolatileints_count=25;staticvolatileints_pedestrian=0;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_count>0)s_count--;if(s_pedestrian&&s_count>3){s_count=3;s_pedestrian=0;}switch(s_phase){casePHASE_EW_GREEN:Lights(1,0,0,0,0,1);/* 误:应是 EW绿 NS红 *//* 正确:EW=001, NS=100 */Lights(0,0,1,1,0,0);if(s_count==5)s_phase=PHASE_EW_YELLOW;break;casePHASE_EW_YELLOW:Lights(0,1,0,1,0,0);if(s_count==0){s_phase=PHASE_NS_GREEN;s_count=25;}break;casePHASE_NS_GREEN:Lights(1,0,0,0,0,1);if(s_count==5)s_phase=PHASE_NS_YELLOW;break;casePHASE_NS_YELLOW:Lights(1,0,0,0,1,0);if(s_count==0){s_phase=PHASE_EW_GREEN;s_count=25;}break;}}intTraffic_GetCount(void){returns_count;}voidHAL_GPIO_EXTI_Callback(uint16_tp){if(p==GPIO_PIN_15)s_pedestrian=1;}

4.2 数码管动态扫描

staticconstuint8_tseg[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};voidSeg_DisplayCounter(intn){staticintidx=0;intdigits[4]={n/10%10,n%10,n/10%10,n%10};HAL_GPIO_WritePin(GPIOB,0xF<<8,GPIO_PIN_RESET);GPIOA->ODR=(GPIOA->ODR&0xFF00)|seg[digits[idx]];HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8<<idx,GPIO_PIN_SET);idx=(idx+1)&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->Instance==TIM2)Traffic_Tick1s();if(h->Instance==TIM3)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 实现路口间联动绿波带;
  • 改造为"潮汐车道"自适应控制器;
  • 教学场地搭建沙盘模型,配合小车线巡演示。

七、调试经验

  1. GPIO 驱动能力:直接驱动 LED 时记得加 470Ω 限流电阻;
  2. 数码管位选用 PNP 管增强电流,否则亮度不均;
  3. EXTI 防抖:行人按钮要防抖 50ms;
  4. 掉电保存当前相位:可写入 BKP 寄存器,恢复后从断电处继续。

八、总结

本项目以一个看似简单的"红绿灯"为切入点,演示了 GPIO、TIM 中断、EXTI、数码管扫描、状态机设计等多种嵌入式核心技术,是嵌入式课程设计、毕业设计的优选题目。完整源代码、Proteus 仿真工程、PCB 工程都已打包在项目中。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/30 22:00:43

RecyclerBanner 开源项目教程

RecyclerBanner 开源项目教程 【免费下载链接】RecyclerBanner 用RecyclerView实现无限轮播图&#xff0c;有普通版和3d版 项目地址: https://gitcode.com/gh_mirrors/re/RecyclerBanner 项目介绍 RecyclerBanner 是一个基于 RecyclerView 实现的无尽轮播图控件。它允许…

作者头像 李华
网站建设 2026/5/30 22:00:01

告别黑屏花屏!在 Ubuntu 上为 xrdp 配置 XFCE 轻量桌面的完整避坑实践

告别黑屏花屏&#xff01;在 Ubuntu 上为 xrdp 配置 XFCE 轻量桌面的完整避坑实践远程桌面连接是管理无显示器服务器的常见需求&#xff0c;但许多用户在 Ubuntu 上配置 xrdp 时都会遇到黑屏或花屏问题。本文将分享一套经过实战验证的配置方案&#xff0c;特别适合资源有限的 A…

作者头像 李华