51单片机DHT11温湿度传感器
//dht11.h
#ifndef __DHT11_H
#define __DHT11_H
#include "sys.h"
#include "delay.h"
#include "oled.h"
#define Datout PAout(2)
#define Datin PAin(2)
void DHT11_start(void);
u8 DHT11_rec_byte(void);
static u8 DHT11_receive(void);
void DHT11_TEST(void);
#endif
//dht11.c
#include "dht11.h"
u8 rec_dat[8];
void DHT11_start(void)
{
RCC->APB2ENR|=1<<2; //使能 PORTA 时钟
RCC->APB2ENR|=1<<5; //使能 PORTD 时钟
GPIOA->CRL&=0XFFFFF0FF;
GPIOA->CRL|=0X00000300;//PA2 推挽输出
GPIOA->IDR=1<<3;
Datout=1;
delay_us(2);
Datout=0;
delay_ms(18); //延时18ms以上
Datout=1;
delay_us(30);
}
u8 DHT11_rec_byte(void) //接收一个字节
{
u8 i,dat=0;
RCC->APB2ENR|=1<<2; //使能 PORTA 时钟
RCC->APB2ENR|=1<<5; //使能 PORTD 时钟
GPIOA->CRL&=0XFFFFF0FF;
GPIOA->CRL|=0X00000700;//PA2 推挽输出
for(i=0;i<8;i++) //从高到低依次接收8位数据
{
while(!Datin); ////等待50us低电平过去
delay_us(60); //延时60us,如果还为高则数据为1,否则为0
dat<<=1; //移位使正确接收8位数据,数据为0时直接移位
if(Datin) //数据为1时,使dat加1来接收数据1
dat+=1;
while(Datin); //等待数据线拉低
}
return dat;
}
static u8 DHT11_receive(void) //接收40位的数据
{
DHT11_start();
RCC->APB2ENR|=1<<2; //使能 PORTA 时钟
RCC->APB2ENR|=1<<5; //使能 PORTD 时钟
GPIOA->CRL&=0XFFFFF0FF;
GPIOA->CRL|=0X00000700;//PA2 推挽输出
if(!Datin)
{
while(!Datin); //等待拉高
delay_us(80); //拉高后延时80us
while(Datin);
return 1;
}
return (0);
}
void DHT11_TEST(void)
{
u8 R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
if(DHT11_receive())
{
R_H=DHT11_rec_byte(); //接收湿度高八位
R_L=DHT11_rec_byte(); //接收湿度低八位
T_H=DHT11_rec_byte(); //接收温度高八位
T_L=DHT11_rec_byte(); //接收温度低八位
revise=DHT11_rec_byte(); //接收校正位
delay_us(25); //结束
if((R_H+R_L+T_H+T_L)==revise) //校正
{
RH=R_H;
RL=R_L;
TH=T_H;
TL=T_L;
}
/*数据处理,方便显示*/
rec_dat[0]='0'+(RH/10);
rec_dat[1]='0'+(RH%10);
rec_dat[2]='0'+(TH/10);
rec_dat[3]='0'+(TH%10);
}
}
51单片机DHT11温湿度传感器
最新推荐文章于 2025-07-13 16:42:04 发布