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