51单片机DHT11温湿度传感器

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);
	}
}

你可能感兴趣的:(单片机,传感器)