我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 711|回复: 0

DHT21温湿度测量模块驱动

[复制链接]

该用户从未签到

3

主题

0

回帖

0

积分

一级逆天

积分
0

终身成就奖

QQ
发表于 2016-5-16 06:45:48 | 显示全部楼层 |阅读模式
/***********************************************************************************************
文件: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;    //
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

论坛开启做任务可以
额外奖励金币快速赚
积分升级了


Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

平平安安
TOP
快速回复 返回顶部 返回列表