dht11.lst 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. C51 COMPILER V9.60.0.0 DHT11 02/21/2022 21:12:49 PAGE 1
  2. C51 COMPILER V9.60.0.0, COMPILATION OF MODULE DHT11
  3. OBJECT MODULE PLACED IN .\Objects\dht11.obj
  4. COMPILER INVOKED BY: D:\Keil_v5\C51\BIN\C51.EXE dht11.c OPTIMIZE(8,SPEED) BROWSE DEBUG OBJECTEXTEND PRINT(.\Listings\dht
  5. -11.lst) TABS(2) OBJECT(.\Objects\dht11.obj)
  6. line level source
  7. 1 #include "dht11.h"
  8. 2
  9. 3
  10. 4 void dht11_Delay32us(void) //@11.0592MHz
  11. 5 {
  12. 6 1 unsigned char i;
  13. 7 1
  14. 8 1 i = 12;
  15. 9 1 while (--i);
  16. 10 1 }
  17. 11 void dht11_Delay20ms(void) //@11.0592MHz
  18. 12 {
  19. 13 1 unsigned char i, j;
  20. 14 1
  21. 15 1 i = 36;
  22. 16 1 j = 217;
  23. 17 1 do
  24. 18 1 {
  25. 19 2 while (--j);
  26. 20 2 } while (--i);
  27. 21 1 }
  28. 22 void dht11_Delay50us(void) //@11.0592MHz
  29. 23 {
  30. 24 1 unsigned char i;
  31. 25 1
  32. 26 1 _nop_();
  33. 27 1 i = 20;
  34. 28 1 while (--i);
  35. 29 1 }
  36. 30
  37. 31
  38. 32 unsigned char dht11_read_byte(void)
  39. 33 {
  40. 34 1 unsigned char r_val = 0;
  41. 35 1 unsigned char t_count = 0; //计时器,防止超时;
  42. 36 1 unsigned char i;
  43. 37 1
  44. 38 1 for(i = 0 ; i < 8 ; i++)
  45. 39 1 {
  46. 40 2 t_count = 0;
  47. 41 2
  48. 42 2 //低电平50us后开始一个数据位读取;
  49. 43 2 while( !DHT11_PIN )
  50. 44 2 {
  51. 45 3 _nop_();
  52. 46 3 t_count++;
  53. 47 3 if(t_count > 250) //超时;
  54. 48 3 return 100;
  55. 49 3 }
  56. 50 2 t_count = 0;
  57. 51 2
  58. 52 2 dht11_Delay32us(); //32us
  59. 53 2
  60. 54 2 //高电平26~28us表示'0',70us表示'1'
  61. C51 COMPILER V9.60.0.0 DHT11 02/21/2022 21:12:49 PAGE 2
  62. 55 2 if( DHT11_PIN == 1 )
  63. 56 2 {
  64. 57 3 r_val <<= 1;
  65. 58 3 r_val |= 1;
  66. 59 3 }
  67. 60 2 else
  68. 61 2 {
  69. 62 3 r_val <<= 1;
  70. 63 3 continue;
  71. 64 3 }
  72. 65 2
  73. 66 2 //等待DHT11数据输出结束;
  74. 67 2 while( DHT11_PIN == 1)
  75. 68 2 {
  76. 69 3 _nop_();
  77. 70 3 t_count++;
  78. 71 3 if(t_count>250)
  79. 72 3 {
  80. 73 4 return 100;
  81. 74 4 }
  82. 75 3 }
  83. 76 2 }
  84. 77 1 return r_val;
  85. 78 1 }
  86. 79
  87. 80
  88. 81 char dht11_value(unsigned char *temp , unsigned char *humi , unsigned char flag)
  89. 82 {
  90. 83 1 unsigned char t_count = 0; //计时器;
  91. 84 1 unsigned char h_i = 0 , h_f = 0;
  92. 85 1 unsigned char t_i = 0 , t_f = 0;
  93. 86 1 unsigned char check_sum = 0;
  94. 87 1
  95. 88 1 DHT11_PIN_OUT();
  96. 89 1 DHT11_PIN_L(); //输出低电平;
  97. 90 1
  98. 91 1 //低电平持续时间必须大于18ms;
  99. 92 1 dht11_Delay20ms(); //20ms;
  100. 93 1
  101. 94 1 DHT11_PIN_H(); //主机结束信号,高电平;
  102. 95 1
  103. 96 1 //主机等待20us~40us,读取DHT11响应输出;
  104. 97 1 dht11_Delay32us();
  105. 98 1
  106. 99 1 DHT11_PIN_IN();
  107. 100 1 if(DHT11_PIN == 0) //正确的响应输出;
  108. 101 1 {
  109. 102 2 while( !DHT11_PIN )
  110. 103 2 {
  111. 104 3 _nop_();
  112. 105 3 t_count++;
  113. 106 3
  114. 107 3 if(t_count > 250) //超时;
  115. 108 3 return -1;
  116. 109 3 }
  117. 110 2
  118. 111 2 t_count = 0;
  119. 112 2
  120. 113 2 dht11_Delay50us(); //DHT11给出响应输出后会拉高总线80us;
  121. 114 2 while( DHT11_PIN ); //等待接收;
  122. 115 2 {
  123. 116 3 _nop_();
  124. C51 COMPILER V9.60.0.0 DHT11 02/21/2022 21:12:49 PAGE 3
  125. 117 3 t_count++;
  126. 118 3
  127. 119 3 if(t_count > 250) //超时;
  128. 120 3 return -1;
  129. 121 3 }
  130. 122 2 EA=0;
  131. 123 2 h_i = dht11_read_byte(); //湿度整数部分;
  132. 124 2 h_f = dht11_read_byte(); //湿度小数部分;
  133. 125 2 t_i = dht11_read_byte(); //温度整数部分;
  134. 126 2 t_f = dht11_read_byte(); //温度小数部分;
  135. 127 2 check_sum = dht11_read_byte(); //校验和;
  136. 128 2 EA=1;
  137. 129 2 //校验和正确或者温湿度整数部分获取正确即表示获取成功!
  138. 130 2 if(check_sum == ( h_i + h_f + t_i + t_f ) || (h_i != 100 && t_i != 100) )
  139. 131 2 {
  140. 132 3 if(flag == DHT11_STRING)
  141. 133 3 {
  142. 134 4 temp[0] = t_i/10+0x30;
  143. 135 4 temp[1] = t_i%10+0x30;
  144. 136 4 humi[0] = h_i/10+0x30;
  145. 137 4 humi[1] = h_i%10+0x30;
  146. 138 4 }
  147. 139 3 else
  148. 140 3 {
  149. 141 4 if(t_i<=50&&h_i<95)
  150. 142 4 {
  151. 143 5 *temp = t_i;
  152. 144 5 *humi = h_i;
  153. 145 5 }
  154. 146 4 }
  155. 147 3 }
  156. 148 2 else
  157. 149 2 {
  158. 150 3 // if(flag == DHT11_STRING)
  159. 151 3 // {
  160. 152 3 // temp[0] = '0';
  161. 153 3 // temp[1] = '0';
  162. 154 3 // humi[0] = '0';
  163. 155 3 // humi[1] = '0';
  164. 156 3 // }
  165. 157 3 // else
  166. 158 3 // {
  167. 159 3 // *temp = 0;
  168. 160 3 // *humi = 0;
  169. 161 3 // }
  170. 162 3
  171. 163 3 return -1;
  172. 164 3 }
  173. 165 2 }
  174. 166 1 else
  175. 167 1 {
  176. 168 2 // if(flag == DHT11_STRING)
  177. 169 2 // {
  178. 170 2 // temp[0] = '0';
  179. 171 2 // temp[1] = '0';
  180. 172 2 // humi[0] = '0';
  181. 173 2 // humi[1] = '0';
  182. 174 2 // }
  183. 175 2 // else
  184. 176 2 // {
  185. 177 2 // *temp = 0;
  186. 178 2 // *humi = 0;
  187. C51 COMPILER V9.60.0.0 DHT11 02/21/2022 21:12:49 PAGE 4
  188. 179 2 // }
  189. 180 2
  190. 181 2 return -1;
  191. 182 2 }
  192. 183 1 return 0;
  193. 184 1 }
  194. 185
  195. 186
  196. 187
  197. 188
  198. MODULE INFORMATION: STATIC OVERLAYABLE
  199. CODE SIZE = 401 ----
  200. CONSTANT SIZE = ---- ----
  201. XDATA SIZE = ---- ----
  202. PDATA SIZE = ---- ----
  203. DATA SIZE = ---- 9
  204. IDATA SIZE = ---- ----
  205. BIT SIZE = ---- ----
  206. END OF MODULE INFORMATION.
  207. C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)