📄 18b20.asm
字号:
ORG 0000H
LJMP MAIN
;高精度数字温度计(此汇编程序在AT2051通过运行)
ORG 0030H
MAIN:MOV 29H, #00H
MOV 28H, #00H
LOOP0:LCALL RE000 ;复位
MOV A, #0CCH ;跳过ROM操作
LCALL WRITE
MOV A, #44H ;发出温度转换命令
LCALL WRITE
LCALL DELAY1 ;延时750mS
LCALL DELAY1
LCALL DELAY1
LCALL RE000 ;复位
MOV A, #0CCH ;跳过ROM操作
LCALL WRITE
MOV A, #0BEH ;发出读温度命令
LCALL WRITE
LCALL READ ;读DS18B20中的温度数据
LCALL BTOD
mov 30H, #13H
mov 35H, #11H
LCALL DELAY2
LJMP LOOP0
;复位DS18B20子程序
RE000:SETB P3.2
NOP
CLR P3.2
MOV R3, #96H
LOOP1:DJNZ R3, LOOP1 ;延时600uS
SETB P3.2
NOP
MOV R3, #0FH
LOOP2:DJNZ R3, LOOP2 ;延时60uS
MOV R3, #1EH
LOOP3:JNB P3.2, LOOP4 ;240uS内检查DS18B20的存在脉冲
DJNZ R3, LOOP3
clr p1.0
LJMP LOOP5
MOV R3, #3CH
LOOP4:DJNZ R3, LOOP4 ;延时240uS
SETB P3.2
LOOP5:RET
;写DS18B20子程序
WRITE:MOV R2,#08H ;一共8位数据
CLR C
LOOP6:SETB p3.2
nop
CLR P3.2
MOV R3, #04H
LOOP7:DJNZ R3, LOOP7
RRC A
MOV P3.2, C
MOV R3,#0CH
LOOP8:DJNZ R3, LOOP8 ;延时48uS
SETB P3.2
NOP
DJNZ R2, LOOP6
SETB P3.2
RET
; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据
READ:MOV R4,#2H ;将温度高位和低位从DS18B20中读出
MOV R1,#29H ;低位存入29H,高位存入28H
RE00:MOV R2,#8H
RE01:CLR C
SETB P3.2
NOP
CLR P3.2
NOP
SETB P3.2
MOV R3, #04H ;延时16uS
RE10:DJNZ R3, RE10
MOV C,P3.2
MOV R3,#0CH ;延时48uS
RE20:DJNZ R3,RE20
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
;延时子程序1(0.25秒)
DELAY1:MOV R4, #0FDH
L3:MOV R5, #0FCH
L5:DJNZ R5, L5
DJNZ R4, L3
RET
;延时子程序2
DELAY2:MOV R4, #02H
L6:MOV R5, #0FFH
L7:LCALL DIRR
DJNZ R5, L7
DJNZ R4, L6
RET
;延时子程序0
DELAY:MOV R2, #01H
L1:MOV R3, #08H
L2:DJNZ R3, L2
DJNZ R2, L1
RET
;进制转换数据处理
BTOD:MOV R0, #34H
JNB 47H, BTOD0 ;28H中的最高位是否为1(温度<0)
QB00: MOV A, 29H ;负数取补
CPL A
ADD A, #01H
MOV 29H, A
MOV A, 28H
CPL A
ADDC A, #00H
MOV 28H, A
MOV @R0, #12H ;显示负号
LJMP BTOD1
BTOD0:MOV @R0, #11H
BTOD1:MOV A,29H
MOV 27H, A
MOV C,40H ;将28H中的最低位移入C,40H41H42H43H为28H中的位地址
RRC A
MOV C,41H
RRC A
MOV C,42H
RRC A
MOV C,43H
RRC A
MOV 29H,A
MOV A, 29H ;将29H中的十六进制数转换成10进制
MOV B, #100
DIV AB
JZ BTOD2
MOV @R0, A ;百位存于33H
LJMP BTOD4
BTOD2:CJNE @R0, #12H, BTOD3
LJMP BTOD4
BTOD3:MOV @R0, #11H ;百位为零暗
BTOD4:DEC R0
MOV A, #10
XCH A, B
DIV AB
MOV @R0, A ;十位存于32H
DEC R0
MOV @R0, B ;个位存于31H
DEC R0
ANL 27H, #0FH ;小数点后一位进制转换
MOV A, 27H
MOV B, #06H
MUL AB
MOV B, #10
DIV AB
MOV @R0, A ;小数点后一位存于30H
JB P3.7, BTOD5 ;小数点后一位是否显示判断
MOV @R0, #0FFH
BTOD5:RET
;动态显示子程序
DIRR: MOV R0, #30H
MOV P1, #00H
MOV A, @R0 ;显示C
MOV DPTR, #SEGPT
MOVC A, @A+DPTR
MOV p0, A
OUT1: JNB TI, OUT1
CLR TI
SETB P1.2
LCALL DELAY
CLR P1.2
INC R0
MOV A, @R0 ;显示小数点后一位
MOV DPTR, #SEGPT
MOVC A, @A+DPTR
MOV p0, A
OUT2: JNB TI, OUT2
CLR TI
SETB P1.3
LCALL DELAY
CLR P1.3
MOV A, #10H ;显示小数点
MOV DPTR, #SEGPT
MOVC A, @A+DPTR
MOV p0, A
OUT0: JNB TI, OUT0
CLR TI
SETB P1.4
LCALL DELAY
CLR P1.4
INC R0
MOV A, @R0 ;显示个位数
MOV DPTR, #SEGPT
MOVC A, @A+DPTR
MOV p0, A
OUT3: JNB TI, OUT3
CLR TI
SETB P1.4
LCALL DELAY
CLR P1.4
INC R0
MOV A, @R0 ;显示高位数
MOV DPTR, #SEGPT
MOVC A, @A+DPTR
MOV p0, A
OUT4: JNB TI, OUT4
CLR TI
SETB P1.5
LCALL DELAY
CLR P1.5
INC R0
MOV A, @R0 ;显示高位数
MOV DPTR, #SEGPT
MOVC A, @A+DPTR
MOV p0, A
OUT5: JNB TI, OUT5
CLR TI
SETB P1.6
LCALL DELAY
CLR P1.6
INC R0
MOV A, @R0 ;显示高位数
MOV DPTR, #SEGPT
MOVC A, @A+DPTR
MOV p0, A
OUT6: JNB TI, OUT6
CLR TI
SETB P1.7
LCALL DELAY
CLR P1.7
RET
SEGPT: DB 0C0H,0F9H,0A4H,0B0H,99H ;0,1,2,3,4
DB 92H,82H,0F8H,80H,90H ;5,6,7,8,9
DB 88H,83H,0C6H,0A1H,86H,8EH ;A,B,C,D,E,F
DB 07FH,0FFH,0BFH,70H ;点,暗,-,摄氏度
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -