需要模块:

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;
}
实现效果:


1066

被折叠的 条评论
为什么被折叠?



