?? dht21.h
字號:
/***********************************************************************************************
文件:DHT21.H
作者:楊斌
用途:溫濕度傳感器DHT21(AM2301)驅(qū)動程序
MCU: MSP430F149 晶振:8MHz
編譯器:IAR Ror MSP430 5.10
日期:2011-6-12
***********************************************************************************************/
#include <msp430x24x.h>
//typedef unsigned char uchar;
//typedef unsigned int uint;
//***************************端口定義*************************************
#define Set_DHTin P6DIR &= ~BIT0
#define Set_DHTout P6DIR |= BIT0
#define DHT_0 P6OUT &= ~BIT0
#define DHT_1 P6OUT |= BIT0
#define DHT_IN (P6IN & BIT0)
//************************************************************************
#define CPU_F ((double)8000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
//************************************************************************
//***************************函數(shù)聲明*************************************
/*
uchar DHT_Readchar(void); //單總線讀取一字節(jié)
void Read_DHT(void); //讀取溫濕度值
uchar DHT_Check(void); //校驗讀取結(jié)果,正確返回1否則返回0
void DHT_getvalue(void); //提取溫濕度值及符號
void DHT_toStr(void); //溫濕度值轉(zhuǎn)換成字符串
*/
//*************************定義全局變量**********************************
uchar Buff_temp_wet[5];
uchar Buff_Meg[29];
uint data_temp,data_wet;
uchar Flag_zero;
uchar dis_buff[3]={'0','0','0'};
/*******************************************
函數(shù)名稱:DHT_Readchar
功 能:從DHT21讀取一個字節(jié)的數(shù)據(jù)
參 數(shù):無
返回值 :讀出的一個字節(jié)數(shù)據(jù)
********************************************/
uchar DHT_Readchar(void)
{
uchar i,temp=0;
uint Flag = 0;
// _DINT();
for(i = 0;i < 8;i++)
{
Flag = 2;
while((!DHT_IN)&&Flag++);//等待上升沿 超時退出
delay_us(40); //延時40us
temp<<=1;
if(DHT_IN)
temp|=0x01;
else
temp&=~0x01;
Flag = 2;
while((DHT_IN)&&Flag++);//等待下降沿 超時退出
if(Flag == 1)
break;//超時則跳出for循環(huán)
}
// _EINT();
return temp;
}
/*******************************************
函數(shù)名稱:Read_DHT()
功 能:讀取溫度適度值
參 數(shù):無
返回值 :無
********************************************/
void Read_DHT(void)
{
uchar i;
uint TimeFlag = 0;
// _DINT();
Set_DHTout;
DHT_0; //主機拉低
delay_ms(5); //延時5ms
DHT_1; //總線由上拉電阻拉高
Set_DHTin; //主機設(shè)為輸入 判斷從機響應(yīng)信號
delay_us(40); //延時40us
if(!DHT_IN)
{
TimeFlag=2;
while((!DHT_IN)&&TimeFlag++); //判斷從機發(fā)出的80us低電平響應(yīng)信號是否結(jié)束
TimeFlag=2;
while((DHT_IN)&&TimeFlag++); //判斷從機發(fā)出的80us高電平,如發(fā)出則進入數(shù)據(jù)接收狀態(tài)
for(i = 0; i < 5;i++)
Buff_temp_wet[i]=DHT_Readchar();
DHT_1;
}
// _EINT();
}
/*******************************************
函數(shù)名稱:uchar DHT_Check(void)
功 能:校驗
參 數(shù):無
返回值 :無
********************************************/
uchar DHT_Check(void)
{
uchar Sum=0;
Sum=Buff_temp_wet[0]+Buff_temp_wet[1]+Buff_temp_wet[2]+Buff_temp_wet[3];
if(Sum==Buff_temp_wet[4])
return 1;
else
return 0;
}
/*******************************************
函數(shù)名稱:void DHT_getvalue(void)
功 能:提取數(shù)值及符號
參 數(shù):無
返回值 :無
********************************************/
void DHT_getvalue(void)
{
//把濕度的高位和地位組合,得到完整的濕度
data_wet=Buff_temp_wet[0];
data_wet <<=8;
data_wet |= Buff_temp_wet[1];
//把溫度的高位和地位組合,得到完整的溫度
data_temp=Buff_temp_wet[2];
data_temp <<=8;
data_temp |= Buff_temp_wet[3];
data_temp = data_temp-50;//溫度校正
if(data_temp & 0x8000) //如果溫度是負(fù)值,則轉(zhuǎn)化
{
data_temp &=0x7FFF;
data_temp=0-data_temp;
Flag_zero='-';
}
else
Flag_zero=' ';
}
/*******************************************
函數(shù)名稱:void DHT_toStr(void)
功 能:溫濕度值轉(zhuǎn)換成字符串
參 數(shù):無
返回值 :無
********************************************/
void DHT_toStr(void)
{
Buff_Meg[0]=0xCA; //
Buff_Meg[1]=0xAA; //濕
Buff_Meg[2]=0xB6; //
Buff_Meg[3]=0xC8; //度
Buff_Meg[4]=0x3A; //:
Buff_Meg[5]=(data_wet%1000)/100+'0'; //
Buff_Meg[6]=(data_wet%100)/10+'0'; //
Buff_Meg[7]='.'; //
Buff_Meg[8]=data_wet%10+'0'; //
Buff_Meg[9]='%'; //%
Buff_Meg[10]='R'; //R
Buff_Meg[11]='H'; //H
Buff_Meg[12]=' '; //H
Buff_Meg[13]=0xCE; //
Buff_Meg[14]=0xC2; //溫
Buff_Meg[15]=0xB6; //
Buff_Meg[16]=0xC8; //度
Buff_Meg[17]=0x3A; //:
Buff_Meg[18]=Flag_zero;
Buff_Meg[19]=(data_temp%1000)/100+'0'; //
Buff_Meg[20]=(data_temp%100)/10+'0'; //
Buff_Meg[21]='.'; //.
Buff_Meg[22]=data_temp%10+'0'; //
Buff_Meg[23]=0xA1; //
Buff_Meg[24]=0xE3; //
Buff_Meg[25]='C'; //
Buff_Meg[26]=0x00; //
Buff_Meg[27]=0x0A; //
Buff_Meg[28]=0x0D; //
}
/*******************************************
函數(shù)名稱:Display_distance()
功 能:顯示距離
參 數(shù):無
返回值 :無
********************************************/
void Display_distance(void)
{
if(dis_buff[0]!='0')
disp_word(64,2,dis_buff[0]);
else
disp_word(64,2,' ');
if(dis_buff[1]!='0')
disp_word(72,2,dis_buff[1]);
else
disp_word(72,2,' ');
disp_word(80,2,dis_buff[2]);
disp_word(88,2,'c');
disp_word(96,2,'m');
}
/*******************************************
函數(shù)名稱:Display_temperature()
功 能:顯示溫度
參 數(shù):無
返回值 :無
********************************************/
void Display_temperature(void)
{
disp_word(64,4,dis_buff[0]);
disp_word(72,4,dis_buff[1]);
disp_word(80,4,'.');
disp_word(88,4,dis_buff[2]);
disp_word(96,4,'C');
}
/*******************************************
函數(shù)名稱:void Display_humidity()
功 能:顯示濕度
參 數(shù):無
返回值 :無
********************************************/
void Display_humidity(void)
{
disp_word(64,6,dis_buff[0]);
disp_word(72,6,dis_buff[1]);
disp_word(80,6,'.');
disp_word(88,6,dis_buff[2]);
disp_word(96,6,'%');
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -