|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区
您需要 登录 才可以下载或查看,没有账号?立即注册
×
/***********************************************************************************************
文件:DHT21.H
作者:沨
用途:温湿度传感器DHT21(AM2301)驱动程序
MCU: MSP430F149 晶振:8MHz
编译器:IAR Ror MSP430 5.10
日期:2010-11-05
***********************************************************************************************/
#include <msp430x14x.h>
typedef unsigned char uchar;
typedef unsigned int uint;
//***************************端口定义*************************************
#define Set_DHTin P2DIR &= ~BIT5
#define Set_DHTout P2DIR |= BIT5
#define DHT_0 P2OUT &= ~BIT5
#define DHT_1 P2OUT |= BIT5
#define DHT_IN (P2IN & BIT5)
//************************************************************************
#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))
//************************************************************************
//***************************函数声明*************************************
/*
uchar DHT_Readchar(void); //单总线读取一字节
void Read_DHT(void); //读取温湿度值
uchar DHT_Check(void); //校验读取结果,正确返回1否则返回0
void DHT_getvalue(void); //提取温湿度值及符号
void DHT_toStr(void); //温湿度值转换成字符串
*/
//*************************定义全局变量**********************************
uchar Buff_temp_wet[5];
uchar Buff_Meg[29];
uint data_temp,data_wet;
uchar Flag_zero;
/*******************************************
函数名称:DHT_Readchar
功 能:从DHT21读取一个字节的数据
参 数:无
返回值 :读出的一个字节数据
********************************************/
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循环
}
// _EINT();
return temp;
}
/*******************************************
函数名称:Read_DHT()
功 能:读取温度适度值
参 数:无
返回值 :无
********************************************/
void Read_DHT(void)
{ uchar i;
uint TimeFlag = 0;
// _DINT();
Set_DHTout;
DHT_0; //主机拉低
delay_ms(5); //延时5ms
DHT_1; //总线由上拉电阻拉高
Set_DHTin; //主机设为输入 判断从机响应信号
delay_us(40); //延时40us
if(!DHT_IN)
{
TimeFlag=2;
while((!DHT_IN)&&TimeFlag++); //判断从机发出的80us低电平响应信号是否结束
TimeFlag=2;
while((DHT_IN)&&TimeFlag++); //判断从机发出的80us高电平,如发出则进入数据接收状态
for(i = 0; i < 5;i++)
Buff_temp_wet=DHT_Readchar();
DHT_1;
}
// _EINT();
}
/*******************************************
函数名称:uchar DHT_Check(void)
功 能:校验
参 数:无
返回值 :无
********************************************/
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;
}
/*******************************************
函数名称:void DHT_getvalue(void)
功 能:提取数值及符号
参 数:无
返回值 :无
********************************************/
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];
if(data_temp & 0x8000) //如果温度是负值,则转化
{
data_temp &=0x7FFF;
data_temp=0-data_temp;
Flag_zero='-';
}
else
Flag_zero=' ';
}
/*******************************************
函数名称:void DHT_toStr(void)
功 能:温湿度值转换成字符串
参 数:无
返回值 :无
********************************************/
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; //
} |
|