📄 ds18b20.asm
字号:
CONFIG12 EQU 1FH ;DS18B20的转换精度选择(0、R1、R2、1、1、1、1、1)
; 0 0 9位测量
; 0 1 10位测量
; 1 0 11位测量
; 1 1 12位测量
TEMPH EQU 40H ;高位温度原始数据的读入地址
TEMPL EQU 41H ;低位温度原始数据的读入地址
DAT EQU P2.2 ;DS18B20与单片机通信的口线
ORG 0000H
LJMP START
ORG 0030H
START:
LCALL INIT ;调用初始化子程序
MAIN:
LCALL RDTEMP ;调用读子程序,从DS18B20中读取出温度值
LCALL DIVV ;调用运算子程序
LCALL DISPLAY ;调用显示子程序显示当前温度值
LJMP MAIN
INIT:
LCALL RESET ;调用DS18B20复位子程序
MOV A,#CONFIG12 ;将DS18B20的转换精度控制数据写入DS18B20
LCALL WRITE
RET
RDTEMP:
LCALL RESET ;调用DS18B20复位子程序
MOV A,#0CCH ;使DS18B20跳过读序列号的操作
LCALL WRITE
MOV A,#44H ;命令DS18B20启动温度转换操作
LCALL WRITE
LCALL RESET ;在重新写入命令之前再次进行复位操作
MOV A,#0CCH
LCALL WRITE
MOV A,#0BEH ;从DS18B20中将转换好的温度数据读出命令
LCALL WRITE
LCALL READ ;调用读程序将低8位温度数据读入A
MOV TEMPL,A ;将低8位温度数据存入TEMPL寄存器中
LCALL READ
MOV TEMPH,A
RET
DIVV: ;数据处理子程序,负责将温度数据转换为BCD码
MOV A,41H
MOV B,#16
DIV AB ;将温度数据低8位除以16,那么商中得到低8位温度数据的整数部分
MOV 74H,A ;将低8位温度数据的整数部分暂存于74H中
MOV A,B ;将余数(即小数部分)转存于A中
MOV B,#10
MUL AB ;将小数部分的余数乘以10,求小数点后1位
MOV B,#16
DIV AB ;然后再除以16,因为小数部分的二进制数是实际表示的温度的16倍
MOV 70H,A ;将小数点后1位的数据存入70H中
MOV A,40H
MOV B,#16
MUL AB ;将温度数据高8位乘以16,因为它们所表示的温度是实际数据的16倍
ADD A,74H ;将高8位中的整数部分数据加上低8位中的整数部分数据得到整数温度
MOV B,#10
DIV AB ;将整数温度除以10求出温度的个位
MOV 71H,B ;将温度BCD码的个位数据(除完后的余数)存入71H中
MOV B,#10
DIV AB ;将上一次除法运算的商再除以10,求出温度的十位
MOV 72H,B ;将温度BCD码的十位数据(除完后的余数)存入72H中
RET
DISPLAY:
MOV P0,#0FFH
MOV A,72H
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P1,A
CLR P0.0
LCALL DLIMS
MOV P0,#0FFH
MOV A,71H
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P1,A
CLR P0.1
LCALL DLIMS
MOV P0,#0FFH
RET
RESET:
LA:
SETB DAT
MOV R2,#200
LB:
CLR DAT
DJNZ R2,LB
SETB DAT
MOV R2,#30
LC:
DJNZ R2,LC
CLR C
ORL C,DAT
JC LB
MOV R6,#80
LD:
ORL C,DAT
JC LP
DJNZ R6,LD
SJMP LA
DJNZ R6,LD
LP:
MOV R2,#250
LF:
DJNZ R2,LF
RET
WRITE:
MOV R3,#8
WR1A:
SETB DAT
MOV R4,#8
RRC A
CLR DAT
WR2A:
DJNZ R4,WR2A
MOV DAT,C
MOV R4,#30
WR3A:
DJNZ R4,WR3A
DJNZ R3,WR1A
SETB DAT
RET
READ:
CLR EA
MOV R6,#8
RD1A:
CLR DAT
MOV R4,#6
NOP
SETB DAT
RD2A:
DJNZ R4,RD2A
MOV C,DAT
RRC A
MOV R5,#30
RD3A:
DJNZ R5,RD3A
DJNZ R6,RD1A
SETB DAT
RET
DLIMS:
MOV R6,#15H
DLL1:
MOV R7,#20H
DLL2:
DJNZ R7,DLL2
DJNZ R6,DLL1
RET
TAB:
DB 0C0H 0F9H 0A4H 0B0H 99H
DB 92H 83H 0F8H 80H 98H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -