⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 readds18b20temp.asm

📁 DS18B20 ying yong de wen jian ben wen wei asm format please use keil to open it
💻 ASM
字号:


;|----------------------------------------------------------------------------|
;| 读出ds1820序列号应用程序,P0.0接ds1820 |
;|----------------------------------------------------------------------------|
DIO  bit P0.0
BUF  EQU 30H  
      ORG 0000H
      AJMP MAIN
      ORG  0023H
      JMP  SERIAL
      ORG 0030H

MAIN:
        MOV    A,#0FFH
        MOV    P0, A
        MOV    P1, A
        MOV    P2, A
        MOV    P3, A
        MOV    SP, #70H
        clr    p0.1            ;拉低GND
        ;MOV    RCAP2H, #0FFH   ;波特率(9600bps)
        ;MOV    RCAP2L, #0B8H
        MOV    RCAP2H, #0FFH   ;波特率(9600bps)
        MOV    RCAP2L, #0DCH
        MOV    TH2, #0FFH
        MOV    TL2, #70H
        MOV    SCON, #40H
        MOV    T2CON, #34H
        MOV    DPTR, #0000H
        MOV    20H, #00H
        MOV    21H, #00H
        MOV    22H, #00H
        MOV    23H, #00H
        ;movx  a,@dptr
      CLR   EA ;使用ds1820一定要禁止任何中断产生
      LCALL INT ;初始化ds1820
      MOV   A,#33H
      LCALL WRITE ;送入读ds1820的ROM命令
      LCALL READ ;开始读出当前ds1820序列号
      MOV   50H,A
      LCALL READ
      MOV   51H,A
      LCALL READ
      MOV   52H,A
      LCALL READ
      MOV   53H,A
      LCALL READ
      MOV   54H,A
      LCALL READ
      MOV   55H,A
      LCALL READ
      MOV   56H,A
      LCALL READ
      MOV   57H,A
      SETB  EA
      CLR   TI
      MOV   R6,#02
H1:
      MOV   R7,#08h
      MOV   R0,#50H
HH:
      CLR   TI
      MOV   SBUF,@R0
      JNB   TI,$
      CLR   TI
      INC   R0
      DJNZ  R7,HH
      DJNZ  R6,H1
KL:
      CALL  GET_TEMP
      JMP   KL
Delay:
      MOV   R6,#0ffH
HL1:
      MOV   R7,#0ffH
HL:
      NOP
      NOP
      NOP
      DJNZ  R7,HL
      DJNZ  R6,HL1
      RET

INT: ;初始化ds1820子程序
      CLR    EA
L0:
      CLR   DIO   ;ds1820总线为低复位电平
      MOV    R2,#250
L1:
      ;NOP
      ;NOP
      CLR   DIO
      DJNZ  R2,L1 ;总线复位电平保持400us
      SETB  DIO   ;释放ds1820总线
      MOV   R2,#30
      ;MOV   R2,#60
L4:
      DJNZ  R2,L4 ;释放ds1820总线保持60us
      CLR   C     ;清存在信号
      ORL   C,DIO
      JC    L0    ;存在吗?不存在则重新来
      MOV   R6,#80
      ;MOV   R6,#160
L5:
      ORL   C,DIO
      JC    L3
      DJNZ  R6,L5
      SJMP  L0
L3:
      MOV   R2,#250
L2:
      ;NOP
      ;NOP
      ;NOP
      DJNZ  R2,L2
      RET
WRITE: ;向ds1820写操作命令子程序
      CLR   EA
      MOV   R3,#8  ;写入ds1820的bit数,一个字节8个bit
WR1:
      SETB  DIO
      ;MOV   R4,#12
      MOV   R4,#6
      RRC   A      ;把一个字节data(A)分成8个bit环移给 C
      CLR   DIO    ;开始写入ds1820总线要处于复位(低)状态
WR2:
      DJNZ  R4,WR2 ;ds1820总线复位保持16us
      MOV   DIO,C  ;写入一个bit
      MOV   R4,#25
      ;MOV   R4,#50
WR3:
      DJNZ  R4,WR3 ;等待40us
      DJNZ  R3,WR1 ;写入下一个bit
      SETB  DIO    ;重新释放ds1820总线
      RET
READ:
      CLR   EA
      MOV   R6,#8  ;连续读8个bit
RE1:
      CLR   DIO    ;读前总线保持为低
      MOV   R4,#4
      ;MOV   R4,#8
      NOP
      SETB  DIO    ;开始读总线释放
RE2:
      DJNZ  R4,RE2 ;持续8us
      MOV   C,DIO  ;从ds1820总线读得一个bit
      RRC   A      ;把读得的位值环移给 A
      ;MOV   R5,#60
      MOV   R5,#30
RE3:
      DJNZ  R5,RE3 ;持续60us
      DJNZ  R6,RE1 ;读下一个bit
      SETB  DIO    ;重新释放ds1820总线
      RET

;|----------------------------------------------------------------------------------------------|
;| 获取单个ds1820转化的温度值的应用程序,P0.0接ds1820 |
;|----------------------------------------------------------------------------------------------|

GET_TEMP:
      CLR    RS1
      SETB   RS0    ;设置工作寄存器当前所在的区域
      CLR    EA     ;使用ds1820一定要禁止任何中断产生
      LCALL  INT    ;调用初使化子程序
      MOV    A,#0CCH
      LCALL  WRITE  ;送入跳过ROM命令
      MOV    A, #44H
      LCALL  WRITE  ;送入温度转换命令
      LCALL  Delay  ;廷时
      LCALL  INT    ;温度转换完全,再次初使化ds1820
      MOV    A,#0CCH
      LCALL  WRITE  ;送入跳过ROM命令
      MOV    A,#0BEH
      LCALL  WRITE  ;送入读温度暂存器命令
      LCALL  READ
      MOV    R7,A   ;读出温度值低字节存入R7
      LCALL  READ
      MOV    R6,A   ;读出谩度值高字节存入R6
      SETB   EA
      MOV    A,#7FH
      CLR    C
      SUBB   A,R6
      JNC    LLL
      LCALL  DOU_BM 
      MOV    A,#80H
      ADD    A,R6
      MOV    R6,A
LLL:
      MOV    R2,#02H
      MOV    R3,#71H
      LCALL  DOU_MUL_SNG
      MOV    A,R4
      ANL    A,#0F0H
      SWAP   A
      MOV    BUF,A   
      MOV    A,R4
      ANL    A,#0FH
      MOV    BUF+1,A  
      MOV    A,R5
      ANL    A,#0F0H
      SWAP   A
      MOV    BUF+2,A   
      MOV    A,R5
      ANL    A,#0FH
      MOV    BUF+3,A    
      MOV    A,R6
      ANL    A,#0F0H
      SWAP   A
      MOV    BUF+4,A   
      MOV    A,R6
      ANL    A,#0FH
      MOV    BUF+5,A  
      MOV    A,R7
      ANL    A,#0F0H
      SWAP   A
      MOV    BUF+6,A   
      MOV    A,R7
      ANL    A,#0FH
      MOV    BUF+7,A
     ; MOV    SBUF,R6
     ; JNB    TI,$   ;通过串口发送温度数据
     ; CLR    TI
     ; MOV    SBUF,R7
     ; JNB    TI,$
     ; CLR    TI    \\
     
      MOV    B,BUF
      CALL    ASII
      MOV    SBUF,A
      JNB    TI,$   ;通过串口发送温度数据
      CLR    TI
      MOV    B,BUF+1
      CALL    ASII
      MOV    SBUF,A
      JNB    TI,$
      CLR    TI
      MOV    B,BUF+2
      CALL    ASII
      MOV    SBUF,A
      JNB    TI,$   ;通过串口发送温度数据
      CLR    TI
      MOV    B,BUF+3
      CALL    ASII
      MOV    SBUF,A
      JNB    TI,$
      CLR    TI
      MOV    B,BUF+4
      CALL    ASII
      MOV    SBUF,A
      JNB    TI,$   ;通过串口发送温度数据
      CLR    TI
      MOV    B,BUF+5
      CALL    ASII
      MOV    SBUF,A
      JNB    TI,$
      CLR    TI
      MOV    B,BUF+6
      CALL    ASII
      MOV    SBUF,A
      JNB    TI,$   ;通过串口发送温度数据
      CLR    TI
      MOV    B,BUF+7
      CALL    ASII
      MOV    SBUF,A
      JNB    TI,$
      CLR    TI
      
      RET
ASII:
     MOV    A,#9H
     CLR    C
     SUBB   A,B
     JNC    DD
     MOV   A,B
     ADD   A,#37H   
     RET
DD:
     MOV   A,B
     ADD   A,#30H
     RET
      
;*************************************************
;        双字节求补码   ;(/R6/R7)+1=R6R7 求补码
;*************************************************
DOU_BM:
        MOV    A, R7
        CPL    A
        ADD    A, #01H
        MOV    R7, A
        MOV    A, R6
        CPL    A
        ADDC   A, #00H
        MOV    R6, A
        RET
;*************************************************
;        双字节加法   ;R2R3+R6R7=R4R5
;*************************************************
DOUBL_ADD:
        MOV    A, R3
        ADD    A, R7
        MOV    R5, A
        MOV    A, R2
        ADDC   A, R6
        MOV    R4, A
        RET
;*************************************************
;       双字节减法    ;R2R3-R6R7=R4R5
;*************************************************
DOUBL_SUB:
        CLR    C
        MOV    A, R3
        SUBB   A, R7
        MOV    R5, A
        MOV    A, R2
        SUBB   A, R6
        MOV    R4, A
        RET
;*************************************************
;       ;双字节带符号减法
;*************************************************
SUBB_SNG:
        MOV    A, R6
        CPL    ACC.7
        MOV    R6, A
ADD_SNG:                  ;带符号加法
        MOV    A, R2
        MOV    C, ACC.7
        MOV    F0, C
        XRL    A, R6
        MOV    C, ACC.7
        MOV    A, R2
        CLR    ACC.7
        MOV    R2, A
        MOV    A, R6
        CLR    ACC.7
        MOV    R6, A
        JC     L0798H
        ACALL  DOUBL_ADD
        MOV    A, R4
        JB     ACC.7, L0796H
L0790H:
        MOV    C, F0
        MOV    ACC.7, C
        MOV    R4, A
        RET
L0796H:
        SETB   C
        RET
L0798H:
        LCALL  DOUBL_SUB
        MOV    A, R4
        JNB    ACC.7, L0790H
        LCALL  DOU_BM
        CPL    F0
        SJMP   L0790H
;*************************************************
;       双字节乘法     ;R2R3*R6R7=R4R5R6R7
;*************************************************
DOUBLE_MUL:
        MOV    R4, #00H
        MOV    R5, #00H
        MOV    R0, #10H
        CLR    C
L07ADH:
        MOV    A, R4
        RRC    A
        MOV    R4, A
        MOV    A, R5
        RRC    A
        MOV    R5, A
        MOV    A, R6
        RRC    A
        MOV    R6, A
        MOV    A, R7
        RRC    A
        MOV    R7, A
        JNC    L07C1H
        MOV    A, R5
        ADD    A, R3
        MOV    R5, A
        MOV    A, R4
        ADDC   A, R2
        MOV    R4, A
L07C1H:
        DJNZ   R0, L07ADH
        MOV    A, R4
        RRC    A
        MOV    R4, A
        MOV    A, R5
        RRC    A
        MOV    R5, A
        MOV    A, R6
        RRC    A
        MOV    R6, A
        MOV    A, R7
        RRC    A
        MOV    R7, A
        RET
;*************************************************
;       双字节除法    ;R2R3R4R5/R6R7=R4R5
;*************************************************
DOUBLE_DIV:
        MOV    A, R3
        CLR    C
        SUBB   A, R7
        MOV    A, R2
        SUBB   A, R6
        JNC    L0819H
        MOV    B, #10H
L07DAH:                     ;除数带部分余数左移一位
        CLR    C
        MOV    A, R5
        RLC    A
        MOV    R5, A
        MOV    A, R4
        RLC    A
        MOV    R4, A
        MOV    A, R3
        RLC    A
        MOV    R3, A
        XCH    A, R2
        RLC    A
        XCH    A, R2
        MOV    F0, C
        CLR    C
        SUBB   A, R7
        MOV    R1, A
        MOV    A, R2
        SUBB   A, R6
        JB     F0, L07F3H
        JC     L07F7H
L07F3H:
        MOV    R2, A
        MOV    A, R1
        MOV    R3, A
        INC    R5           ;商加 1
L07F7H:
        DJNZ   B, L07DAH    ;除完否
        CLR    F0
        MOV    A, R2
        RLC    A
        JC     L080EH
        MOV    A, R3        ;四舍五入
        RLC    A
        MOV    R3, A
        MOV    A, R2
        RLC    A
        SUBB   A, R6
        JC     L0817H
        JNZ    L080EH
        MOV    A, R3
        SUBB   A, R7
        JC     L0817H
L080EH:                      ;商加 1
        CLR    C
        MOV    A, R5
        ADD    A, #01H
        MOV    R5, A
        MOV    A, R4
        ADDC   A, #00H
        MOV    R4, A
L0817H:
        CLR    A
        RET
L0819H:
        SETB   F0
        RET
;*************************************************
;       ;带符号数双字节乘法  R2R3*R6R7=R4R5R6R7
;*************************************************
DOU_MUL_SNG:
        MOV    A, R2
        XRL    A, R6
        MOV    C, ACC.7     ;保存符号位
        MOV    01H, C
        MOV    A, R2        ;作为无符号数乘
        CLR    ACC.7
        MOV    R2, A
        MOV    A, R6
        CLR    ACC.7
        MOV    R6, A
        LCALL  DOUBLE_MUL
        MOV    A, R4
        MOV    C, 01H
        MOV    ACC.7, C
        MOV    R4, A         ;恢复符号位
        RET
;*************************************************
;       ;带符号数双字节除法 R2R3R4R5/R6R7=R4R5
;*************************************************
DOU_DIV_SNG:
        MOV    A, R2
        XRL    A, R6
        MOV    C, ACC.7      ;保存符号位
        MOV    01H, C
        MOV    A, R2
        CLR    ACC.7
        MOV    R2, A
        MOV    A, R6
        CLR    ACC.7
        MOV    R6, A
        LCALL  DOUBLE_DIV     ;作为无符号数除
        MOV    A, R4
        JB     ACC.7, L084FH  ;恢复符号位
        MOV    C, 01H
        MOV    ACC.7, C
        MOV    R4, A
        RET
L084FH:
        SETB   F0             ;溢出
        RET
SERIAL:
      NOP
      CLR RI
      CLR TI
      RETI
      END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -