dht11.lst 8.0 KB

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