📄 wendu.txt
字号:
DTH EQU 20H ;温度值高八位
DTL EQU 21H ;温度值低八位
NUM1 EQU 22H ;第一位显示字,十位
NUM2 EQU 23H ;第二位显示字,个位
NUM3 EQU 24H ;第三位显示字,小数位
TEMP EQU 25H
DQ BIT P1.7 ;定义18B20数字输入输出
;============主函数==================
ORG 0000H
AJMP MAIN
ORG 0100H
MAIN: MOV DPTR,#07100H
MOV A,#3H
MOVX @DPTR,A
loop: ACALL RD_REG
ACALL COUNT
MOV R1,#10
LOOPDP: ACALL DISP
DJNZ R1,LOOPDP
ACALL CONVERT
SJMP loop
;初始化18B20
BE_18B20: CLR C
CLR C
CLR DQ ;发送复位脉冲
MOV R5,#60
MOV R7,#105 ;延时500us
ACALL DEL5us ;延时子程序,延时时长为(R7)*5us+5us
SETB DQ ;释放总线,等到待大约70us
MOV R7,#11 ;等待
ACALL DEL5us
LOOPB: JNB DQ,NEXTB1
DJNZ R5,LOOPB
SJMP STOPB ;复位不成功,C=0,返回
NEXTB1: MOV R7,#73 ;复位成功后延时约1000us,C=1
ACALL DEL5us
SETB C
STOPB: NOP
RET
;---------读字子程序-------------
;读出的字存在RD_WORD中,会对ACC及R6的值产生影向
RD_Byte: CLR A
MOV R6,#08H
LOOPD: CLR DQ ;读时序开始,至少保持1us
NOP
NOP
SETB DQ ;释放数据线,此后的15us内的数据就是我们要的数据
MOV R7,#1
ACALL DEL5us
MOV C,DQ
RRC A
MOV R7,#6 ;延时
ACALL DEL5us
DJNZ R6,LOOPD
RET
;---------写字子程序--------------
;要写的字在WR_WORD,会对ACC及R6产生影向
WR_Byte: CLR C ;消除C的影响
MOV R6,#08H
LOOPW:
SETB DQ
RRC A ;无论读写,都是低位在先
CLR DQ ;写时序开始
MOV R7,#2
ACALL DEL5us ; DS18B20在15us到60us间进行采样
SETB DQ
MOV DQ,C
MOV R7,#6
ACALL DEL5us
DJNZ R6,LOOPW
RET
;============其他子函数===========
;---------读中间寄存器------------
;会对R6产生影向,同时也会对相关寄存器产生影向
;只读前两个寄存器
RD_REG: ACALL BE_18B20 ;芯片复位
MOV A,#0CCH ;ROM配对
ACALL WR_Byte
MOV A,#0BEH ;读取寄存器值
ACALL WR_Byte
ACALL RD_Byte ;读取低字节数据
MOV DTL,A
ACALL RD_Byte ;读取高字节数据
MOV DTH,A
ACALL BE_18B20
RET
;--------温度转换-----------------
;会对R0及相关寄存器产生影响
CONVERT: ACALL BE_18B20 ;芯片复位
JNC CONVERT
MOV A,#0CCH ;跳过芯片ROM配对
ACALL WR_Byte
MOV A,#44H ;温度转换指令
ACALL WR_Byte
LOOPC: ACALL RD_Byte ;读BUSY,等待转换结束
MOV R0,A
ACALL DISP
CJNE R0,#0FFH,LOOPC
RET
;=================================
COUNT: MOV A,DTL ;小数位的计算
MOV R0,#0FH ;取出低四位
ANL A,R0
MOV B,#10
MUL AB
MOV B,#16 ;1表示0.1度
DIV AB
MOV NUM3,A
MOV A,DTL ;个位数与十位数的计算
MOV R0,#0F0H
ANL A,R0
SWAP A
MOV DTL,A
MOV A,DTH
MOV R0,#0FH
ANL A,R0
SWAP A
ORL A,DTL ;计算出来的温度值存在A中
MOV TEMP,A
MOV B,#10 ;将其转换成显示字
DIV AB
MOV NUM1,A
MOV NUM2,B
RET
;显示子程序
DISP: MOV A,#40H
MOV DPTR,#7101H
MOVX @DPTR,A
MOV DPTR,#7102H
MOV A,num1 ;百位
LCALL SQL
MOVX @DPTR,A
LCALL DELAY
MOV A,#20H
MOV DPTR,#7101H
MOVX @DPTR,A
MOV DPTR,#7102H
MOV A,num2 ;十位
LCALL SQL1
MOVX @DPTR,A
LCALL DELAY
MOV A,#10H
MOV DPTR,#7101H
MOVX @DPTR,A
MOV DPTR,#7102H
MOV A,num3 ;个位
LCALL SQL
MOVX @DPTR,A
LCALL DELAY
;5us延时子程序
DEL5us: NOP
NOP
NOP
DJNZ R7,DEL5us
RET
;送数码管各位数之间的延时
DELAY: MOV R5,#04H
LOOP6: MOV R4,#0F9H
LOOP7: DJNZ R4,LOOP7
NOP
NOP
DJNZ R5,LOOP6
RET
;查表程序(不带小数点)
SQL: INC A
MOVC A,@A+PC
RET
TAB: DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6H
;查表程序(带小数点)
SQL1: INC A
MOVC A,@A+PC
RET
TAB1: DB 0FDH,61H,0DBH,0F3H,67H,0B7H,0BFH,0E1H,0FFH,0F7H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -