野火stm32f407zgt6烟雾报警器代码用mq2传感器
时间: 2025-06-15 15:20:00 浏览: 16
### STM32F407ZGT6与MQ2传感器的烟雾报警器代码示例
以下是一个基于STM32F407ZGT6芯片和MQ2传感器的烟雾报警器示例代码。该代码使用了GPIO引脚读取MQ2传感器的模拟值,并通过串口打印检测结果[^1]。
#### 代码实现
以下是完整的代码示例:
```c
#include "stm32f4xx.h"
// ADC初始化函数
void ADC_Config(void) {
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; // 使能GPIOA时钟
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; // 使能ADC1时钟
GPIOA->MODER |= GPIO_MODER_MODE0_1; // 配置PA0为模拟输入模式
ADC1->CR2 |= ADC_CR2_ADON; // 开启ADC
ADC1->SMPR1 |= ADC_SMPR1_SMP0_2; // 设置采样时间为239.5周期
ADC1->SQR1 &= ~ADC_SQR1_L; // 配置规则序列长度为1
ADC1->SQR3 |= ADC_SQR3_SQ1_0; // 配置规则序列的第一个通道为CH0
}
// 延时函数
void Delay(volatile uint32_t nCount) {
while (nCount--) {
__asm("nop");
}
}
int main(void) {
// 初始化系统时钟
RCC->CFGR |= RCC_CFGR_SW_PLL; // 选择PLL作为系统时钟源
RCC->CR |= RCC_CR_HSEON; // 使能外部高速时钟
while (!(RCC->CR & RCC_CR_HSERDY)); // 等待HSE稳定
RCC->PLLCFGR = 0x24003010; // 配置PLL
RCC->CR |= RCC_CR_PLLON; // 使能PLL
while (!(RCC->CR & RCC_CR_PLLRDY)); // 等待PLL稳定
RCC->CFGR |= RCC_CFGR_HPRE_DIV1; // 设置AHB预分频因子为1
RCC->CFGR |= RCC_CFGR_PPRE1_DIV2; // 设置APB1预分频因子为2
RCC->CFGR |= RCC_CFGR_PPRE2_DIV1; // 设置APB2预分频因子为1
// 初始化USART2用于调试输出
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; // 使能GPIOA时钟
RCC->APB1ENR |= RCC_APB1ENR_USART2EN; // 使能USART2时钟
GPIOA->MODER |= GPIO_MODER_MODE2_1; // 配置PA2为复用功能模式(USART2_TX)
GPIOA->OTYPER &= ~GPIO_OTYPER_OT_2; // 配置PA2为推挽输出
GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR2; // 配置PA2为高速模式
GPIOA->PUPDR &= ~GPIO_PUPDR_PUPD2; // 配置PA2无上下拉
USART2->BRR = 0x0683; // 配置波特率为115200
USART2->CR1 |= USART_CR1_TE | USART_CR1_RE | USART_CR1_UE; // 使能发送、接收和USART
// 初始化ADC
ADC_Config();
while (1) {
ADC1->CR2 |= ADC_CR2_SWSTART; // 启动一次转换
while (!(ADC1->SR & ADC_SR_EOC)); // 等待转换结束
uint16_t adc_value = ADC1->DR; // 获取转换结果
// 打印ADC值到串口
char buffer[20];
sprintf(buffer, "ADC Value: %d\r\n", adc_value);
for (int i = 0; buffer[i] != '\0'; i++) {
while (!(USART2->SR & USART_SR_TXE)); // 等待发送缓冲区为空
USART2->DR = buffer[i]; // 发送字符
}
if (adc_value > 2000) { // 如果检测到烟雾,触发报警
for (int i = 0; i < 5; i++) {
GPIOA->ODR ^= GPIO_ODR_ODR_5; // PA5引脚闪烁LED
Delay(0xFFFFFF);
}
}
Delay(0xFFFF); // 延时一段时间后再次检测
}
}
```
#### 代码说明
- **ADC初始化**:配置ADC1以从PA0读取模拟信号。MQ2传感器的输出连接到PA0。
- **USART初始化**:配置USART2以通过串口打印检测结果[^2]。
- **主循环**:在主循环中,程序定期读取ADC值并判断是否超过阈值(如2000)。如果超过,则触发报警逻辑[^3]。
#### 注意事项
- 需要根据实际硬件连接调整GPIO和ADC通道配置。
- 烟雾检测阈值(`adc_value > 2000`)需要根据具体传感器校准调整。
- 使用野火开发板时,请确保正确配置了时钟树和外设引脚。
阅读全文
相关推荐

















