;****DS18B20温度计,注意数据口是P3.7     
;测温范围-55度至+125度 * 
        TIMEL          EQU     0E0H        ;20MS,定时器 0 时间常数 
        TIMEH        EQU    0B1H        ; 
        TEMPHEAD    EQU    36H        ; 
CS1     BIT     P2.3 
CS2     BIT     P2.4 
D_I     BIT     P3.6   ;4 
R_W     BIT     P2.5   ;5 
E       BIT     P2.6   ;6 
DB0_DB7 EQU     P0 
X       EQU     22H    ;页地址 
Y       EQU     23H    ;列地址   
COM     EQU        24H 
DAT     EQU     24H 
COUNT   EQU     25H          ;代码倒计数单元             
CODE0   EQU     26H        ;表格起始地址,赋0值后与DPTR合成查表指针地址 
MUL_    EQU     26H    ;显示数字时,暂存单元(要显示的数是几就在里面存几)   
        BITST       DATA    20H 
        TIME1SOK    BIT    BITST.1 
        TEMPONEOK    BIT    BITST.2 
        TEMPL        DATA    30H 
        TEMPH        DATA    27H 
        TEMPHC        DATA    28H 
        TEMPLC        DATA    29H 
        TEMPDIN     BIT     P3.7            ; 
        ORG     0000H 
        AJMP    START 
        ORG     00BH 
        AJMP    T0IT 
        ORG     0030H 
;       系统初始化 
START:           MOV   SP,#60H 
                   ACALL INT 
                   SETB  CS1 
                   SETB  CS2 
                   ACALL CLEAR 
CLSMEM:          MOV      R0, #20H                ; 
                 MOV      R1, #60H                ; 
CLSMEM1:         MOV      @R0, #00H               ; 
                INC     R0                      ; 
                DJNZ    R1, CLSMEM1             ; 
                ACALL SY 
; 
         MOV     TMOD, #00100001B    ; 定时器 0 作方式1 (16BIT) 
         MOV     TH0, #TIMEL        ; 
         MOV     TL0, #TIMEH        ; 20ms 
                SJMP    INIT 
; 
ERROR:          NOP 
                LJMP    START            ; 
; 
                NOP                ; 
INIT:           NOP                ; 
        SETB    ET0            ; 
        SETB    TR0            ; 
         SETB    EA            ; 
                 MOV     PSW, #00H        ; 
                CLR    TEMPONEOK        ; 
                LJMP    MAIN            ; 
;       定时器0中断服务程序 
T0IT:          PUSH    PSW            ; 
         MOV     PSW, #10H        ; 
         MOV     TH0, #TIMEH        ; 
         MOV     TL0, #TIMEL        ; 
        INC    R7            ; 
        CJNE    R7, #32H, T0IT1        ; 
         MOV     R7, #00H        ; 
        SETB    TIME1SOK        ;1S定时到标志 
T0IT1:        POP    PSW            ; 
        RETI                ; 
;    主程序 
MAIN:         LCALL    DISP1            ;调用显示子程序 
        JNB    TIME1SOK, $        ; 
        CLR    TIME1SOK        ;测温每1S一次 
                JNB    TEMPONEOK, MAIN2    ;上电时先温度转换一次 
                LCALL    READTEMP1        ;读出温度值子程序 
                LCALL    CONVTEMP        ;温度BCD 码计算处理子程序 
                LCALL   DISPBCD                 ;显示区BCD码温度值涮新子程序 
                LCALL   DISP1                   ;消闪烁,显示一次 
MAIN2:        LCALL    READTEMP        ;温度转换开始 
                SETB    TEMPONEOK        ; 
                LJMP    MAIN            ; 
;子程序 
INITDS1820:    SETB    TEMPDIN            ; 
        NOP                ; 
        NOP                ; 
        CLR    TEMPDIN            ; 
         MOV     R6, #0A0H        ; DELAY 480us 
        DJNZ    R6, $ 
                 MOV     R6, #0A0H 
                DJNZ    R6, $            ; 
        SETB    TEMPDIN            ; 
         MOV     R6, #32H        ; DELAY 70us 
        DJNZ    R6, $            ; 
                 MOV      R6,#3CH 
LOOP1820:        MOV     C, TEMPDIN        ; 
        JC    INITDS1820OUT        ; 
                DJNZ    R6,LOOP1820 
                 MOV     R6, #064H        ; DELAY 200us 
        DJNZ    R6, $            ; 
        SJMP    INITDS1820        ; 
        RET                ; 
; 
INITDS1820OUT:    SETB    TEMPDIN            ; 
        RET                ; 
