📄 temprature.lst
字号:
240 1
241 1 }
C51 COMPILER V7.06 TEMPRATURE 04/09/2008 00:06:15 PAGE 5
242
243
244
245
246 void timer_init(void)
247 {
248 1 TR0=0;
249 1 TR1=0;
250 1 TL0=0x00;
251 1 TH0=0x00;
252 1 TL1=0xFF;
253 1 TH1=0x4B; //定时50ms
254 1 TMOD=0x11;//T0,T1,16位定时器
255 1 CKCON=0x00;//定时器时钟=系统时钟/12
256 1
257 1
258 1
259 1 Time_Inc=0;
260 1 Time_Inc_30S=0;
261 1 Time_Inc_5S=0;
262 1 Display_Select=0; //默认起始显示当前温度
263 1 Time_Change=0; //默认30计时开始
264 1
265 1 TR0=1;//启动T0,T1
266 1 TR1=1;
267 1
268 1 ET0=1;
269 1 ET1=1; //允许定时器中断
270 1 }
271
272
273 void Temperature_Display(unsigned char tempr) //显示当前温度
274 {
275 1 unsigned char tempHigh,tempLow;
276 1 tempHigh=(unsigned char)tempr/10;
277 1 tempLow=tempr%10;
278 1
279 1 Write_Hd7279(0x81,tempLow); //显示温度个位81
280 1 Write_Hd7279(0x80,tempHigh); //显示温度十位80
281 1 }
282
283 void Time_Display(unsigned char time) //显示当前时间
284 {
285 1 unsigned char TimeHigh,TimeLow;
286 1 TimeHigh=time/10;
287 1 TimeLow=time%10;
288 1
289 1 Write_Hd7279(0x83,TimeLow); //显示时间低位83
290 1 Write_Hd7279(0x82,TimeHigh); //显示时间高位82
291 1 }
292
293 void init_18B20(void)
294 {
295 1 DQ=TRUE;
296 1 DQ=FALSE;
297 1 delayus(700);//>480us
298 1 DQ=TRUE;
299 1 delayus(17);
300 1 while(FALSE!=DQ);
301 1 delayus(200);//60~240us
302 1 }
303
C51 COMPILER V7.06 TEMPRATURE 04/09/2008 00:06:15 PAGE 6
304
305 void write_18B20(unsigned char x)
306 {
307 1 unsigned char m;
308 1 for(m=0;m<8;m++)
309 1 {
310 2 DQ=TRUE;
311 2 DQ=FALSE;
312 2 delayus(1);
313 2 if(x&(1<<m))//写数据,从低位开始
314 2 DQ=TRUE;
315 2 else
316 2 DQ=FALSE;
317 2 delayus(100);//60us
318 2 }
319 1 DQ=TRUE;
320 1 delayus(1);
321 1 }
322
323 unsigned char read_18B20(void)
324 {
325 1 unsigned char temp,l;
326 1 temp=0;
327 1 for(l=0;l<8;l++)
328 1 {
329 2 temp>>=1;
330 2 DQ=FALSE;
331 2 delayus(1);
332 2 DQ=TRUE;
333 2 delayus(1);
334 2 if(DQ)
335 2 temp|=0x80;
336 2 delayus(100); //60~120us
337 2 DQ=TRUE;
338 2 }
339 1 delayus(1);
340 1 return (temp);
341 1 }
342
343 void t0_ISR() interrupt 1
344 {
345 1 unsigned char temh,teml;
346 1 ET1=0; //关定时器1
347 1 EX0=0; //关外部中断
348 1 // TCON&=~0x01;
349 1
350 1 if(0==a)
351 1 {
352 2 temh=0;
353 2 teml=0;
354 2 init_18B20();//复位18b20
355 2 write_18B20(0xCC);//发出转换命令
356 2 write_18B20(0x44);
357 2 delayus(1000);
358 2 init_18B20();
359 2 write_18B20(0xCC);//发出读命令
360 2 write_18B20(0xBE);
361 2 teml=read_18B20();//读数据
362 2 temh=read_18B20();
363 2 count=(temh*256.0+teml*1.0)*0.0625;//计算具体温度
364 2 TemperatureNow=(unsigned char)(count);
365 2 }
C51 COMPILER V7.06 TEMPRATURE 04/09/2008 00:06:15 PAGE 7
366 1 a++;
367 1 if(a>10)
368 1 a=0;
369 1 // TCON=0x00;
370 1 ET1=1; //开定时器1
371 1 EX0=1; //开外部中断
372 1 Temperature_Flag=1;
373 1
374 1 }
375
376 void T1_ISR() interrupt 3 //50ms定时
377 {
378 1 // ET0=0; //关定时器0
379 1 // EX0=0; //关外部中断
380 1 EA=0;
381 1 delayus(200);
382 1 Time_Inc++;
383 1
384 1 if(Time_Change==0) //30s定时统计
385 1 Time_Inc_30S++;
386 1 if(Time_Change==1) //5s定时统计
387 1 Time_Inc_5S++;
388 1 if(Time_Inc==1200) //1min定时到
389 1 {
390 2
391 2 TimeSet--;
392 2 if(TimeSet==-1)
393 2 TimeSet=60;
394 2 Time_Inc=0;
395 2
396 2 }
397 1 else if(Time_Inc_30S==600) //30s定时时间到
398 1 {
399 2 Time_Inc_30S=0;
400 2 Display_Select=1; //开始显示设定温度
401 2 Time_Change=1;
402 2 }
403 1 else if(Time_Inc_5S==100) //5s定时时间到
404 1 {
405 2 Time_Inc_5S=0;
406 2 Display_Select=0; //显示测量温度
407 2 Time_Change=0;
408 2 }
409 1
410 1
411 1
412 1 TL1=0xFF;
413 1 TH1=0x4B; //重载(50ms定时)
414 1
415 1
416 1 EA=1;
417 1
418 1 }
419
420
421
422
423
424 void Short_Delay(void) /*短延时函数*/
425 {
426 1 unsigned char i;
427 1 for(i=0;i<0x08;i++);
C51 COMPILER V7.06 TEMPRATURE 04/09/2008 00:06:15 PAGE 8
428 1 }
429 /******************************************************************************
430 ******/
431 void Long_Delay(void) /*长延时函数*/
432 {
433 1 unsigned char i;
434 1 for(i=0;i<0x30;i++);
435 1 }
436
437 void Write_Hd7279(unsigned char Command,unsigned char Data) /*HD7279写函数*/
438 {
439 1 Send_Byte(Command);
440 1 Send_Byte(Data);
441 1 }
442 /******************************************************************************
443 ******/
444 unsigned char Read_Hd7279(unsigned char Command) /*HD7279读函数*/
445 {
446 1 Send_Byte(Command);
447 1 return(Receive_Byte());
448 1 }
449
450
451 /******************************************************************************
452 ******/
453 void Send_Byte(unsigned char Data_Out) /*HD7279发送字节函数*/
454 {
455 1 unsigned char i;
456 1 Clear_Bit(Hd7279_CS);
457 1 Long_Delay();
458 1 for(i=0;i<8;i++)
459 1 {
460 2 if(Data_Out&0x80) Set_Bit(Hd7279_Data);
461 2 else Clear_Bit(Hd7279_Data);
462 2 Set_Bit(Hd7279_Clk);
463 2 Short_Delay();
464 2 Clear_Bit(Hd7279_Clk);
465 2 Short_Delay();
466 2 Data_Out=Data_Out<<1;
467 2 }
468 1 Clear_Bit(Hd7279_Data);
469 1 }
470 /******************************************************************************
471 ******/
472 unsigned char Receive_Byte(void) /*HD7279接收字节函数*/
473 {
474 1 unsigned char i,Data_In;
475 1 Set_Bit(Hd7279_Data);
476 1 Long_Delay();
477 1 for(i=0;i<8;i++)
478 1 {
479 2 Set_Bit(Hd7279_Clk);
480 2 Short_Delay();
481 2 Data_In=Data_In<<1;
482 2 if(Hd7279_Data) Data_In=Data_In|0x01;
483 2 Clear_Bit(Hd7279_Clk);
484 2 Short_Delay();
485 2 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -