DHT11.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #include "DHT11.h"
  2. #include "hi_time.h"
  3. void GPIO_mode_out()
  4. {
  5. IoTGpioInit(DHT11_DQ_GPIO);
  6. IoTGpioSetFunc(DHT11_DQ_GPIO, IOT_GPIO_FUNC_GPIO_13_GPIO);
  7. IoTGpioSetDir(DHT11_DQ_GPIO, IOT_GPIO_DIR_OUT); // 设置为输出模式
  8. }
  9. void GPIO_mode_in()
  10. {
  11. IoTGpioInit(DHT11_DQ_GPIO);
  12. IoTGpioSetFunc(DHT11_DQ_GPIO, IOT_GPIO_FUNC_GPIO_13_GPIO);
  13. IoTGpioSetDir(DHT11_DQ_GPIO, IOT_GPIO_DIR_IN); // 设置为输入模式
  14. }
  15. static uint8_t DHT11_DQ_IN(void)
  16. {
  17. IotGpioValue temp = {0};
  18. IoTGpioGetInputVal(DHT11_DQ_GPIO,&temp);
  19. return temp;
  20. }
  21. //Reset DHT11
  22. void DHT11_Rst(void)
  23. {
  24. GPIO_mode_out(); //SET OUTPUT
  25. DHT11_DQ_OUT_OFF; //GPIOA.0=0
  26. osDelay(2); //Pull down Least 18ms
  27. DHT11_DQ_OUT_ON; //GPIOA.0=1
  28. hi_udelay(30); //Pull up 20~40us
  29. }
  30. uint8_t DHT11_Check(void)
  31. {
  32. uint8_t retry=0;
  33. GPIO_mode_in();//SET INPUT
  34. while (DHT11_DQ_IN()&&retry<100)//DHT11 Pull down 40~80us
  35. {
  36. retry++;
  37. hi_udelay(1);
  38. };
  39. if(retry>=100)
  40. return 1;
  41. else
  42. retry=0;
  43. while (!DHT11_DQ_IN()&&retry<100)//DHT11 Pull up 40~80us
  44. {
  45. retry++;
  46. hi_udelay(1);
  47. };
  48. if(retry>=100)
  49. return 1;//chack error
  50. return 0;
  51. }
  52. uint8_t DHT11_Read_Bit(void)
  53. {
  54. uint8_t retry=0;
  55. while(DHT11_DQ_IN()&&retry<100)//wait become Low level
  56. {
  57. retry++;
  58. hi_udelay(1);
  59. }
  60. retry=0;
  61. while(!DHT11_DQ_IN()&&retry<100)//wait become High level
  62. {
  63. retry++;
  64. hi_udelay(1);
  65. }
  66. hi_udelay(50);//wait 40us
  67. if(DHT11_DQ_IN())
  68. return 1;
  69. else
  70. return 0;
  71. }
  72. uint8_t DHT11_Read_Byte(void)
  73. {
  74. uint8_t i,dat;
  75. dat=0;
  76. for (i=0;i<8;i++)
  77. {
  78. dat<<=1;
  79. dat|=DHT11_Read_Bit();
  80. }
  81. return dat;
  82. }
  83. uint8_t DHT11_Read_Data(uint8_t *temperature,uint8_t *humidity)
  84. {
  85. uint8_t buf[5];
  86. uint8_t i;
  87. DHT11_Rst();
  88. if(DHT11_Check()==0)
  89. {
  90. for(i=0;i<5;i++)
  91. {
  92. buf[i]=DHT11_Read_Byte();
  93. }
  94. if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
  95. {
  96. *humidity=buf[0];
  97. *temperature=buf[2];
  98. }
  99. }
  100. else
  101. return 1;
  102. return 0;
  103. }