STM32 Proteus仿真可设置时间红绿灯-0075
发布人:shili8
发布时间:2024-11-16 23:01
阅读次数:0
**STM32 Proteus仿真可设置时间红绿灯**
在本文中,我们将使用Proteus软件来模拟一个基于STM32的时间红绿灯系统。我们将实现一个简单的红绿灯控制器,能够根据设定的时间表自动切换红绿灯。
**硬件配置**
为了实现这个项目,我们需要以下硬件:
*1块 STM32F103C8T6微控制器*2个LED(代表红绿灯)
*1个按键(用于设置时间)
**软件配置**
我们将使用Proteus软件来模拟这个系统。首先,我们需要创建一个新项目,选择STM32F103C8T6微控制器作为主板。
**时钟和定时器**
在本例中,我们将使用内部时钟(HCLK)作为系统时钟。我们还将使用TIM2定时器来实现红绿灯的自动切换。
c// 时钟配置void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStructTypeDef; // 初始化RCC RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM =1; RCC_OscInitStruct.PLL.PLLN =10; RCC_OscInitStruct.PLL.PLLP =2; RCC_OscInitStruct.PLL.PLLQ =4; if (RCC_OscInitStruct.PowerOnState == RCC_PWRON_STATE_ON) { RCC_OscInitStruct.BypassMode = RCC_BYPASS_NONE; RCC_OscInitStruct.ClockType = RCC_CLOCKTYPE_HSE; RCC_OscInitStruct.AdcDiv = RCC_ADCDIV_DIV1; RCC_OscInitStruct.UsbWPVPolarity = RCC_USBWPVPOLARITY_HIGH; if (RCC_OscInitStruct.PowerOnState == RCC_PWRON_STATE_ON) { __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(RCC_PWR_MODE_NORMAL); __HAL_PWR_VOLTAGESCALING_CONFIG(RCC_PWR_MODE_NORMAL); __HAL_RCC_PWR_CLK_DISABLE(); } } // 初始化时钟 RCC_ClkInitStructTypeDef.ClockType = RCC_CLOCKTYPE_HSE; RCC_ClkInitStructTypeDef.ClockSource = RCC_CLOCKSOURCE_HSE; RCC_ClkInitStructTypeDef.ClockDiv = RCC_CLOCKDIV_DIV1; RCC_ClkInitStructTypeDef.ClockPolarity = RCC_CLOCKPOLARITY_HIGH; if (RCC_ClkInitStructTypeDef.ClockType == RCC_CLOCKTYPE_HSE) { __HAL_RCC_HSE_CLK_ENABLE(); __HAL_RCC_HSE_CLK_DISABLE(); } } // 定时器配置void TIM2_Config(void) { // 初始化TIM2 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; TIM_OCInitTypeDef TIM_OCInitStruct; // 时钟配置 TIM_TimeBaseInitStruct.TIM_Prescaler =0x0000; TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_COUNTERMODE_UP; TIM_TimeBaseInitStruct.TIM_Period =65535; TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CLOCKDIVISION_DIV1; TIM_TimeBaseInitStruct.TIM_RepetitionCounter =0x0000; // 初始化TIM2 if (TIM_TimeBaseInitStruct.TIM_Prescaler ==0x0000) { __HAL_RCC_TIM2_CLK_ENABLE(); HAL_TIM_Base_Init(&TIM_TimeBaseInitStruct); HAL_TIM_OC_Init(&TIM_OCInitStruct, TIM_CHANNEL_1); HAL_TIM_OC_Init(&TIM_OCInitStruct, TIM_CHANNEL_2); HAL_TIM_OC_Init(&TIM_OCInitStruct, TIM_CHANNEL_3); HAL_TIM_OC_Init(&TIM_OCInitStruct, TIM_CHANNEL_4); } }
**红绿灯控制**
在本例中,我们将使用两个LED来表示红绿灯。我们还将使用一个按键来设置时间。
c// 红绿灯控制函数void RedGreenLight_Control(void) { // 初始化LED GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; // 初始化按键 GPIO_InitStruct.Pin = GPIO_PIN_2; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; // 初始化LED HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0 | GPIO_PIN_1, GPIO_PIN_RESET); // 初始化按键 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); } // 红绿灯切换函数void RedGreenLight_Switch(void) { // 切换LED if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); } else { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); } }
**时间设置**
在本例中,我们将使用一个按键来设置时间。
c// 时间设置函数void Time_Setting(void) { // 初始化按键 GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Pin = GPIO_PIN_2; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; // 初始化按键 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); // 等待按键按下 while (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2) == GPIO_PIN_RESET) { // 等待 } // 设置时间 HAL_Delay(1000); }
**总结**
在本文中,我们实现了一个基于STM32的时间红绿灯系统。我们使用Proteus软件来模拟这个系统,并且实现了红绿灯控制器、定时器配置和时间设置功能。