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

📄 ok.asm

📁 用DS18B20测温程序
💻 ASM
字号:
ORG 0000H
LJMP START
ORG  0003H
LJMP JIA
ORG  0013H
LJMP JIAN
ORG 0030H
FLAG1   BIT    F0        ;DS18B20存在标志位
 DQ      BIT    P2.2
 TEMPER_L    EQU   29H
 TEMPER_H    EQU   28H
 A_BIT      EQU    35H
 B_BIT      EQU     36H
START:
MOV IE,#85H
MOV 30H,#30
shezhi:MOV R1,#30H
acall display
MOV P2,#0FFH
mov a,p2
mov c,acc.0
jnc shezhi
ljmp main

DISPLAY:MOV A,@R1;将29H中的十六进制数转换成10进制 
MOV B,#10 ;10进制/10=10进制
DIV AB
MOV B_BIT,A ;十位在A
MOV A_BIT,B ;个位在B
MOV DPTR,#tab ;指定查表启始地址
SETB   P3.7       ;选中第一个数码管
MOV A,A_BIT ;取个位数
MOVC A,@A+DPTR ;查个位数的7段代码
MOV P1,A ;送出个位的7段代码
LCALL    DELAY       ; 调用延时
CLR P3.7
SETB P3.6      ;选中第二个数码管
MOV A,B_BIT ;取十位数
MOVC A,@A+DPTR ;查十位数的7段代码
MOV P1,A ;送出十位的7段代码
LCALL    DELAY
CLR P3.6
RET
JIA:
MOV P2,#0FFH
mov a,p2
mov c,acc.0
jc out
INC @R1
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
out:
RETI
JIAN:
MOV P2,#0FFH
mov a,p2
mov c,acc.0
jc out1
DEC @R1
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
out1:
RETI
DELAY:                       ;延时子程序
MOV R5,#120
NOP
NOP
D1: MOV R6,#100
D2: DJNZ R6,D2
DJNZ R5,D1
RET

;**************主程序开始************
MAIN:
    
      LCALL    INIT_18B20
     ;LCALL    RE_CONFIG
      LCALL    GET_TEMPER
     lJMP     CHANGE
    

;**********DS18B20复位程序*****************
INIT_18B20:    SETB   DQ
               NOP
               CLR   DQ
               MOV    R0,#0FBH
         TSR1: DJNZ   R0,TSR1       ;延时
               SETB   DQ
               MOV    R0,#25H
         TSR2: JNB   DQ ,TSR3
               DJNZ   R0,TSR2
         TSR3: SETB   FLAG1       ;置标志位,表明DS18B20存在
               CLR    P0.5       ;二极管指示
               AJMP   TSR5
         TSR4: CLR   FLAG1
               LJMP   TSR7
          TSR5: MOV   R0,#06BH
          TSR6: DJNZ   R0,TSR6
          TSR7:SETB   DQ          ;表明不存在
                RET

;*****************读转换后的温度值****************
GET_TEMPER:
            SETB   DQ
            LCALL  INIT_18B20
            JB     FLAG1,TSS2
            RET                  ;若不存在则返回
      TSS2: MOV  A,#0CCH        ;跳过ROM
            LCALL  WRITE_18B20
            MOV    A,#44H         ;发出温度转换命令
            LCALL   WRITE_18B20

            ;LCALL  DISPLAY                       ;延时
            LCALL    INIT_18B20
            MOV  A,#0CCH        ;跳过ROM
            LCALL  WRITE_18B20
            MOV    A,#0BEH         ;发出读温度换命令
            LCALL   WRITE_18B20
            LCALL   READ2_18B20    ;读两个字节的温度
            RET
 ;***************写DS18B20程序************
 WRITE_18B20:
            MOV    R2,#8
            CLR    C
        WR1:
              CLR   DQ
              MOV  R3,#6
              DJNZ  R3,$
              RRC   A
              MOV    DQ,C
              MOV   R3,#23
              DJNZ   R3,$
              SETB    DQ
              NOP
              DJNZ    R2,WR1
              SETB  DQ
              RET

 


 ;***********读18B20程序,读出两个字节的温度*********
 READ2_18B20:
            MOV   R4,#2              ;低位存在29 H,高位存在28H
            MOV   R1,#29H
      RE00: MOV  R2,#8
      RE01: CLR   C
            SETB   C
            NOP
            NOP
            CLR  DQ
            NOP
            NOP
            NOP
            SETB  DQ
            MOV   R3,#7
            DJNZ   R3,$
            MOV    C,DQ
            MOV    R3,#23
             DJNZ   R3,$
            RRC   A
            DJNZ   R2,RE01
            MOV    @R1,A
            DEC    R1
            DJNZ   R4,RE00
            RET
 ;************读出的温度进行数据转换**************

CHANGE:     MOV A,29H
            MOV C,28H.0           ;将28H中的最低位移入C
            RRC A
            MOV C,28H.1
            RRC A
            MOV C,28H.2
            RRC A
            MOV C,28H.3
            RRC A
            MOV 29H,A
            mov r1,#29h
            LCALL  DISPLAY  ;调用数码管显示子程序
            clr c
	    mov a,30h
            subb a,29h
	    jc  bj
    
	    LJMP MAIN

bj:cpl p0.0
cpl p0.1

LJMP MAIN


 ;***********************************
             D1MS: MOV R7,#80   ;1MS延时(按12MHZ算)
             DJNZ R7,$
             RET
 ;*************************
 TAB:         DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
end

⌨️ 快捷键说明

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