一、環(huán)境介紹
溫濕度模塊: DHT11
源碼下載地址:
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);
}
}