📄 ds18b20.txt
字号:
TemL EQU 29H ;温度的低8位
TemH EQU 28H ;温度的高8位
FLAG bit 21H ;是否检测到DS18B20标志位
TEMPER_NUM equ 38h
DQ EQU P3.7
ORG 0000H ;ClimberWin 2005.9.28
AJMP MAIN
;ORG 000BH
;AJMP DINSHI
ORG 0030H
;主程序;
;;************************************
main: ;***
MOV SP,#60H
ACALL DELAY2
acall RE_CONFIG ;重新写DS18B20暂存存储器设定
;MOV TMOD,#01H
;MOV TH0,#0AFH
;MOV TL0,#3CH
MOV A,#0ffH
;mov 4bh,#0fcH
MOV P1,A
MOV P3,A
;SETB ET0
;SETB TR0
;SETB EA
START:
acall RE_CONFIG
aCALL CLIMBER
ACALL bin_bcd1;数码转换
ACALL DISPLAY
;ACALL KEY
AJMP START
;;;;;;;;;;
; 键盘子程序;
;;;;;;;;;;
key:
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;
;显示子程序
;;;;;;;;;;;;;;;;;;;;;
display:
mov r2,#04h
mov r3,#0feh
mov r0,#4ah
dislop:
mov a,r3
mov p3,a
mov a,@R0
mov dptr,#tab
movc a,@a+dptr
mov p1,a
acall delay2
dec r0
mov a,r3
rl a
mov r3,a
djnz r2,dislop
ret
delay2:
mov r4,#032h
dellop:
mov r5,#064h
djnz r5,$
djnz r4,dellop
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 中断子程序,读温度;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DINSHI:
push acc
push psw
CLR tr0
MOV TH0,#0AFH
MOV TL0,#3CH
setb tr0
acall RE_CONFIG
CALL CLIMBER;调用读温度子程序;***
;ACALL bin_bcd1;数码转换
pop psw
pop acc
RETI ;***
;;************************************
;ds18b20初始化子程序*
;;*************************************
INIT:
SETB DQ
NOP
CLR DQ
MOV R7,#34 ;延时510ms
CALL DELAY
SETB DQ
MOV R7,#04 ;延时60ms
CALL DELAY
CLR FLAG
JB DQ,BACK
SETB FLAG
MOV R7,#28 ;延时420ms
CALL DELAY
SETB DQ ;然后拉高数据线
BACK:
RET
;********************************************
;重新写DS18B20暂存存储器设定值;
;使用资源
;;*************************************
RE_CONFIG:
SETB DQ
CALL INIT
JB flag, RE_CONFIG1 ; 若DS18B20存在,转RE_CONFIG1
RET
RE_CONFIG1:
MOV A,0CCH ; 发SKIP ROM命令
call Write
MOV A,4EH ; 发写暂存存储器命令
call Write
MOV A,00H ; TH(报警上限)中写入00H
call Write
MOV A,00H ; TL(报警下限)中写入00H
call Write
MOV A,#07FH ; 选择12位温度分辨率
call Write
RET
;********************************************
;读出转换后的温度值;
;;*************************************
CLIMBER:
SETB RS1 ; 改变寄存器位置
SETB DQ
CALL INIT ;先复位DS18B20
JB FLAG,TSS2
RET ;判断DS1820是否存在?若DS18B20不存在则返回
TSS2:
MOV A,#0CCH ;跳过ROM匹配
CALL WRITE
MOV A,#44H ;发出温度转换命令
CALL WRITE
MOV R7,#50 ;延时750ms转换时间
CALL DELAY
CALL INIT ;准备读温度前先复位
MOV A,#0CCH ;跳过ROM匹配
CALL WRITE
MOV A,#0BEH ;发出读温度命令
CALL WRITE
CALL READ
RET
;;*******************************************************
;写DS18B20的子程序(注意时序);
;使用资源C,R7、R2
;;*******************************************************
WRITE:
CLR C
MOV R2,#8 ;一共8位数据
WR1:
CLR DQ
MOV R7,#1
CALL DELAY
RRC A
MOV DQ,C
MOV R7,#1
CALL DELAY
SETB DQ
NOP
DJNZ R2,WR1
SETB DQ
RET
;;*********************************************************
;读DS18B20的程序;
;;*********************************************************
READ:
MOV R4,#2 ;将温度高位和低位从DS18B20中读出
MOV R1,#29H ;低位存入29H(TemL),高位存入28H(TemH)
WIN00:
MOV R2,#8 ;数据一共有8位
WIN01:
CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R7,#01
CALL DELAY
MOV C,DQ
MOV R7,#03
CALL DELAY
RRC A
DJNZ R2,WIN01
MOV @R1,A
DEC R1
DJNZ R4,WIN00
RET
;*******************************************
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELAY: MOV R6,#06H ;;;;
D1: DJNZ R6,D1 ;延时=R7*15ms ;;;;
DJNZ R7,DELAY ;;;;
RET ;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;//*****************************************//
; 将从DS18B20中读出的温度数据进行转换
;//*****************************************//
bin_bcd1:
mov 47h,#00h
MOV A,TEMH
JB ACC.7,FUTEMR
MOV A,TEMH
MOV R4,A
MOV A,TEML
MOV R5,A
zhuhuan:
MOV R7,#10H
ACALL ZH
MOV A,46H
MOV B,#64H
DIV AB
MOV 48H,A
MOV A,B
MOV B,#0AH
DIV AB
MOV 49H,A
MOV 4AH,B
mov a,47h
jz zhen
ajmp bfh
zhen:
mov 47h,#0eh
bfh:
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;多字节BCD码取补
;入口条件:字节数在R7中,操作数在[R0]中。
;出口信息:结果仍在[R0]中。 ;;;
;影响资源:PSW、A、R2、R3 堆栈需求: 2字节;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
FUTEMR:
MOV B,TEMH
MOV A,#0FFH
SUBB A,B
MOV R4,A
MOV B,TEML
MOV A,#0FFH
SUBB A,B
MOV R5,A
MOV A,R5
add A,#01h
MOV R5,A
MOV A,R4
ADDC A,#00H
MOV R4,A
mov 47h,#0fh
ljmp zhuhuan
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;入口条件:被除数在R4、R5中,除数在R7中。
;出口信息:OV=0 时,单字节商在R3中,OV=1 时溢出。
;影响资源:PSW、A、R3~R7 堆栈需求: 2字节
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ZH:
CLR C
MOV A,R4
SUBB A,R7
JC DV50
SETB OV ; ;商溢出
RET
DV50: MOV R6,#8; ;求平均值(R4R5/R7-→R3)
DV51: MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV F0,C
CLR C
SUBB A,R7
ANL C,/F0
JC DV52
MOV R4,A
DV52: CPL C
MOV A,R3
RLC A
MOV R3,A
DJNZ R6,DV51
MOV A,R4 ;;四舍五入
ADD A,R4
JC DV53
SUBB A,R7
JC DV54
DV53: INC R3
DV54: CLR OV
MOV 46H,R3
RET
tab:
db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h ;;不带小数点十六进制数字0--7对应的编码
db 80h,90h,88h,83h,0c6h,0a1h,0ffh,0bfh ;;不带小数点十六进制数字8--F对应的编码
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -