一、環(huán)境介紹
溫濕度模塊: DHT11
源碼下載地址:
https://download.csdn.net/download/xiaolong1126626497/18263569
二、DHT11介紹
DHT11數(shù)字溫濕度傳感器是一款含有已校準(zhǔn)數(shù)字信號(hào)輸出的溫濕度復(fù)合傳感器。
它應(yīng)用專(zhuān)用的數(shù)字模塊采集技術(shù)和溫濕度傳感技術(shù), 確保產(chǎn)品具有極高的可靠性與卓越的長(zhǎng)期穩(wěn)定性。傳感器包括一個(gè)電阻式感濕元件和一個(gè)NTC測(cè)溫元件,并與一個(gè)高性能8位單片機(jī)相連接。因此該產(chǎn)品具有品質(zhì)卓越、超快響應(yīng)、抗干擾能力強(qiáng)、性?xún)r(jià)比極高等優(yōu)點(diǎn)。
每個(gè)DHT11傳感器都在極為精確的濕度校驗(yàn)室中進(jìn)行校準(zhǔn)。校準(zhǔn)系數(shù)以程序的形式儲(chǔ)存在OTP內(nèi)存中,傳感器內(nèi)部在檢測(cè)信號(hào)的處理過(guò)程中要調(diào)用這些校準(zhǔn)系數(shù)。
單線(xiàn)制串行接口, 使系統(tǒng)集成變得簡(jiǎn)易快捷。超小的體積、極低的功耗, 信號(hào)傳輸距離可達(dá)20米以上, 使其成為各類(lèi)應(yīng)用甚至最為苛刻的應(yīng)用場(chǎng)合的最佳選則。
產(chǎn)品為 4 針單排引腳封裝。 連接方便, 特殊封裝形式可根據(jù)用戶(hù)需求而提供。
應(yīng)用領(lǐng)域
- 暖通空調(diào)
- 測(cè)試及檢測(cè)設(shè)備
- 汽車(chē)
- 數(shù)據(jù)記錄器
- 消費(fèi)品
- 自動(dòng)控制
- 氣象站
- 家電
- 濕度調(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); //主機(jī)拉高20~40us
}
//等待DHT11的回應(yīng)
//返回1:未檢測(cè)到DHT11的存在
//返回0:存在
u8 DHT11_Check(void)
{
u8 retry=0;
DHT11_IO_IN();//SET INPUT
while (DHT11_DQ_IN&&retry<100)//DHT11會(huì)拉低40~80us
{
retry++;
DelayUs(1);
};
if(retry>=100)return 1;
else retry=0;
while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后會(huì)再次拉高40~80us
{
retry++;
DelayUs(1);
};
if(retry>=100)return 1;
return 0;
}
//從DHT11讀取一個(gè)位
//返回值: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讀取一個(gè)字節(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 同時(shí)檢測(cè)DHT11的存在
//返回1:不存在
//返回0:存在
u8 DHT11_Init(void)
{
RCC->APB2ENR|=1<<2; //使能PORTA口時(shí)鐘
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); //讀出一個(gè)字節(jié)
u8 DHT11_Read_Bit(void); //讀出一個(gè)位
u8 DHT11_Check(void); //檢測(cè)是否存在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);
}
}