用HC-SR501检测人接近1s以上,控制L9110风扇模块启动同时启动DHT11检测环境温度,根据温度自动调整风扇转速,人离开后关闭风扇,STM32F103ZET6生成代码,标准库
时间: 2023-06-19 11:36:12 浏览: 37
以下是基于STM32F103ZET6标准库的代码示例:
```c
#include "stm32f10x.h"
#include "delay.h"
#include "usart.h"
#include "dht11.h"
#define FAN_ON() GPIO_ResetBits(GPIOB, GPIO_Pin_1) // PB1控制风扇开启
#define FAN_OFF() GPIO_SetBits(GPIOB, GPIO_Pin_1) // PB1控制风扇关闭
#define LED_ON() GPIO_ResetBits(GPIOC, GPIO_Pin_13) // PC13控制LED亮
#define LED_OFF() GPIO_SetBits(GPIOC, GPIO_Pin_13) // PC13控制LED灭
#define MOTION_SENSOR_PIN GPIO_Pin_0 // PA0为HC-SR501信号输入
#define FAN_PIN GPIO_Pin_1 // PB1为风扇控制输出
#define LED_PIN GPIO_Pin_13 // PC13为LED控制输出
#define TEMP_THRESHOLD 28 // 温度阈值,风扇工作时的最低温度
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// 使能GPIOA、GPIOB、GPIOC时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE);
// 配置PA0为输入模式
GPIO_InitStructure.GPIO_Pin = MOTION_SENSOR_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 配置PB1和PC13为输出模式
GPIO_InitStructure.GPIO_Pin = FAN_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = LED_PIN;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
void TIM_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
// 使能TIM3时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
// TIM3定时器配置,1s中断一次
TIM_TimeBaseStructure.TIM_Period = 7199; // 1s
TIM_TimeBaseStructure.TIM_Prescaler = 999; // 72MHz / 1000 = 72000Hz
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM3, ENABLE);
}
void TIM3_IRQHandler(void)
{
static uint16_t timer = 0;
static uint8_t fan_speed = 0;
// 温度检测
if (timer % 5 == 0) {
DHT11_Read();
if (DHT11_Data[2] >= TEMP_THRESHOLD) {
fan_speed = (DHT11_Data[2] - TEMP_THRESHOLD) * 10; // 温度高于阈值,根据温度调整风扇转速
if (fan_speed > 100) fan_speed = 100;
TIM_SetCompare3(TIM2, (fan_speed * 7200) / 100); // TIM2_CH3输出PWM控制风扇转速
FAN_ON();
} else {
TIM_SetCompare3(TIM2, 0);
FAN_OFF();
}
}
// 人体感应检测
if (GPIO_ReadInputDataBit(GPIOA, MOTION_SENSOR_PIN)) {
LED_ON();
timer = 0;
} else {
LED_OFF();
if (timer >= 2) {
TIM_SetCompare3(TIM2, 0);
FAN_OFF();
}
}
timer++;
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
}
int main(void)
{
SystemInit();
USART_Configuration();
GPIO_Configuration();
TIM_Configuration();
DHT11_Init();
while (1) {
// 等待中断
}
}
```
需要注意的是,以上代码中使用了定时器TIM3中断来检测人体感应信号和温度,并且通过PWM控制TIM2_CH3输出来调整风扇转速。同时,为了保证风扇启动前能够稳定工作,需要在启动风扇前给定一个适当的延时时间。