基于STM32的甲醛浓度检测报警设计
基于STM32的甲醛浓度报警仿真程序功能介绍具体功能1.滑动变阻器模拟甲醛浓度检测2.单片机处理在LCD1602上显示检测的甲醛浓度和上限值3.单片机也通过串口显示检测到的甲醛浓度和上限值4.若甲醛浓度超过设定上限蜂鸣器报警5.甲醛浓度上限可通过按键调整添加图片注释不超过 140 字可选程序/* USER CODE BEGIN Header */ /** ****************************************************************************** * file : main.c * brief : Main program body ****************************************************************************** * attention * * Copyright (c) 2022 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include main.h #include adc.h #include tim.h #include usart.h #include gpio.h /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include lcd1602.h #include stdio.h /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ uint16_t Tim_cnt 0; //定时器变量 uint8_t set_flag 0; float warming_val0.10; /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ /** * brief The application entry point. * retval int */ int main(void) { /* USER CODE BEGIN 1 */ ADC_ChannelConfTypeDef sConfig {0}; //建立sConfig结构体 char str[20]; //字符串的存放数组 uint32_t adcv; //存放ADC转换结果 float temp; set_flag 0; /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ sConfig.Rank ADC_REGULAR_RANK_1; sConfig.SamplingTime ADC_SAMPLETIME_1CYCLE_5; //采样周期为1.5个周期 /* 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(); MX_ADC1_Init(); MX_USART1_UART_Init(); MX_TIM3_Init(); /* USER CODE BEGIN 2 */ LCD_Init(); //初始化LCD1602 HAL_TIM_Base_Start_IT(htim3);//开启定时器3 // LCD_ShowString(0,0,dis_str); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { sConfig.Channel ADC_CHANNEL_1; //选择通道1 HAL_ADC_ConfigChannel(hadc1, sConfig); //选择ADC1的通道道1 HAL_ADC_Start(hadc1); //启动ADC1 HAL_ADC_PollForConversion(hadc1, 10); //等待ADC1转换结束超时设定为10ms adcv HAL_ADC_GetValue(hadc1); //读取ADC1的转换结果 temp(float)adcv*(1.0/4095); sprintf(str,%4.3fmg/m3,temp); LCD_ShowString(0,0,MV:); LCD_ShowString(0,4,str); HAL_UART_Transmit(huart1, (uint8_t *)MV, 3, 10); //串口1发送字符串数组长度为12超时10ms HAL_UART_Transmit(huart1, (uint8_t *)str, 10, 10); //串口1发送字符串数组长度为5超时10ms HAL_UART_Transmit(huart1, (uint8_t *)\n\r, 2, 10); //串口1发送字符串数组长度为2超时10ms if(set_flag){//设置模式 sprintf(str,%4.3fmg/m3^ ,warming_val); LCD_ShowString(1,0,ALM:); LCD_ShowString(1,4,str); }else{ sprintf(str,%4.3fmg/m3 ,warming_val); LCD_ShowString(1,0,ALM:); LCD_ShowString(1,4,str); } HAL_UART_Transmit(huart1, (uint8_t *)ALM, 4, 10); //串口1发送字符串数组长度为12超时10ms HAL_UART_Transmit(huart1, (uint8_t *)str, 10, 10); //串口1发送字符串数组长度为5超时10ms HAL_UART_Transmit(huart1, (uint8_t *)\n\r, 2, 10); //串口1发送字符串数组长度为2超时10ms if(tempwarming_val!set_flag){//如果超过报警值 HAL_GPIO_WritePin(GPIOA,BEEP_Pin, GPIO_PIN_RESET);//BEEP引脚拉低 }else{ HAL_GPIO_WritePin(GPIOA,BEEP_Pin, GPIO_PIN_SET); } HAL_ADC_Stop(hadc1); //停止ADC1 HAL_Delay(300); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } /** * 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 RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ 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 buses 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(); } PeriphClkInit.PeriphClockSelection RCC_PERIPHCLK_ADC; PeriphClkInit.AdcClockSelection RCC_ADCPCLK2_DIV2; if (HAL_RCCEx_PeriphCLKConfig(PeriphClkInit) ! HAL_OK) { Error_Handler(); } } /* USER CODE BEGIN 4 */ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim-Instance htim3.Instance) { Tim_cnt; if(Tim_cnt5) //2.5ms进一次 { Tim_cnt0; //请 HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin); } } } //中断处理 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { UNUSED(GPIO_Pin); if(GPIO_Pin KEY1_Pin) //测到EXTI0线产生外部中断事件 { if(set_flag){ set_flag 0; }else{ set_flag 1; } } else if(GPIO_Pin KEY2_Pin) //测到EXTI1线产生外部中断事件 { if(set_flag){ if(warming_val0.9){ warming_val0.01; } } } else if(GPIO_Pin KEY3_Pin) //测到EXTI2线产生外部中断事件 { if(set_flag){ if(warming_val0){ warming_val-0.01; } } } } /* USER CODE END 4 */ /** * brief This function is executed in case of error occurrence. * retval None */ void Error_Handler(void) { /* USER CODE BEGIN Error_Handler_Debug */ /* User can add his own implementation to report the HAL error return state */ __disable_irq(); while (1) { } /* USER CODE END Error_Handler_Debug */ } #ifdef USE_FULL_ASSERT /** * brief Reports the name of the source file and the source line number * where the assert_param error has occurred. * param file: pointer to the source file name * param line: assert_param error line source number * retval None */ void assert_failed(uint8_t *file, uint32_t line) { /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name and line number, ex: printf(Wrong parameters value: file %s on line %d\r\n, file, line) */ /* USER CODE END 6 */ } #endif /* USE_FULL_ASSERT */ /* USER CODE BEGIN Header */ /** ****************************************************************************** * file adc.c * brief This file provides code for the configuration * of the ADC instances. ****************************************************************************** * attention * * Copyright (c) 2022 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include adc.h /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ ADC_HandleTypeDef hadc1; /* ADC1 init function */ void MX_ADC1_Init(void) { /* USER CODE BEGIN ADC1_Init 0 */ /* USER CODE END ADC1_Init 0 */ ADC_ChannelConfTypeDef sConfig {0}; /* USER CODE BEGIN ADC1_Init 1 */ /* USER CODE END ADC1_Init 1 */ /** Common config */ hadc1.Instance ADC1; hadc1.Init.ScanConvMode ADC_SCAN_DISABLE; hadc1.Init.ContinuousConvMode DISABLE; hadc1.Init.DiscontinuousConvMode DISABLE; hadc1.Init.ExternalTrigConv ADC_SOFTWARE_START; hadc1.Init.DataAlign ADC_DATAALIGN_RIGHT; hadc1.Init.NbrOfConversion 1; if (HAL_ADC_Init(hadc1) ! HAL_OK) { Error_Handler(); } /** Configure Regular Channel */ sConfig.Channel ADC_CHANNEL_1; sConfig.Rank ADC_REGULAR_RANK_1; sConfig.SamplingTime ADC_SAMPLETIME_1CYCLE_5; if (HAL_ADC_ConfigChannel(hadc1, sConfig) ! HAL_OK) { Error_Handler(); } /* USER CODE BEGIN ADC1_Init 2 */ /* USER CODE END ADC1_Init 2 */ } void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle) { GPIO_InitTypeDef GPIO_InitStruct {0}; if(adcHandle-InstanceADC1) { /* USER CODE BEGIN ADC1_MspInit 0 */ /* USER CODE END ADC1_MspInit 0 */ /* ADC1 clock enable */ __HAL_RCC_ADC1_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); /**ADC1 GPIO Configuration PA1 ------ ADC1_IN1 */ GPIO_InitStruct.Pin GPIO_PIN_1; GPIO_InitStruct.Mode GPIO_MODE_ANALOG; HAL_GPIO_Init(GPIOA, GPIO_InitStruct); /* ADC1 interrupt Init */ HAL_NVIC_SetPriority(ADC1_2_IRQn, 0, 0); HAL_NVIC_EnableIRQ(ADC1_2_IRQn); /* USER CODE BEGIN ADC1_MspInit 1 */ /* USER CODE END ADC1_MspInit 1 */ } } ******//完整资料 ******//微信公众号木子单片机 void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle) { if(adcHandle-InstanceADC1) { /* USER CODE BEGIN ADC1_MspDeInit 0 */ /* USER CODE END ADC1_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_ADC1_CLK_DISABLE(); /**ADC1 GPIO Configuration PA1 ------ ADC1_IN1 */ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_1); /* ADC1 interrupt Deinit */ HAL_NVIC_DisableIRQ(ADC1_2_IRQn); /* USER CODE BEGIN ADC1_MspDeInit 1 */ /* USER CODE END ADC1_MspDeInit 1 */ } } /* USER CODE BEGIN 1 */ /* USER CODE END 1 */硬件设计使用元器件单片机STM32F103添加图片注释不超过 140 字可选设计资料01仿真图本设计使用proteus8.9版本设计具体如图添加图片注释不超过 140 字可选02程序本设计使用软件keil5版本编程设计具体如图添加图片注释不超过 140 字可选03设计资料全部资料包括程序、仿真源文件等。具体内容如下全网最全!!添加图片注释不超过 140 字可选点赞分享一起学习成长。