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