⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dht21.h

📁 超声波测距+温湿度传感器
💻 H
字号:
/***********************************************************************************************
文件:DHT21.H
作者:杨斌
用途:温湿度传感器DHT21(AM2301)驱动程序
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)) 
//************************************************************************

 
//***************************函数声明*************************************
/*
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;
uchar dis_buff[3]={'0','0','0'};

/*******************************************
函数名称: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[i]=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];
  data_temp = data_temp-50;//温度校正
  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;	//
}

/*******************************************
函数名称:Display_distance()
功    能:显示距离
参    数:无
返回值  :无
********************************************/
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');
}

/*******************************************
函数名称:Display_temperature()
功    能:显示温度
参    数:无
返回值  :无
********************************************/
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');
}

/*******************************************
函数名称:void Display_humidity()
功    能:显示湿度
参    数:无
返回值  :无
********************************************/
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,'%');
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -