当前位置: 首页 > news >正文

基于STM32的交通灯设计—紧急模式、可调时间

基于STM32交通灯设计

(仿真+程序+设计报告)

功能介绍

具体功能:

1.数码管和LED模拟交通灯;

2.南北绿灯9秒,东西绿灯15秒,黄灯2秒;

3.紧急情况:按下按键,全变红灯,数码管显示00,再按一次退出紧急模式;

4.按键可设置绿灯时间;

添加图片注释,不超过 140 字(可选)

程序

#include <stdlib.h> #include <string.h> #include "main.h" #include "smg.h" #include "ds18b20.h" #include "beep.h" #include "key.h" #include "timer.h" #include "delay.h" #define SPEED 101 //因电脑配置不同,导致仿真速度有区别,如果需要实时倒计时趋于1秒,修改这个值 #define YELLOW_TIME 3 //黄灯时间(秒) void SystemClock_Config(void); uint8_t data_table[4] = {10,10,10,10}; //显示缓存数组 uint8_t bei_nan_time = 10; //南北方向默认时间(秒) uint8_t xi_dong_time = 15; //东西方向默认时间(秒) uint8_t temp_bei = 10; //南北倒计时,显示临时缓存变量 uint8_t temp_xi = 15 + YELLOW_TIME;//东西倒计时,显示临时缓存变量 uint8_t mode = 1; /*mode =1,南北方向;mode =0,东西方向*/ uint8_t emg_mode = 0; /*emg_mode =0,正常;emg_mode =1,紧急停止,时间为0,所有方向亮红灯*/ uint8_t set_mode = 0; /*set_mode =0,不设置;set_mode =1,设置南北方向时间;set_mode =2,设置东西方向时间*/ uint16_t time_update = 101; //1秒计时变量 int main(void) { /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* Configure the system clock */ SystemClock_Config(); // delay_init(10); //初始化延时函数 TIM3_Init(1800-1, 18-1); // 10ms,数码管刷新用 Key_Init(); //按键中断初始化 Led_Init(); //指示灯的初始化 SEG_Init(); //数码管引脚初始化 while(1) { if(time_update > SPEED && set_mode == 0) //计时达到1秒且未进入设置模式 { time_update = 0; //重置1秒钟倒计时时间 if(mode) //mode=0,表示进入南北通行模式(南北绿灯+南北黄灯) { LED_NBR_OF();LED_NBY_OF();LED_NBG_ON(); //南北方向,亮绿灯 LED_DXR_ON();LED_DXY_OF();LED_DXG_OF(); //东西方向,亮红灯 if(temp_bei == 0) //南北方向,倒计时结束时 { if(temp_xi == 0) //多出来3秒的东西方向,也倒计时结束了 { mode = 0; //进入东西方向绿灯模式 temp_xi = xi_dong_time; //提前更新东西方向的倒计时时间 temp_bei = temp_xi + YELLOW_TIME; //更新南北方向的时间,为东西方向+3秒 LED_NBR_ON();LED_NBY_OF();LED_NBG_OF(); //南北方向,亮红灯 LED_DXR_OF();LED_DXY_OF();LED_DXG_ON(); //东西方向,亮绿灯 } else //南北方向已经结束,但是东西方向多出来的3秒未结束(3秒黄灯时间) { temp_xi--; //剩余的3秒,倒计时-1秒 // temp_bei = temp_xi;//南北方向黄灯时间 LED_NBR_OF();LED_NBY_ON();LED_NBG_OF(); //南北亮黄灯 LED_DXR_ON();LED_DXY_OF();LED_DXG_OF(); //东西亮红灯 } } else { temp_bei--; //南北方向。计时为-1秒 temp_xi = temp_bei + YELLOW_TIME; //更新东西方向的倒计时时间 } } else//mode=0,表示进入东西通行模式(东西绿灯+东西黄灯) { LED_NBR_ON();LED_NBY_OF();LED_NBG_OF(); //南北方向,亮红灯 LED_DXR_OF();LED_DXY_OF();LED_DXG_ON(); //东西方向,亮绿灯 if(temp_xi == 0) //东西方向,倒计时结束时 { if(temp_bei == 0) //多出来3秒的南北方向,也倒计时结束了 { mode = 1; //进入南北方向绿灯模式 temp_bei = bei_nan_time; //提前更新南北方向的倒计时时间 temp_xi = temp_bei + YELLOW_TIME; //更新东西方向的时间,为南北方向+3秒 LED_NBR_OF();LED_NBY_OF();LED_NBG_ON(); //南北方向,亮绿灯 LED_DXR_ON();LED_DXY_OF();LED_DXG_OF(); //东西方向,亮红灯 } else //东西方向已经结束,但是南北方向多出来的3秒未结束(3秒黄灯时间) { temp_bei--; //南北方向,剩余的3秒,倒计时-1秒 // temp_xi = temp_bei; LED_NBR_ON();LED_NBY_OF();LED_NBG_OF(); //南北亮红灯 LED_DXR_OF();LED_DXY_ON();LED_DXG_OF(); //东西亮黄灯 } } else { temp_xi--; //东西方向。计时为-1秒 temp_bei = temp_xi + YELLOW_TIME; //更新南北方向的倒计时时间 } } } } } *****//完整资料 ***//***公众号:木子单片机********/ //定时器3中断服务函数 uint8_t led_temp = 0; void TIM3_IRQHandler(void) { if(emg_mode) //判断是紧急模式 { data_table[0] = 0; //倒计时全显示0000 data_table[1] = 0; data_table[2] = 0; data_table[3] = 0; LED_NBR_ON();LED_NBY_OF();LED_NBG_OF(); //亮起所有红灯 LED_DXR_ON();LED_DXY_OF();LED_DXG_OF(); } else //判断不是紧急模式 { if(set_mode != 0) //是设置东西南北时间的模式 { data_table[0] = bei_nan_time / 10; //将倒计时数据缓存到数码管显示数组 data_table[1] = bei_nan_time % 10; data_table[2] = xi_dong_time / 10; data_table[3] = xi_dong_time % 10; if(set_mode==1){ LED_NBR_ON();LED_NBY_ON();LED_NBG_ON(); //开启南北方向指示灯,表示进入了南北时间设置模式 LED_DXR_OF();LED_DXY_OF();LED_DXG_OF(); }else if(set_mode==2){ LED_NBR_OF();LED_NBY_OF();LED_NBG_OF(); LED_DXR_ON();LED_DXY_ON();LED_DXG_ON();//开启东西方向指示灯,表示进入了东西时间设置模式 } } else //不是设置东西南北时间的模式 { time_update++; //累加时间10ms data_table[0] = temp_bei / 10; //将倒计时数据缓存到数码管显示数组 data_table[1] = temp_bei % 10; data_table[2] = temp_xi / 10; data_table[3] = temp_xi % 10; } } switch(led_temp) { case 0: SEG_1(0);SEG_2(1);SEG_3(1);SEG_4(1); //打开第一个数码管 Dsg_Display(data_table[0]); //将第一个数送至数码管 break; case 1: SEG_1(1);SEG_2(0);SEG_3(1);SEG_4(1); //打开第二个数码管 Dsg_Display(data_table[1]); //将第二个数送至数码管 break; case 2: SEG_1(1);SEG_2(1);SEG_3(0);SEG_4(1); //打开第三个数码管 Dsg_Display(data_table[2]); //将第三个数送至数码管 break; case 3: SEG_1(1);SEG_2(1);SEG_3(1);SEG_4(0); //打开第四个数码管 Dsg_Display(data_table[3]); //将第四个数送至数码管 break; } led_temp++; if(led_temp == 4) led_temp = 0; HAL_TIM_IRQHandler(&TIM3_Handler); } /** * @brief System Clock Configuration * @retval None **/ 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) { } /** 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) { } PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_ADC; PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSI; PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV2; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) { } } #include "sys.h" ////////////////////////////////////////////////////////////////////////////////// //本程序只供学习使用,未经作者许可,不得用于其它任何用途 //******************************************************************************** //时钟系统配置函数 //PLL:选择的倍频数,RCC_PLL_MUL2~RCC_PLL_MUL16 //返回值:0,成功;1,失败 void Stm32_Clock_Init(u32 PLL) { HAL_StatusTypeDef ret = HAL_OK; RCC_OscInitTypeDef RCC_OscInitStructure; RCC_ClkInitTypeDef RCC_ClkInitStructure; RCC_OscInitStructure.OscillatorType=RCC_OSCILLATORTYPE_HSE; //时钟源为HSE RCC_OscInitStructure.HSEState=RCC_HSE_ON; //打开HSE RCC_OscInitStructure.HSEPredivValue=RCC_HSE_PREDIV_DIV1; //HSE预分频 RCC_OscInitStructure.PLL.PLLState=RCC_PLL_ON; //打开PLL RCC_OscInitStructure.PLL.PLLSource=RCC_PLLSOURCE_HSE; //PLL时钟源选择HSE RCC_OscInitStructure.PLL.PLLMUL=PLL; //主PLL倍频因子 ret=HAL_RCC_OscConfig(&RCC_OscInitStructure);//初始化 if(ret!=HAL_OK) while(1); //选中PLL作为系统时钟源并且配置HCLK,PCLK1和PCLK2 RCC_ClkInitStructure.ClockType=(RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2); RCC_ClkInitStructure.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK; //设置系统时钟时钟源为PLL RCC_ClkInitStructure.AHBCLKDivider=RCC_SYSCLK_DIV1; //AHB分频系数为1 RCC_ClkInitStructure.APB1CLKDivider=RCC_HCLK_DIV2; //APB1分频系数为2 RCC_ClkInitStructure.APB2CLKDivider=RCC_HCLK_DIV1; //APB2分频系数为1 ret=HAL_RCC_ClockConfig(&RCC_ClkInitStructure,FLASH_LATENCY_2); //同时设置FLASH延时周期为2WS,也就是3个CPU周期。 if(ret!=HAL_OK) while(1); } #ifdef USE_FULL_ASSERT //当编译提示出错的时候此函数用来报告错误的文件和所在行 //file:指向源文件 //line:指向在文件中的行数 void assert_failed(uint8_t* file, uint32_t line) { while (1) { } } #endif //THUMB指令不支持汇编内联 //采用如下方法实现执行汇编指令WFI void WFI_SET(void) { __ASM volatile("wfi"); } //关闭所有中断 void INTX_DISABLE(void) { __ASM volatile("cpsid i"); } //开启所有中断 void INTX_ENABLE(void) { __ASM volatile("cpsie i"); } //设置栈顶地址 //addr:栈顶地址 __asm void MSR_MSP(u32 addr) { MSR MSP, r0 //set Main Stack value BX r14 } /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

