forked from secoworld/LTempTest
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdht11.c
More file actions
122 lines (103 loc) · 1.7 KB
/
dht11.c
File metadata and controls
122 lines (103 loc) · 1.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include "dht11.h"
unsigned char pin;
#define data_1 digitalWrite(pin, HIGH)
#define data_0 digitalWrite(pin, LOW)
#define data_in pinMode(pin,INPUT)
#define data_out pinMode(pin,OUTPUT)
#define data digitalRead(pin)
//返回0代表成功,1代表失败
void dht11_pin_init(uchar pins)
{
pin=pins;
pinMode (pin, OUTPUT) ;
}
//0 代表成功,1代表失败
uint dht11_check(void)
{
uint i=0;
data_in;
while(data&&i<100)
{
i++;
delayMicroseconds(1);
}
if(i>=100) return 1;
else i=0;
while(!data&&i<100)
{
i++;
delayMicroseconds(1);
}
if(i>=100) return 1;
return 0;
}
uint dht11_init(void) //DHT11初始化
{
data_out;
data_0;
delay(20); //延时ms
data_1;
delayMicroseconds(30); //延时us
return dht11_check();
}
uint dht11_read_bit(void)
{
uint i=0;
while(data&&i<100)
{
i++;
delayMicroseconds(1);
}
i=0;
while(!data&&i<100)
{
i++;
delayMicroseconds(1);
}
delayMicroseconds(40);
if(data) return 1;
else return 0;
}
uint dht11_read_byte(void)
{
uint i,dat;
dat=0;
for(i=0;i<8;i++)
{
dat<<=1;
dat |= dht11_read_bit();
}
return dat;
}
uint dht11_read_data(uint *temp,uint *humi,uint *temp1,uint *humi1)
{
uint buf[5];
uint i,j=0;
while(dht11_init()==1)
{
//printf("dht11 初始化失败\r\n");
delay(500);
j++;
if(j>=5) return 1;
}
//printf("dht11 初始化成功\r\n");
for(i=0;i<5;i++)
{
buf[i]=dht11_read_byte();
}
if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
{
*humi=buf[0];
*temp=buf[2];
*humi1=buf[1];
*temp1=buf[3];
//printf("读取数据成功\r\n");
//printf("%d,%d\r\n",*humi,*temp);
}
else
{
//printf("读取数据错误\r\n");
dht11_read_data(temp,humi,temp1,humi1);
}
return 0;
}