📄 ds18b20.txt
字号:
;---------------------------------------------------DS18B20子程序--------------------------------------------
;------------水温采集与显示--------------------------------------------
;所用到的地址有22H,36H,37H,38H
TEMPERATURE:LCALL READTEMP;温度转换开始
LCALL READTEMP1;读出温度子程序
LCALL CONVTEMP;处理BCD码子程序
LCALL HEX2BCD1;BCD码转换
LCALL DISP;显示温度
;LJMP MAIN1
RET
DELAY:MOV R7,#200
DD: MOV R6,#10
DDD: MOV R5,#50
NOP
DDDD: DJNZ R5,DDDD
DJNZ R6,DDD
DJNZ R7,DD
RET
;********************************开始转换************************************
READTEMP:LCALL INITDS1820;复位
MOV A,#0CCH
LCALL WRITEDS1820;跳过ROM
MOV R6,#34H
DJNZ R6,$
MOV A,#44H
LCALL WRITEDS1820;开始转换
MOV R6,#34H
DJNZ R6,$
RET
;**********************************************************
;读出温度子程序
;**********************************************************
READTEMP1:
LCALL INITDS1820;先复位
MOV A,#0CCH
LCALL WRITEDS1820;跳过ROM
MOV R6,#34H
DJNZ R6,$
MOV A,#0BEH
LCALL WRITEDS1820;开始转换
MOV R6,#34H
DJNZ R6,$;延时
MOV R5,#02H
MOV R0,#36H
READTEMP2:
LCALL READDS1820
MOV @R0,A
INC R0
DJNZ R5,READTEMP2;第一个字节存在36H,第二个字节存在37H
RET
;***********************************************************
;BCD码转换
;***********************************************************
HEX2BCD1:
MOV B,#064H
DIV AB
MOV R7,A
MOV A,#0AH
XCH A,B
DIV AB
SWAP A
ORL A,B
MOV 22H,A
RET
;***********************************************************
;写DS18B20的程序,从DS18B20中定一个字节数据,该子程序的入口是A
;***********************************************************
WRITEDS1820:
MOV R7,#08H
SETB P3.0
NOP
NOP
WRITEDS1820LOP:
CLR P3.0;下降沿写一次
MOV R6,#07H;延时
DJNZ R6,$
RRC A
MOV P3.0,C
MOV R6,#34H
DJNZ R6,$
SETB P3.0
DJNZ R7,WRITEDS1820LOP
RET
;*********************************************
;读DS18B20的程序,从DS18B20中读出一个字节的数据
;*********************************************
READDS1820:
MOV R7,#08H
SETB P3.0
NOP
NOP
READDS1820LOOP:CLR P3.0
NOP
NOP
NOP
SETB P3.0
MOV R6,#07H;延时15微秒
DJNZ R6,$
MOV C,P3.0;每上升沿取一次数
MOV R6,#3CH;延时120微秒
DJNZ R6,$
RRC A
SETB P3.0
DJNZ R7,READDS1820LOOP
MOV R6,#3CH;延时120微秒
DJNZ R6,$
RET
;**********************************************
;复位子程序
;***********************************************
INITDS1820:
SETB P3.0;先将数据口置1
NOP
NOP
CLR P3.0;再将数据口置0主要的效果是清除存在的标志位
MOV R6,#0A0H
DJNZ R6,$
MOV R6,#0A0H
DJNZ R6,$;延时480微秒
SETB P3.0;将数据口置1
MOV R6,#32H;延时70微秒
DJNZ R6,$
MOV R6,#3CH
LOOP1820:
MOV C,P3.0;取一次数据
JC INITDS1820OUT
DJNZ R6,LOOP1820
MOV R6,#064H;延时200微秒
DJNZ R6,$
SJMP INITDS1820
RET
INITDS1820OUT:SETB P3.0
RET
;****************************************************
;处理温度BCD码
;****************************************************
CONVTEMP:
MOV A,36H;低位温度存在36H的高四位
ANL A,#11110000B
SWAP A;将低四位屏蔽掉,再将高四位放回低四位
MOV 38H,A;把转换好的温度存入38H
MOV A,37H;高位温度存在37H的低三位
ANL A,#00000111B;将高五位屏蔽掉
SWAP A;再将转换好的低四位放回到高四位
ORL A,38H;将都转换好的高低四位相加,结果存在A里
RET
DISP:MOV A,22H
MOV P2,A
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -