溫濕度傳感器介紹
DHT11數字溫濕度傳感器是一款含有已校準數字信號輸出的溫濕度復合傳感器,應用于專用數字模塊采集技術和溫濕度傳感技術,確保產品具有極高的可靠性和卓越的長期穩定性,
傳感器包括一個電阻式感濕元件和一個NTC測溫元件,并與一個高性能八位單片機相連接,采用單線制串口行介面,信號傳輸距離可達20M以上,
應用于通暖空調,汽車,自動控制設備,氣象站家電
濕度調節器,醫療,除濕器等等,

溫濕度傳感器介紹
供電電壓:3.3 - 5.5V直流電
輸出為單總線數字信號
溫度測量范圍0-50度(精度正負2度,解析度1度)
濕度測量范圍為20-90%RH(精度為正負5%,解析度1%)
模塊的+ 接單片機的5V
模塊的- 接單片機的GND
模塊的OUT 接單片機定義的引腳
vcc和gnd之間可以加一個電容,用于去耦濾波

采用單總線雙向串行通信協議,每次采集都要由單片機發起開始信號,然后DHT11會向單片機發送回應并開始傳輸40位資料幀,高位在前,
資料格式為:
第一二個位元組: 8bit濕度整數資料+8bit濕度小數資料
第三四個位元組: 8bit溫度整數資料+8bit溫度小數資料
第五個位元組 : 8bit校驗位(它是前四個資料相加后八位的數值)
溫濕度小數部分默認為0,即單片機采集的資料都是整數,校驗位為4個位元組的資料相加取結果的低8位資料作為校驗和;
示例一:
濕度高八位:0011 0101
濕度低八位:0000 0000
溫度高八位:0011 1000
溫度低八位:0000 0000
檢驗位:0110 1101
計算 :
0011 0101 (相加)
0011 1000
結果: 01101101
濕度為0011 0101 = 35H = 53%RH
溫度為0011 1000 = 18H = 24°
示例二:
濕度高八位:0011 0101
濕度低八位:0000 0000
溫度高八位:0001 1000
溫度低八位:0000 0000
檢驗位:0110 1001
計算 :
0011 0101 (相加)
0001 1000
結果: 0100 1101 不等于 01101001 本次接收資料不正確,重新接收資料
溫濕度傳感器時序介紹
總線空閑狀態為高電平,主機把總線拉低等待DHT11回應,主機把總線拉低必須大于18毫秒,保證DHT11能檢測起始信號,DHT11接收到主機的開始信號后,等待主機開始信號結束,然后發送80us低電平回應信號,主機發送開始信號結束后,延時等待20-40us后,讀取DHT11的回應信號,主機發送開始信號后,可以切換到輸入模式,或者輸出高電平均可,總線由上拉電阻拉高,

DHT11輸出0時時序

DHT11輸出1時時序

