基于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; //倒计时全显示0000data_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++; //累加时间10msdata_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;    	//时钟源为HSERCC_OscInitStructure.HSEState=RCC_HSE_ON;                      	//打开HSERCC_OscInitStructure.HSEPredivValue=RCC_HSE_PREDIV_DIV1;		//HSE预分频RCC_OscInitStructure.PLL.PLLState=RCC_PLL_ON;					//打开PLLRCC_OscInitStructure.PLL.PLLSource=RCC_PLLSOURCE_HSE;			//PLL时钟源选择HSERCC_OscInitStructure.PLL.PLLMUL=PLL; 							//主PLL倍频因子ret=HAL_RCC_OscConfig(&RCC_OscInitStructure);//初始化if(ret!=HAL_OK) while(1);//选中PLL作为系统时钟源并且配置HCLK,PCLK1和PCLK2RCC_ClkInitStructure.ClockType=(RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2);RCC_ClkInitStructure.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK;		//设置系统时钟时钟源为PLLRCC_ClkInitStructure.AHBCLKDivider=RCC_SYSCLK_DIV1;				//AHB分频系数为1RCC_ClkInitStructure.APB1CLKDivider=RCC_HCLK_DIV2; 				//APB1分频系数为2RCC_ClkInitStructure.APB2CLKDivider=RCC_HCLK_DIV1; 				//APB2分频系数为1ret=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 valueBX r14
}/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

硬件设计

使用元器件:

单片机:STM32F103;

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

设计资料

01仿真图

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

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

02程序

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

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

03设计报告

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

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

04设计资料

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

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

点赞分享一起学习成长。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/95788.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/95788.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

汽车软件研发智能化:AI在CI/CD中的实践

当汽车行业加速驶入“软件定义”的时代&#xff0c;软件已成为决定车辆竞争力的核心要素。从智能座舱的多场景交互到自动驾驶的复杂决策逻辑&#xff0c;汽车软件的代码量逐年递增&#xff0c;复杂度呈指数级攀升&#xff0c;传统研发流程深陷困境&#xff1a;代码质量管控滞后…

DeepSeek:开启智能体驱动对话式数据分析新时代

在数字化浪潮汹涌澎湃的当下,数据已然成为驱动企业发展、推动科学研究以及优化日常生活决策的关键力量。数据分析,作为从海量数据中提取有价值信息、洞察趋势、挖掘规律的核心手段,其重要性不言而喻。无论是企业精准把握市场动态、优化运营流程,还是科研人员探索未知领域、…

MCP驱动企业微信智能中枢:企业级机器人服务构建全攻略

一、背景与目标 公司规模200-300人&#xff0c;主要使用企业微信作为内部沟通平台。日常面临大量重复性通知工作&#xff0c;如会议提醒、系统维护通知、项目进度更新等。 业务痛点&#xff1a; 人工发送通知效率低下&#xff0c;平均3分钟/条重要信息传递不及时&#xff0c…

语音识别系统的技术核心:从声音到文字的智能转换

语音识别技术&#xff0c;也称为自动语音识别&#xff08;ASR&#xff09;&#xff0c;其核心目标是将人类语音信号转换为对应的文本或指令。随着人工智能的发展&#xff0c;语音识别已成为智能助手、实时翻译、车载系统等领域的关键技术。其工作原理可分解为信号处理、特征提取…

《用 Django 构建博客应用:从模型设计到文章管理的全流程实战》

