• 方案介紹
    • 一、環(huán)境介紹
    • 二、DHT11介紹
    • 三、核心代碼
  • 附件下載
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

STM32+DHT11讀取溫濕度數(shù)據(jù)顯示(核心代碼)

01/26 08:31
3429
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

更多詳細(xì)資料請聯(lián)系.docx

共1個文件

一、環(huán)境介紹

MCU:??STM32F103C8T6

溫濕度模塊: DHT11

開發(fā)軟件: Keil5

源碼下載地址:
https://download.csdn.net/download/xiaolong1126626497/18263569

二、DHT11介紹

DHT11數(shù)字溫濕度傳感器是一款含有已校準(zhǔn)數(shù)字信號輸出的溫濕度復(fù)合傳感器。

它應(yīng)用專用的數(shù)字模塊采集技術(shù)和溫濕度傳感技術(shù), 確保產(chǎn)品具有極高的可靠性與卓越的長期穩(wěn)定性。傳感器包括一個電阻式感濕元件和一個NTC測溫元件,并與一個高性能8位單片機相連接。因此該產(chǎn)品具有品質(zhì)卓越、超快響應(yīng)、抗干擾能力強、性價比極高等優(yōu)點。

每個DHT11傳感器都在極為精確的濕度校驗室中進行校準(zhǔn)。校準(zhǔn)系數(shù)以程序的形式儲存在OTP內(nèi)存中,傳感器內(nèi)部在檢測信號的處理過程中要調(diào)用這些校準(zhǔn)系數(shù)。

單線制串行接口, 使系統(tǒng)集成變得簡易快捷。超小的體積、極低的功耗, 信號傳輸距離可達20米以上, 使其成為各類應(yīng)用甚至最為苛刻的應(yīng)用場合的最佳選則。

產(chǎn)品為 4 針單排引腳封裝。 連接方便, 特殊封裝形式可根據(jù)用戶需求而提供。

應(yīng)用領(lǐng)域

  • 暖通空調(diào)
  • 測試及檢測設(shè)備
  • 汽車
  • 數(shù)據(jù)記錄器
  • 消費品
  • 自動控制
  • 氣象站
  • 家電
  • 濕度調(diào)節(jié)器
  • 醫(yī)療
  • 除濕器

三、核心代碼

3.1? dht11.c

#include "dht11.h"
#include "delay.h"

//復(fù)位DHT11
void DHT11_Rst(void)	   
{                 
	  DHT11_IO_OUT(); 	//SET OUTPUT
    DHT11_DQ_OUT=0; 	//拉低DQ
    DelayMs(20);    	//拉低至少18ms
    DHT11_DQ_OUT=1; 	//DQ=1 
	  DelayUs(30);     	//主機拉高20~40us
}


//等待DHT11的回應(yīng)
//返回1:未檢測到DHT11的存在
//返回0:存在
u8 DHT11_Check(void) 	   
{   
	u8 retry=0;
	DHT11_IO_IN();//SET INPUT	 
  while (DHT11_DQ_IN&&retry<100)//DHT11會拉低40~80us
	{
		retry++;
		DelayUs(1);
	};	 
	if(retry>=100)return 1;
	else retry=0;
    while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后會再次拉高40~80us
	{
		retry++;
		DelayUs(1);
	};
	if(retry>=100)return 1;	    
	return 0;
}

//從DHT11讀取一個位
//返回值:1/0
u8 DHT11_Read_Bit(void) 			 
{
 	u8 retry=0;
	while(DHT11_DQ_IN&&retry<100)//等待變?yōu)榈?a class="article-link" target="_blank" href="/baike/1465710.html">電平
	{
		retry++;
		DelayUs(1);
	}
	retry=0;
	while(!DHT11_DQ_IN&&retry<100)//等待變高電平
	{
		retry++;
		DelayUs(1);
	}
	DelayUs(40);//等待40us
	if(DHT11_DQ_IN)return 1;
	else return 0;		   
}


//從DHT11讀取一個字節(jié)
//返回值:讀到的數(shù)據(jù)
u8 DHT11_Read_Byte(void)    
{        
  u8 i,dat;
  dat=0;
  for (i=0;i<8;i++) 
  {
    dat<<=1; 
    dat|=DHT11_Read_Bit();
  }						    
    return dat;
  }


//從DHT11讀取一次數(shù)據(jù)
//temp:溫度值(范圍:0~50°)
//humi:濕度值(范圍:20%~90%)
//返回值:0,正常;1,讀取失敗
u8 DHT11_Read_Data(u8 *temp,u8 *humi)    
{        
 	u8 buf[5];
	u8 i;
	DHT11_Rst();
	if(DHT11_Check()==0)
	{
		for(i=0;i<5;i++)//讀取40位數(shù)據(jù)
		{
			buf[i]=DHT11_Read_Byte();
		}
		if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
		{
			*humi=buf[0];
			*temp=buf[2];
		}
	}else return 1;
	return 0;	    
}


//初始化DHT11的IO口 DQ 同時檢測DHT11的存在
//返回1:不存在
//返回0:存在    	 
u8 DHT11_Init(void)
{
	RCC->APB2ENR|=1<<2;    //使能PORTA口時鐘 
	GPIOA->CRL&=0XFF0FFFFF;//PORTA.11 推挽輸出
	GPIOA->CRL|=0X00300000;
	GPIOA->ODR|=1<<5;      //輸出1				    
	DHT11_Rst();
	return DHT11_Check();
}


3.2 dht11.h

#ifndef __DHT11_H
#define __DHT11_H 
#include "sys.h"   
    
//IO方向設(shè)置
#define DHT11_IO_IN()  {GPIOA->CRL&=0XFF0FFFFF;GPIOA->CRL|=0x00800000;}
#define DHT11_IO_OUT() {GPIOA->CRL&=0XFF0FFFFF;GPIOA->CRL|=0x00300000;}

IO操作函數(shù)											   
#define	DHT11_DQ_OUT PAout(5) //數(shù)據(jù)端口	PA5
#define	DHT11_DQ_IN  PAin(5)  //數(shù)據(jù)端口	PA5


u8 DHT11_Init(void);		//初始化DHT11
u8 DHT11_Read_Data(u8 *temp,u8 *humi);//讀取溫濕度
u8 DHT11_Read_Byte(void);	//讀出一個字節(jié)
u8 DHT11_Read_Bit(void);	//讀出一個位
u8 DHT11_Check(void);		//檢測是否存在DHT11
void DHT11_Rst(void);		//復(fù)位DHT11    
#endif

3.3 main.c

#include "stm32f10x.h"
#include "delay.h"
#include "led.h"
#include "sys.h"
#include "usart.h"
#include <string.h>
#include <stdlib.h>
#include "timer.h"
#include "adc.h"
#include "dht11.h"

int main(void)
{
  u8 Temperature,Humidity;
	LED_Init();  //初始化LED
	USARTx_Init(USART1,72,115200);//串口1的初始化
  DHT11_Init();
  
	while(1)
	{
		 LED1=!LED1;
     if(DHT11_Read_Data(&Temperature,&Humidity) == 0)
     {
       printf("溫濕度: %d,%dn",Temperature,Humidity);
     }
     DelayMs(500);
	}	
}

  • 更多詳細(xì)資料請聯(lián)系.docx
    下載

相關(guān)推薦