?? 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 + -