当前位置:实例文章 » 其他实例» [文章]STM32 Proteus仿真可设置时间红绿灯-0075

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软件来模拟这个系统,并且实现了红绿灯控制器、定时器配置和时间设置功能。

其他信息

其他资源

Top