#include "ets_sys.h"
#include "os_type.h"
#include "osapi.h"
#include "mem.h"
#include "user_interface.h"
#include "uart.h"
#include "gpio.h"
#include "dht11.h"
int DHT=14; //数据接口

char  U8count,U8temp,U8FLAG,U8comdata;
char   U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
char   U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;

void  COM(void)
      {
     
	        int i;
       for(i=0;i<8;i++)	   
	    {
		
	   	    U8FLAG=2;
	   	//----------------------
	      
		  
	    //---------------------- 
	
	   	while((!GPIO_INPUT_GET(DHT))&&U8FLAG++);
			os_delay_us(50);
			
		//	Delay_10us();
	  		U8temp=0;
	     if(GPIO_INPUT_GET(DHT))U8temp=1;
		    U8FLAG=2;
		 while((GPIO_INPUT_GET(DHT))&&U8FLAG++);
		 	
	    //----------------------
	      
	   //----------------------
	   	//超时则跳出for循环		  
	   	 if(U8FLAG==1)break;
	   	//判断数据位是0还是1	 
	   	   
		// 如果高电平高过预定0高电平值则数据位为 1 
	   	 
		   U8comdata<<=1;
	   	   U8comdata|=U8temp;        //0
	     }//rof
	   
	}

	//--------------------------------
	//-----湿度读取子程序 ------------
	//--------------------------------
	//----以下变量均为全局变量--------
	//----温度高8位== U8T_data_H------
	//----温度低8位== U8T_data_L------
	//----湿度高8位== U8RH_data_H-----
	//----湿度低8位== U8RH_data_L-----
	//----校验 8位 == U8checkdata-----
	//----调用相关子程序如下----------
	//---- Delay();, Delay_10us();,COM(); 
	//--------------------------------

	void RH(void)
	{gpiorun(DHT); 	
	  //主机拉低18ms 
       GPIO_OUTPUT_SET(DHT,0);
	   os_delay_us(6000);
	   os_delay_us(6000);
        os_delay_us(6000);		
	   GPIO_OUTPUT_SET(DHT,1);
	 //总线由上拉电阻拉高 主机延时20us
	   os_delay_us(40);
	 //主机设为输入 判断从机响应信号 
	   //GPIO_OUTPUT_SET(DHT,1);
		gpio_output_set(0,0,0,BIT(DHT));
	 //判断从机是否有低电平响应信号 如不响应则跳出，响应则向下运行	  
	   if(!GPIO_INPUT_GET(DHT))		 //T !	  
	   {
	   U8FLAG=2;
	 //判断从机是否发出 80us 的低电平响应信号是否结束	 
	   while((!GPIO_INPUT_GET(DHT))&&U8FLAG++);
	   U8FLAG=2;
	 //判断从机是否发出 80us 的高电平，如发出则进入数据接收状态
	   while((GPIO_INPUT_GET(DHT))&&U8FLAG++);
	 //数据接收状态		 
	   COM();
	   U8RH_data_H_temp=U8comdata;
	   COM();
	   U8RH_data_L_temp=U8comdata;
	   COM();
	   U8T_data_H_temp=U8comdata;
	   COM();
	   U8T_data_L_temp=U8comdata;
	   COM();
	   U8checkdata_temp=U8comdata;
	    GPIO_OUTPUT_SET(DHT,1);
	 //数据校验 
	 
	   U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
	   if(U8temp==U8checkdata_temp)
	   {
	   	  U8RH_data_H=U8RH_data_H_temp;////湿度高8位
	   	  U8RH_data_L=U8RH_data_L_temp;//湿度低8位
		  U8T_data_H=U8T_data_H_temp;//温度高8位
	   	  U8T_data_L=U8T_data_L_temp;//温度低8位
	   	  U8checkdata=U8checkdata_temp;//校验值
	   }//fi
	   }//fi

	}
	int readwdu(){
		
		 RH(); 
	 return U8T_data_H;
		
		}
    int readsdu(){
	   RH(); 
	 return U8RH_data_H;
	    }
