📄 dht11.lst
字号:
C51 COMPILER V8.02 DHT11 04/25/2013 19:45:37 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE DHT11
OBJECT MODULE PLACED IN DHT11.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE DHT11.c BROWSE DEBUG OBJECTEXTEND
line level source
1 //STC89C52单片机的时钟频率是11.0592M
2 #include "DHT11.h"
3 #include <reg52.h>
4
5 /*读一个字节的数据*/
6 static uchar ReadValue(void)
7 {
8 1 uchar count, value = 0, i;
9 1 status = OK; //设置标志位为正常状态
10 1 for(i = 8; i > 0; i--)
11 1 {
12 2 value <<= 1; //高位在先,将得到的数据依次左移,最后得到1字节的数据
13 2 count = 0;
14 2 //每一位数据前都有50us的低电平等待时间.等待50us时间结束
15 2 while(dht11 == 0 && count++ < NUMBER);
16 2 if(count >= NUMBER)
17 2 {
18 3 status = ERROR;//设定错误标志
19 3 return 0;//函数执行过程发生错误就退出函数
20 3 }
21 2 //26-28us的高电平表示该位为0, 70us的高电平表示该位为1
22 2 Delay_10us();
23 2 Delay_10us();
24 2 Delay_10us();
25 2 //延时30us后检测数据线是否为高电平
26 2 if(dht11 != 0)
27 2 {
28 3 //进入这里表明该位为1
29 3 value++;
30 3 //等待剩下的40us高电平结束
31 3 while(dht11 != 0 && count++ < NUMBER)
32 3 {
33 4 dht11 = 1;
34 4 }
35 3 if(count >= NUMBER)
36 3
37 3 {
38 4 status = ERROR;//设定错误标志
39 4 return 0;
40 4 }
41 3 }
42 2 }
43 1 return (value);
44 1 }
45
46 //读一次数据,共5个字节
47 uchar ReadTempAndHumi(void)
48 {
49 1
50 1 uchar i = 0, check_value = 0,count = 0;
51 1 EA = 0;
52 1 dht11 = 0; //先拉低数据线至少18ms,发送开始信号
53 1 Delay_1ms(20); //延时大于18ms
54 1 dht11 = 1; //释放数据线,用于检测低电平响应信号
55 1 //等待20-40us,检测响应信号,响应信号为从机拉低数据线80us
C51 COMPILER V8.02 DHT11 04/25/2013 19:45:37 PAGE 2
56 1 Delay_10us();
57 1 Delay_10us();
58 1 Delay_10us();
59 1 Delay_10us();
60 1 if(dht11 != 0) //检测响应信号是否存在,响应信号为低电平
61 1 {
62 2 //响应信号不存在
63 2 EA = 1;
64 2 return ERROR;
65 2 }
66 1 else
67 1 {
68 2
69 2 //有响应信号
70 2 while(dht11 == 0 && count++ < NUMBER); //等待响应信号结束
71 2 if(count >= NUMBER) //检测计数器是否超出了设定范围
72 2 {
73 3 dht11 = 1;
74 3 EA = 1;
75 3 return ERROR;//读数据出错,退出函数
76 3 }
77 2 count = 0;
78 2 dht11 = 1;//释放数据线
79 2 //应答信号后有80us的等待时间,等待高电平结束
80 2 while(dht11 != 0 && count++ < NUMBER);
81 2 if(count >= NUMBER)
82 2 {
83 3 dht11 = 1;
84 3 EA = 1;
85 3 return ERROR;//计数器超出检测范围,退出函数
86 3 }
87 2
88 2 //读出温湿度值
89 2 for(i = 0; i < SIZE; i++)
90 2 {
91 3 value_array[i] = ReadValue(); //调用ReadValue()读数据
92 3 if(status == ERROR)//若读数据出错,则退出函数
93 3 {
94 4
95 4 dht11 = 1;
96 4 EA = 1;
97 4 return ERROR;
98 4 }
99 3 //若读到的数据是校验值,则不需要加上去
100 3 if(i != SIZE -1)
101 3 {
102 4 //若读到的数据中前4字节数据的和等于第5字节字节,则表示成功
103 4 check_value += value_array[i];
104 4 }
105 3 }//end for
106 2 //检验读到的数据是否正确
107 2 if(check_value == value_array[SIZE - 1])
108 2 {
109 3 //将温湿度值扩大十倍,以方便读出其中的每一位
110 3 humi_value = (value_array[0]+value_array[1]) * 10; //前2bit数据为湿度值
111 3 temp_value = (value_array[2]+value_array[3]) * 10; //后2bit为温度值
112 3 dht11 = 1;
113 3 EA = 1;
114 3 return OK;//正确地读出dht11输出的数据
115 3 }
116 2 else
117 2 {
C51 COMPILER V8.02 DHT11 04/25/2013 19:45:37 PAGE 3
118 3 //校验数据出错
119 3 EA = 1;
120 3 return ERROR;
121 3 }
122 2 }
123 1 }
124
125 //LCD显示函数
126 void SMG_Display(uint value)
127 {
128 1 uchar ge, bai, shi;
129 1 ge = value%10+0x30; //必须加上0x30,否则显示乱码
130 1 shi = value%100/10+0x30;
131 1 bai = value/100+0x30;
132 1
133 1 lcd_write_data(bai);
134 1
135 1 lcd_write_data(shi);
136 1 lcd_write_data('.');
137 1 lcd_write_data(ge);
138 1
139 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 361 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 1 8
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -