基于STM32的智能交通灯系统设计与实现
1. 智能交通灯系统设计概述十字路口的红绿灯控制系统是嵌入式开发的经典练手项目。用STM32来实现这个系统特别合适因为它兼具性能强大和性价比高的特点。我去年带学生做毕业设计时就用了这个方案实测下来稳定性很好成本还不到50块钱。这个系统的核心逻辑其实很简单东西方向和南北方向的灯组交替亮灭中间用黄灯作为缓冲。但真正动手做的时候你会发现很多细节需要考虑。比如数码管显示要稳定不闪烁、状态切换要精准计时、代码结构要清晰易维护等等。硬件部分主要包含三块STM32最小系统板、LED灯组红黄绿各两个和两位共阳数码管。软件层面需要实现状态机控制、倒计时显示和灯光驱动。下面我会结合自己踩过的坑详细讲解每个环节的实现要点。2. 硬件电路设计要点2.1 元器件选型与连接我用的是STM32F103C8T6最小系统板价格便宜且性能足够。LED建议选用5mm草帽灯红黄绿各两个记得串联220Ω限流电阻。数码管推荐使用3461BS这种两位共阳型直接接在GPIOC口上就行。实际接线时有个容易出错的地方数码管的段选信号需要接上拉电阻。我第一次做的时候没加电阻显示总是暗谈不清。后来发现是因为STM32的IO驱动能力不足加上1kΩ的上拉电阻就解决了。LED的驱动电路要注意红灯功率较大建议用三极管驱动黄灯和绿灯可以直接用IO口驱动所有灯都要加续流二极管防止反峰电压2.2 Protues仿真设计先用Protues画原理图是个好习惯。我一般先放好这些元件STM32F103C8LED-RED/YELLOW/GREEN 各两个7SEG-MPX2-CA (两位共阳数码管)电阻、三极管等外围器件仿真时特别注意时钟配置我遇到过仿真跑不起来的情况最后发现是HSE时钟没设置对。建议先用内部8MHz RC振荡器等基本功能调通再换外部晶振。3. 软件逻辑实现详解3.1 状态机设计与实现交通灯最核心的就是状态机控制。我把它划分为四个状态东西红灯南北绿灯30秒东西红灯南北黄灯3秒东西绿灯南北红灯30秒东西黄灯南北红灯3秒用枚举类型定义状态最清晰typedef enum { STATE_EW_RED_NS_GREEN, STATE_EW_RED_NS_YELLOW, STATE_EW_GREEN_NS_RED, STATE_EW_YELLOW_NS_RED } TrafficLightState;状态切换用定时器中断触发最可靠。我用TIM2做1秒基准在中断服务函数里递减计数器并检查状态转换。3.2 数码管显示优化原始代码的数码管显示有个问题直接使用Delay函数会导致显示闪烁。我的改进方案是用定时器中断做1ms扫描采用动态显示方式添加消影处理优化后的显示函数void TIM3_IRQHandler(void) { static uint8_t pos 0; if(TIM_GetITStatus(TIM3, TIM_IT_Update)) { GPIO_Write(GPIOC, 0xFFFF); // 消影 if(pos 0) { GPIO_Write(GPIOC, disp[0]); GPIO_ResetBits(GPIOC, GPIO_Pin_8); } else { GPIO_Write(GPIOC, disp[1]); GPIO_ResetBits(GPIOC, GPIO_Pin_9); } pos !pos; TIM_ClearITPendingBit(TIM3, TIM_IT_Update); } }4. 模块化编程实践4.1 代码组织架构好的嵌入式程序一定要模块化。我的项目结构是这样的/DriversLEDled.cled.hSMGsmg.csmg.h/Srcmain.cstm32f10x_it.c每个硬件模块对应一个驱动文件全局变量尽量少用。比如LED控制就封装成六个函数void LED_Red_EW_On(void); void LED_Red_EW_Off(void); // 其他灯类似...4.2 关键参数配置这几个配置最容易出错需要特别注意时钟树配置HSI 8MHz经PLL倍频到72MHz定时器参数TIM21秒中断用于状态机TIM31ms中断用于数码管扫描GPIO模式推挽输出LED控制开漏输出数码管位选调试时建议先用示波器检查这些信号各IO口输出电平定时器中断间隔数码管扫描频率5. 常见问题排查5.1 显示异常处理数码管显示不正常时按这个顺序检查测量段选信号电压应在2-3V左右检查位选信号是否正常切换确认字形码数据是否正确检查消影处理是否到位我遇到过最奇葩的问题是数码管显示缺划最后发现是PCB上有根线虚焊了。所以硬件问题也不能忽视。5.2 状态切换不准时如果红绿灯时间控制不准重点检查定时器时钟源是否正确中断优先级设置建议TIM2用最高优先级是否在中断服务函数中做了耗时操作有个小技巧在状态切换时点亮一个调试LED用逻辑分析仪抓时序特别方便。6. 功能扩展思路基础功能实现后可以考虑这些增强功能通过按键调整红绿灯时长添加蜂鸣器提示黄灯时段用OLED显示更丰富的信息增加远程控制功能需配合无线模块我最推荐先做第一个扩展只需要增加四个按键KEY1增加东西方向时间KEY2减少东西方向时间KEY3增加南北方向时间KEY4减少南北方向时间按键处理放在主循环中即可注意做好防抖处理。时间参数建议保存在备份寄存器掉电不丢失。

相关新闻