#include "DHT11.h" #include "hi_time.h" void GPIO_mode_out() { IoTGpioInit(DHT11_DQ_GPIO); IoTGpioSetFunc(DHT11_DQ_GPIO, IOT_GPIO_FUNC_GPIO_13_GPIO); IoTGpioSetDir(DHT11_DQ_GPIO, IOT_GPIO_DIR_OUT); // 设置为输出模式 } void GPIO_mode_in() { IoTGpioInit(DHT11_DQ_GPIO); IoTGpioSetFunc(DHT11_DQ_GPIO, IOT_GPIO_FUNC_GPIO_13_GPIO); IoTGpioSetDir(DHT11_DQ_GPIO, IOT_GPIO_DIR_IN); // 设置为输入模式 } static uint8_t DHT11_DQ_IN(void) { IotGpioValue temp = {0}; IoTGpioGetInputVal(DHT11_DQ_GPIO,&temp); return temp; } //Reset DHT11 void DHT11_Rst(void) { GPIO_mode_out(); //SET OUTPUT DHT11_DQ_OUT_OFF; //GPIOA.0=0 osDelay(2); //Pull down Least 18ms DHT11_DQ_OUT_ON; //GPIOA.0=1 hi_udelay(30); //Pull up 20~40us } uint8_t DHT11_Check(void) { uint8_t retry=0; GPIO_mode_in();//SET INPUT while (DHT11_DQ_IN()&&retry<100)//DHT11 Pull down 40~80us { retry++; hi_udelay(1); }; if(retry>=100) return 1; else retry=0; while (!DHT11_DQ_IN()&&retry<100)//DHT11 Pull up 40~80us { retry++; hi_udelay(1); }; if(retry>=100) return 1;//chack error return 0; } uint8_t DHT11_Read_Bit(void) { uint8_t retry=0; while(DHT11_DQ_IN()&&retry<100)//wait become Low level { retry++; hi_udelay(1); } retry=0; while(!DHT11_DQ_IN()&&retry<100)//wait become High level { retry++; hi_udelay(1); } hi_udelay(50);//wait 40us if(DHT11_DQ_IN()) return 1; else return 0; } uint8_t DHT11_Read_Byte(void) { uint8_t i,dat; dat=0; for (i=0;i<8;i++) { dat<<=1; dat|=DHT11_Read_Bit(); } return dat; } uint8_t DHT11_Read_Data(uint8_t *temperature,uint8_t *humidity) { uint8_t buf[5]; uint8_t i; DHT11_Rst(); if(DHT11_Check()==0) { for(i=0;i<5;i++) { buf[i]=DHT11_Read_Byte(); } if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4]) { *humidity=buf[0]; *temperature=buf[2]; } } else return 1; return 0; }