📄 潘.asm
字号:
;开始温度检测
LCALL REST ;对DS18B20发复位命令
MOV A,#0CCH ;发跳过DS18B20的命令机器代码
LCALL WRBYTE
MOV A,#44H ;对DS18B20发温度转换命令
LCALL WRBYTE
LCALL DELAY ;DS18B20温度转换所需延时1S
MOV R1,#30H
MOV 30H,#28H;将所读的DS18B20序列号存于内部RAM中,地址单元为:30H-3FH。
MOV 31H,#9BH ;注意如果对于6个以上的话,一般把他们的序列号存于外部RAM中。
MOV 32H,#0BBH
MOV 33H,#22H
MOV 34H,#0H
MOV 35H,#0H
MOV 36H,#0H
MOV 37H,#1FH
MOV 38H,#28H
MOV 39H,#3AH
MOV 3AH,#0F0H
MOV 3BH,#22H
MOV 3CH,#0H
MOV 3DH,#0H
MOV 3EH,#0H
MOV 3FH,#0EDH
MOV R4,#2H ;总线上DS18B20的数目
CYCLE: LCALL RESET ;对DS18B20发复位命令.
MOV A,#55H ;总线发匹配命令。
LCALL WRBYTE
MOV R6,#8H ;DS18B20的序列号占8个字节。
CY1: MOV A,@R1 ;总线发一个DS18B20的序列号。
LCALL WRBYTE
INC R1
DJNZ R6,CY1
MOV A,#0BEH ;发读取温度的命令的机器代码。
LCALL WRBYTE
LCALL READ ;读温度值,低字节送50H。
MOV 50H,ACC ;高字节送51H。
LCALL READ
MOV 51H,ACC
LCALL RESET ;发复位命令。
LCALL DISP ;调用显示程序。
DJNZ R4,CYCLE ;判断DS18B20有无都显示完毕。
LJMP START
RESET:PUSH B ;对DS18B20的复位子程序。
PUSH ACC
BACK:MOV A,#200 ;使总线低电平保持600us。
L1:CLR P0.0
DJNZ ACC,L1
SETB P0.0 ;释放总线。
MOV B,#30
DJNZ B,$
CLR C
ORL C,P0.0
JC BACK
MOV B,#80
L2: ORL C,P0.0
JC L3 ;复位成功,跳转。
DJNZ B,L2
SJMP BACK ;复位失败重来。
L3:MOV B,#240
DJNZ B,$
POP ACC
POP B
RET
WRBYTE: PUSH PSW ;往DS18B20写一个字节子程序。
SETB PSW.3
CLR PSW.4
MOV R6,#8
WRBIE:SETB P0.0
MOV R7,#7
RRC A
CLR P0.0
NOP
NOP
DJNZ R7,$
MOV P0.0,C
MOV R7,#20
DJNZ R7,$
DJNZ R6,WRBIT
SETB P0.0;总线在空闲状态时,应为高电平。
POP PSW
RET
DISP:PUSH PSW
SETB PSW.4
CLR PSW.3
MOV A,51H ;将温度高字节数据拿出来分析,
RLC A
CLR C
MOV R6,#4 ;对温度值进行处理右移4位。
DISPP:MOV A,51H
RC A
MOV 51H,A
MOV A,50H
RRC A
MOV 50H,A
DJNZ R6,DISPP
MOV 10H,C ;将判断有无0.5送位地址10H
MOV R0,50H ;将温度值的整数部分送R0.
LCALL CHULI ;将二进制的数转换成BCD码。
CHULI:PUSH PSW ;将二进制数转换成BCD码程序。
SETEB PSW.4
CLR PSW.3
MOV A,R0
MOV B,#64H
DIV AB
MOV R3,A
MOV A,#0AH
XCH A,B
DIV AB
MOV R4,A
MOV A,B
MOV R5,A
POP PSW
RET
READ:PUSH B;从DS18B20里读取数据的子程序。
PUSH PSW
SETB PSW.3
CLR PSW.4
MOV B,#8
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -