基于STM32的酒精濃度檢測報警防酒駕仿真設(shè)計(仿真+程序+講解)
仿真圖proteus 8.9
程序編譯器:keil 5
編程語言:C語言
設(shè)計編號:C0082
講解視頻
基于STM32的酒精濃度檢測報警防酒駕proteus仿真設(shè)計(仿真+程序+講解)
1.主要功能
功能說明:
1、以STM32單片機和MQ-3為控制核心設(shè)計酒精濃度檢測報警設(shè)計;
3、可以通過按鍵設(shè)置酒精濃度報警值大小。
4、監(jiān)測酒精濃度大于報警值時蜂鳴器報警電路導通,蜂鳴器報警。
5、默認監(jiān)測到酒精濃度高于20mg/100ml蜂鳴器報警。
以下為本設(shè)計資料展示:
2.仿真
整體設(shè)計方案
本實驗利用STM32單片機的ADC、GPIO、定時器等資源,將軟、硬件有機地結(jié)合起來,使得系統(tǒng)能夠正確地進識別輸入模擬酒精傳感器的AD值,LCD1602能夠正確地顯示,蜂鳴器根據(jù)氣體濃度報警值工作。需注意的是,proteus是沒有MQ-3等酒精濃度傳感器的,本設(shè)計使用滑動變阻器模擬酒精濃度變化,不能直接用于實物設(shè)計,有需要的需跟據(jù)實物調(diào)試。
本實驗旨在利用STM32單片機的模擬數(shù)字轉(zhuǎn)換器(ADC)、通用輸入/輸出(GPIO)和定時器等資源,將軟件和硬件有機地結(jié)合在一起,以實現(xiàn)對輸入模擬酒精傳感器的AD值進行正確的識別,并通過LCD1602顯示器顯示出來。此外,系統(tǒng)還配備了蜂鳴器,可以根據(jù)預設(shè)的氣體濃度報警值進行工作。
在這個實驗中,需要注意的是,Proteus仿真軟件中并沒有MQ-3等常見的酒精濃度傳感器。因此,為了模擬酒精濃度的變化,我們使用了滑動變阻器來代替。這并不意味著這個設(shè)計可以直接應用于實際硬件,如果需要進行實物設(shè)計,需要根據(jù)實際情況進行調(diào)試和修改。
在整個實驗過程中,我們不僅對STM32單片機的各種資源進行了深入的利用和調(diào)試,同時也對軟件編程和硬件電路設(shè)計進行了全面的理解和實踐。通過這個實驗,我們進一步了解了STM32單片機在物聯(lián)網(wǎng)應用中的重要地位,以及如何有效地將軟件和硬件結(jié)合在一起,實現(xiàn)系統(tǒng)的智能化和自動化。
本測試如下所示:
仿真運行情況:
開始仿真后LCD1602實時顯示檢測到的酒精濃度,可以通過滑動變阻器改變測量值??赏ㄟ^按鍵設(shè)置報警值濃度,按下設(shè)置鍵進入設(shè)置模式,通過設(shè)置+調(diào)高報警值,通過設(shè)置-調(diào)低報警值。蜂鳴器報警電路在酒精濃度高于報警值時啟動,有嘟嘟報警聲,低于不啟動。
下圖檢測到氣體濃度是3mg/100mL,低于報警值20mg/100mL,蜂鳴器電路不工作。
下圖檢測到酒精濃度是23mg/100mL,大于等于報警值,三極管導通,蜂鳴器報警
仿真過程中可通過按鍵設(shè)置酒精濃度報警值。
3. 程序
程序是用keil5 mdk版本打開的,如果打開有問題,核實下keil的版本。程序是HAL庫版本編寫的,有注釋可以結(jié)合講解視頻理解。
mian函數(shù)
int main(void)
{
/* USER CODE BEGIN 1 */
ADC_ChannelConfTypeDef sConfig = {0}; //建立sConfig結(jié)構(gòu)體
char str[20]; //字符串的存放數(shù)組
uint32_t adcv; //存放ADC轉(zhuǎn)換結(jié)果
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轉(zhuǎn)換結(jié)束,超時設(shè)定為10ms
adcv = HAL_ADC_GetValue(&hadc1); //讀取ADC1的轉(zhuǎn)換結(jié)果
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發(fā)送字符串,數(shù)組長度為12,超時10ms
HAL_UART_Transmit(&huart1, (uint8_t *)str, 12, 10); //串口1發(fā)送字符串,數(shù)組長度為5,超時10ms
HAL_UART_Transmit(&huart1, (uint8_t *)&"nr", 2, 10); //串口1發(fā)送字符串,數(shù)組長度為2,超時10ms
if(set_flag){//設(shè)置模式
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發(fā)送字符串,數(shù)組長度為12,超時10ms
HAL_UART_Transmit(&huart1, (uint8_t *)str, 12, 12); //串口1發(fā)送字符串,數(shù)組長度為5,超時10ms
HAL_UART_Transmit(&huart1, (uint8_t *)&"nr", 2, 10); //串口1發(fā)送字符串,數(shù)組長度為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 */
}
4. 資料清單&下載鏈接
0、常見使用問題及解決方法–必讀?。。。?/p>
1、程序代碼
2、Proteus仿真
3、功能要求
4、講解視頻
5、MQ-3傳感器說明
Altium Designer 軟件資料
KEIL軟件資料
Proteus軟件資料
單片機學習資料
答辯技巧
設(shè)計報告常用描述
鼠標雙擊打開查找更多51 STM32單片機課程畢業(yè)設(shè)計.url
資料下載鏈接