代碼
main.c
#include <REGX52.H>
#include "LCD1602.h"
#include "DHT11.h"
#include <stdio.h>
extern unsigned int rec_dat[4];
extern unsigned char rec_dat_lcd0[6];
extern unsigned char rec_dat_lcd1[6];
extern unsigned char rec_dat_lcd2[6];
extern unsigned char rec_dat_lcd3[6];
/**
*1|?ü£o?óê±500ms
*2?êy£ovoid
*·μ???μ£ovoid
*/
void Delay500ms(void) //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 22;
j = 3;
k = 227;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
int main()
{
LCD_Init();
InitUART();
LCD_ShowString(1,0,"Humi:");
LCD_ShowString(2,1,"Temp:");
while(1)
{
DHT11_delay_ms(150);
DHT11_receive();
sprintf(rec_dat_lcd0,"%d",rec_dat[0]);
sprintf(rec_dat_lcd1,"%d",rec_dat[1]);
sprintf(rec_dat_lcd2,"%d",rec_dat[2]);
sprintf(rec_dat_lcd3,"%d",rec_dat[3]);
DHT11_delay_ms(100);
//??ê?êa?è
LCD_ShowString(1,6,rec_dat_lcd0);
LCD_ShowString(1,8,".");
LCD_ShowString(1,9,rec_dat_lcd1);
LCD_ShowString(1,10,"%");
//??ê????è
LCD_ShowString(2,6,rec_dat_lcd2);
LCD_ShowString(2,8,".");
LCD_ShowString(2,9,rec_dat_lcd3);
LCD_ShowString(2,10,"C");
}
}
DHT11.h
#ifndef _DHT11_H_
#define _DHT11_H_
void DHT11_START();
unsigned char DHT11_rec_byte();
void DHT11_receive();
void DHT11_delay_us(unsigned char n);
void DHT11_delay_ms(unsigned int z);
void InitUART(void);
#endif
DHT11.c
#include <REG52.H>
#include "DHT11.h"
sbit Temp_data = P2^0;
unsigned int rec_dat[4];
unsigned char rec_dat_lcd0[6];
unsigned char rec_dat_lcd1[6];
unsigned char rec_dat_lcd2[6];
unsigned char rec_dat_lcd3[6];
//DHT11?eê?D?o?
void DHT11_START()
{
Temp_data = 1; //??μ???
DHT11_delay_us(2); //??μ?????3?2us
Temp_data = 0; //μíμ???
DHT11_delay_ms(20);//?áéù??18ms
Temp_data = 1; //??μ???
DHT11_delay_us(13); //??μ?????3?13us
}
//?óê?ò???×??úoˉêy
unsigned char DHT11_rec_byte()
{
unsigned char i,dat;
for(i=0;i<8;i++)
{
while(!Temp_data);//μè′ydht11 μíμ???1yè¥
DHT11_delay_us(8);//?óê±′ó??8us£?è?o??1ê???μ????ò?a1
dat<<=1;
if(Temp_data == 1)
{
dat += 1;
}
while(Temp_data); //μè′ydht11à-μí£?×?±???ò???
}
return dat;
}
//?óê???êa?èêy?Y
void DHT11_receive()
{
unsigned int R_H,R_L,T_H,T_L;
unsigned char RH,RL,TH,TL,revise;
DHT11_START();//?÷?ú·¢?aê?D?o?
Temp_data = 1;
if(Temp_data == 0)//?D??DHT11 ê?·???è??ìó|
{
while(Temp_data == 0);//μè′y??μ????ìó|D?o?
DHT11_delay_us(40); //à-??oó?óê±40us
R_H = DHT11_rec_byte();//?óê?êa?è??°???
R_L = DHT11_rec_byte();//?óê?êa?èμí°???
T_H = DHT11_rec_byte();//?óê????è??°???
T_L = DHT11_rec_byte();//?óê????èμí°???
revise = DHT11_rec_byte();//?óê?D£?é??
DHT11_delay_us(25);
if((R_H+R_L+T_H+T_L) == revise)//D£?é??êy?Yê?·??yè·
{
RH = R_H;
RL = R_L;
TH = T_H;
TL = T_L;
}
rec_dat[0] = RH;
rec_dat[1] = RL;
rec_dat[2] = TH;
rec_dat[3] = TL;
}
}
//?óê±us
void DHT11_delay_us(unsigned char n)
{
while(--n);
}
//?óê±ms
void DHT11_delay_ms(unsigned int z)
{
unsigned int i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void InitUART(void)//ê1ó??¨ê±?÷1 ×÷?a′??ú2¨ì??ê·¢éú?÷
{
SCON = 0X40;//′??úí¨D?1¤×÷·?ê?ò?
REN = 1; //?êDí′??ú?óê?
TMOD = 0X20;//?¨ê±?÷1μ?1¤×÷·?ê?
TH1 = 0XF3;//????′??úμ?2¨ì??ê
TL1 = 0XF3;
TI = 1; //?D??
TR1 = 1;
}
LCD1602.h
#ifndef _LCD1602_H_
#define _LCD1602_H_
void LCD_WriteCommand(unsigned char Command);
void LCD_WriteDate(unsigned char Date);
void LCD_Init(void);
void LCD_SetCursor(unsigned char Line,unsigned char Columu);
void LCD_Showchar(unsigned char Line,unsigned char Columu,unsigned char Char);
void LCD_ShowString(unsigned char Line,unsigned char Columu,unsigned char *String);
int LCD_Pow(int x,int y);
int LCD_getNumberSize(int Number);
void LCD_ShowNumber(unsigned char Line,unsigned char Columu,unsigned int Number);
#endif
LCD1602.c
#include <REGX52.h>
#include "LCD1602.h"
#include <INTRINS.H>
sbit LCD_RS = P2^6;
sbit LCD_RW = P2^5;
sbit LCD_E = P2^7;
#define LCD_DataPort P0
/**
*1|?ü£o?óê±1ms
*2?êy£ovoid
*·μ???μ£ovoid
*/
void LCD_Delay1ms(void) //@11.0592MHz
{
unsigned char i, j;
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
/**
*1|?ü£oD′??á?oˉêy
*2?êy£oCommand ??á?
*·μ???μ£ovoid
*2???£oD′2ù×÷ê±Dòí?
*/
void LCD_WriteCommand(unsigned char Command)
{
LCD_RS = 0; //éè????á??£ê?
LCD_RW = 0; //éè??D′?£ê?
LCD_DataPort = Command; //D′??á?
LCD_E = 1;
LCD_Delay1ms();
LCD_E = 0;
LCD_Delay1ms();
}
/**
*1|?ü£oD′êy?Yoˉêy
*2?êy£oDate êy?Y
*·μ???μ£ovoid
*2???£oD′2ù×÷ê±Dòí?
*/
void LCD_WriteDate(unsigned char Date)
{
LCD_RS = 1; //éè??êy?Y?£ê?
LCD_RW = 0; //éè??D′?£ê?
LCD_DataPort = Date; //D′??á?
LCD_E = 1;
LCD_Delay1ms();
LCD_E = 0;
LCD_Delay1ms();
}
/**
*1|?ü£oLCD3?ê??ˉoˉêy
*2?êy£ovoid
*·μ???μ£ovoid
*/
void LCD_Init(void)
{
LCD_WriteCommand(0X38);//????°???êy?Y?ó?ú
LCD_WriteCommand(0X0c);//??ê??a£?1a±ê1?£?éá???a
LCD_WriteCommand(0X06);//1a±ê+1£??-??2??ˉ
LCD_WriteCommand(0X01);//???á
}
/**
*1|?ü£o??ê?1a±ê
*2?êy£oLine DD £?Columu áD
*·μ???μ£ovoid
*/
void LCD_SetCursor(unsigned char Line,unsigned char Columu)
{
if(Line == 1){
//μúò?DDμ??·
LCD_WriteCommand(0x80 | (Columu - 1));
}else{
//μú?tDDμ??·
LCD_WriteCommand(0x80 | (Columu - 1) + 0x40);
}
}
/**
*1|?ü£o??ê?×?·?oˉêy
*2?êy£oLine DD £?Columu áD £?Char òa??ê?μ?×?·?
*·μ???μ£ovoid
*/
void LCD_Showchar(unsigned char Line,unsigned char Columu,unsigned char Char)
{
LCD_SetCursor(Line,Columu);
LCD_WriteDate(Char);
}
/**
*1|?ü£o??ê?×?·?′?oˉêy
*2?êy£oLine DD £?Columu áD £?String òa??ê?μ?×?·?′?
*·μ???μ£ovoid
*/
void LCD_ShowString(unsigned char Line,unsigned char Columu,unsigned char *String)
{
unsigned char i;
LCD_SetCursor(Line,Columu);
for(i=0;String[i]!='\0';i++)
{
LCD_WriteDate(String[i]);
}
}
/**
*1|?ü£o??ê?′?·?oˉêy(xμ?y′?·?)
*2?êy£ox μ×êy y ′?·?
*·μ???μ£oResult xμ?y′?·??á1?
*/
int LCD_Pow(int x,int y)
{
unsigned char i;
int Result = 1;
for(i=0;i<y;i++)
{
Result *=x;
}
return Result;
}
/**
*1|?ü£o??è?êy×?3¤?è
*2?êy£oNumber Dèòa??è?3¤?èμ?êy×?
*·μ???μ£oSize êy×?Numberμ?3¤?è
*/
int LCD_getNumberSize(int Number)
{
unsigned int Size = 0;
while(Number > 0)
{
Number /= 10;
Size++;
}
return Size;
}
/**
*1|?ü£o??ê?êy×?oˉêy
*2?êy£oLine DD £?Columu áD £?Number òa??ê?μ?êy×?
*·μ???μ£ovoid
*/
void LCD_ShowNumber(unsigned char Line,unsigned char Columu,unsigned int Number)
{
unsigned int i;
LCD_SetCursor(Line,Columu);
for(i=LCD_getNumberSize(Number);i>0;i--)
{
LCD_WriteDate('0'+Number/LCD_Pow(10,i-1)%10);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/292582.html
標籤:其他
