📄 ds18b20-lcd1602-c51.lst
字号:
255 {
256 1 unsigned char i = 0;
257 1 for (i = 8; i > 0; i--)
258 1 {
259 2 DQ = 0;
260 2 DQ = dat&0x01;
261 2 Delay(5);
262 2
263 2 DQ = 1;
264 2 dat>>=1;
265 2 }
266 1 }
267
268 /*******************************************************************/
269 /* */
270 /* 温度报警值写入DS18B20 */
271 /* */
272 /*******************************************************************/
273 Write_Temperature_alarm(void)
274 {
275 1 Init_DS18B20();
276 1
277 1 WriteOneChar(0xCC); //跳过读序号列号的操作
278 1 WriteOneChar(0x4e); //将设定的温度报警值写入 DS18B20
279 1 WriteOneChar(temp_alarm[0]); //写TH
280 1 WriteOneChar(temp_alarm[1]); //写TL
281 1 WriteOneChar(0x7f); //12位精确度
282 1
283 1 Init_DS18B20();
284 1 WriteOneChar(0xCC); //跳过读序号列号的操作
285 1 WriteOneChar(0x48); //把暂存器里的温度报警值拷贝到EEROM
286 1 }
287
288 /*******************************************************************/
289 /* */
290 /* 读取64位序列码 */
291 /* */
292 /*******************************************************************/
293 Read_RomCord(void)
294 {
295 1 unsigned char j;
296 1 Init_DS18B20();
297 1
298 1 WriteOneChar(0x33); // 读序列码的操作
299 1 for (j = 0; j < 8; j++)
300 1 {
301 2 RomCode[j] = ReadOneChar() ;
302 2 }
303 1 }
C51 COMPILER V8.05a DS18B20_LCD1602_C51 11/20/2006 21:44:00 PAGE 6
304
305 /*******************************************************************/
306 /* */
307 /*DS18B20的CRC8校验程序 */
308 /* */
309 /*******************************************************************/
310 uchar CRC8()
311 {
312 1 uchar i,x; uchar crcbuff;
313 1
314 1 crc=0;
315 1 for(x = 0; x <8; x++)
316 1 {
317 2 crcbuff=RomCode[x];
318 2 for(i = 0; i < 8; i++)
319 2 {
320 3 if(((crc ^ crcbuff)&0x01)==0)
321 3 crc >>= 1;
322 3 else {
323 4 crc ^= 0x18; //CRC=X8+X5+X4+1
324 4 crc >>= 1;
325 4 crc |= 0x80;
326 4 }
327 3 crcbuff >>= 1;
328 3 }
329 2 }
330 1 return crc;
331 1 }
332 /*******************************************************************/
333 /* */
334 /* 数据转换与显示 */
335 /* */
336 /*******************************************************************/
337
338 Disp_RomCode(uchar H_num)
339 {
340 1 uchar j;
341 1
342 1 if(H_num==1)
343 1 lcd_pos(0x00);
344 1 if(H_num==2)
345 1 lcd_pos(0x40);
346 1
347 1 for(j=0;j<8;j++)
348 1 {
349 2 Temp = RomCode[j];
350 2
351 2 display[0]=((Temp&0xf0)>>4);
352 2 if(display[0]>9)
353 2 { display[0]=display[0]+0x37;}
354 2 else{display[0]=display[0]+0x30;}
355 2 lcd_wdat(display[0]); //高位数显示
356 2
357 2 display[1]=(Temp&0x0f);
358 2 if(display[1]>9)
359 2 {display[1]=display[1]+0x37;}
360 2 else {display[1]=display[1]+0x30;}
361 2 lcd_wdat(display[1]); //低位数显示
362 2 }
363 1 }
364
365 /*******************************************************************/
C51 COMPILER V8.05a DS18B20_LCD1602_C51 11/20/2006 21:44:00 PAGE 7
366 /* */
367 /* 读取温度 */
368 /* */
369 /*******************************************************************/
370 Read_Temperature(void)
371 {
372 1 uchar i;
373 1 TR0=0; //关中断,防止读数错误
374 1 Init_DS18B20();
375 1
376 1 WriteOneChar(0xCC); //跳过读序号列号的操作
377 1 WriteOneChar(0x44); //启动温度转换
378 1
379 1 Init_DS18B20();
380 1
381 1 WriteOneChar(0x55); //匹配ROM命令
382 1 for(i=0;i<8;i++)
383 1 WriteOneChar(RomCode[i]);
384 1
385 1 WriteOneChar(0xBE); //读取温度寄存器
386 1
387 1 temp_data[0] = ReadOneChar(); //温度低8位
388 1 temp_data[1] = ReadOneChar(); //温度高8位
389 1 temp_alarm[0] = ReadOneChar(); //温度报警TH
390 1 temp_alarm[1] = ReadOneChar(); //温度报警TL
391 1
392 1 temp_comp=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
393 1 //取温度整数值
394 1 TR0=1; //开中断
395 1 }
396 /*******************************************************************/
397 /* */
398 /* 数据转换与温度显示 */
399 /* */
400 /*******************************************************************/
401 Disp_Temperature()
402 {
403 1 uchar s=0;
404 1 if(temp_data[1]>127) //温度为负值
405 1 {
406 2 temp_data[0]=(~temp_data[0])+1; //取反加一,将补码变成原码
407 2 if((~temp_data[0])>=0xff)
408 2 temp_data[1]=(~temp_data[1])+1;
409 2 else temp_data[1]=~temp_data[1];
410 2 s=1;
411 2 }
412 1
413 1 display[4]=temp_data[0]&0x0f;
414 1 display[0]=(display[4]*10/16)+0x30;
415 1
416 1 display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
417 1 display[3]=display[4]/100+0x30;
418 1 display[1]=display[4]%100;
419 1 display[2]=display[1]/10+0x30;
420 1 display[1]=display[1]%10+0x30;
421 1
422 1 if(display[3]==0x30) //高位为0,不显示
423 1 {
424 2 display[3]=0x20;
425 2 if(display[2]==0x30) //次高位为0,不显示
426 2 display[2]=0x20;
427 2 }
C51 COMPILER V8.05a DS18B20_LCD1602_C51 11/20/2006 21:44:00 PAGE 8
428 1 if(s)
429 1 display[3]=0x2d; //显示负号
430 1
431 1 lcd_pos(0x07);
432 1 lcd_wdat(display[3]); //百位数显示
433 1 lcd_wdat(display[2]); //十位数显示
434 1 lcd_wdat(display[1]); //个位数显示
435 1 lcd_wdat('.');
436 1 lcd_wdat(display[0]); //小数位数显示
437 1 lcd_wdat(0x00); //显示自定义字符
438 1 lcd_wdat('C'); //显示C
439 1 }
440
441 /*******************************************************************/
442 /* */
443 /* 蜂鸣器响一声 */
444 /* */
445 /*******************************************************************/
446 void beep()
447 {
448 1 unsigned char y;
449 1 for (y=0;y<100;y++)
450 1 {
451 2 Delay(70);
452 2 BEEP=!BEEP; //BEEP取反
453 2 }
454 1 BEEP=1; //关闭蜂鸣器
455 1 Delay(25000);
456 1 }
457
458 /*******************************************************************/
459 /* */
460 /* ROMCORD 显示菜单 */
461 /* */
462 /*******************************************************************/
463 void RomCode_Menu ()
464 {
465 1 uchar m;
466 1 lcd_init(); //初始化LCD
467 1
468 1 lcd_pos(0); //设置显示位置为第一行
469 1 for(m=0;m<16;m++) //显示字符
470 1 lcd_wdat(cdis1[m]);
471 1
472 1 Read_RomCord(); //读取64位序列码
473 1 CRC8(); //CRC效验
474 1 if(crc==0) //CRC效验正确
475 1 {
476 2 Disp_RomCode(2); //显示64位序列码
477 2 }
478 1 }
479
480 /*******************************************************************/
481 /* */
482 /* DS18B20 ERROR 显示菜单 */
483 /* */
484 /*******************************************************************/
485 void Error_Menu ()
486 {
487 1 uchar m;
488 1 lcd_init(); //初始化LCD
489 1
C51 COMPILER V8.05a DS18B20_LCD1602_C51 11/20/2006 21:44:00 PAGE 9
490 1 lcd_pos(0); //设置显示位置为第一行的第1个字符
491 1 for(m=0;m<16;m++)
492 1 lcd_wdat(cdis3[m]); //显示字符
493 1
494 1 lcd_pos(0x40); //设置显示位置为第二行第1个字符
495 1 for(m=0;m<16;m++)
496 1 lcd_wdat(cdis4[m]); //显示字符
497 1 }
498
499 /*******************************************************************/
500 /* */
501 /* DS18B20 正常显示菜单 */
502 /* */
503 /*******************************************************************/
504 void Natural_Menu ()
505 {
506 1 uchar m;
507 1 lcd_init(); //初始化LCD
508 1
509 1 lcd_pos(0); //设置显示位置为第一行的第1个字符
510 1 for(m=0;m<16;m++)
511 1 lcd_wdat(cdis5[m]); //显示字符
512 1
513 1 lcd_pos(0x40); //设置显示位置为第二行第1个字符
514 1 for(m=0;m<16;m++)
515 1 lcd_wdat(cdis6[m]); //显示字符
516 1
517 1 Read_Temperature();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -