📄 51_dht21.lst
字号:
C51 COMPILER V7.06 51_DHT21 01/05/2009 21:06:12 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE 51_DHT21
OBJECT MODULE PLACED IN 51_DHT21.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil C51\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 //----------------------------------------------//
36 U8 U8FLAG,k;
37 U8 U8count,U8temp;
38 U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata; //定义温湿度高低位和校验位
39 U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
40 U8 U8comdata;
41 U8 outdata[5]; //定义发送的字节数
42 U8 indata[5];
43 U8 count, count_r=0;
44 U8 str[5]={"RS232"};
45 U16 U16temp1,U16temp2;
46
47 SendData(U8 *a)
48 {
49 1 outdata[0] = a[0];
50 1 outdata[1] = a[1];
51 1 outdata[2] = a[2];
C51 COMPILER V7.06 51_DHT21 01/05/2009 21:06:12 PAGE 2
52 1 outdata[3] = a[3];
53 1 outdata[4] = a[4];
54 1 count = 1;
55 1 SBUF=outdata[0];
56 1 }
57
58 //延时程序
59 void Delay(U16 j)
60 {
61 1 U8 i;
62 1 for(;j>0;j--)
63 1 {
64 2 for(i=0;i<27;i++);
65 2 }
66 1 }
67
68 void Delay_10us(void)
69 {
70 1 U8 i;
71 1 i--;
72 1 i--;
73 1 i--;
74 1 i--;
75 1 i--;
76 1 i--;
77 1 }
78
79 void COM(void)
80 {
81 1 U8 i;
82 1 for(i=0;i<8;i++)
83 1 {
84 2 U8FLAG=2;
85 2 //----------------------
86 2 P2_1=0 ; //T
87 2 P2_1=1 ; //T
88 2 //----------------------
89 2 while((!P2_0)&&U8FLAG++);
90 2 Delay_10us();
91 2 Delay_10us();
92 2 // Delay_10us();
93 2 U8temp=0;
94 2 if(P2_0)U8temp=1;
95 2 U8FLAG=2;
96 2 while((P2_0)&&U8FLAG++);
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 // 如果高电平高过预定0高电平值则数据位为 1
105 2 U8comdata<<=1;
106 2 U8comdata|=U8temp; //0
107 2 }//rof
108 1 }
109
110 //*******************************************//
111 //**********湿度读取子程序*******************//
112 //*******************************************//
113 //-------以下变量均为全局变量----------------//
C51 COMPILER V7.06 51_DHT21 01/05/2009 21:06:12 PAGE 3
114 //-------温度高8位== U8T_data_H--------------//
115 //-------温度低8位== U8T_data_L--------------//
116 //-------湿度高8位== U8RH_data_H-------------//
117 //-------湿度低8位== U8RH_data_L-------------//
118 //-------校验 8位 == U8checkdata-------------//
119 //-------调用相关子程序如下------------------//
120 //-------Delay();, Delay_10us();,COM();------//
121 //*******************************************//
122 void RH(void)
123 {
124 1 //主机拉低18ms
125 1 P2_0=0;
126 1 Delay(180);
127 1 P2_0=1;
128 1 //总线由上拉电阻拉高 主机延时20us
129 1 Delay_10us();
130 1 Delay_10us();
131 1 Delay_10us();
132 1 Delay_10us();
133 1 //主机设为输入 判断从机响应信号
134 1 P2_0=1;
135 1 //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
136 1 if(!P2_0) //T !
137 1 {
138 2 U8FLAG=2;
139 2 //判断从机是否发出 80us 的低电平响应信号是否结束
140 2 while((!P2_0)&&U8FLAG++);
141 2 U8FLAG=2;
142 2 //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
143 2 while((P2_0)&&U8FLAG++);
144 2 //数据接收状态
145 2 COM();
146 2 U8RH_data_H_temp=U8comdata;
147 2 COM();
148 2 U8RH_data_L_temp=U8comdata;
149 2 COM();
150 2 U8T_data_H_temp=U8comdata;
151 2 COM();
152 2 U8T_data_L_temp=U8comdata;
153 2 COM();
154 2 U8checkdata_temp=U8comdata;
155 2 P2_0=1;
156 2 //数据校验
157 2 U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
158 2 if(U8temp==U8checkdata_temp)
159 2 {
160 3 U8RH_data_H=U8RH_data_H_temp;
161 3 U8RH_data_L=U8RH_data_L_temp;
162 3 U8T_data_H=U8T_data_H_temp;
163 3 U8T_data_L=U8T_data_L_temp;
164 3 U8checkdata=U8checkdata_temp;
165 3 }//fi
166 2 }//fi
167 1 }
168
169 //----------------------------------------------
170 //main()功能描述: AT89C51 11.0592MHz 串口发
171 //送温湿度数据,波特率 9600
172 //----------------------------------------------
173 void main()
174 {
175 1 U8 i,j;
C51 COMPILER V7.06 51_DHT21 01/05/2009 21:06:12 PAGE 4
176 1
177 1 //uchar str[6]={"RS232"};
178 1 /* 系统初始化 */
179 1 TMOD = 0x20; //定时器T1使用工作方式2
180 1 TH1 = 253; // 设置初值
181 1 TL1 = 253;
182 1 TR1 = 1; // 开始计时
183 1 SCON = 0x50; //工作方式1,波特率9600bps,允许接收
184 1 ES = 1;
185 1 EA = 1; // 打开所以中断
186 1 TI = 0;
187 1 RI = 0;
188 1 SendData(str) ; //发送到串口
189 1 Delay(1); //延时100US(12M晶振)
190 1 while(1)
191 1 {
192 2
193 2 //------------------------
194 2 //调用温湿度读取子程序
195 2 RH();
196 2 //串口显示程序
197 2 //--------------------------
198 2
199 2 str[0]=U8RH_data_H;
200 2 str[1]=U8RH_data_L;
201 2 str[2]=U8T_data_H;
202 2 str[3]=U8T_data_L;
203 2 str[4]=U8checkdata;
204 2 SendData(str) ; //发送到串口
205 2 //读取模块数据周期不易小于 2S
206 2 Delay(20000);
207 2 }//elihw
208 1
209 1 }// main
*** WARNING C280 IN LINE 175 OF 51_DHT21.C: 'i': unreferenced local variable
*** WARNING C280 IN LINE 175 OF 51_DHT21.C: 'j': unreferenced local variable
210
211 void RSINTR() interrupt 4 using 2
212 {
213 1 U8 InPut3;
214 1 if(TI==1) //发送中断
215 1 {
216 2 TI=0;
217 2 if(count!=5) //发送完5位数据
218 2 {
219 3 SBUF= outdata[count];
220 3 count++;
221 3 }
222 2 }
223 1
224 1 if(RI==1) //接收中断
225 1 {
226 2 InPut3=SBUF;
227 2 indata[count_r]=InPut3;
228 2 count_r++;
229 2 RI=0;
230 2 if (count_r==5)//接收完4位数据
231 2 {
232 3 //数据接收完毕处理。
233 3 count_r=0;
234 3 str[0]=indata[0];
235 3 str[1]=indata[1];
C51 COMPILER V7.06 51_DHT21 01/05/2009 21:06:12 PAGE 5
236 3 str[2]=indata[2];
237 3 str[3]=indata[3];
238 3 str[4]=indata[4];
239 3 P0=0;
240 3 }
241 2 }
242 1 }
243
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 + -