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

📄 ds18b20.asm

📁 温度 DS18B20 测量外间温度的汇编程序
💻 ASM
字号:
;==========================================
LED0             EQU 60H      ;Temp0
LED1             EQU 61H      ;Temp1
LED2             EQU 62H      ;Temp2
LED3             EQU 63H      ;Temp3
LED4             EQU 64H      ;Temp4
;------------------------------------------

;===========================================
FLAG1            BIT 47H      ;是否检测到DS18B20标志位
;===========================================
SDATA            BIT P2.0     ;DS18B2总线

;==========================================
SDA_Temp         BIT P2.3   ;温度数据线
SCL_Temp         BIT P2.2    ;温度时钟线

;============================================
ORG  0000H
AJMP MAIN
ORG  0100H
MAIN:
;//////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 
;*****************主程序结束************************
EADTEMPER:
;=======================测温==========================
        ACALL GET_TEMPER       ;调用读温度子程序
        MOV   19H,29H
        MOV   A,29H
        ANL   A,#0F0H
        SWAP  A
        MOV   29H,A
        MOV   A ,28H
        ANL   A,#0FH
        SWAP  A
        ORL   A,29H
        MOV   29H,A
        ANL   19H,#0FH
        MOV   LED0,19H
        MOV   R0,#LED1
        MOV   R1,#3
        ;---------------------
        MOV   A,28H
        ANL   A,#70H
        SWAP  A
        MOV   LED4,A
        CJNE  A,#00H,BECOME11
        MOV   A,29H
        AJMP  BECOME1
BECOME11:
        CLR   C
        MOV   A,#10H
        SUBB  A,19H
        MOV   LED0,A
        MOV   A,29H
        CPL   A
        ;--------------------
BECOME1:
        MOV   B,#0AH
        DIV   AB
        MOV   @R0,B
        INC   R0
        DJNZ  R1,BECOME1
        ACALL  DISPLAY3
        AJMP  MAIN
        RET
;========================================
; DS18B20复位初始化子程序
;==============================================
;==============================================
;1111111111111111111111111111111111111111111111
;========================================
INIT_1820:
        SETB SDATA
        NOP
        CLR SDATA
;------------------------------------------
;主机发出延时537微秒的复位低脉冲
;------------------------------------------
        MOV R1,#3
TSR1:
        MOV R0,#107
TSR11:  DJNZ R0,TSR11
        DJNZ R1,TSR1
        SETB SDATA;然后拉高数据线
        NOP
        NOP
        NOP
;等待DS18B20回应
        MOV R0,#25H
TSR2:
        JNB SDATA,TSR3
        DJNZ R0,TSR2
        AJMP TSR4  ;延时
TSR3:
        SETB FLAG1 ;置标志位,表示DS1820存在
        AJMP TSR5
TSR4:
        CLR FLAG1  ;清标志位,表示DS1820不存在
        AJMP TSR7
TSR5:
        MOV R0,#117
TSR6:
        DJNZ R0,TSR6 ; 时序要求延时一段时间
TSR7:
        SETB SDATA
        RET
;=========================================================
; 读出转换后的温度值
;==========================================================
GET_TEMPER:
           SETB SDATA
           ACALL INIT_1820 ;复位DS18B20
           JB FLAG1,TSS2   ;与TSR3对应
           RET             ;判断DS1820是否存在?若DS18B20不存在则返回
;------------------------------------------------------------
TSS2:
     MOV A,#0CCH      ;跳过ROM匹配
     ACALL WRITE_1820

     MOV A,#44H       ;发出温度转换命令
     ACALL WRITE_1820
     ;=====================================
     MOV  R7, #200
     DJNZ R7,$         ; 延时400微秒
     MOV  R7, #200
     DJNZ R7,$         ; 延时400微秒
     ;==================================
     ACALL INIT_1820  ;读温度前先复位
     MOV A,#0CCH      ;跳过ROM匹配
     ACALL WRITE_1820
     MOV A,#0BEH      ;发出读温度命令
     ACALL WRITE_1820
     ACALL READ_18200 ;将读出的温度数据保存到28H/29H
     RET
;===========================================================================
;写DS18B20的子程序(有具体的时序要求)
;===========================================================================
WRITE_1820:

           MOV R2,#8;一共8位数据
           CLR C
WR1:
           CLR SDATA
           MOV R3,#6
           DJNZ R3,$

           RRC A
           MOV SDATA,C
           MOV R3,#23
           DJNZ R3,$

           SETB SDATA
           NOP

           DJNZ R2,WR1
           SETB SDATA
           RET
;============================================================================
;读DS18B20的程序,从DS18B20中读出两个字节的温度数据
;============================================================================
READ_18200:
          MOV R4,#2     ; 将温度高位和低位从DS18B20中读出
          MOV R1,#29H   ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
RE00:
          MOV R2,#8     ; 数据一共有8位
RE01:
          CLR C
          SETB SDATA
          NOP
          NOP
          CLR SDATA
          NOP
          NOP
          NOP
;---------------------
          SETB SDATA
          MOV R3,#9
RE10:     DJNZ R3,RE10
;----------------------
          MOV C,SDATA

          MOV R3,#23
RE20:     DJNZ R3,RE20

          RRC A
          DJNZ R2,RE01
          MOV @R1,A
          DEC R1
          DJNZ R4,RE00
          RET
;=============================================================
;=============================================================
;=============================================================
;=============================================================
;=========温 度 显 示=========================================
;//////////////////////////////////////////
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
DISPLAY3:
;=======温度显示===================
     MOV DPTR ,#TAB
     MOV  A,LED0
     MOVC A, @A+DPTR
     ACALL  SHIFT

     MOV DPTR ,#TAB
     MOV  A,LED1
     MOVC A,@A+DPTR
     ANL  A,#0FEH
     ACALL SHIFT

     ;----------------------
     MOV   16H,LED2
     MOV  A,LED3
     CJNE A,#00H,DIS1
     MOV  A,LED2
     CJNE A,#00H,DIS1
     MOV  LED2,LED4
     MOV  A,LED2
     CJNE A,#00H,DIS1
     MOV  LED2,#0FFH
DIS1:
     MOV  A,LED2
     MOVC A, @A+DPTR
     ACALL  SHIFT
     ;---------------------

     MOV  LED2,16H
     MOV  A,LED2
     CJNE A,#00H,DIS00002
     MOV  A,LED3
     CJNE A,#00H,DIS0002
     AJMP  DIS000002
DIS00002:
     MOV  A,LED3
     CJNE A,#00H,DIS0002
     MOV  A,LED4
     CJNE A,#00H,DIS0002
DIS000002:
     MOV  A,#0FFH
DIS0002:
     MOVC A, @A+DPTR
     ACALL  SHIFT
     ;---------------------
     RET
;====================================
;//////////////////////////////////////////
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;==========移位子程序================
SHIFT:
       MOV R0,#8H
       CLR C
       CLR SCL_Temp
LPPP4:
       Rrc A
       NOP
       MOV SDA_Temp,C
       NOP
       SETB SCL_Temp
       NOP
       CLR SCL_Temp
       NOP
       DJNZ R0,LPPP4
       RET
;============延时子程序=================
DELAY1S:
      MOV R6,#0FFH
LOOP12:
      MOV R7,#0FFH
LOOP13:
      NOP
      NOP
      NOP
      NOP
      NOP
      NOP
      NOP
      NOP
      DJNZ R7,LOOP13
      DJNZ R6,LOOP12
      RET
DELAY10MS:
      MOV R7,#200
LOOP113:
      NOP
      NOP
      DJNZ R7,LOOP113
      RET
;==========================================
;==================整数表========================
TAB:  ;DB 11h,7dh,23h,29h,4dh,89h,81h,3dh,01h,09h,00H,87H,00H,00H,00H,0EFH
      ;DB  82H,9FH,0A4H,8CH,99H,0C8H,0C0H,9EH,80H,88H,90H,0c1H,0E2H,85H,0E0H,0F0H
      DB  88H,0EBH,4CH,49H,2BH,19H,18H,0CBH,8H,09H,0FFH
;=================小数点表=========================
TAB2: DB 11h,7dh,23h,29h,29h,4dh,4dh,89h,81h,81h,3dh,01h,01h, 09h,09h,11h,87H
    END

⌨️ 快捷键说明

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