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

📄 18b20ok.asm

📁 DS18B20的操作原码
💻 ASM
字号:
        DISPBUF EQU 40H
	DISPSDA	BIT P1.0
        DISPSCK	BIT P1.1
        IO BIT P3.0
        TEMPER_L EQU 29H  ;用于保存读出温度的低8位
        TEMPER_H EQU 28H  ;用于保存读出温度的高8位
        FLAG1 EQU 38H      ;是否检测到DS18B20标志位
        SIGN BIT 2FH.0      ;符号位
        XIAOSHU EQU 44H
        BCDS  EQU 21H
        ORG 0000H
        AJMP MAIN
        ORG 0030H
MAIN:   NOP
        MOV SP,#90H

        LCALL INIT_1820
        LCALL GET_TEMPER

        LCALL CHUL
        MOV 43H,22H
        MOV 42H,21H
        MOV 41H,20H
        JNB SIGN,TOZH
        MOV 40H,#0FH
        JMP NEXT
TOZH:   MOV 40H,#00H
NEXT:  MOV A,#08H
        mov B,#04H
        LCALL DISPLAY
        LCALL TDY100MS
        LCALL TDY100MS
        LCALL TDY100MS
        NOP
        LJMP MAIN
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
; DS18B20复位初始化程序
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
INIT_1820:SETB   IO
          NOP
          CLR   IO
          MOV   R0,#06BH ;主机发出延时537微秒的复位低脉冲
          MOV   R1,#03H
TSR1:     DJNZ   R0,TSR1
          MOV   R0,#6BH
          DJNZ   R1,TSR1
          SETB   IO   ;然后拉高数据线
          NOP
          NOP
          NOP
          MOV   R0,#25H
TSR2:     JNB   IO,TSR3 ;等待DS18B20回应
          DJNZ   R0,TSR2
          LJMP   TSR4   ;延时
TSR3:     SETB   FLAG1   ;置标志位,表示DS1820存在
          LJMP   TSR5
TSR4:     CLR   FLAG1   ;清标志位,表示DS1820不存在
          LJMP   TSR7
TSR5:     MOV   R0,#06BH
TSR6:     DJNZ   R0,TSR6  ;时序要求延时一段时间
TSR7:     SETB   IO
          RET
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;; 读出转换后的温度值,读出的温度存放在28H,29H高位在先
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

GET_TEMPER:SETB   IO   		;定时入口
           LCALL INIT_1820 	;先复位DS18B20
           JB	FLAG1,TSS2
           RET       		;判断DS1820是否存在?
TSS2:            		;若DS18B20不存在则返回
           MOV	A,#0CCH   ;	跳过ROM匹配
           LCALL   WRITE_1820
           MOV   A,#44H    ;	发出温度转换命令
           LCALL   WRITE_1820

;现延时一段时间,等待AD转
;换结束,12位的话750微秒.
          LCALL   INIT_1820  ;准备读温度前先复位
          MOV   A,#0CCH   ;跳过ROM匹配
          LCALL   WRITE_1820
          MOV   A,#0BEH   ;发出读温度命令
          LCALL   WRITE_1820
          LCALL   READ_18200  ;将读出的温度数据保存到35H/36H
          RET
;写DS18B20的子程序(有具体的时序要求)
WRITE_1820:MOV   R2,#8   ;一共8位数据
          CLR   C
WR1:      CLR   IO
          MOV   R3,#6
          DJNZ   R3,$
          RRC   A
          MOV   IO,C
          MOV   R3,#23
          DJNZ   R3,$
          SETB   IO
          NOP
          DJNZ   R2,WR1
          SETB   IO
          RET
; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据
READ_18200:
           MOV   R4,#2   ;将温度高位和低位从DS18B20中读出
           MOV   R1,#29H  ;低位存入29H(TEMPER_L),
RE00:       ;高位存入28H(TEMPER_H)
           MOV   R2,#8
RE01:
           CLR   C
           SETB   IO
           NOP
           NOP
           CLR   IO
           NOP
           NOP
           NOP
           SETB   IO
           MOV   R3,#09
RE10:
           DJNZ   R3,RE10
           MOV   C,IO
           MOV   R3,#23
RE20:
           DJNZ   R3,RE20
           RRC   A
           DJNZ   R2,RE01
           MOV   @R1,A
           DEC   R1
           DJNZ   R4,RE00
           RET
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;处理子程序
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
CHUL:   PUSH ACC
        PUSH 00H
        PUSH PSW
        clr  c
        MOV A,TEMPER_H
        CLR SIGN
        JNB TEMPER_H.7,TOZ
TOF:    MOV A,TEMPER_L
        CPL A
        add a,#01h
        MOV TEMPER_L,A
        MOV A,TEMPER_H
        CPL A
        ADDC A,#00H
        MOV TEMPER_H,A
        SETB SIGN
