📄 dht21.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 + -