📄 液晶显示ds18b20.asm
字号:
RS EQU P3.0
RW EQU P3.1
E EQU P3.2
DAT EQU P3.7
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN: MOV SP,#60H
START:LCALL JUDGE
MOV P1,#01H
LCALL ENABLE
MOV P1,#38H
LCALL ENABLE
MOV P1,#0FH
LCALL ENABLE
MOV P1,#06H
LCALL ENABLE
MOV P1,#80H
LCALL ENABLE
MOV DPTR,#TABLE1
LCALL DISP
MOV P1,#0C0H
LCALL ENABLE
MOV DPTR ,#TABLE2
LCALL DISP
LCALL DSWD
MOV P1,#0C7H
LCALL ENABLE
LCALL DISP2
AJMP $
DISP: MOV R1,#16
LOOP: MOV A,#00H
MOVC A,@A+DPTR
LCALL DISP1
INC DPTR
DJNZ R1,LOOP
RET
DISP1: MOV P1,A
SETB RS
CLR RW
CLR E
LCALL ENABLE
SETB E
RET
DISP2: MOV A,#30H
ADD A,R7
MOV P1,A
LCALL DISP3
MOV A,#30H
ADD A,R6
MOV P1,A
LCALL DISP3
MOV P1,#2EH
LCALL DISP3
MOV A,#30H
ADD A,R5
MOV P1,A
LCALL DISP3
MOV A,#30H
ADD A,R4
MOV P1,A
LCALL DISP3
RET
DISP3: SETB RS
CLR RW
CLR E
LCALL ENABLE
SETB E
RET
ENABLE: CLR RW
CLR RS
CLR E
ACALL JUDGE
SETB E
RET
JUDGE: MOV P1,#0FFH
CLR RS
SETB RW
CLR E
NOP
SETB E
JB P1.7,JUDGE
RET
TABLE1: DB " DS18B20 OK! "
TABLE2: DB " TEMP: "
TABLE3:DB "C"
DSWD: CLR EA
LCALL RST
JNB F0,OUT0 ;如果没有应答,返回主程序
MOV R0,#0CCH
LCALL SEND_BYTE ;跳过ROM匹配
MOV R0,#44H ;发出温度转换命令
LCALL SEND_BYTE
MOV R7,#1 ;廷时75ms以上准备读
SS2: MOV R6,#255
SS1: MOV R5,#255
SS0: DJNZ R5,SS0
DJNZ R6,SS1
DJNZ R7,SS2
LCALL RST
JNB F0,OUT0
MOV R0,#0CCH ;跳过ROM匹配
LCALL SEND_BYTE
MOV R0,#0BEH ;发出读温度命令
LCALL SEND_BYTE
LCALL READ_BYTE
MOV R2,A
LCALL READ_BYTE
MOV R3,A
LCALL TRANS12
SETB EA
OUT0: 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
RST: 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
WRITE_0: CLR DAT;写0
MOV R6,#30
DJNZ R6,$
SETB DAT
RET
WRITE_1: CLR DAT ;写1
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
TRANS12: MOV A,R2
ANL A,#0F0H
MOV R0,A
MOV A,R3
ANL A,#0FH
ORL A,R0
SWAP A
MOV B,#10
DIV AB
MOV R7,A
MOV R6,B
MOV DPTR,#TABB
MOV A,R2
ANL A,#0FH
MOV B,#2
MUL AB
MOVC A,@A+DPTR
MOV R5,A
MOV A,R2
ANL A,#0FH
MOV B,#2
MUL AB
INC A
MOVC A,@A+DPTR
MOV R4,A
RET
TABB: DB 0,0,0,6,1,2,1,8,2,5,3,1,3,7,4,3,5,0
DB 5,6,6,2,6,8,7,5,8,1,8,7,9,3
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -