基于STM32的酒精浓度检测报警防酒驾仿真设计(仿真+程序+讲解)
仿真图proteus 8.9
程序编译器:keil 5
编程语言:C语言
设计编号:C0082
基于STM32的酒精浓度检测报警防酒驾proteus仿真设计(仿真+程序+讲解)
功能说明:
1、以STM32单片机和MQ-3为控制核心设计酒精浓度检测报警设计;
2、通过液晶屏LCD1602和串口上位机显示酒精浓度;
3、可以通过按键设置酒精浓度报警值大小。
4、监测酒精浓度大于报警值时蜂鸣器报警电路导通,蜂鸣器报警。
5、默认监测到酒精浓度高于20mg/100ml蜂鸣器报警。
主要硬件设备:STM32F103单片机
以下为本设计资料展示:
整体设计方案
本实验利用STM32单片机的ADC、GPIO、定时器等资源,将软、硬件有机地结合起来,使得系统能够正确地进识别输入模拟酒精传感器的AD值,LCD1602能够正确地显示,蜂鸣器根据气体浓度报警值工作。需注意的是,proteus是没有MQ-3等酒精浓度传感器的,本设计使用滑动变阻器模拟酒精浓度变化,不能直接用于实物设计,有需要的需跟据实物调试。
本实验旨在利用STM32单片机的模拟数字转换器(ADC)、通用输入/输出(GPIO)和定时器等资源,将软件和硬件有机地结合在一起,以实现对输入模拟酒精传感器的AD值进行正确的识别,并通过LCD1602显示器显示出来。此外,系统还配备了蜂鸣器,可以根据预设的气体浓度报警值进行工作。
在这个实验中,需要注意的是,Proteus仿真软件中并没有MQ-3等常见的酒精浓度传感器。因此,为了模拟酒精浓度的变化,我们使用了滑动变阻器来代替。这并不意味着这个设计可以直接应用于实际硬件,如果需要进行实物设计,需要根据实际情况进行调试和修改。
在整个实验过程中,我们不仅对STM32单片机的各种资源进行了深入的利用和调试,同时也对软件编程和硬件电路设计进行了全面的理解和实践。通过这个实验,我们进一步了解了STM32单片机在物联网应用中的重要地位,以及如何有效地将软件和硬件结合在一起,实现系统的智能化和自动化。
本测试如下所示:
仿真运行情况:
开始仿真后LCD1602实时显示检测到的酒精浓度,可以通过滑动变阻器改变测量值。可通过按键设置报警值浓度,按下设置键进入设置模式,通过设置+调高报警值,通过设置-调低报警值。蜂鸣器报警电路在酒精浓度高于报警值时启动,有嘟嘟报警声,低于不启动。
下图检测到气体浓度是3mg/100mL,低于报警值20mg/100mL,蜂鸣器电路不工作。
下图检测到酒精浓度是23mg/100mL,大于等于报警值,三极管导通,蜂鸣器报警
仿真过程中可通过按键设置酒精浓度报警值。
程序是用keil5 mdk版本打开的,如果打开有问题,核实下keil的版本。程序是HAL库版本编写的,有注释可以结合讲解视频理解。
mian函数
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*(3.3/4095)*100;
sprintf(str,"%4.0fmg/100ml",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, 12, 10); //串口1发送字符串,数组长度为5,超时10ms
HAL_UART_Transmit(&huart1, (uint8_t *)&"\n\r", 2, 10); //串口1发送字符串,数组长度为2,超时10ms
if(set_flag){//设置模式
sprintf(str,"^%3.0fmg/100ml",warming_val);
LCD_ShowString(1,0,"ALM:");
LCD_ShowString(1,4,str);
}else{
sprintf(str,"%4.0fmg/100ml",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, 12, 12); //串口1发送字符串,数组长度为5,超时10ms
HAL_UART_Transmit(&huart1, (uint8_t *)&"\n\r", 2, 10); //串口1发送字符串,数组长度为2,超时10ms
if(temp>warming_val){//如果超过报警值
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 */
}
0、常见使用问题及解决方法–必读!!!!
1、程序代码
2、Proteus仿真
3、功能要求
4、讲解视频
5、MQ-3传感器说明
Altium Designer 软件资料
KEIL软件资料
Proteus软件资料
单片机学习资料
答辩技巧
设计报告常用描述
鼠标双击打开查找更多51 STM32单片机课程毕业设计.url
资料下载链接