C51 COMPILER V9.53.0.0 DHT11 09/30/2018 11:45:29 PAGE 1 C51 COMPILER V9.53.0.0, COMPILATION OF MODULE DHT11 OBJECT MODULE PLACED IN .\Output\DHT11.obj COMPILER INVOKED BY: D:\Keil_v5\C51\BIN\C51.EXE ..\..\Code\User\Driver\DHT11.c LARGE OPTIMIZE(0,SPEED) BROWSE INCDIR(../ -../Code/Include;../../Code/User;../../Code/User/Common;../../Code/User/Driver) DEFINE(FOSC_160000=1) DEBUG OBJECTEXTEND -PRINT(.\Output\LST\DHT11.lst) TABS(2) OBJECT(.\Output\DHT11.obj) line level source 1 /** 2 * @File: DHT11.c 3 * @Author: Kinve JQ 4 * @Version: V0.1 5 * @Date: 2018.09.30 6 * @Brief: 7 * @Modify: 8 2018.09.30.Kinve:1.创建文件 9 **/ 10 11 #include "DHT11.h" 12 13 #define delay_ms(ms) Timer3_Delay1ms(ms) 14 #define delay_us(us) Timer3_Delay1us(us) //{u8 i; for(i=0;i18ms 60 2.主机H 20-40us 61 3.DHT L 80us 62 4.DHT H 80us 63 5.DHT DATA.... 64 */ 65 static u8 _us = 0; 66 unsigned char DHT11_Start ( void ) 67 { 68 1 69 1 //主机开始信号 70 1 /* 71 1 低18ms->高30us->等待dht响应(拉低) 72 1 */ 73 1 DHT11_PortOUT(); 74 1 DHT11_Out = 0; 75 1 delay_ms ( 20 ); //触发开始,总线拉低要大于18ms 76 1 DHT11_Out = 1; //释放总线 77 1 delay_us(30); //拉低 20-40uS 等待DHT11的低电平响应信号 78 1 79 1 //dht响应 80 1 /* 81 1 正确,拉低(80us) ->拉高(80us)->传送数据 82 1 */ 83 1 DHT11_PortIN(); //改为输入 84 1 85 1 #if 0 //实际6 _us = 0; while ( DHT11_In ) //低电平的响应信号,20-40uS { if ( ++_us > 40 ) { return 0; } delay_us ( 1 ); } #endif 99 1 100 1 //实际53 101 1 _us = 0; 102 1 103 1 while ( !DHT11_In ) //低电平的响应信号,80us 104 1 { 105 2 if ( ++_us > 80 ) 106 2 { 107 3 return 0; 108 3 } 109 2 110 2 delay_us ( 1 ); 111 2 } 112 1 113 1 //实际54 114 1 _us = 0; 115 1 C51 COMPILER V9.53.0.0 DHT11 09/30/2018 11:45:29 PAGE 3 116 1 while ( DHT11_In ) //紧接着是80us的高电平数据准备信号 117 1 { 118 2 if ( ++_us > 80 ) 119 2 { 120 3 return 0; 121 3 } 122 2 123 2 delay_us ( 1 ); 124 2 } 125 1 126 1 //拉低后DHT11会拉高总线80us,接着会开始传数据 127 1 128 1 return 1; 129 1 130 1 } 131 132 133 /* 134 传输数据: 135 1.一次8bit 136 2. 137 开始(50us 低)-> 138 0: 26-28us 高+ (50us 低) = 80us 139 1: 70us 高+ (50us 低) = 120us 140 141 3.判断0/1, 142 1. 26-28us < n < 26-28us+50us 143 2. 0us < n < 70us 144 即, 145 延时35-40us, 146 高 = 1,是70us的,需要延时40us 147 低 = 0,是26-28us的 148 149 */ 150 static uint8_t Read_Byte ( void ) 151 { 152 1 u8 i, temp = 0xff; 153 1 154 1 //开始必须是为低的50us 开始信号 155 1 if ( !DHT11_In ) 156 1 { 157 2 for ( i = 0; i < 8; i++ ) 158 2 { 159 3 //等待高电平,消耗50us 160 3 _us = 0; 161 3 162 3 while ( !DHT11_In ) 163 3 { 164 4 if ( ++_us > 50 ) 165 4 { 166 5 return temp; 167 5 } 168 4 169 4 delay_us ( 1 ); 170 4 } 171 3 172 3 //等待低电平,真实数据的结束 173 3 _us = 0; 174 3 175 3 while ( DHT11_In ) 176 3 { 177 4 if ( ++_us > 80 ) C51 COMPILER V9.53.0.0 DHT11 09/30/2018 11:45:29 PAGE 4 178 4 { 179 5 return temp; 180 5 } 181 4 182 4 delay_us ( 1 ); 183 4 } 184 3 185 3 if ( _us > 37 ) //35-40us后仍为高电平表示数据“1” 186 3 { 187 4 temp |= ( uint8_t ) ( 0x01 << ( 7 - i ) ); //把第7-i位置1 188 4 } 189 3 else //40us后为低电平表示数据“0” 190 3 { 191 4 temp &= ( uint8_t ) ~ ( 0x01 << ( 7 - i ) ); //把第7-i位置0 192 4 } 193 3 } 194 2 } 195 1 196 1 return temp; 197 1 } 198 199 200 201 uint8_t DHT11_Read_Data ( DHT11_Data_TypeDef *DHT11_Data ) 202 { 203 1 uint8_t res; 204 1 uint8_t check_sum; 205 1 206 1 if ( DHT11_Start() ) //判断是否已经响应 207 1 { 208 2 /*开始接收数据*/ 209 2 DHT11_Data->humi_int = Read_Byte(); 210 2 DHT11_Data->humi_deci = Read_Byte(); 211 2 DHT11_Data->temp_int = Read_Byte(); 212 2 DHT11_Data->temp_deci = Read_Byte(); 213 2 DHT11_Data->check_sum = Read_Byte(); 214 2 215 2 check_sum = DHT11_Data->humi_int + DHT11_Data->humi_deci + DHT11_Data->temp_int + DHT11_Data->temp -_deci; 216 2 217 2 /*检查读取的数据是否正确*/ 218 2 if ( DHT11_Data->check_sum == check_sum ) 219 2 { 220 3 res = SUCCESS; 221 3 } 222 2 else 223 2 { 224 3 res = ERROR; 225 3 } 226 2 } 227 1 else 228 1 { 229 2 res = ERROR; 230 2 } 231 1 232 1 return res; 233 1 } 234 235 /********************* (C) COPYRIGHT Kinve JQ *******END OF FILE ********/ 236 237 C51 COMPILER V9.53.0.0 DHT11 09/30/2018 11:45:29 PAGE 5 MODULE INFORMATION: STATIC OVERLAYABLE CODE SIZE = 605 ---- CONSTANT SIZE = ---- ---- XDATA SIZE = 13 ---- PDATA SIZE = ---- ---- DATA SIZE = ---- ---- IDATA SIZE = ---- ---- BIT SIZE = ---- ---- END OF MODULE INFORMATION. C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)