📄 main.asm
字号:
DAT BIT P3.7 ;数据通信口
swpH equ 0d2H
swpL equ 0ffH
WDLSB DATA 30H ;读出的温度低字节
WDMSB DATA 31H ;读出的温度高字节
;***************************************************************
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP TMR0 ;定时显示,用定时器0
;********************************************************
;定时显示子程序
TMR0:
MOV TH0,#swpH ;定时器10MS中断
MOV TL0,#swpL
JB 21H,dsl;用于高低位轮流显示
MOV P0,42H;高位
ORL P0,#00100000B
sjmp kkk
dsl:
MOV P0,43H;低位
ORL P0,#00010000B
kkk:
cpl 21H
RETI
;主程序:
MAIN:
TOINIT:
;定时器0的初始化
CLR EA
MOV TMOD,#01H
MOV TH0,#swpH ;定时器10MS中断
MOV TL0,#swpL
SETB EA
SETB ET0
SETB TR0
;***********************************************************
;清显示缓冲
MOV R2,#2
MOV R0,#42H ;
OVER:
MOV @R0,#00H;
INC R0
DJNZ R2,OVER
LOOP:
LCALL DSWD ;调用读出DS18B20温度程序
SJMP LOOP
;**********************************************************
DSWD:
LCALL RSTSNR;调用复位程序
JNB F0,KEND ;如果没有应答,返回主程序
MOV R0,#0CCH
LCALL SEND_BYTE ;跳过ROM匹配
MOV R0,#44H ;发出温度转换命令
LCALL SEND_BYTE
SETB EA
MOV 48H,#1 ;延时75ms以上准备读
SS2:
MOV 49H,#255
SS1:
MOV 4AH,#255
SS0:
DJNZ 4AH,SS0
DJNZ 49H,SS1
DJNZ 48H,SS2
CLR EA
LCALL RSTSNR
JNB F0,KEND
MOV R0,#0CCH ;跳过ROM匹配
LCALL SEND_BYTE
MOV R0,#0BEH ;发出读温度命令
LCALL SEND_BYTE
LCALL READ_BYTE
MOV WDLSB,A
LCALL READ_BYTE
MOV WDMSB,A
LCALL TRANS12
KEND:
SETB EA
RET
;**********************************************************
;温度转换程序(只取整数) ,30H=LSB,31H=MSB;
TRANS12:
MOV A,30H
ANL A,#0F0H
MOV 3AH,A
MOV A,31H
ANL A,#0FH
ORL A,3AH
SWAP A
MOV B,#10
DIV AB
;MOV 42H,A
MOV 43H,B ;
mov b,#10
div ab
mov 42H,B
mov 41H,A
RET
;*************************************************
SEND_BYTE: ;发送一个字节程序
MOV A,R0
MOV R5,#8
SEN3: CLR C
RRC A
JC SEN1
LCALL WRITE_0
SJMP SEN2
SEN1: LCALL WRITE_1
SEN2: DJNZ R5,SEN3 ; 循环8次,写一个字节
RET
;*************************************************
;读一个字节程序
READ_BYTE:
MOV R5,#8
READ1: LCALL READ
RRC A
DJNZ R5,READ1 ; 循环8次,读一个字节
MOV R0,A
RET
;*************************************************
;复位程序,如果复位置位F0,没有就复位F0
RSTSNR: SETB DAT
NOP
NOP
CLR DAT
MOV R6,#250 ;主机发复位脉冲持续3μs×200=600μs
DJNZ R6,$
MOV R6,#50
DJNZ R6,$
SETB DAT ;主机释放总线,口线改为输入
MOV R6,#15
DJNZ R6,$
CALL CHCK ;调用应答检查程序
MOV R6,#60
DJNZ R6,$
SETB DAT
RET
;*************************************************
CHCK: MOV C,DAT
JC RST0
SETB F0 ;检测到信号,置位F0
SJMP CHCK0
RST0: CLR F0 ;未准备好F0复位
CHCK0: RET
;*************************************************
;写0
WRITE_0:
CLR DAT
MOV R6,#30
DJNZ R6,$
SETB DAT
RET
;*************************************************
;写1
WRITE_1:
CLR DAT
NOP
NOP
NOP
NOP
NOP
SETB DAT
MOV R6,#30
DJNZ R6,$
RET
;*************************************************
;读一位数据程序
READ: SETB DAT ;先复位至少1US产生读起始信号
NOP
NOP
CLR DAT
NOP
NOP
SETB DAT ;置位DAT准备接收数据
NOP
NOP
NOP
NOP
NOP
NOP
NOP
MOV C,DAT
MOV R6,#23
DJNZ R6,$
RET
;**********************************************
;13毫秒延时子程序
DELAY10:MOV R4,#20
D2: MOV R5,#30
DJNZ R5,$
DJNZ R4,D2
RET
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -