foucsing 发表于 2016-5-16 06:45

DHT21温湿度测量模块驱动

/***********************************************************************************************
文件:DHT21.H
作者:沨
用途:温湿度传感器DHT21(AM2301)驱动程序
MCU: MSP430F149 晶振:8MHz
编译器:IAR Ror MSP430 5.10
日期:2010-11-05
***********************************************************************************************/
#include <msp430x14x.h>

typedef unsigned char uchar;
typedef unsigned intuint;
//***************************端口定义*************************************
#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;
uchar Buff_Meg;
uintdata_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();
    returntemp;
}

/*******************************************
函数名称: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+Buff_temp_wet+Buff_temp_wet+Buff_temp_wet;
if(Sum==Buff_temp_wet)
    return 1;
else
    return 0;
}

/*******************************************
函数名称:void DHT_getvalue(void)
功    能:提取数值及符号
参    数:无
返回值:无
********************************************/
void DHT_getvalue(void)
{
//把湿度的高位和地位组合,得到完整的湿度   
    data_wet=Buff_temp_wet;
    data_wet <<=8;
    data_wet |= Buff_temp_wet;
//把温度的高位和地位组合,得到完整的温度
    data_temp=Buff_temp_wet;
    data_temp <<=8;
    data_temp |= Buff_temp_wet;
    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=0xCA;    //
Buff_Meg=0xAA;    //湿
Buff_Meg=0xB6;    //
Buff_Meg=0xC8;    //度
Buff_Meg=0x3A;    //:

Buff_Meg=(data_wet%1000)/100+'0';    //
Buff_Meg=(data_wet%100)/10+'0';    //
Buff_Meg='.';    //
Buff_Meg=data_wet%10+'0';    //
Buff_Meg='%';    //%
Buff_Meg='R';    //R
Buff_Meg='H';    //H

Buff_Meg=' ';    //H
   
Buff_Meg=0xCE;    //
Buff_Meg=0xC2;    //温
Buff_Meg=0xB6;    //
Buff_Meg=0xC8;    //度
Buff_Meg=0x3A;    //:

Buff_Meg=Flag_zero;
Buff_Meg=(data_temp%1000)/100+'0';    //
Buff_Meg=(data_temp%100)/10+'0';    //
Buff_Meg='.';    //.
Buff_Meg=data_temp%10+'0';    //
Buff_Meg=0xA1;    //
Buff_Meg=0xE3;    //
Buff_Meg='C';    //
Buff_Meg=0x00;    //
Buff_Meg=0x0A;    //
Buff_Meg=0x0D;    //
}
页: [1]
查看完整版本: DHT21温湿度测量模块驱动