目录
一、设计背景和意义
1.1设计背景
城市交通系统是现代都市的命脉,其运行效率直接关系到经济发展、能源消耗与公众的生活品质。然而,伴随着机动车数量的爆炸式增长,传统交通管理系统固有的弊端日益凸显。其中,以固定配时方案为核心的传统交通信号灯,因其僵化的控制逻辑无法应对车流量的潮汐式、随机性波动,已成为造成交叉路口通行能力低下、车辆延误时间增加、乃至引发大面积交通拥堵的关键瓶颈之一。这种"车等灯"而非"灯看车"的模式,不仅加剧了燃油消耗和尾气排放,也构成了智慧城市建设的巨大障碍。
1.2设计意义
城市交叉路口是交通拥堵的频发点,其通行效率直接关乎公众出行体验与社会经济运行成本。本系统所设计的基于实时车流量的自适应控制策略,能够有效克服传统定时信号灯"死板"、效率低下的缺点,实现从"车等灯"到"灯看车"的初步转变,有望显著减少车辆在路口的平均等待时间,提升路口吞吐率,从而缓解交通拥堵,降低燃油消耗和汽车尾气排放。此外,系统的远程监控功能可将传统的现场人工巡查转变为高效的远程数字化管理,降低了交通管理部门的运维成本。
二、实物效果展示
2.1实物图片
2.2实物演示视频
基于STM32自适应车流交通信号灯-云智能App版
三、硬件功能简介
3.1项目功能详解
1、东西、南北方向交通信号灯倒计时结束并切换;
2、红外传感器检测车流量判断高峰、正常、低峰,实现不同情况下信号灯时间变换;
3、紧急停止按键按下,信号灯全部变为红灯进制通行;
4、APP查看当前时段车流量,并可通过按键设置时段
3.2元器件清单
- 红外对管
- 二位数码管
- 红绿黄led灯
- WiFi模块
- 按键
四、主框图与软件流程图
主框图

流程图

五、硬件PCB展示


六、软件程序设计
cpp
#include "main.h"
#include "stm32f1xx.h"
TIM_HandleTypeDef htim2;
void leddisplay(uint8_t num); //数码管显示函数,num为要显示的数
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
void Error_Handler(void);
static void MX_GPIO_Init(void);
static void MX_TIM2_Init(void);
extern uint8_t i;
int main(void)
{
uint16_t ttt = 0,t=0;
i = 0;
uint8_t key_value = 3;
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
BASIC_TIMx_Init();
/* 在中断模式下启动定时器 */
HAL_TIM_Base_Start_IT(&htimx);
while (1)
{
HAL_Delay(10);
if(i<10)
{ ttt=i;
LED0_ON;
LED1_OFF;
LED2_OFF;
LED3_OFF;
LED4_OFF;
LED5_ON;
t=10-ttt;
}
else if(i>=10&&i<15)
{
ttt=i-10;
LED0_OFF;
LED1_ON;
LED2_OFF;
LED3_OFF;
LED4_ON;
LED5_OFF;
t=5-ttt;
}
else if(i>=15)
{
ttt=i-15;
LED0_OFF;
LED1_OFF;
LED2_ON;
LED3_ON;
LED4_OFF;
LED5_OFF;
if(i==25)
{
i=0;
}
t=10-ttt;
}
leddisplay(t);
}
// /* USER CODE END 3 */
}
/** System Clock Configuration
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
/** Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.LSIState = RCC_LSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/** Initializes the CPU, AHB and APB busses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
| RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
{
Error_Handler();
}
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC;
PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
{
Error_Handler();
}
}
/** Configure pins as
* Analog
* Input
* Output
* EVENT_OUT
* EXTI
*/
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/*Configure GPIO pins : LEDPING_Pin LEDPINC_Pin LEDPIND_Pin LEDPINE_Pin
LEDPINDP_Pin LEDPINF_Pin LEDPINB_Pin LEDPINA_Pin */
GPIO_InitStruct.Pin = LEDPING_Pin | LEDPINC_Pin | LEDPIND_Pin | LEDPINE_Pin
| LEDPINDP_Pin | LEDPINF_Pin | LEDPINB_Pin | LEDPINA_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/*Configure GPIO pins : LEDPINDG2_Pin LEDPINDG1_Pin */
GPIO_InitStruct.Pin = LEDPINDG2_Pin | LEDPINDG1_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4 | GPIO_PIN_5, GPIO_PIN_SET);
/*Configure GPIO pin Output Level */
GPIO_InitStruct.Pin = LED0 | LED1 | LED2 | LED3
| LED4 | LED5;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_GPIO_WritePin(LED0_GPIO_Port, LED0 | LED1 | LED2 | LED3 | LED4 | LED5 , GPIO_PIN_SET);
}
/* USER CODE BEGIN 4 */
void leddisplay(uint8_t num) //数码管显示函数,num为要显示的数
{
uint8_t tmp = 0;
static uint8_t j = 0;
HAL_GPIO_WritePin(GPIOB, 0xFF << 7, GPIO_PIN_SET); //PE7~PE14位置零,清除数码管显示
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4 | GPIO_PIN_5, GPIO_PIN_RESET);
if(j == 0)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET);
tmp = num / 10;
}
else
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
tmp = num % 10;
}
j = !j;
switch(tmp)
{
case 0: LEDDISPLAY0; break;
case 1: LEDDISPLAY1; break;
case 2: LEDDISPLAY2; break;
case 3: LEDDISPLAY3; break;
case 4: LEDDISPLAY4; break;
case 5: LEDDISPLAY5; break;
case 6: LEDDISPLAY6; break;
case 7: LEDDISPLAY7; break;
case 8: LEDDISPLAY8; break;
case 9: LEDDISPLAY9; break;
}
}
void Error_Handler(void)
{
/* USER CODE BEGIN Error_Handler */
/* User can add his own implementation to report the HAL error return state */
while(1)
{
}
/* USER CODE END Error_Handler */
}
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t *file, uint32_t line)
{
/* USER CODE BEGIN 6 */
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* USER CODE END 6 */
}
#endif
七、项目资料包内容
