基于stm32室内警报系统

需要模块:

 DTH11 

MQ2

人体红外模块

代码实现

#include "main.h"
#include <stdio.h>
#include "dht11.h"

uint8_t Recv_Data;
int main(void)
{
	u16 w25q64_id=0;
	LED_Init();
	HW_Sensor_Init();
	TIM6_Config();
	Usart1_Init();
  
	MQ2_Init();
	BEEP_Init();
	Dht11_Init();
	HC_SR04_Config();
	PWM_Config();
	KT_Config();
	SPI1_Config();
	printf("\r\n你好,XYD\r\n");//标准C库函数  打印到屏幕 数据流输出到串口
	w25q64_id=W25Q64_ID();
	printf("w25q64_id=%#X\r\n",w25q64_id);
	while(1)
	{
		
/*******************************
		室内报警系统
		红外 --- PB5
		烟雾 --- PA1
		DHT11 --- PB6
*******************************/
  	Hw_Sys();
		Dht11_Sys();
		Mq2_Sys();
		Delay_nms(300);
		
	}
}

红外模块:

#include "hw.h"

//按键输入
void HW_Sensor_Init(void)
{
	RCC_AHB1PeriphClockCmd(HW_PERIPH_CLK,ENABLE);

	GPIO_InitTypeDef HW_InitStruct;
	HW_InitStruct.GPIO_Pin     = HW_SENSOR_PIN;//红外使用引脚
    HW_InitStruct.GPIO_PuPd    = GPIO_PuPd_NOPULL;
	HW_InitStruct.GPIO_Mode    = GPIO_Mode_IN;
	GPIO_Init(HW_PORT,&HW_InitStruct);
}



u8 hw_check(void)
{
	if(HW_STA == 0)
	{
		
		return 1;
		
	}
	
	return 0;
	
}


温湿度监测模块Dht11:

#include "dht11.h"
#include "time6.h"

/******************************
函数名:Dht11_Init
函数功能:DHT11管脚的初始化
函数形参:void
函数返回值:void
备注:配置PB6
*******************************/
void Dht11_Init(void)
{
	GPIO_InitTypeDef gpio_InitTypeDef;//别名可以自己写的
	
	//打开时钟 PB时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
	
	//配置GPIO模式
	gpio_InitTypeDef.GPIO_Mode=GPIO_Mode_OUT; //输出模式
	gpio_InitTypeDef.GPIO_OType=GPIO_OType_OD; //开漏
	gpio_InitTypeDef.GPIO_PuPd=GPIO_PuPd_UP;  //上拉
	gpio_InitTypeDef.GPIO_Pin=GPIO_Pin_6;
	gpio_InitTypeDef.GPIO_Speed=GPIO_Medium_Speed;//中速
	GPIO_Init(GPIOB,&gpio_InitTypeDef);
}

/******************************
函数名:Dht11_Start
函数功能:DHT11起始信号
函数形参:void
函数返回值:void
备注:
*******************************/
void Dht11_Start(void)
{
	//实现起始信号时序
	DAT_H;
	DAT_L;
	Time_Dlayus(20000);
	DAT_H;
	Time_Dlayus(30);
}

/******************************
函数名:Dht11_Check
函数功能:DHT11响应信号
函数形参:void
函数返回值:u8
备注:正常响应 0   非正常响应 1
*******************************/
u8 Dht11_Check(void)
{
	//判断响应的时长
	u8 num=0;
	while((!DAT_Read)&&(num<100))   //判断低电平时长
	{
		num++;
		Time_Dlayus(1);
	}
	if(num>=100)  return 1;
	else num=0;
	
	while((DAT_Read)&&(num<100))    //判断高电平时长
	{
		num++;
		Time_Dlayus(1);
	}
	if(num>=100)  return 1;
	else return 0;

}

/******************************
函数名:Dht11_Read_Bit
函数功能:DHT11读取0和1
函数形参:void
函数返回值:u8
备注:
*******************************/
u8 Dht11_Read_Bit(void)
{
	//等待一个低电平
	while(DAT_Read);
	
	//等待一个高电平
	while(!DAT_Read);
	
	//判断是数据0还是数据1
	Time_Dlayus(40);
	if(DAT_Read) return 1;
	else         return 0;
}

/******************************
函数名:Dht11_Read_Byte
函数功能:DHT11获取8位数据
函数形参:void
函数返回值:u8
备注:
*******************************/
u8 Dht11_Read_Byte(void)
{
	//整合数据 8位
	u8 data=0;
	u8 i=0;
	//高位先发
	for(i=0;i<8;i++)
	{
		data <<=1;
		data |=Dht11_Read_Bit();  //一位一位的去读取 
	}
	//返回8位数据
	return data;
}

/******************************
函数名:Dht11_Read_Data
函数功能:DHT11获取温度和湿度
函数形参:float *temp   float *humi
函数返回值:u8
备注:
*******************************/
u8 buf[6]={0,0,0,0,0,'\0'};  //储存完整温湿度

u8 Dht11_Read_Data(float *temp,float *humi)
{
	//判断是否响应
	u8 i=0;
	Dht11_Start();
	if(Dht11_Check()==0)
	{
		//获取40bit数据
		for(i=0;i<5;i++)
		{
			buf[i]=Dht11_Read_Byte();
		}
	  //做校验
		if(buf[0]+buf[1]+buf[2]+buf[3]==buf[4])
		{
			*humi=buf[0]+buf[1]/10.0;  //储存的湿度
			*temp=buf[2]+buf[3]/10.0;  //储存的温度
		}
	
	//获取温度和湿度
	}
	else return 1;
	return 0;
}

/******************************
函数名:Dht11_Show_Data
函数功能:DHT11打印温湿度
函数形参:void 
函数返回值:void
备注:
*******************************/
float te=0;
float hi=0;
void Dht11_Show_Data(void)
{
	//printf("111");
	//将温湿度传输到获取函数上
	if(Dht11_Read_Data(&te,&hi)==0)
	{
		printf("温度:%f\r\n",te);
		printf("湿度:%f\r\n",hi);
	}
}

MQ2:用ADC获取数值

 

#include "mq2.h"

//1-3组    这个ADC在哪个时钟总线  如何打开
//4-8组    ADC配置结构体长什么样子    里面成员变量什么含义 某一个通道
//9-13组   ADC通道有哪些 分别在哪个引脚
//14-17组  ADC触发转换的一些条件   软件触发的方法  ADC TIME  ADC DMA

void MQ2_Init(void)
{
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
	ADC_CommonInitTypeDef ADC_CommonStruct;
        
	ADC_CommonStruct.ADC_Mode             = ADC_Mode_Independent;    //adc模式选择
	ADC_CommonStruct.ADC_DMAAccessMode    = ADC_Prescaler_Div2;                        
	ADC_CommonStruct.ADC_Prescaler        = ADC_DMAAccessMode_Disabled;                                                //adc分频系数
	ADC_CommonStruct.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;     //adc采样延时

	ADC_CommonInit(&ADC_CommonStruct);
	
	ADC_InitTypeDef        ADC_InitStruct;
	ADC_InitStruct.ADC_Resolution           = ADC_Resolution_12b;
	ADC_InitStruct.ADC_ScanConvMode         = DISABLE;
	ADC_InitStruct.ADC_ContinuousConvMode   = DISABLE;
	ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
	ADC_InitStruct.ADC_ExternalTrigConv     = ADC_ExternalTrigConv_T1_CC1;
	ADC_InitStruct.ADC_DataAlign            = ADC_DataAlign_Right;
	ADC_InitStruct.ADC_NbrOfConversion      = 1;

	ADC_Init(ADC1,&ADC_InitStruct);
	
	ADC_Cmd(ADC1,ENABLE);

	//1.开时钟             GPIOC时钟  GPIOC在AHB1上
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//开时钟的库函数
	//2.配置结构体
	
	GPIO_InitTypeDef MQ2_InitStruct;
	
	MQ2_InitStruct.GPIO_Pin   = GPIO_Pin_1;
	MQ2_InitStruct.GPIO_Mode  = GPIO_Mode_AN;
	//3.结构体生效
	GPIO_Init(GPIOA,&MQ2_InitStruct);      //使配置生效的库函数
	
	
}




//获取ADC的值
//ADC1   ADC2   ADC3 
float Adc_Getval(void)
{	
	float adc_value;
	ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_480Cycles);
	ADC_SoftwareStartConv(ADC1);
	while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)==RESET);
	adc_value = 100.0-((100.0*ADC_GetConversionValue(ADC1))/4096);	
	return adc_value;
}

实现效果:

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值