硬件设计

使用元器件:

单片机:STM32F103;

添加图片注释,不超过 140 字(可选)

设计资料

01仿真图

本设计使用proteus8.9版本设计!具体如图!

添加图片注释,不超过 140 字(可选)

02程序

本设计使用Keil5 MDK版本编程设计!具体如图!

添加图片注释,不超过 140 字(可选)

03设计报告

五千字设计报告,具体如下!

添加图片注释,不超过 140 字(可选)

04设计资料

全部资料包括程序(含注释)、仿真源文件 、设计报告等。具体内容如下,全网最全! !

添加图片注释,不超过 140 字(可选)

点赞分享一起学习成长。

http://www.jsqmd.com/news/697958/

相关文章:

  • 5G基站、智能电网都在用!图解PTP(IEEE1588)协议如何成为工业互联网的‘心跳’
  • SAP ABAP新手必看:手把手教你用Flight模型(SCARR/SPFLI/SFLIGHT)快速生成测试数据
  • 运放电路自激振荡了?试试这3种补偿方法(附RC参数估算与仿真对比)
  • 总结内蒙古地区口碑好的板式办公沙发,河北鑫麓都家具多少钱? - 工业设备
  • FFmpeg开发笔记(二十七)Ubuntu环境部署ZLMediaKit实现多协议直播推流
  • 【仅限首批内测开发者】VSCode 2026“Context-Aware Completion”功能全解锁:含6类高危误补全拦截规则与自定义意图标记语法
  • 如何高效使用BilibiliDown:5个实用场景解决你的B站视频下载难题
  • 英雄联盟终极自动化工具:如何用LeagueAkari提升你的游戏体验
  • 核心基础-Web服务与代理-Nginx 进阶:location 匹配、反向代理、缓存、Rewrite 规则
  • std::string vs std::string_view
  • 从JDK8到21:SpringBoot核心组件适配实战与性能优化
  • Proteus仿真玩转51单片机:用光敏电阻和LCD1602模拟智能光照检测系统(含AD21原理图解析)
  • Z-Image-LM权重验证工具实操:LM系列在中英文混合提示词下表现对比
  • 2026年内蒙古5公分黄锈石地铺石、市政中国黑地铺石哪家口碑好 - myqiye
  • 保姆级教程:在Ubuntu 20.04 + ROS Noetic上从零编译运行LIO-SAM(含GTSAM 4.0.2避坑指南)
  • C04-【Excel实战】差旅费用报销管理:从日期处理到多维度分析报告
  • 2026架构前瞻:从文本生成到跨端操作,移动端agnet执行体的底层范式转移
  • Elasticsearch 底层存储与写入链路:从 Segment 到 Merge,一篇搞懂
  • 终极开源游戏启动器:Starward的完整使用指南与高效技巧
  • 解读2026年中古风咖啡厅预算,宜昌靠谱装修服务有哪些 - 工业品牌热点
  • 揭秘Home Assistant本地控制架构:突破云端依赖的美的智能家电技术实现
  • 从限购到畅通:GLM-5.1 Coding Plan接入攻略
  • 把 BigQuery 接进 SAP HANA Cloud,Google BigQuery Remote Source 的实战思路与落地细节
  • 从0到1掌握TMDB:API Key、Session_ID、Account_ID获取指南(含一键获取脚本,调用源码和SDK)
  • 5分钟掌握网站离线下载:Python网站下载器实用指南
  • 总结2026年宜昌意式风格建筑排名,意式风格地毯选购攻略 - mypinpai
  • B站视频下载终极指南:用BilibiliDown三步搞定离线观看
  • 5个技巧快速掌握AKShare:Python金融数据获取终极指南
  • 保姆级教程:用CS5266+MA8621芯片组,从零设计一个Type-C七合一拓展坞(附PCB/原理图)
  • 别再扔了!手把手教你用美工刀和砂纸复活严重氧化的烙铁头(附日常保养技巧)