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