;读DS18B20的程序, 从DS18B20中读出一个字节的数据 
READDS1820:      MOV     R7, #08H        ; 
        SETB    TEMPDIN            ; 
        NOP                ; 
        NOP                ; 
READDS1820LOOP:    CLR    TEMPDIN            ; 
        NOP                ; 
        NOP                ; 
        NOP                ; 
        SETB     TEMPDIN            ; 
         MOV         R6, #07H        ; DELAY 15us 
               DJNZ    R6, $            ; 
             MOV      C, TEMPDIN        ; 
         MOV     R6, #3CH        ; DELAY 120us 
        DJNZ    R6, $            ; 
        RRC     A            ; 
                SETB     TEMPDIN            ; 
        DJNZ    R7, READDS1820LOOP    ; 
         MOV     R6, #3CH        ; DELAY 120us 
        DJNZ    R6, $            ; 
        RET                ; 
;写DS18B20的程序, 从DS18B20中写一个字节的数据 
WRITEDS1820:     MOV     R7, #08H        ; 
        SETB    TEMPDIN            ; 
        NOP                ; 
        NOP                ; 
WRITEDS1820LOP:    CLR    TEMPDIN            ; 
         MOV         R6, #07H        ; DELAY 15us 
               DJNZ    R6, $            ; 
            RRC     A            ; 
             MOV     TEMPDIN, C        ; 
             MOV     R6, #34H        ; DELAY 104us 
            DJNZ    R6, $            ; 
            SETB    TEMPDIN            ; 
            DJNZ    R7, WRITEDS1820LOP    ; 
        RET                ; 
;READ TEMP 
READTEMP:    LCALL    INITDS1820        ; 
         MOV     A, #0CCH        ; 
        LCALL    WRITEDS1820        ; SKIP ROM 
         MOV     R6, #34H        ; DELAY 104us 
        DJNZ    R6, $            ; 
         MOV     A, #44H            ; 
        LCALL    WRITEDS1820        ; START CONVERSION 
         MOV     R6, #34H        ; DELAY 104us 
        DJNZ    R6, $        ; 
        RET                ; 
; 
READTEMP1:    LCALL    INITDS1820        ; 
         MOV     A, #0CCH        ; 
        LCALL    WRITEDS1820        ; SKIP ROM 
         MOV     R6, #34H        ; DELAY 104us 
        DJNZ    R6, $            ; 
         MOV     A, #0BEH        ; 
        LCALL    WRITEDS1820        ; 
SCRATCHPAD 
         MOV     R6, #34H        ; DELAY 104us 
        DJNZ    R6, $            ; 
         MOV     R5, #09H        ; 
         MOV     R0, #TEMPHEAD        ; 
                 MOV      B,#00H 
READTEMP2:    LCALL    READDS1820        ; 
         MOV     @R0, A            ; 
        INC    R0            ; 
READTEMP21:     LCALL    CRC8CAL            ; 
        DJNZ    R5, READTEMP2        ; 
         MOV     A, B            ; 
        JNZ    READTEMPOUT        ; 
         MOV     A, TEMPHEAD + 0        ; 
         MOV     TEMPL, A        ; 
         MOV     A, TEMPHEAD + 1        ; 
         MOV     TEMPH, A        ; 
READTEMPOUT:    RET                ; 
;处理温度 BCD 码子程序 
CONVTEMP:     MOV     A, TEMPH        ; 
        ANL    A, #80H            ; 
        JZ    TEMPC1            ; 
        CLR    C            ; 
         MOV     A, TEMPL        ; 
        CPL    A            ; 
        ADD    A, #01H            ; 
         MOV     TEMPL, A        ; 
         MOV     A, TEMPH        ; - 
        CPL    A            ; 
        ADDC    A, #00H            ; 
         MOV     TEMPH, A        ; TEMPHC HI = 符号位 
         MOV     TEMPHC, #0BH        ; 
        SJMP    TEMPC11            ; 
; 
TEMPC1:         MOV     TEMPHC, #0AH        ; + 
TEMPC11:         MOV      A,TEMPHC 
                SWAP    A 
                 MOV      TEMPHC,A 
                 MOV     A, TEMPL        ; 
        ANL    A, #0FH            ; 乘 0.0625 
         MOV     DPTR, #TEMPDOTTAB    ; 
         MOV C    A, @A + DPTR        ; 
         MOV     TEMPLC, A        ; TEMPLC LOW = 小数部分 BCD 
; 
         MOV     A, TEMPL        ; 整数部分 
        ANL    A, #0F0H        ; 
        SWAP    A            ; 
         MOV     TEMPL, A        ; 
         MOV     A, TEMPH        ; 
        ANL    A, #0FH            ; 
        SWAP    A            ; 
        ORL    A, TEMPL        ; 
        LCALL    HEX2BCD1        ; 
         MOV     TEMPL, A        ; 
        ANL    A, #0F0H        ; 
        SWAP    A            ; 
        ORL    A, TEMPHC        ; TEMPHC LOW = 十位数 BCD 
         MOV     TEMPHC, A        ; 
         MOV     A, TEMPL        ; 
        ANL    A, #0FH            ; 
        SWAP    A            ; TEMPLC HI = 个位数 BCD 
        ORL    A, TEMPLC        ; 
         MOV     TEMPLC, A        ; 
         MOV     A, R7            ; 
        JZ    TEMPC12            ; 
        ANL    A, #0FH            ; 
        SWAP    A            ; 
         MOV     R7, A            ; 
         MOV     A, TEMPHC        ; TEMPHC HI = 百位数 BCD 
        ANL    A, #0FH            ; 
        ORL    A, R7            ; 
         MOV     TEMPHC, A        ; 
TEMPC12:    RET                ; 
;小数部分码表 
TEMPDOTTAB:    DB    00H, 01H, 01H, 02H, 03H, 03H, 04H, 04H, 05H, 06H 
; 
        DB    06H, 07H, 08H, 08H, 09H, 09H 
;显示区BCD码温度值涮新子程序 
DISPBCD:         MOV     A, TEMPLC        ; 
        ANL    A, #0FH            ; 
         MOV     70H, A                ; 
         MOV     A, TEMPLC        ; 
        SWAP    A            ; 
        ANL    A, #0FH            ; 
         MOV     71H, A                ; 
         MOV     A, TEMPHC        ; 
        ANL    A, #0FH            ; 
         MOV     72H, A                ; 
         MOV     A, TEMPHC        ; 
        SWAP    A            ; 
        ANL    A, #0FH            ; 
         MOV     73H, A                ; 
         MOV     A, TEMPHC        ; 
        ANL    A, #0F0H        ; 
        CJNE    A, #010H, DISPBCD0    ; 
        SJMP    DISPBCD2        ; 
; 
DISPBCD0:     MOV     A, TEMPHC        ; 
        ANL    A, #0FH            ; 
        JNZ    DISPBCD2        ; 十位数是零 
         MOV     A, TEMPHC        ; 
        SWAP    A            ; 
        ANL    A, #0FH            ; 
         MOV     73H, #0AH            ; 符号位不显示 
         MOV     72H, A                ; 十位数显示符号 
DISPBCD2:    RET                ; 
;单字节 16 进制转 BCD 
HEX2BCD1:     MOV     B, #064H        ; 16 进制 -> BCD 
        DIV    AB            ; B = A % 100 
         MOV     R7, A            ; R7 = 百位数 
         MOV     A, #0AH            ; 
        XCH    A, B            ; 
        DIV    AB            ; B = A % B 
        SWAP    A            ; 
        ORL    A, B            ; 
        RET                ; 
;    Calculate CRC-8 Values.  Uses The CCITT-8 Polynomial, Expressed As 
;    X^8 + X^5 + X^4 + 1 
CRC8CAL:    PUSH    ACC            ; 
         MOV     R7, #08H        ; Number Bits In Byte 
; 
CRC8LOOP1:    XRL    A, B            ; Calculate CRC 
        RRC    A            ;  MOV e To Carry 
         MOV     A, B            ; Get The Last CRC Value 
        JNC    CRC8LOOP2        ; Skip If Data == 0 
        XRL    A, #18H            ; Update The CRC Value 
; 
CRC8LOOP2:    RRC    A            ; Position The New CRC 
         MOV     B, A            ; Store The New CRC 
        POP    ACC            ; Get The Remaining Bits 
        RR    A            ; Position The Next Bit 
        PUSH    ACC            ; Save The Remaining Bits 
        DJNZ    R7, CRC8LOOP1        ; Repeat For 8 Bits 
        POP    ACC            ; 
        RET                ; 
;显示子程序 
;显示数据在70H-73H单元内,用4位LED共阳数码管显示 
DISP1:    SETB CS2 
         CLR  CS1 
          MOV  X,#0BAH                 
          MOV  Y,#48H                     
          MOV  DPTR,#DDB  
          MOV  MUL_,72H 
         ACALL DISP_ 
          MOV  X,#0BAH                 
          MOV  Y,#50H                     
          MOV  MUL_,71H 
         ACALL DISP_ 
          MOV  X,#0BAH                 
          MOV  Y,#60H                     
          MOV  MUL_,70H 
         ACALL DISP_ 
          MOV  X,#0BAH                 
          MOV  Y,#58H                     
          MOV  DPTR,#TAB1 
          MOV  MUL_,#00H 
         ACALL DISP_ 
         RET 
;************************8位字宽显示子程序:  (CODE0待设)********************** 
DISP_:   MOV  B,#10H       ;要显示的数是几就用几乘以16,得到基址起始地址   
         MOV  A,MUL_ 
        MUL AB 
         MOV  CODE0,A 
         MOV  39H,#02H 
         MOV  COUNT,#08H         
LP_:     MOV  COM,X            ;设置页地址 
        LCALL INST 
         MOV  COM,Y            ;设置列地址 
        LCALL INST  
W_:      MOV  A,CODE0                    
         MOV C A,@A+DPTR 
         MOV  DAT,A 
        LCALL DATA_         
        INC CODE0 
        DJNZ COUNT,W_ 
        DJNZ 39H,LP1_ 
        RET 
LP1_:   INC X 
         MOV  COUNT,#08H 
        AJMP LP_ 
;***************************16位字宽显示子程序**********************    
DISP:    MOV  39H,#02H 
         MOV  CODE0,#00H 
         MOV  COUNT,#10H    ;根据字宽及象素的不同而改变 DISP中的COUNT根据字高及象素改变CODE0     
LP:      MOV  COM,X            ;设置页地址 
        LCALL INST 
         MOV  COM,Y            ;设置列地址 
        LCALL INST  
W:       MOV  A,CODE0                    
         MOV C A,@A+DPTR 
         MOV  DAT,A 
        LCALL DATA_         
        INC CODE0 
        DJNZ COUNT,W 
        DJNZ 39H,LP1 
        RET 
LP1:    INC X 
         MOV  COUNT,#10H 
        AJMP LP 
;***********************以下为字符显示子程序块************************* 
SY:        SETB CS1          ;开机    
        CLR  CS2 
         MOV  X,#0BAH                    
         MOV  Y,#40H                         
         MOV      DPTR,#TAB2        ; 
        CALL    DISP 
         MOV  X,#0BAH                        
         MOV  Y,#50H                        
         MOV      DPTR,#TAB3        ; 
        CALL    DISP 
         MOV  X,#0BAH                 
         MOV  Y,#60H                     
         MOV      DPTR,#TAB4       ; 
        CALL    DISP 
         MOV  X,#0BAH                    
         MOV  Y,#70H                        
         MOV      DPTR,#TAB5        ;    
        CALL    DISP 
        CLR CS1 
        SETB CS2 
         MOV  X,#0BAH                    
         MOV  Y,#40H                         
         MOV      DPTR,#TAB6        ; 
        CALL    DISP 
         MOV  X,#0BAH                    
         MOV  Y,#70H                         
         MOV      DPTR,#TAB7        ; 
        CALL    DISP         
        RET 
INST:   LCALL BUSY     ;写指令 
        SETB E 
        CLR D_I 
        CLR R_W 
         MOV  DB0_DB7,COM 
        CLR E 
        RET 
DATA_:  LCALL BUSY     ;写数据 
        SETB E 
        SETB D_I 
        CLR R_W 
         MOV  DB0_DB7,DAT 
        CLR E 
        RET 
BUSY:   CLR D_I        ;测忙 
        SETB R_W 
BUSY1:   MOV  DB0_DB7,#0FFH 
        SETB E 
         MOV  A,DB0_DB7 
        CLR E 
        JB ACC.7,BUSY1 
        RET 
CLEAR:      MOV  R4,#00H      ;清屏 
CLEAR1:  MOV  A,R4 
        ORL A,#0B8H 
         MOV  COM,A 
        ACALL INST 
         MOV  COM,#40H 
        ACALL INST 
         MOV  R3,#40H 
CLEAR2:  MOV  DAT,#00H 
        LCALL DATA_ 
        DJNZ R3,CLEAR2 
        INC R4 
        CJNE R4,#08H,CLEAR1 
        RET 
INT:     MOV  COM,#0C0H    ;初始化 
        ACALL INST 
         MOV  COM,#3FH 
        ACALL INST 
        RET 
;*********************************************** 
DEL:   MOV  R7,#01H 
DEL1:  MOV  R6,#0FFH 
DEL2:  MOV  R5,#0FFH 
      DJNZ R5,$ 
      DJNZ R6,DEL2 
      DJNZ R7,DEL1 
      RET 
