一、環境介紹
MCU: STM32F103C8T6
溫濕度子產品: DHT11
開發軟體: Keil5
源碼下載下傳位址:
https://download.csdn.net/download/xiaolong1126626497/18263569二、DHT11介紹
DHT11數字溫濕度傳感器是一款含有已校準數字信号輸出的溫濕度複合傳感器。
它應用專用的數字子產品采集技術和溫濕度傳感技術, 確定産品具有極高的可靠性與卓越的長期穩定性。傳感器包括一個電阻式感濕元件和一個NTC測溫元件,并與一個高性能8位單片機相連接配接。是以該産品具有品質卓越、超快響應、抗幹擾能力強、成本效益極高等優點。
每個DHT11傳感器都在極為精确的濕度校驗室中進行校準。校準系數以程式的形式儲存在OTP記憶體中,傳感器内部在檢測信号的處理過程中要調用這些校準系數。
單線制串行接口, 使系統內建變得簡易快捷。超小的體積、極低的功耗, 信号傳輸距離可達20米以上, 使其成為各類應用甚至最為苛刻的應用場合的最佳選則。
産品為 4 針單排引腳封裝。 連接配接友善, 特殊封裝形式可根據使用者需求而提供。
應用領域
►暖通空調
►測試及檢測裝置
►汽車
►資料記錄器
►消費品
►自動控制
►氣象站
►家電
►濕度調節器
►醫療
►除濕器
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iMmJTN4EjMhRDOmdjM0IGOiBjY0YTO5kTZzIDOwMTNm9CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.png)
#include "dht11.h"
#include "delay.h"
//複位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的回應
//傳回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)//等待變為低電平
{
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讀取一個位元組
//傳回值:讀到的資料
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讀取一次資料
//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位資料
{
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.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,%d\n",Temperature,Humidity);
}
DelayMs(500);
}
}