#ifndef _DHTSENSOR_
#define _DHTSENSOR_

 u32 WIRE_PORT;
 u8 WIRE_BIT;
 
 #define Set_WIRE_DDR 	GPIO_Setting((GPIO_TypeDef*)WIRE_PORT,WIRE_BIT,GPIO_Mode_Out_PP)
 #define Cls_WIRE_DDR 	GPIO_Setting((GPIO_TypeDef*)WIRE_PORT,WIRE_BIT,GPIO_Mode_IN_FLOATING)
 #define Set_WIRE     	GPIO_SetBits((GPIO_TypeDef*)WIRE_PORT,(1<<WIRE_BIT))
 #define Cls_WIRE     	GPIO_ResetBits((GPIO_TypeDef*)WIRE_PORT,(1<<WIRE_BIT))
 #define WIRE_PinStatus  GPIO_ReadInputDataBit((GPIO_TypeDef*)WIRE_PORT,(1<<WIRE_BIT))
 
#define _DTHSDELAYBASIC_		{asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");}
void DTHS_Delayus(unsigned long nCount)
{
	unsigned int i;
	for (i=0;i<nCount;i++){_DTHSDELAYBASIC_;}
}
void DTHS_Delayms(unsigned long nCount)
{
	unsigned long i;
	unsigned int j;
	for (i=0;i<nCount;i++)
	{
		for (j=0;j<4500;j++)
		{_DTHSDELAYBASIC_;}
	}
}
void DTHS_Delay28us(void)
{
	DTHS_Delayus(165);//165-28.2us 175-30.2us
}
void DTHS_Delay40us(void)
{
	DTHS_Delayus(240);//240-40.2us
}
void DTHS_Delay18ms(void)
{
	DTHS_Delayms(20);//18-18ms
}
// read 8 bits onice
unsigned char DTHS_GetOneByte(void)
{
	unsigned char i,temp=0,data=0;
	for(i=0;i<8;i++)
	{
		while(!WIRE_PinStatus);// 表示读取的高电位延时大于20us则读取的是1,否则读取的是0
		DTHS_Delay28us(); //通过 U8FLAG 可判断 bit11 显示数据的脉长 0:26-28us
		if(WIRE_PinStatus)temp=0X01;
		else temp=0X00;
		while(WIRE_PinStatus);
		data<<=1;
		data|=temp;
	}
	return data;
}
//--------------------- 温湿度读取子程序 ------------
//DHT11一次通讯时间最大3ms，主机连续采样间隔建议不小于100ms。
//DTH11采样周期1s
//8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据
unsigned char GetDHT11Data(unsigned char i,unsigned int *pdat)
{
	unsigned char sum,s;
	unsigned char hum_int,hum_dec;
	unsigned char temp_int,temp_dec;
	
	Set_WIRE_DDR;
	Cls_WIRE;
	DTHS_Delay18ms();//主机拉低 18ms
	Set_WIRE;
	DTHS_Delay40us();//总线由上拉电阻拉高 主机延时 20us-40us
	Cls_WIRE_DDR;//释放总线 主机设为输入 判断从机响应信号
	
	if(!WIRE_PinStatus)// 判断从机是否有低电平响应信号 如不响应则跳出，响应则向下运行
	{
		while(!WIRE_PinStatus);//判断从机是否发出 80us 的低电平响应信号是否结束  
		while(WIRE_PinStatus);//判断从机是否发出 80us 的高电平，如发出则进入数据接收状态
		
		hum_int=DTHS_GetOneByte();//湿度整数
		hum_dec=DTHS_GetOneByte();//湿度小数 读出为0
		temp_int=DTHS_GetOneByte();//湿度整数
		temp_dec=DTHS_GetOneByte();//湿度小数 读出为0
		sum=DTHS_GetOneByte();
		
		Set_WIRE_DDR;
		Set_WIRE;
		
		s=hum_int+hum_dec+temp_int+temp_dec;//计算校验和
		if(s==sum)
		{
			if(i)//湿度
			{
				*pdat=hum_int;
			}
			else//温度
			{
				*pdat=temp_int;
			}
			return (1);
		}
		else *pdat=999;//读到错误数据
	}
	else *pdat=888;//读不到数据
	return(0);
}

#endif