| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271 |
- 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;i<us;i++) {nop;}}
- 15
- 16 DHT11_Data_TypeDef DHT11_Data;
- 17
- 18 //全局变量定义区
- 19 //***************************************************************************/
- 20 // //uchar i;
- 21 // uchar U8FLAG,k;
- 22 // uchar U8count,U8temp;
- 23 // uchar U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
- 24 // uchar U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
- 25 // uchar U8comdata;
- 26 // uint ReceiveHighByte;
- 27 // uint ReceiveLowByte;
- 28 //***************Global defination for DHT11 end****//
- 29
- 30 void DHT11_PortIN ( void )
- 31 {
- 32 1 #if 0
- GPIO_InitTypeDef GPIO_InitStructure;
-
- RCC_APB2PeriphClockCmd ( DHT11_IORCC, ENABLE );
-
- //切换为输入口
- GPIO_InitStructure.GPIO_Pin = DHT11_DATA_PIN;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init ( DHT11_PORT, &GPIO_InitStructure );
- #endif
- 43 1 }
- 44 void DHT11_PortOUT ( void )
- 45 {
- 46 1 #if 0
- GPIO_InitTypeDef GPIO_InitStructure;
-
- RCC_APB2PeriphClockCmd ( DHT11_IORCC, ENABLE );
-
- GPIO_InitStructure.GPIO_Pin = ( DHT11_DATA_PIN );
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- C51 COMPILER V9.53.0.0 DHT11 09/30/2018 11:45:29 PAGE 2
- GPIO_Init ( DHT11_PORT, &GPIO_InitStructure );
- #endif
- 56 1 }
- 57
- 58 /*
- 59 1.主机L >18ms
- 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)
|