proteus仿真 基于stm32模拟交通灯

  • 设计思路

本实验采用stm32f103r6为主控芯片,及led-red、led-yellow、led-green;时钟源为晶振为8M的系统内部时钟;

  • 实现效果

绿灯先亮4秒,再一秒为快闪(亮暗各0.1秒,闪烁5次),然后黄灯亮2秒,绿灯黄灯亮闪期间,对方红灯保持亮状态(共7秒)然后对方绿灯黄灯重复上述过程,交替不断。

  • 环境

操作系统: Window10 专业版
使用软件:Keil uVision5、Proteus 8
开发语言:C语言

  • 电路设计
  • 在这里插入图片描述
  • 软件设计
/***   时钟配置    ***/
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};  
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};   
  /** Initializes the CPU, AHB and APB busses clocks   */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;  
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;  
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; 
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;  
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
    {
       Error_Handler();
    }  
   /** 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_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) 
    {    
       Error_Handler();  
    }
}
/***   GPIO初始化    ***/
void MX_GPIO_Init(void)
{
   GPIO_InitTypeDef GPIO_InitStruct = {0};   
   /* GPIO Ports Clock Enable */ 
   __HAL_RCC_GPIOB_CLK_ENABLE();   
   /*Configure GPIO pin Output Level */  
   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5, GPIO_PIN_SET);
   /*Configure GPIO pins : PB0 PB1 PB2 PB3 PB4 */  
   GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4;
   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
   GPIO_InitStruct.Pull = GPIO_PULLUP;
   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;  
   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);  
   /*Configure GPIO pin : PB5 */  
   GPIO_InitStruct.Pin = GPIO_PIN_5;  
   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;  
   GPIO_InitStruct.Pull = GPIO_PULLUP; 
   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;  
   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
/***  主函数    ***/
int main(void)
{
  /* USER CODE BEGIN 1 */ 
  /* USER CODE END 1 */
  /* MCU Configuration--------------------------------------------------------*/   
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */  
  HAL_Init();   
  /* USER CODE BEGIN Init */   
  /* USER CODE END Init */   
  /* Configure the system clock */  
  SystemClock_Config();  
  /* USER CODE BEGIN SysInit */   
  /* USER CODE END SysInit */   
  /* Initialize all configured peripherals */  
  MX_GPIO_Init();  
  /* USER CODE BEGIN 2 */   
  /* USER CODE END 2 */   
  /* Infinite loop */  
  /* USER CODE BEGIN WHILE */  
  while (1)
    {
        /* USER CODE END WHILE */    
        /* USER CODE BEGIN 3 */	  
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET);	  
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);//红灯	  	 
        
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);	  
        HAL_Delay(4000); 	  
        int i = 10;	  
        while(i--)	 
        {		
           HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0);	
           HAL_Delay(100);	  
        }	  
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);//绿灯
        
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);	  
        HAL_Delay(2000);	  
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);//黄灯
        	  
        //另一方向开始重复	
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);	  
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);//红灯
        	  	  
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);	  
        HAL_Delay(4000); 	  
        int j = 10;	  
        while(j--)	  
        {		
           HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_3);		
           HAL_Delay(100);	
        }	 
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET);//绿灯	  	  
        
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_RESET);	  
        HAL_Delay(2000);	  
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET);//黄灯	  	    
     }  
   /* USER CODE END 3 */
} 

猜你喜欢

转载自blog.csdn.net/weixin_45323971/article/details/107488079