TOZ:
        MOV A,TEMPER_L
        ANL A,#0FH
        MOV R0,A
        MOV A,TEMPER_L
        ANL TEMPER_H,#0FH
        ANL A,#0F0H
        ORL A,TEMPER_H
        SWAP A
        MOV TEMPER_L,A
        LCALL  TOBCD
        LCALL DECIMAL
        POP PSW
        POP 00H
        POP ACC
        RET



;入口参数A为和的二进制数
;出口参数20H,21H,22H存放BCD码的百,十,个
TOBCD:PUSH A
        PUSH B
        MOV B,#64H
        DIV AB
        MOV 20H,A
        MOV A,B
        MOV B,#0AH
        DIV AB

        MOV 21H,A
        MOV 22H,B
        POP B
        POP A
        RET
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
DECIMAL: MOV DPTR, #DECTAB
         MOV R1,   #XIAOSHU
         MOV A,#0FFH
         MOV A,R0
         RL A
         RL A


         MOV R4,#04H
LOOP1:   MOV R3,A
         MOVC A,@A+DPTR
         MOV @R1,A
         INC R1
         MOV A,R3
         INC A
         DJNZ R4,LOOP1
         RET
;显示子程序
;堆栈深度:9
;显示缓冲区:20H~27H(可少,存储待显示字符的序号,最前位在20H中)
;入口参数:A:显示数字位数(O1H~08H)
;         B:小数点位置(在第几位数字的后面:01H~08H,大于08H时为没有小数点)
;出口参数:无
;
DISPLAY:PUSH 00H
        PUSH 02H
        PUSH 03H
        PUSH 04H
        PUSH DPH
        PUSH DPL

        MOV R2,A
        MOV R0,#DISPBUF
        MOV R4,#01H
DISPL0: MOV A,@R0
	MOV DPTR,#DISPTAB
	MOVC A,@A+DPTR
        PUSH ACC
        MOV A,B
        CJNE A,04H,DISPL2
        POP ACC
        ORL A,#10H
        LJMP DISPL3
DISPL2: POP ACC
DISPL3: NOP
        MOV R3,#08H
DISPL1: CLR DISPSCK
	RLC A
	MOV DISPSDA,C
	SETB DISPSCK
	DJNZ R3,DISPL1
	INC R0
        INC R4
	DJNZ R2,DISPL0

        POP DPL
        POP DPH
        POP 04H
        POP 03H
        POP 02H
        POP 00H
        RET
TDY2S:	MOV R5,#14H             ;2S TIME DELAY
TDY2S0:	LCALL TDY100MS
	DJNZ R5,TDY2S0
	RET

TDY100MS:MOV R6,#64H		;100ms TIME DELAY
TDELAY1:LCALL TDLY1MS           ;USED EGISTER:R6,R7
        DJNZ R6,TDELAY1         ;STACK DEEP:4
	RET
TDLY50MS:MOV R6,#32H            ;50ms TIME DELAY
TDELAY2:LCALL TDLY1MS           ;USED EGISTER:R6,R7
        DJNZ R6,TDELAY2         ;STACK DEEP:4
	RET
TDLY25MS:MOV R6,#19H		;25ms TIME DELAY
TDELAY3:LCALL TDLY1MS           ;USED EGISTER:R6,R7
        DJNZ R6,TDELAY3         ;STACK DEEP:4
	RET
TDLY10MS:MOV R6,#0AH		;10ms TIME DELAY
TDELAY4:LCALL TDLY1MS           ;USED EGISTER:R6,R7
        DJNZ R6,TDELAY4         ;STACK DEEP:4
	RET
TDLY1MS:MOV R7,#0F9H            ;1ms TIME DELAY(6MHz:7CH; 12MHZ:0F9H)
TDELAY5:NOP                     ;USED EGISTER:R7
        NOP                     ;STACK DEEP:2
        DJNZ R7,TDELAY5
        RET

DISPTAB:DB 0edh,48h,0e6h,6eh,4bh,2fh,0afh,68h,0efh,6fh  ;"0"~"9"("5"="s","9"="g")
        DB 87H,0E7H,8EH,0CEH,0A7H,02H,60H,00H,0A3H,8AH 	;"t","e","o","d","E","-","=","灭","F","n"
	DB 8CH,08H					;"u","i"
DECTAB:DB  0,0,0,0,0,6,2,5,1,2,5,0, 1,8,7,5
       DB  2,5,0,0,3,1,2,5,3,7,5,0, 4,3,7,5
       DB  5,0,0,0,5,6,2,5,6,2,5,0,6,8,7,5
       DB  7,5,0,0,8,1,2,5,8,7,5,0,9,3,7,5
       NOP
   ENDS:NOP
        END

⌨️ 快捷键说明

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