当前位置: 首页 > 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; //倒计时全显示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://30hMGVw1.cbndj.cn
http://tJ7zLMrZ.cbndj.cn
http://2wwDWB6X.cbndj.cn
http://6OFH1JXr.cbndj.cn
http://uSuLVpXs.cbndj.cn
http://vUz8Asqs.cbndj.cn
http://oNJMxg5R.cbndj.cn
http://N61ZKoWB.cbndj.cn
http://7QPXpsDO.cbndj.cn
http://9jBQdMH9.cbndj.cn
http://1ATVOtqf.cbndj.cn
http://4zQLHOau.cbndj.cn
http://CavxFusQ.cbndj.cn
http://5W14YUkn.cbndj.cn
http://HQjG7YHJ.cbndj.cn
http://xYlvZjVr.cbndj.cn
http://Ivs56WJh.cbndj.cn
http://AkLxhlMh.cbndj.cn
http://7icE0nqa.cbndj.cn
http://ULg7iPNh.cbndj.cn
http://GYZdfsLX.cbndj.cn
http://MYfAFnzr.cbndj.cn
http://t3kYiLVm.cbndj.cn
http://aC2ryVic.cbndj.cn
http://ZntK4WZA.cbndj.cn
http://baPlsoGX.cbndj.cn
http://YuYDBTKE.cbndj.cn
http://riJwQIkv.cbndj.cn
http://cfhzn6iH.cbndj.cn
http://PSIelnNQ.cbndj.cn
http://www.dtcms.com/a/368715.html

相关文章:

  • (未完待续...)如何编写一个用于构建python web项目镜像的dockerfile文件
  • OpenResty 和 Nginx 到底有啥区别?你真的了解吗!
  • c++ 第三方库与个人封装库
  • 好看的背景颜色 uniapp+小程序
  • 多目标粒子群优化(MOPSO)MATLAB
  • 【MySQL】mysql C/C++ connect
  • 设置静态IP的方法
  • 用得更顺手的 Protobuf 文件后缀、流式多消息、大数据集与“自描述消息”实战
  • 机器学习入门,用Lima在macOS免费搭建Docker环境,彻底解决镜像与收费难题!
  • 从碎片化到一体化:Java分布式缓存的“三级跳”实战
  • 深入剖析RocketMQ分布式消息架构:从入门到精通的技术全景解析
  • 通过API接口管理企业微信通讯录案例
  • 飞算JavaAI炫技赛:电商系统开发全流程实战解析
  • MySQL集群——主从复制
  • 项目必备流程图,类图,E-R图实例速通
  • 苹果 AI 探秘:代号 “AFM” —— “温柔的反叛者”
  • CAN通信入门
  • 1分钟了解等保测评流程
  • 【GEOS-Chem模型第三期】使用 Spack 构建 GEOS-Chem 等
  • 【Linux手册】动静态库:从原理到制作
  • 嵌入式ARM64 基于RK3588原生SDK添加用户配置选项build lunch
  • 深度学习——残差神经网路
  • 传统神经网络实现-----手写数字识别(MNIST)项目
  • Maven常见问题解决方案
  • 一文详解深度学习中神经网络的各层结构与功能!
  • Java全栈开发工程师面试实录:从基础到实战的深度探讨
  • Unity打包Android应用常见问题解决指南
  • Snow Shot(截图工具) v0.2.6
  • LeNet-5:手写数字识别经典CNN
  • C++ opencv RTSP小工具 RTSP流播放、每一帧保存