?? 51_dht21.lst
字號:
C51 COMPILER V7.07 51_DHT21 12/06/2008 09:05:08 PAGE 1
C51 COMPILER V7.07, COMPILATION OF MODULE 51_DHT21
OBJECT MODULE PLACED IN 51_DHT21.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 51_DHT21.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 //****************************************************************//
2 // DHT21使用范例
3 //單片機 : AT89S52 或 STC89C52RC
4 // 功能 :串口發送溫濕度數據 波特率 9600
5 //硬件連接: P2.0口為通訊口連接DHT11,DHT11的電源和地連接單片機的電源和地,單片機串口加MAX232連接電腦
6 // 公司 :奧松電子
7 //****************************************************************//
8
9 #include <reg51.h>
10 #include <intrins.h>
11 //
12 typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 無符號8位整型變量 */
13 typedef signed char S8; /* defined for signed 8-bits integer variable 有符號8位整型變量 */
14 typedef unsigned int U16; /* defined for unsigned 16-bits integer variable 無符號16位整型變量 */
15 typedef signed int S16; /* defined for signed 16-bits integer variable 有符號16位整型變量 */
16 typedef unsigned long U32; /* defined for unsigned 32-bits integer variable 無符號32位整型變量 */
17 typedef signed long S32; /* defined for signed 32-bits integer variable 有符號32位整型變量 */
18 typedef float F32; /* single precision floating point variable (32bits) 單精度浮點數(32位長
-度) */
19 typedef double F64; /* double precision floating point variable (64bits) 雙精度浮點數(64位長
-度) */
20 //
21 #define uchar unsigned char
22 #define uint unsigned int
23 #define Data_0_time 4
24
25 //----------------------------------------------//
26 //----------------IO口定義區--------------------//
27 //----------------------------------------------//
28 sbit P2_0 = P2^0 ;
29 sbit P2_1 = P2^1 ;
30 sbit P2_2 = P2^2 ;
31 sbit P2_3 = P2^3 ;
32 //----------------------------------------------//
33 //----------------定義區--------------------//
34 //----------------------------------------------//
35 U8 U8FLAG,k;
36 U8 U8count,U8temp;
37 U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
38 U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
39 U8 U8comdata;
40 U8 outdata[5]; //定義發送的字節數
41 U8 indata[5];
42 U8 count, count_r=0;
43 U8 str[5]={"RS232"};
44 U16 U16temp1,U16temp2;
45 SendData(U8 *a)
46 {
47 1 outdata[0] = a[0];
48 1 outdata[1] = a[1];
49 1 outdata[2] = a[2];
50 1 outdata[3] = a[3];
51 1 outdata[4] = a[4];
52 1 count = 1;
53 1 SBUF=outdata[0];
C51 COMPILER V7.07 51_DHT21 12/06/2008 09:05:08 PAGE 2
54 1 }
55
56 void Delay(U16 j)
57 { U8 i;
58 1 for(;j>0;j--)
59 1 {
60 2 for(i=0;i<27;i++);
61 2
62 2 }
63 1 }
64 void Delay_10us(void)
65 {
66 1 U8 i;
67 1 i--;
68 1 i--;
69 1 i--;
70 1 i--;
71 1 i--;
72 1 i--;
73 1 }
74
75 void COM(void)
76 {
77 1
78 1 U8 i;
79 1 for(i=0;i<8;i++)
80 1 {
81 2
82 2 U8FLAG=2;
83 2 //----------------------
84 2 P2_1=0 ; //T
85 2 P2_1=1 ; //T
86 2 //----------------------
87 2
88 2 while((!P2_0)&&U8FLAG++);
89 2 Delay_10us();
90 2 Delay_10us();
91 2 // Delay_10us();
92 2 U8temp=0;
93 2 if(P2_0)U8temp=1;
94 2 U8FLAG=2;
95 2 while((P2_0)&&U8FLAG++);
96 2
97 2 //----------------------
98 2 P2_1=0 ; //T
99 2 P2_1=1 ; //T
100 2 //----------------------
101 2 //超時則跳出for循環
102 2 if(U8FLAG==1)break;
103 2 //判斷數據位是0還是1
104 2
105 2 // 如果高電平高過預定0高電平值則數據位為 1
106 2
107 2 U8comdata<<=1;
108 2 U8comdata|=U8temp; //0
109 2 }//rof
110 1
111 1 }
112
113 //--------------------------------
114 //-----濕度讀取子程序 ------------
115 //--------------------------------
C51 COMPILER V7.07 51_DHT21 12/06/2008 09:05:08 PAGE 3
116 //----以下變量均為全局變量--------
117 //----溫度高8位== U8T_data_H------
118 //----溫度低8位== U8T_data_L------
119 //----濕度高8位== U8RH_data_H-----
120 //----濕度低8位== U8RH_data_L-----
121 //----校驗 8位 == U8checkdata-----
122 //----調用相關子程序如下----------
123 //---- Delay();, Delay_10us();,COM();
124 //--------------------------------
125
126 void RH(void)
127 {
128 1 //主機拉低18ms
129 1 P2_0=0;
130 1 Delay(180);
131 1 P2_0=1;
132 1 //總線由上拉電阻拉高 主機延時20us
133 1 Delay_10us();
134 1 Delay_10us();
135 1 Delay_10us();
136 1 Delay_10us();
137 1 //主機設為輸入 判斷從機響應信號
138 1 P2_0=1;
139 1 //判斷從機是否有低電平響應信號 如不響應則跳出,響應則向下運行
140 1 if(!P2_0) //T !
141 1 {
142 2 U8FLAG=2;
143 2 //判斷從機是否發出 80us 的低電平響應信號是否結束
144 2 while((!P2_0)&&U8FLAG++);
145 2 U8FLAG=2;
146 2 //判斷從機是否發出 80us 的高電平,如發出則進入數據接收狀態
147 2 while((P2_0)&&U8FLAG++);
148 2 //數據接收狀態
149 2 COM();
150 2 U8RH_data_H_temp=U8comdata;
151 2 COM();
152 2 U8RH_data_L_temp=U8comdata;
153 2 COM();
154 2 U8T_data_H_temp=U8comdata;
155 2 COM();
156 2 U8T_data_L_temp=U8comdata;
157 2 COM();
158 2 U8checkdata_temp=U8comdata;
159 2 P2_0=1;
160 2 //數據校驗
161 2
162 2 U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
163 2 if(U8temp==U8checkdata_temp)
164 2 {
165 3 U8RH_data_H=U8RH_data_H_temp;
166 3 U8RH_data_L=U8RH_data_L_temp;
167 3 U8T_data_H=U8T_data_H_temp;
168 3 U8T_data_L=U8T_data_L_temp;
169 3 U8checkdata=U8checkdata_temp;
170 3 }//fi
171 2 }//fi
172 1
173 1 }
174
175 //----------------------------------------------
176 //main()功能描述: AT89C51 11.0592MHz 串口發
177 //送溫濕度數據,波特率 9600
C51 COMPILER V7.07 51_DHT21 12/06/2008 09:05:08 PAGE 4
178 //----------------------------------------------
179 void main()
180 {
181 1 U8 i,j;
182 1
183 1 //uchar str[6]={"RS232"};
184 1 /* 系統初始化 */
185 1 TMOD = 0x20; //定時器T1使用工作方式2
186 1 TH1 = 253; // 設置初值
187 1 TL1 = 253;
188 1 TR1 = 1; // 開始計時
189 1 SCON = 0x50; //工作方式1,波特率9600bps,允許接收
190 1 ES = 1;
191 1 EA = 1; // 打開所以中斷
192 1 TI = 0;
193 1 RI = 0;
194 1 SendData(str) ; //發送到串口
195 1 Delay(1); //延時100US(12M晶振)
196 1 while(1)
197 1 {
198 2
199 2 //------------------------
200 2 //調用溫濕度讀取子程序
201 2 RH();
202 2 //串口顯示程序
203 2 //--------------------------
204 2
205 2 str[0]=U8RH_data_H;
206 2 str[1]=U8RH_data_L;
207 2 str[2]=U8T_data_H;
208 2 str[3]=U8T_data_L;
209 2 str[4]=U8checkdata;
210 2 SendData(str) ; //發送到串口
211 2 //讀取模塊數據周期不易小于 2S
212 2 Delay(20000);
213 2 }//elihw
214 1
215 1 }// main
*** WARNING C280 IN LINE 181 OF 51_DHT21.C: 'i': unreferenced local variable
*** WARNING C280 IN LINE 181 OF 51_DHT21.C: 'j': unreferenced local variable
216
217 void RSINTR() interrupt 4 using 2
218 {
219 1 U8 InPut3;
220 1 if(TI==1) //發送中斷
221 1 {
222 2 TI=0;
223 2 if(count!=5) //發送完5位數據
224 2 {
225 3 SBUF= outdata[count];
226 3 count++;
227 3 }
228 2 }
229 1
230 1 if(RI==1) //接收中斷
231 1 {
232 2 InPut3=SBUF;
233 2 indata[count_r]=InPut3;
234 2 count_r++;
235 2 RI=0;
236 2 if (count_r==5)//接收完4位數據
237 2 {
C51 COMPILER V7.07 51_DHT21 12/06/2008 09:05:08 PAGE 5
238 3 //數據接收完畢處理。
239 3 count_r=0;
240 3 str[0]=indata[0];
241 3 str[1]=indata[1];
242 3 str[2]=indata[2];
243 3 str[3]=indata[3];
244 3 str[4]=indata[4];
245 3 P0=0;
246 3 }
247 2 }
248 1 }
249
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 410 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 36 3
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 2 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -