DHT11.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. #include "stm32f10x.h"
  2. #include "Delay.h"
  3. #include "DHT11.h"
  4. #include "sys.h"
  5. //unsigned char humidity, temperature, check_sum ;
  6. //全局变量定义区
  7. //***************************************************************************/
  8. // //uchar i;
  9. // uchar U8FLAG,k;
  10. // uchar U8count,U8temp;
  11. // uchar U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
  12. // uchar U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
  13. // uchar U8comdata;
  14. // uint ReceiveHighByte;
  15. // uint ReceiveLowByte;
  16. //***************Global defination for DHT11 end****//
  17. void DHT11_PortIN ( void )
  18. {
  19. GPIO_InitTypeDef GPIO_InitStructure;
  20. RCC_APB2PeriphClockCmd ( DHT11_IORCC, ENABLE );
  21. //切换为输入口
  22. GPIO_InitStructure.GPIO_Pin = DHT11_DATA_PIN;
  23. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  24. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  25. GPIO_Init ( DHT11_PORT, &GPIO_InitStructure );
  26. }
  27. void DHT11_PortOUT ( void )
  28. {
  29. GPIO_InitTypeDef GPIO_InitStructure;
  30. RCC_APB2PeriphClockCmd ( DHT11_IORCC, ENABLE );
  31. GPIO_InitStructure.GPIO_Pin = ( DHT11_DATA_PIN );
  32. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
  33. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  34. GPIO_Init ( DHT11_PORT, &GPIO_InitStructure );
  35. }
  36. static u8 _us = 0;
  37. unsigned char StartDHT11 ( void )
  38. {
  39. //主机开始信号
  40. /*
  41. 低18ms->高30us->等待dht响应(拉低)
  42. */
  43. DHT11_PortOUT();
  44. DHT11_Out = 0;
  45. delay_ms ( 18 ); //触发开始,总线拉低要大于18ms
  46. DHT11_Out = 1; //释放总线
  47. //delay_us(30); //拉低 20-40uS 等待DHT11的低电平响应信号
  48. //dht响应
  49. /*
  50. 正确,拉低(80us) ->拉高(80us)->传送数据
  51. */
  52. DHT11_PortIN(); //改为输入
  53. //实际6
  54. _us = 0;
  55. while ( DHT11_In ) //低电平的响应信号,20-40uS
  56. {
  57. if ( ++_us > 40 )
  58. {
  59. return 0;
  60. }
  61. delay_us ( 1 );
  62. }
  63. //实际53
  64. _us = 0;
  65. while ( !DHT11_In ) //低电平的响应信号,80us
  66. {
  67. if ( ++_us > 80 )
  68. {
  69. return 0;
  70. }
  71. delay_us ( 1 );
  72. }
  73. //实际54
  74. _us = 0;
  75. while ( DHT11_In ) //紧接着是80us的高电平数据准备信号
  76. {
  77. if ( ++_us > 80 )
  78. {
  79. return 0;
  80. }
  81. delay_us ( 1 );
  82. }
  83. //拉低后DHT11会拉高总线80us,接着会开始传数据
  84. return 1;
  85. }
  86. /*
  87. 传输数据:
  88. 1.一次8bit
  89. 2.
  90. 开始(50us 低)->
  91. 0: 26-28us 高+ (50us 低) = 80us
  92. 1: 70us 高+ (50us 低) = 120us
  93. 3.判断0/1,
  94. 1. 26-28us < n < 26-28us+50us
  95. 2. 0us < n < 70us
  96. 即,
  97. 延时35-40us,
  98. 高 = 1,是70us的,需要延时40us
  99. 低 = 0,是26-28us的
  100. */
  101. static uint8_t Read_Byte ( void )
  102. {
  103. u8 i, temp = 0xff;
  104. //开始必须是为低的50us 开始信号
  105. if ( !DHT11_In )
  106. {
  107. for ( i = 0; i < 8; i++ )
  108. {
  109. //等待高电平,消耗50us
  110. _us = 0;
  111. while ( !DHT11_In )
  112. {
  113. if ( ++_us > 50 )
  114. {
  115. return temp;
  116. }
  117. delay_us ( 1 );
  118. }
  119. //等待低电平,真实数据的结束
  120. _us = 0;
  121. while ( DHT11_In )
  122. {
  123. if ( ++_us > 80 )
  124. {
  125. return temp;
  126. }
  127. delay_us ( 1 );
  128. }
  129. if ( _us > 37 ) //35-40us后仍为高电平表示数据“1”
  130. {
  131. temp |= ( uint8_t ) ( 0x01 << ( 7 - i ) ); //把第7-i位置1
  132. }
  133. else //40us后为低电平表示数据“0”
  134. {
  135. temp &= ( uint8_t ) ~ ( 0x01 << ( 7 - i ) ); //把第7-i位置0
  136. }
  137. }
  138. }
  139. return temp;
  140. }
  141. uint8_t Read_DHT11 ( DHT11_Data_TypeDef *DHT11_Data )
  142. {
  143. uint8_t res;
  144. uint8_t check_sum;
  145. if ( StartDHT11() ) //判断是否已经响应
  146. {
  147. /*开始接收数据*/
  148. DHT11_Data->humi_int = Read_Byte();
  149. DHT11_Data->humi_deci = Read_Byte();
  150. DHT11_Data->temp_int = Read_Byte();
  151. DHT11_Data->temp_deci = Read_Byte();
  152. DHT11_Data->check_sum = Read_Byte();
  153. check_sum = DHT11_Data->humi_int + DHT11_Data->humi_deci + DHT11_Data->temp_int + DHT11_Data->temp_deci;
  154. /*检查读取的数据是否正确*/
  155. if ( DHT11_Data->check_sum == check_sum )
  156. {
  157. res = SUCCESS;
  158. }
  159. else
  160. {
  161. res = ERROR;
  162. }
  163. }
  164. else
  165. {
  166. res = ERROR;
  167. }
  168. return res;
  169. }