《用 Django 构建博客应用:从模型设计到文章管理的全流程实战》 一、引言:为什么选择 Django 构建博客系统? 在 Python 的 Web 框架中,Django 被誉为“全能型选手”。它不仅提供了强大的 ORM、模板系统、认证机制和后台管理,还鼓励开发者遵循“DRY”(Don’t Repeat You…

以 R1 为视角,手把手教你画 OSPF 最短路径树与推导路由表

视频版讲解>>>>>>>>>>>>>>>>>>>OSPF最短路径树构建与路由计算练习&#xff08;一&#xff09; 在 OSPF 协议的学习中&#xff0c;“纸上谈兵” 不如 “实战推演”—— 尤其是以特定路由器为主视角&#xff0c;从 LS…

axios请求缓存与重复拦截:“相同请求未完成时,不发起新请求”

import axios from "axios";// 1. 缓存已完成的请求结果&#xff08;key&#xff1a;请求URL参数&#xff0c;value&#xff1a;数据&#xff09; const requestCache new Map(); // 2. 记录正在执行的请求&#xff08;避免并行重复请求&#xff09; const pendingR…

k8s的SidecarSet配置和initContainers

目录引言一、k8s如何实现Sidecar这段配置正确吗&#xff1f;正确的配置方式为什么这样做&#xff1f;一个简单的例子总结二、什么是SidecarSet主要功能使用场景示例配置三、也可以通过 initContainers 的 restartPolicy 实现边车逻辑四、题外话&#xff1a;什么是InitContainer…

PostgreSQL与SQL Server:为什么 PostgreSQL遥遥领先

PostgreSQL与SQL Server:为什么 PostgreSQL遥遥领先 在数据库领域&#xff0c;PostgreSQL 和 Microsoft SQL Server 长期以来一直是竞争对手。然而&#xff0c;近年来&#xff0c;PostgreSQL 以其性能、灵活性和创新功能让 SQL Server 望尘莫及。以下是对 PostgreSQL 明显优越的…

零跑汽车8月交付57066台,同比增长超88%

零跑汽车官宣&#xff0c;在刚刚过去的8月份&#xff0c;品牌交付57066辆&#xff0c;同比增长超88%再创历史新高&#xff0c;并实现了连续6个月稳坐新势力销冠。目前&#xff0c;零跑旗下共有T03、B10、B01、C01、C10、C11、C16等七款车型在售&#xff0c;得益于零跑坚持全栈自…

DNS地址推荐

DNS地址推荐&#xff08;2025年最新整理&#xff09; 以下DNS服务器按使用场景分类&#xff0c;涵盖国内、国际、安全隐私、游戏优化等需求&#xff0c;均为2025年仍在维护的公共DNS服务&#xff1a; 一、国内通用DNS&#xff08;适合中国大陆用户&#xff09; 国内DNS服务器对…

兴趣电商内容数据洞察未来市场走向研究——基于开源AI智能名片链动2+1模式S2B2C商城小程序的实践

摘要&#xff1a;在互联网电商数据高度透明的当下&#xff0c;“已发生”的品类规模和品类增速数据虽易获取&#xff0c;但主要反映市场历史状况&#xff0c;难以预测未来走向。兴趣电商的内容数据因揭示消费者“新需求”和“潜在需求”&#xff0c;在宏观层面更早体现用户消费…

【已更新文章+代码】2025数学建模国赛A题思路代码文章高教社杯全国大学生数学建模-烟幕干扰弹的投放策略

截止周四晚上11点已更新五个问题完整建模和问题一二的代码 截止周五早上完整版已更新 可以看主页最新博文获取 完整内容请看文末最后的推广群2.1问题1的分析 问题1是典型的确定性时空几何与运动学计算问题&#xff0c;核心在于通过建立坐标系下的参数方程&#xff0c;量化烟幕云…

UE4 Rider如何直接调试PC DebugGame

背景1、用UBT 打了一个exe的包&#xff0c;打开时遇到崩溃&#xff0c;想获知这个崩溃时的中间信息&#xff0c;例如材质信息&#xff0c;于是我直接双击 打包位置下的崩溃dmp文件 &#xff08;MyGame/Saved/Archived/WindowsClient/MyGame/Saved/Crashes/....dmp&#xff09; …

【FastDDS】Layer DDS之Domain ( 06-Partitions )

在DDS(Data Distribution Service,数据分发服务)中,Partition(分区) 是一种在“域(Domain)”提供的物理隔离基础上,为发布者(Publisher)和订阅者(Subscriber)新增的逻辑隔离与通信筛选机制。它的核心作用是在“域”和“主题(Topic)”之外,进一步精细化控制哪些…

FastVLM:高效视觉编码助力视觉语言模型突破高分辨率效率瓶颈

想要掌握如何将大模型的力量发挥到极致吗&#xff1f;叶梓老师带您深入了解 Llama Factory —— 一款革命性的大模型微调工具。 1小时实战课程&#xff0c;您将学习到如何轻松上手并有效利用 Llama Factory 来微调您的模型&#xff0c;以发挥其最大潜力。 CSDN教学平台录播地址…

【HarmonyOS】一步解决弹框集成-快速弹框QuickDialog使用详解

【HarmonyOS】一步解决弹框集成-快速弹框QuickDialog使用详解 一、集成的应用背景介绍 最近比较忙&#xff0c;除了工作节奏调整&#xff0c;有重点项目需要跟。业务时间&#xff0c;也因为参加了25年创新大赛&#xff0c;我们网友&#xff0c;组成了鸿蒙超新星研发团队&#x…

当公司在你电脑上安装了IP-guard,你必须知道的事

保护公司机密的同时&#xff0c;你的隐私权何在&#xff1f;在现代企业中&#xff0c;为了保护敏感数据和知识产权&#xff0c;很多公司会选择在员工电脑上安装监控软件&#xff0c;IP-guard 就是其中常见的一款。如果你发现公司电脑安装了IP-guard&#xff0c;以下几点是你需要…

拆分TypeScript项目的学习收获:避免缓存问题,peerDependencies,引用本地项目

最近需要将工作中的一个TS包拆出一部分代码&#xff0c;以便在多个团队和项目中共享。原以为这会是一项特别简单的工作&#xff0c;但是也花了两天才大致拆成功。因此记录一下&#xff0c;也给有类似需求的同学一点经验。 所拆项目的大致功能&#xff1a;整个项目的结构大致分为…

无人机各种接头焊接方法

无人机接头的焊接直接关系到设备可靠性和飞行安全&#xff0c;以下是常见接头的焊接方法及注意事项&#xff1a;一、焊接通用原则工具准备恒温焊台&#xff08;推荐温度&#xff1a;$350 \pm 20^{\circ}\text{C}$&#xff09;含松芯焊锡丝&#xff08;直径0.8mm&#xff09;助焊…