基于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) //mode0表示进入南北通行模式(南北绿灯南北黄灯) { 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//mode0表示进入东西通行模式(东西绿灯东西黄灯) { 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_mode1){ LED_NBR_ON();LED_NBY_ON();LED_NBG_ON(); //开启南北方向指示灯表示进入了南北时间设置模式 LED_DXR_OF();LED_DXY_OF();LED_DXG_OF(); }else if(set_mode2){ 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.OscillatorTypeRCC_OSCILLATORTYPE_HSE; //时钟源为HSE RCC_OscInitStructure.HSEStateRCC_HSE_ON; //打开HSE RCC_OscInitStructure.HSEPredivValueRCC_HSE_PREDIV_DIV1; //HSE预分频 RCC_OscInitStructure.PLL.PLLStateRCC_PLL_ON; //打开PLL RCC_OscInitStructure.PLL.PLLSourceRCC_PLLSOURCE_HSE; //PLL时钟源选择HSE RCC_OscInitStructure.PLL.PLLMULPLL; //主PLL倍频因子 retHAL_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.SYSCLKSourceRCC_SYSCLKSOURCE_PLLCLK; //设置系统时钟时钟源为PLL RCC_ClkInitStructure.AHBCLKDividerRCC_SYSCLK_DIV1; //AHB分频系数为1 RCC_ClkInitStructure.APB1CLKDividerRCC_HCLK_DIV2; //APB1分频系数为2 RCC_ClkInitStructure.APB2CLKDividerRCC_HCLK_DIV1; //APB2分频系数为1 retHAL_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 字可选点赞分享一起学习成长。