7cf5af90447c5fe50d55d1009c8a9fd16025f03b.svn-base 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. C51 COMPILER V9.53.0.0 DHT11 09/30/2018 11:45:29 PAGE 1
  2. C51 COMPILER V9.53.0.0, COMPILATION OF MODULE DHT11
  3. OBJECT MODULE PLACED IN .\Output\DHT11.obj
  4. COMPILER INVOKED BY: D:\Keil_v5\C51\BIN\C51.EXE ..\..\Code\User\Driver\DHT11.c LARGE OPTIMIZE(0,SPEED) BROWSE INCDIR(../
  5. -../Code/Include;../../Code/User;../../Code/User/Common;../../Code/User/Driver) DEFINE(FOSC_160000=1) DEBUG OBJECTEXTEND
  6. -PRINT(.\Output\LST\DHT11.lst) TABS(2) OBJECT(.\Output\DHT11.obj)
  7. line level source
  8. 1 /**
  9. 2 * @File: DHT11.c
  10. 3 * @Author: Kinve JQ
  11. 4 * @Version: V0.1
  12. 5 * @Date: 2018.09.30
  13. 6 * @Brief:
  14. 7 * @Modify:
  15. 8 2018.09.30.Kinve:1.创建文件
  16. 9 **/
  17. 10
  18. 11 #include "DHT11.h"
  19. 12
  20. 13 #define delay_ms(ms) Timer3_Delay1ms(ms)
  21. 14 #define delay_us(us) Timer3_Delay1us(us) //{u8 i; for(i=0;i<us;i++) {nop;}}
  22. 15
  23. 16 DHT11_Data_TypeDef DHT11_Data;
  24. 17
  25. 18 //全局变量定义区
  26. 19 //***************************************************************************/
  27. 20 // //uchar i;
  28. 21 // uchar U8FLAG,k;
  29. 22 // uchar U8count,U8temp;
  30. 23 // uchar U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
  31. 24 // uchar U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
  32. 25 // uchar U8comdata;
  33. 26 // uint ReceiveHighByte;
  34. 27 // uint ReceiveLowByte;
  35. 28 //***************Global defination for DHT11 end****//
  36. 29
  37. 30 void DHT11_PortIN ( void )
  38. 31 {
  39. 32 1 #if 0
  40. GPIO_InitTypeDef GPIO_InitStructure;
  41. RCC_APB2PeriphClockCmd ( DHT11_IORCC, ENABLE );
  42. //切换为输入口
  43. GPIO_InitStructure.GPIO_Pin = DHT11_DATA_PIN;
  44. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  45. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  46. GPIO_Init ( DHT11_PORT, &GPIO_InitStructure );
  47. #endif
  48. 43 1 }
  49. 44 void DHT11_PortOUT ( void )
  50. 45 {
  51. 46 1 #if 0
  52. GPIO_InitTypeDef GPIO_InitStructure;
  53. RCC_APB2PeriphClockCmd ( DHT11_IORCC, ENABLE );
  54. GPIO_InitStructure.GPIO_Pin = ( DHT11_DATA_PIN );
  55. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
  56. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  57. C51 COMPILER V9.53.0.0 DHT11 09/30/2018 11:45:29 PAGE 2
  58. GPIO_Init ( DHT11_PORT, &GPIO_InitStructure );
  59. #endif
  60. 56 1 }
  61. 57
  62. 58 /*
  63. 59 1.主机L >18ms
  64. 60 2.主机H 20-40us
  65. 61 3.DHT L 80us
  66. 62 4.DHT H 80us
  67. 63 5.DHT DATA....
  68. 64 */
  69. 65 static u8 _us = 0;
  70. 66 unsigned char DHT11_Start ( void )
  71. 67 {
  72. 68 1
  73. 69 1 //主机开始信号
  74. 70 1 /*
  75. 71 1 低18ms->高30us->等待dht响应(拉低)
  76. 72 1 */
  77. 73 1 DHT11_PortOUT();
  78. 74 1 DHT11_Out = 0;
  79. 75 1 delay_ms ( 20 ); //触发开始,总线拉低要大于18ms
  80. 76 1 DHT11_Out = 1; //释放总线
  81. 77 1 delay_us(30); //拉低 20-40uS 等待DHT11的低电平响应信号
  82. 78 1
  83. 79 1 //dht响应
  84. 80 1 /*
  85. 81 1 正确,拉低(80us) ->拉高(80us)->传送数据
  86. 82 1 */
  87. 83 1 DHT11_PortIN(); //改为输入
  88. 84 1
  89. 85 1 #if 0
  90. //实际6
  91. _us = 0;
  92. while ( DHT11_In ) //低电平的响应信号,20-40uS
  93. {
  94. if ( ++_us > 40 )
  95. {
  96. return 0;
  97. }
  98. delay_us ( 1 );
  99. }
  100. #endif
  101. 99 1
  102. 100 1 //实际53
  103. 101 1 _us = 0;
  104. 102 1
  105. 103 1 while ( !DHT11_In ) //低电平的响应信号,80us
  106. 104 1 {
  107. 105 2 if ( ++_us > 80 )
  108. 106 2 {
  109. 107 3 return 0;
  110. 108 3 }
  111. 109 2
  112. 110 2 delay_us ( 1 );
  113. 111 2 }
  114. 112 1
  115. 113 1 //实际54
  116. 114 1 _us = 0;
  117. 115 1
  118. C51 COMPILER V9.53.0.0 DHT11 09/30/2018 11:45:29 PAGE 3
  119. 116 1 while ( DHT11_In ) //紧接着是80us的高电平数据准备信号
  120. 117 1 {
  121. 118 2 if ( ++_us > 80 )
  122. 119 2 {
  123. 120 3 return 0;
  124. 121 3 }
  125. 122 2
  126. 123 2 delay_us ( 1 );
  127. 124 2 }
  128. 125 1
  129. 126 1 //拉低后DHT11会拉高总线80us,接着会开始传数据
  130. 127 1
  131. 128 1 return 1;
  132. 129 1
  133. 130 1 }
  134. 131
  135. 132
  136. 133 /*
  137. 134 传输数据:
  138. 135 1.一次8bit
  139. 136 2.
  140. 137 开始(50us 低)->
  141. 138 0: 26-28us 高+ (50us 低) = 80us
  142. 139 1: 70us 高+ (50us 低) = 120us
  143. 140
  144. 141 3.判断0/1,
  145. 142 1. 26-28us < n < 26-28us+50us
  146. 143 2. 0us < n < 70us
  147. 144 即,
  148. 145 延时35-40us,
  149. 146 高 = 1,是70us的,需要延时40us
  150. 147 低 = 0,是26-28us的
  151. 148
  152. 149 */
  153. 150 static uint8_t Read_Byte ( void )
  154. 151 {
  155. 152 1 u8 i, temp = 0xff;
  156. 153 1
  157. 154 1 //开始必须是为低的50us 开始信号
  158. 155 1 if ( !DHT11_In )
  159. 156 1 {
  160. 157 2 for ( i = 0; i < 8; i++ )
  161. 158 2 {
  162. 159 3 //等待高电平,消耗50us
  163. 160 3 _us = 0;
  164. 161 3
  165. 162 3 while ( !DHT11_In )
  166. 163 3 {
  167. 164 4 if ( ++_us > 50 )
  168. 165 4 {
  169. 166 5 return temp;
  170. 167 5 }
  171. 168 4
  172. 169 4 delay_us ( 1 );
  173. 170 4 }
  174. 171 3
  175. 172 3 //等待低电平,真实数据的结束
  176. 173 3 _us = 0;
  177. 174 3
  178. 175 3 while ( DHT11_In )
  179. 176 3 {
  180. 177 4 if ( ++_us > 80 )
  181. C51 COMPILER V9.53.0.0 DHT11 09/30/2018 11:45:29 PAGE 4
  182. 178 4 {
  183. 179 5 return temp;
  184. 180 5 }
  185. 181 4
  186. 182 4 delay_us ( 1 );
  187. 183 4 }
  188. 184 3
  189. 185 3 if ( _us > 37 ) //35-40us后仍为高电平表示数据“1”
  190. 186 3 {
  191. 187 4 temp |= ( uint8_t ) ( 0x01 << ( 7 - i ) ); //把第7-i位置1
  192. 188 4 }
  193. 189 3 else //40us后为低电平表示数据“0”
  194. 190 3 {
  195. 191 4 temp &= ( uint8_t ) ~ ( 0x01 << ( 7 - i ) ); //把第7-i位置0
  196. 192 4 }
  197. 193 3 }
  198. 194 2 }
  199. 195 1
  200. 196 1 return temp;
  201. 197 1 }
  202. 198
  203. 199
  204. 200
  205. 201 uint8_t DHT11_Read_Data ( DHT11_Data_TypeDef *DHT11_Data )
  206. 202 {
  207. 203 1 uint8_t res;
  208. 204 1 uint8_t check_sum;
  209. 205 1
  210. 206 1 if ( DHT11_Start() ) //判断是否已经响应
  211. 207 1 {
  212. 208 2 /*开始接收数据*/
  213. 209 2 DHT11_Data->humi_int = Read_Byte();
  214. 210 2 DHT11_Data->humi_deci = Read_Byte();
  215. 211 2 DHT11_Data->temp_int = Read_Byte();
  216. 212 2 DHT11_Data->temp_deci = Read_Byte();
  217. 213 2 DHT11_Data->check_sum = Read_Byte();
  218. 214 2
  219. 215 2 check_sum = DHT11_Data->humi_int + DHT11_Data->humi_deci + DHT11_Data->temp_int + DHT11_Data->temp
  220. -_deci;
  221. 216 2
  222. 217 2 /*检查读取的数据是否正确*/
  223. 218 2 if ( DHT11_Data->check_sum == check_sum )
  224. 219 2 {
  225. 220 3 res = SUCCESS;
  226. 221 3 }
  227. 222 2 else
  228. 223 2 {
  229. 224 3 res = ERROR;
  230. 225 3 }
  231. 226 2 }
  232. 227 1 else
  233. 228 1 {
  234. 229 2 res = ERROR;
  235. 230 2 }
  236. 231 1
  237. 232 1 return res;
  238. 233 1 }
  239. 234
  240. 235 /********************* (C) COPYRIGHT Kinve JQ *******END OF FILE ********/
  241. 236
  242. 237
  243. C51 COMPILER V9.53.0.0 DHT11 09/30/2018 11:45:29 PAGE 5
  244. MODULE INFORMATION: STATIC OVERLAYABLE
  245. CODE SIZE = 605 ----
  246. CONSTANT SIZE = ---- ----
  247. XDATA SIZE = 13 ----
  248. PDATA SIZE = ---- ----
  249. DATA SIZE = ---- ----
  250. IDATA SIZE = ---- ----
  251. BIT SIZE = ---- ----
  252. END OF MODULE INFORMATION.
  253. C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)