AM2302(又稱DHT22)溫溼度傳感器的使用及Proteus仿真(附源碼)

一、產品綜述

AM2303(DHT22)溼敏電容數字溫溼度模塊是一款含有已校準數字信號輸出的溫溼度複合傳感器。它應用專用的數字模塊採集技術和溫溼度傳感技術,確保產品具有極高的可靠性與卓越的長期穩定性。傳感器包括一個電容式感溼元件和一個高精度測溫元件,並與一個高性能的8位單片機相連。因此該產品具有品質卓越、超快響應、抗干擾能力強、性價比高等優點。每個傳感器都在極爲精確的溼度檢驗室中進行校準。校準係數以程序的形式儲存在單片機中,傳感器內部在檢測信號的處理過程中要調用這些校準係數。標準單總線接口,使系統集成變得簡易快捷。超小的體積、極低的功耗,信號傳輸距離可達20米以上,使其成爲各類應用甚至比較苛刻的應用場合的最佳選擇。產品爲3引線(單總線接口)連接方便。特殊封裝形式可根據用戶需求而提供。

 

二、產品圖示及性能

2.1 典型應用電路

2.2 封裝信息

 

2.3 接口定義

2.4 傳感器參數

2.4.1 電氣特性

2.4.2 傳感器性能

 

 

三、傳感器工作過程說明

3.1 單總線說明

AM2302器件採用簡化的單總線通信。單總線即只有一根數據線,系統中的數據交換、控制均由數據線完成。設備(微處理器)通過一個漏極開路或三態端口連接至該數據線,以允許設備在不發送數據時能夠釋放總線;單總線通常要求外接一個約5.1K歐姆的上拉電阻,這樣,當總線閒置時,其狀態爲高電平。由於他們是主從結構,只有在主機呼叫傳感器時,傳感器纔會應答,因此主機訪問傳感器必須遵循單總線序列,如果出現序列混亂,傳感器將不再響應主機。單總線信號格式如下:

3.2 數據格式說明

傳感器一次傳送40bit數據,高位在前低位在後,這40bit數據分別爲:溼度值高八位+溼度值低八位+溫度值高八位+溫度值低八位+八位校驗位。當“校驗值=度值高八位+溼度值低八位+溫度值高八位+溫度值低八位”時,說明數據傳輸正確。

對於溫度值,其最高位爲符號位。即當最高位爲1時,表示溫度值爲負值;反之,則爲正值。

注意:所得溫溼度值均爲實際值的十倍。

3.3 傳感器工作時序

3.3.1 發送數據前的準備(向傳感器發送起始信號)

首先主機把數據總線(SDA)拉低一段時間(技術手冊上說至少1ms,實際中可能需要18ms以上),然後再由主機拉高約20us。然後,傳感器響應,響應形式爲:傳感器先把總線拉低約80us再拉高80us(典型值),隨後開始發送40bit數據。時序如圖所示:

3.3.2 40bit數據中0與1的判斷

在40bit的數據中,每一位數據均由一段低電平加一段高電平組成。0的電平形式爲50us低電平+26us高電平;1的電平形式爲50us電平+70us高電平。因此,可以得出判斷0與1的方法爲:先度過低電平,然後延時40us再檢測總線電平值,若此時總線爲低電平則爲0,總線爲高電平則爲1.。時序圖如下:

3.3.3 AM2302一次完整通信過程時序

注意:主機從AM2302讀取的溫溼度數據總是前一次的測量值,如兩次測量值間隔時間很長,要連續讀兩次以第二次獲得的值爲實時溫溼度值,同時兩次讀取間隔時間最小爲2S。

 

四、例程(例程均爲自己編寫且驗證通過)

/*****使用單片機爲AT89C52;數值測量值用八段數碼管顯示;溫度測量範圍爲-40.0~80.0攝氏度,溼度測量範圍爲0~99.9%;測量數據可精確到小數點後一位*****/

#include<reg52.h>
#include<intrins.h>

typedef unsigned char uchar;
typedef unsigned int  uint;


#define DELAY_TIME 5
 

uchar value[5];
uint temp,hum; 

sbit w1=P2^0;
sbit w2=P2^1;
sbit w3=P2^2;
sbit w4=P2^3;
sbit Bus=P2^4;
//P3溫度,P1溼度

void Delay10us(void);//10us延時函數
void Delay20us(void);//20us延時函數 
void Delay1ms(void);//1ms延時函數
void Read_value(void);//讀值子函數
void Show(uint x,y);//顯示子函數



void main()
{
	uint i;
	for(i=0;i<2000;i++)
	{
		Delay1ms();
	}

	Read_value();//讀值	

	hum=value[0]*256+value[1];//計算溼度值
	temp=(value[2]&0x7f)*256+value[3];//如果溫度爲負值,則&0x3f去掉符號位後再計算;若爲正值則無影響

	Show(temp,hum);	
}






/***********************10us延時函數*****************************/
void Delay10us()
{
	uchar i;
	i=2;
	while(--i);
      	
}
/***********************20us延時函數*****************************/
void Delay20us(void)   //誤差 0us
{
    unsigned char a,b;
    for(b=3;b>0;b--)
        for(a=1;a>0;a--);
}



/***********************1ms延時函數*****************************/
void Delay1ms()   //誤差 0us
{
    unsigned char a,b,c;
    for(c=1;c>0;c--)
        for(b=142;b>0;b--)
            for(a=2;a>0;a--);
}
/************************讀值函數******************************/
void Read_value()
{	
	uchar i,j=0,mask;
	Bus=0;//主機拉低總線至少1ms(20ms)
	for(i=0;i<20;i++)
	{
		Delay1ms();
	}
	Bus=1;//主機主動拉高20us
	while(Bus);//等待從機拉低總線
	while(!Bus);//度過從機拉低時間
	while(Bus);//度過從機拉高時間
	
	while(j<5)
	{
		mask=0x80;
		for(i=0;i<8;i++)
		{
			while(!Bus);//度過數據位的低電平
			Delay20us();//延遲40us後進行電平檢測
			Delay20us();		
			if(Bus==0)
			{
				value[j]&=(~mask);
			}
			else
			{
				value[j]|=mask;
			}
			mask>>=1;
			while(Bus);//度過剩餘高電平(如果是1的話)
		}
		j++;
	}
}



/**********************顯示函數*************************************/
void Show(uint x,y)
{
	char duan1[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段碼
	char duan2[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
	while(1)
	{
		w1=1;//小數位
		w2=0;
		w3=0;
		w4=0;
		Delay10us();
		P3=duan1[x%10];
		P1=duan1[y%10];
		Delay1ms();
		P3=0xff;
		P1=0xff;


		w1=0;//個位
		w2=1;
		w3=0;
		w4=0;
		Delay10us();
		P3=duan2[(x/10)%10];
		P1=duan2[(y/10)%10];
		Delay1ms();
		P3=0xff;
		P1=0xff;

		w1=0;//十位
		w2=0;
		w3=1;
		w4=0;
		Delay10us();
		P3=duan1[(x/100)%10];
		P1=duan1[(y/100)%10];
		Delay1ms();
		P3=0xff;
		P1=0xff;

		w1=0;//百位
		w2=0;
		w3=0;
		w4=1;
		Delay10us();
		if(value[2]>127)//即溫度最高位爲1,表示負值
		{
			P3=0xbf;//顯示負號
		}
		else
		{
			P3=duan1[(x/1000)%10];
		}
		P1=duan1[(y/1000)%10];
		Delay1ms();
		P3=0xff; 
		P1=0xff;
	}
}

注意:該例程在Proteus仿真中已驗證通過。但在Proteus仿真中,即使溫溼度值沒有問題也存在校驗錯誤的情況,因此在該例程中沒有加校驗函數。實際使用中,可通過判斷value[4]是否等於value[0]+value[1]+value[2]+value[3]的方式進行校驗,若相等則校驗成功。

 

五、Proteus仿真程序

注意:雖然技術手冊中要求對傳感器的數據線接5.1K的上拉電阻,但在Proteus仿真中發現不用接即可,若接上反而會導致傳感器無法對總線進行下拉,最終導致溫溼度測量失敗。

 

左肩理想右肩擔當,君子不怨永遠不會停下腳步!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章