DDB: 
DB 000H,0E0H,010H,008H,008H,010H,0E0H,000H,000H,00FH,010H,020H,020H,010H,00FH,000H ; "0" 0 
DB 000H,010H,010H,0F8H,000H,000H,000H,000H,000H,020H,020H,03FH,020H,020H,000H,000H ; "1" 1 
DB 000H,070H,008H,008H,008H,088H,070H,000H,000H,030H,028H,024H,022H,021H,030H,000H ; "2" 2 
DB 000H,030H,008H,088H,088H,048H,030H,000H,000H,018H,020H,020H,020H,011H,00EH,000H ; "3" 3 
DB 000H,000H,0C0H,020H,010H,0F8H,000H,000H,000H,007H,004H,024H,024H,03FH,024H,000H ; "4" 4 
DB 000H,0F8H,008H,088H,088H,008H,008H,000H,000H,019H,021H,020H,020H,011H,00EH,000H ; "5" 5 
DB 000H,0E0H,010H,088H,088H,018H,000H,000H,000H,00FH,011H,020H,020H,011H,00EH,000H ; "6" 6 
DB 000H,038H,008H,008H,0C8H,038H,008H,000H,000H,000H,000H,03FH,000H,000H,000H,000H ; "7" 7 
DB 000H,070H,088H,008H,008H,088H,070H,000H,000H,01CH,022H,021H,021H,022H,01CH,000H ; "8" 8 
DB 000H,0E0H,010H,008H,008H,010H,0E0H,000H,000H,000H,031H,022H,022H,011H,00FH,000H ; "9" 9 
DB 000H,0E0H,010H,008H,008H,010H,0E0H,000H,000H,00FH,010H,020H,020H,010H,00FH,000H ; "0" 0 
DB 000H,0E0H,010H,008H,008H,010H,0E0H,000H,000H,00FH,010H,020H,020H,010H,00FH,000H ; "0" 0 
DB 000H,0E0H,010H,008H,008H,010H,0E0H,000H,000H,00FH,010H,020H,020H,010H,00FH,000H ; "0" 0 
DB 000H,0E0H,010H,008H,008H,010H,0E0H,000H,000H,00FH,010H,020H,020H,010H,00FH,000H ; "0" 0 
DB 000H,0E0H,010H,008H,008H,010H,0E0H,000H,000H,00FH,010H,020H,020H,010H,00FH,000H ; "0" 0 
DB 000H,0E0H,010H,008H,008H,010H,0E0H,000H,000H,00FH,010H,020H,020H,010H,00FH,000H ; "0" 0 
TAB1: 
DB 000H,000H,000H,000H,000H,000H,000H,000H,000H,030H,030H,000H,000H,000H,000H,000H ; "." 0 
TAB2: 
DB 000H,000H,040H,042H,05CH,048H,040H,040H,07FH,040H,050H,04EH,044H,0C0H,000H,000H ;  
DB 000H,000H,020H,022H,022H,022H,022H,022H,022H,022H,022H,022H,022H,07FH,000H,000H ; "当" 0 
TAB3: 
DB 008H,008H,0E8H,0A8H,0A9H,0AEH,0EAH,008H,008H,0C8H,00CH,00BH,0EAH,008H,008H,000H ;  
DB 000H,000H,07FH,004H,024H,044H,03FH,000H,000H,01FH,040H,080H,07FH,000H,000H,000H ; "前" 1 
TAB4: 
DB 000H,010H,02CH,024H,0A4H,064H,025H,026H,024H,024H,0A4H,024H,034H,02CH,004H,000H ;  
DB 040H,040H,048H,049H,049H,049H,049H,07FH,049H,049H,049H,04BH,048H,040H,040H,000H ; "室" 0 
TAB5: 
DB 010H,021H,086H,070H,000H,07EH,04AH,04AH,04AH,04AH,04AH,07EH,000H,000H,000H,000H ;  
DB 002H,0FEH,001H,040H,07FH,041H,041H,07FH,041H,041H,07FH,041H,041H,07FH,040H,000H ; "温" 0 
TAB6: 
DB 000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H ;  
DB 000H,000H,036H,036H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H ; ":" 0 
TAB7: 
DB 000H,000H,0FCH,004H,024H,024H,0FCH,0A5H,0A6H,0A4H,0FCH,024H,024H,024H,004H,000H ;  
DB 080H,060H,01FH,080H,080H,042H,046H,02AH,012H,012H,02AH,026H,042H,0C0H,040H,000H ; "度" 1 
        END