📄 18b20ok.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 + -