📄 dzsj.lst
字号:
C51 COMPILER V8.02 DZSJ 10/24/2008 15:27:10 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE DZSJ
OBJECT MODULE PLACED IN dzsj.OBJ
COMPILER INVOKED BY: D:\Program Files\keil\C51\BIN\C51.EXE dzsj.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include<at89x51.h>
2 #include<string.h>
3 #include<math.h>
4 #include<stdio.h>
5
6 /*ADC0809数据采集*/
7 unsigned char xdata *ADC;
8 unsigned char ADCR[3];
9 unsigned char I;
10 unsigned char F=1;
11
12 void int0() interrupt 2
13 {
14 1 unsigned char temp;
15 1 EX0=1;
16 1 temp=*(ADC+I);
17 1 ADCR[I]=temp;
18 1 F=1;
19 1 }
20
21 void StatADC0809(void)
22 { ADC=0xFE00;
23 1 *(ADC+I)=I;
24 1 F=0;
25 1 EX0=1;
26 1 }
27
28 void ADC0809(void)
29 { if(F)
30 1 {I++;
31 2 if(I>3)
32 2 I=0;
33 2 StatADC0809();
34 2 }
35 1 }
36
37 /*LCD1601液晶显示屏驱动程序*/
38 #define Data P0
39 sbit RS=P1^7;
40 sbit RW=P1^6;
41 sbit E=P2^6;
42 unsigned char code tab[4][8]={{"CO"},{"CH4"},{"SMOKE"},{"DANGER!!"}};
43
44 void delay(unsigned int k)
45 {
46 1 unsigned int i,j;
47 1 for(i=k;i>0;i--)
48 1 for(j=50;j>0;j--) ;
49 1 }
50
51 unsigned char ReadStatus(void)
52 {
53 1 Data=0xFF;
54 1 RS=0;
55 1 RW=1;
C51 COMPILER V8.02 DZSJ 10/24/2008 15:27:10 PAGE 2
56 1 E=1;
57 1 while(Data&0x80);
58 1 return(Data);
59 1 delay(2);
60 1 E=0;
61 1 }
62
63 void wr_com(unsigned char com)
64 {
65 1 ReadStatus();
66 1 Data=com;
67 1 RS=0;
68 1 RW=0;
69 1 E=1;
70 1 delay(2);
71 1 E=0;
72 1 }
73
74 void wr_dat(unsigned char dat)
75 {
76 1 ReadStatus();
77 1 Data=dat;
78 1 RS=1;
79 1 RW=0;
80 1 E=1;
81 1 delay(2);
82 1 E=0;
83 1 }
84
85 void LCD_Init(void)
86 {
87 1 Data=0x0;
88 1 wr_com(0x38);
89 1 delay(5);
90 1 wr_com(0x38);
91 1 delay(5);
92 1 wr_com(0x38);
93 1 delay(5);
94 1 wr_com(0x38);
95 1 wr_com(0x08);
96 1 wr_com(0x01);
97 1 wr_com(0x06);
98 1 wr_com(0x0C);
99 1 }
100
101 void GotoY(unsigned char y)
102 {
103 1 y&=0x0F;
104 1 wr_com(y);
105 1 do{
106 2 y=ReadStatus();
107 2 }while((y&0x80)==0x80);
108 1 }
109
110 void disp(unsigned char y,unsigned char _char)
111 {
112 1 GotoY(y);
113 1 wr_dat(_char);
114 1 }
115
116 /*按键扫描程序*/
117 unsigned char K1,K2;
C51 COMPILER V8.02 DZSJ 10/24/2008 15:27:10 PAGE 3
118 sbit key1=P1^1;
119 sbit key2=P1^2;
120 unsigned char code table[]={'0','1','2','3','4','5','6','7','8','9'};
121
122 void delay10ms(void)
123 {unsigned char i,j;
124 1 for(i=20;i>0;i--)
125 1 for(j=248;j>0;j--);
126 1 }
127
128 void Key1(void)
129 {if(key1==0)
130 1 {delay10ms();
131 2 if(key1==0)
132 2 {K1++;
133 3 if(K1==11)
134 3 {K1=0;}
135 3 while(key1==0);
136 3 }
137 2 }
138 1 switch(K1)
139 1 {
140 2 case 0:
141 2 GotoY(4);
142 2 break;
143 2 case 1:
144 2 GotoY(5);
145 2 break;
146 2 case 2:
147 2 GotoY(7);
148 2 break;
149 2 case 3:
150 2 GotoY(8);
151 2 break;
152 2 case 4:
153 2 GotoY(0xA);
154 2 break;
155 2 case 5:
156 2 GotoY(0xB);
157 2 break;
158 2 }
159 1 }
160
161 void Key2(void)
162 { K2=0;
163 1 while(1)
164 1 {
165 2 if(key2==0)
166 2 {
167 3 delay10ms();
168 3 delay10ms();
169 3 if(key2==0)
170 3 {
171 4 K2++;
172 4 if(K2==10)K2=0;
173 4 Key1();
174 4 wr_dat(table[K2]);
175 4 }
176 3 }
177 2 }
178 1 }
179
C51 COMPILER V8.02 DZSJ 10/24/2008 15:27:10 PAGE 4
180
181 /*用定时器T0每50ms中断一次*/
182 unsigned char second=45,minute=58,hour=12,day=29,month=11,year=07;
183 unsigned char n_50m_second; /*多少个50毫秒的变量*/
184 unsigned char days_of_month; /*该月多少天的变量*/
185
186 unsigned char calculate_days(void) /*计算本月有多少天*/
187 {
188 1 unsigned int temp;
189 1 switch (month)
190 1 {
191 2 case 1:
192 2 case 3:
193 2 case 5:
194 2 case 7:
195 2 case 8:
196 2 case 10:
197 2 case 12:
198 2 return 31; /*1、3、5、7、8、10、12月为31天*/
199 2 break;
200 2 case 4:
201 2 case 6:
202 2 case 9:
203 2 case 11:
204 2 return 30; /*4、6、9、11月为30天*/
205 2 break;
206 2 case 2:
207 2 temp=2000+year; /*因为year中保存的是年的最后两位,所以要加上2000*/
208 2 if((((temp%4)==0)&&((temp%100)!=0))||((temp%400)==0))
209 2 {
210 3 return 29; /*闰年2月为29天*/
211 3 }
212 2 else
213 2 {
214 3 return 28; /*平年2月为28天*/
215 3 }
216 2 }
217 1 }
218
219 void timer0_isr(void) interrupt 1 using 1 /*定时器0中断处理函数*/
220 {
221 1 TL0=0xB9;
222 1 TH0=0x3C; /*定时器重装。定时50mS中断一次*/
223 1 n_50m_second++;
224 1 if(n_50m_second>=20) /*1秒到*/
225 1 {
226 2 n_50m_second=0; /*清50毫秒计数*/
227 2 second++; /*秒加1*/
228 2 if(second==60) /*如果秒到60*/
229 2 {
230 3 second=0; /*秒清0*/
231 3 minute++; /*分加1*/
232 3 if(minute==60) /*如果分到60*/
233 3 {
234 4 minute=0; /*分清0*/
235 4 hour++; /*小时加1*/
236 4 if(hour==24) /*如果小时到24*/
237 4 {
238 5 hour=0; /*小时清零*/
239 5 day++; /*天加1*/
240 5 days_of_month=calculate_days();/*计算本月有多少天*/
241 5 if(day>days_of_month) /*如果天大于本月最后一天*/
C51 COMPILER V8.02 DZSJ 10/24/2008 15:27:10 PAGE 5
242 5 {
243 6 day=1; /*天置1*/
244 6 month++; /*月加1*/
245 6 if(month>12) /*如果月大于12*/
246 6 {
247 7 month=1; /*月置1*/
248 7 year++; /*年加1*/
249 7 if(year>=100) /*如果年大于100*/
250 7 {
251 8 year=0; /*年清零*/
252 8 }
253 7 }
254 6 }
255 5 }
256 4 }
257 3 }
258 2 }
259 1 }
260
261 void disp_timer(void)
262 {
263 1 disp(4,hour/10+48);
264 1 disp(5,hour%10+48);
265 1 disp(6,':');
266 1 disp(7,minute/10+48);
267 1 disp(8,minute%10+48);
268 1 disp(9,':');
269 1 disp(0xA,second/10+48);
270 1 disp(0xB,second%10+48);
271 1 Key2();
272 1 }
273
274 /*数据处理*/
275 sbit fm=P1^0;
276 unsigned char flag;
277 unsigned char COSJ[3],CH4SJ[3],SmokeSJ[3];
278 unsigned char _co,_ch4,_smoke;
279 unsigned char co,ch4,smo;
280 int a,b;
281
282 void disp_wx(void) /*lcd第二行中间显示"DANGER!!"*/
283 {
284 1 disp(7,tab[3][0]);
285 1 disp(8,tab[3][1]);
286 1 disp(9,tab[3][2]);
287 1 disp(0xA,tab[3][3]);
288 1 disp(0xB,tab[3][4]);
289 1 disp(0xC,tab[3][5]);
290 1 disp(0xD,tab[3][6]);
291 1 disp(0xE,tab[3][7]);
292 1 }
293
294 void un_disp(unsigned int i)
295 {
296 1 switch(i)
297 1 {case 0:
298 2 disp(3,tab[0][0]);
299 2 disp(4,tab[0][1]);/*lcd显示"CO"*/
300 2 disp_wx();
301 2 break;
302 2 case 1:
303 2 disp(2,tab[1][0]);
C51 COMPILER V8.02 DZSJ 10/24/2008 15:27:10 PAGE 6
304 2 disp(3,tab[1][1]);
305 2 disp(4,tab[1][2]);/*lcd显示"CH4"*/
306 2 disp_wx();
307 2 break;
308 2 case 2:
309 2 disp(1,tab[2][0]);
310 2 disp(2,tab[2][1]);
311 2 disp(3,tab[2][2]);
312 2 disp(4,tab[2][3]);
313 2 disp(5,tab[2][4]);/*lcd显示"SMOKE"*/
314 2 disp_wx();
315 2 break;
316 2 }
317 1 }
318
319 void delay02s(void)
320 {
321 1 unsigned char i;
322 1 for(i=20;i>0;i++)
323 1 {delay10ms();}
324 1 }
325
326 lag(unsigned char x,unsigned char y)
327 { int flag;
328 1 if(x>y) flag=1;
329 1 else flag=0;
330 1 return(flag);
331 1 }
332
333 void get_data()
334 {
335 1 _co=0;_ch4=0;_smoke=0;//_humidity=0;
336 1 for(a=0;a<3;a++)
337 1 {
338 2 COSJ[a]=ADCR[0];
339 2 CH4SJ[a]=ADCR[1];
340 2 SmokeSJ[a]=ADCR[2];
341 2 //HumiditySJ[a]=ADCR[3];
342 2 delay02s();
343 2 delay02s();
344 2 }
345 1 for(b=0;b<3;b++)
346 1 {
347 2 _co=_co+COSJ[b];
348 2 _ch4=_ch4+CH4SJ[b];
349 2 _smoke=_smoke+SmokeSJ[b];
350 2 //_humidity=_humidity+HumiditySJ[b];
351 2 }
352 1 }
353
354 void hand_data()
355 {
356 1 unsigned char bz[3];//标准量
357 1 get_data();
358 1 co=_co/3;
359 1 ch4=_ch4/3;
360 1 smo=_smoke/3;
361 1 //hum=_humidity/3;
362 1 if(lag(bz[0],co)==1)
363 1 { fm=0;
364 2 un_disp(0);}
365 1 else if(lag(bz[1],ch4)==1)
C51 COMPILER V8.02 DZSJ 10/24/2008 15:27:10 PAGE 7
366 1 { fm=0;
367 2 un_disp(1);}
368 1 else if(lag(bz[2],smo)==1)
369 1 { fm=0;
370 2 un_disp(2);}
371 1 else { fm=0;
372 2 disp_timer();//显示时间
373 2 }
374 1 }
375
376 /*主函数*/
377 void system_initial(void) //系统初始化
378 {
379 1 TMOD=0x11; //定时器工作在模式1
380 1 ET0=1; //开定时器0中断
381 1 TR0=1; //启动定时器0
382 1 EX0=1;
383 1 IT0=0;
384 1 EA=1; //开总中断
385 1 }
386
387 void main(void)
388 {
389 1 system_initial();
390 1 LCD_Init();
391 1 while(1)
392 1 {
393 2 ADC0809();
394 2 hand_data();
395 2 }
396 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1135 ----
CONSTANT SIZE = 42 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 37 3
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 + -