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