📄 ds18b20-lcd1602-温度控制.lst
字号:
0298 D8FE 387 TSR6: DJNZ R0,$ ; 时序要求延时一段时间
029A D2B3 388 TSR7: SETB DATE_LINE
029C 22 389 RET
390
391 ;==========================================================
392 ;重新对 DS18B20 初始化
393 ;将设定的温度报警值写入 DS18B20
394 ;==========================================================
029D 395 RE_18B20:
029D 200001 396 JB FLAG1,RE_18B20A
02A0 22 397 RET
02A1 398 RE_18B20A:
02A1 5171 399 CALL RESET
02A3 74CC 400 MOV A,#0CCH ;跳过ROM匹配
02A5 1202F1 401 LCALL WRITE
02A8 744E 402 MOV A,#4EH ;写暂存寄存器
02AA 1202F1 403 LCALL WRITE
02AD E527 404 MOV A,TEMP_TH ;TH(报警上限)
02AF 1202F1 405 LCALL WRITE
02B2 E528 406 MOV A,TEMP_TL ;TL(报警下限)
02B4 1202F1 407 LCALL WRITE
02B7 747F 408 MOV A,#7FH ;12位精确度
02B9 1202F1 409 LCALL WRITE
02BC 22 410 RET
411 ;------------------------------------------------------------
412 ;把 DS18B20 暂存器里的温度报警值拷贝到EEROM
413 ;------------------------------------------------------------
02BD 414 WRITE_E2:
02BD 5171 415 CALL RESET
02BF 74CC 416 MOV A,#0CCH ;跳过ROM匹配
02C1 1202F1 417 LCALL WRITE
02C4 7448 418 MOV A,#48H ;把暂存器里的温度报警值拷贝到EEROM
02C6 1202F1 419 LCALL WRITE
02C9 22 420 RET
421 ;--------------------------------------------------------------
422 ;把 DS18B20 EEROM 里的温度报警值拷贝回暂存器
423 ;-------------------------------------------------------------
02CA 424 READ_E2:
02CA 5171 425 CALL RESET
02CC 74CC 426 MOV A,#0CCH ;跳过ROM匹配
02CE 1202F1 427 LCALL WRITE
A51 MACRO ASSEMBLER DS18B20_LCD1602_温禵縚制 12/20/2006 22:01:59 PAGE 8
02D1 74B8 428 MOV A,#0B8H ;把EEROM里的温度报警值拷贝回暂存器
02D3 51F1 429 CALL WRITE
02D5 22 430 RET
431 ;--------------------------------------------------------------
432 ;将自定义字符“℃”写入 LCD1602 的 CGRAM 中
433 ;--------------------------------------------------------------
02D6 434 STORE_DATA:
02D6 7440 435 MOV A,#40H ;指定地址
02D8 B107 436 CALL WCOM
02DA 7A08 437 MOV R2,#08H ;共取 8 个数
02DC 9002E9 438 MOV DPTR,#D_DATA
02DF 7B00 439 MOV R3,#00H
02E1 440 S_DATA:
02E1 EB 441 MOV A,R3
02E2 93 442 MOVC A,@A+DPTR ;查表取数
02E3 B114 443 CALL WDATA ;写入数据
02E5 0B 444 INC R3
02E6 DAF9 445 DJNZ R2,S_DATA ;没有取完,继续
02E8 22 446 RET
447
02E9 448 D_DATA:
02E9 0C12120C 449 DB 0CH,12H,12H,0CH,00H,00H,00H,00H ;字符 “°”
02ED 00000000
450 ;------------------------------------------------------------------
451 ;DS18B20 写命令、数据子程序
452 ;根据命令的内容,进行写操作
453 ;------------------------------------------------------------------
02F1 454 WRITE:
02F1 7A08 455 MOV R2,#8 ;8位数据长度
02F3 C3 456 CLR C
02F4 457 WR1:
02F4 C2B3 458 CLR DATE_LINE ;开始写入DS18B20总线要处于复位(低)状态
02F6 7B08 459 MOV R3,#08
02F8 DBFE 460 DJNZ R3,$ ;总线复位保持16微妙以上
02FA 13 461 RRC A ;把一个字节DATA 分成8个BIT环移给C
02FB 92B3 462 MOV DATE_LINE,C ;写入一个BIT
02FD 7B3C 463 MOV R3,#3CH
02FF DBFE 464 DJNZ R3,$ ;等待120微妙
0301 D2B3 465 SETB DATE_LINE ;重新释放总线
0303 00 466 NOP
0304 DAEE 467 DJNZ R2,WR1 ;写入下一个BIT
0306 D2B3 468 SETB DATE_LINE
0308 22 469 RET
470 ;--------------------------------------------------------------------
471 ;DS18B20 读温度子程序
472 ; 将温度低位、高位、TH、TL从DS18B20中读出
473 ; 分别存入 25H、26H、27H、28H 单元中
474 ;--------------------------------------------------------------------
0309 475 READ_TEMP:
0309 C28C 476 CLR TR0
030B 74CC 477 MOV A,#0CCH ; 跳过ROM匹配
030D 51F1 478 CALL WRITE
030F 7444 479 MOV A,#44H ; 发出温度转换命令
0311 51F1 480 CALL WRITE
0313 5171 481 CALL RESET
0315 74CC 482 MOV A,#0CCH ; 跳过ROM匹配
0317 51F1 483 CALL WRITE
0319 74BE 484 MOV A,#0BEH ; 发出读温度命令
031B 51F1 485 CALL WRITE ;先写入命令
486
031D 7C04 487 MOV R4,#4 ;存入4个单元中
031F 7925 488 MOV R1,#TEMPL ;存入单元的首地址送入 R1
0321 489 RE00:
0321 7A08 490 MOV R2,#8 ;8位数据长度
0323 491 RE01:
0323 C2D7 492 CLR CY
A51 MACRO ASSEMBLER DS18B20_LCD1602_温禵縚制 12/20/2006 22:01:59 PAGE 9
0325 D2B3 493 SETB DATE_LINE
0327 00 494 NOP
0328 00 495 NOP
0329 C2B3 496 CLR DATE_LINE ;读前总线保持为低
032B 00 497 NOP
032C 00 498 NOP
032D 00 499 NOP
032E D2B3 500 SETB DATE_LINE ;开始读总线释放
0330 7B07 501 MOV R3,#07 ;延时15微妙
0332 DBFE 502 DJNZ R3,$
0334 A2B3 503 MOV C,DATE_LINE ;从DS18B20总线读得一个BIT
0336 7B3C 504 MOV R3,#3CH
0338 DBFE 505 DJNZ R3,$ ;等待100微妙
033A 13 506 RRC A ;把读得的位值环移给A
033B DAE6 507 DJNZ R2,RE01 ;读下一个BIT
033D F7 508 MOV @R1,A
033E 09 509 INC R1
033F DCE0 510 DJNZ R4,RE00 ;没有读完,继续
0341 D28C 511 SETB TR0
0343 22 512 RET
513 ;*****************************************************
514 ;处理温度 BCD 码子程序
515 ;整数部分:取出 TEMPL 高四位和 TEMPH 低四位进行重新组合
516 ;小数部分:取出 TEMPL 低四位,查小数码表
517 ;****************************************************
0344 518 CONVTEMP:
0344 E526 519 MOV A,TEMPH ;判温度是否零下
0346 5480 520 ANL A,#80H
0348 6013 521 JZ TEMPC1 ;温度零上转
034A D203 522 SETB FLAG3 ;温度为负值
034C C3 523 CLR C
034D E525 524 MOV A,TEMPL ;二进制数求补(双字节)
034F F4 525 CPL A ;取反加1
0350 2401 526 ADD A,#01H
0352 F525 527 MOV TEMPL,A
0354 E526 528 MOV A,TEMPH
0356 F4 529 CPL A
0357 3400 530 ADDC A,#00H
0359 F526 531 MOV TEMPH,A
035B 8002 532 JMP TEMPC2
035D 533 TEMPC1:
035D C203 534 CLR FLAG3 ;温度为正值
035F 535 TEMPC2:
035F E525 536 MOV A,TEMPL
0361 540F 537 ANL A,#0FH ;取出小数部分
0363 75F00A 538 MOV B,#10 ;将TEMP_L的低四位X10/16得小数后一位数.
0366 A4 539 MUL AB
0367 75F010 540 MOV B,#16
036A 84 541 DIV AB
036B F570 542 MOV 70H,A ;小数部分 BCD
543
036D E525 544 MOV A,TEMPL ;整数部分
036F 54F0 545 ANL A,#0F0H ;取出高四位
0371 C4 546 SWAP A
0372 F525 547 MOV TEMPL,A
0374 E526 548 MOV A,TEMPH ;取出低四位
0376 540F 549 ANL A,#0FH
0378 C4 550 SWAP A
0379 4525 551 ORL A,TEMPL ;重新组合温度数据
037B F524 552 MOV TEMP_ZH,A ;重新组合的温度数据存入TEMP_ZH
037D 120391 553 LCALL HEX2BCD1
554
0380 F525 555 MOV TEMPL,A ;(A)=十位数和个位数
0382 54F0 556 ANL A,#0F0H
0384 C4 557 SWAP A
0385 F572 558 MOV 72H,A ;十位数 BCD
A51 MACRO ASSEMBLER DS18B20_LCD1602_温禵縚制 12/20/2006 22:01:59 PAGE 10
0387 E525 559 MOV A,TEMPL
0389 540F 560 ANL A,#0FH
038B F571 561 MOV 71H,A ;个位数 BCD
562
038D EC 563 MOV A,R4 ;(R4)= 百位数
038E F573 564 MOV 73H,A
0390 565 TEMPC3:
0390 22 566 RET
567 ;====================================================
568 ;单字节十六进制转BCD
569 ;入口:(A)=单字节十六进制的温度值
570 ;出口:(R4)= 百位数,(A)=十位数和个位数
571 ;====================================================
0391 572 HEX2BCD1:
0391 75F064 573 MOV B,#064H
0394 84 574 DIV AB
0395 FC 575 MOV R4,A ;(R4)=百位数
0396 740A 576 MOV A,#0AH
0398 C5F0 577 XCH A,B
039A 84 578 DIV AB
039B C4 579 SWAP A
039C 45F0 580 ORL A,B ;(A)=十位数和个位数
039E 22 581 RET
582
583 ;=====================================================
584 ;显示 TH 和 TL 值的子程序
585 ;=====================================================
039F 586 LOOK_ALARM:
039F 9003BD 587 MOV DPTR,#M_ALAX2 ;指针指到显示信息区
03A2 7402 588 MOV A,#2 ;显示在第二行
03A4 91D4 589 CALL LCD_PRINT ;
590
03A6 74C6 591 MOV A,#0C6H ;指定地址
03A8 71CE 592 CALL TEMP_BJ1
03AA E527 593 MOV A,TEMP_TH ;加载 TH 数据
03AC 752F03 594 MOV LCD_X,#3 ;设置位置变量
03AF 71E1 595 CALL SHOW_DIG2H ;显示 TH 数据
596
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -