📄 text1.asm
字号:
RTE EQU 22H
RTG EQU 30H
RTO EQU 32H
RSH EQU 35H
TEMPL EQU 40H;存放温度值低位
TEMPH EQU 41H;存放温度值高位
TEMP EQU 50H
ORG 000H
LJMP MAIN
ORG 1000H
MAIN:MOV SP,#60H
SETB P1.0
LCALL RST;调用复位子程序
JNB RTO,MA;判断复位是否成功
MOV A,#0CCH;跳过RAM
LCALL WRS ;调用写子程序
MOV A,#44H;启动温度转换
LCALL WRS
LCALL RST
MOV A,#0CCH
LCALL WRS
MOV A,#0BEH;读内部RAM命令
LCALL WRS
NOP
LCALL RRS
NOP
LCALL WDZ;调用温度转换子程序
LCALL SMX;调用数码管显示程序
MA: LJMP MAIN
/*DS18B20初始复位程序*/
RST: SETB P1.0
NOP
NOP
CLR P1.0 ;下拉数据线
LCALL DELAY1;调用延时程序延时540微妙
NOP
SETB P1.0;释放数据线
MOV RTE,#03H;短暂延时等待
RTD: DJNZ RTE,RTD
JNB P1.0,RTH;判断是否收到复位成功信号
CLR RTO;复位失败RT0清零
NOP
ACALL RTA
RTH: SETB RTO ;复位成功RT0置一
NOP
MOV RTG ,#5BH;短暂延时
RTT: DJNZ RTG ,RTT
RTA: SETB P1.0;使P1.0置一
RET
/*DS18B20写时序子程序*/
WRS: CLR C ;
MOV R4,#8;字节数
NOP
W0: CLR P1.0
MOV R2,#05H
W1: DJNZ R2, W1
RRC A ;循环右移
MOV P1.0,C ;将结果送入
NOP
MOV R3,#28;延时
W2: DJNZ R3,W2
SETB P1.0
DJNZ R4,W0;判断送完没
SETB P1.0
RET
/*DS18B20读时序子程序*/
RRS: MOV R5, #2;字节行数
MOV R0,#40H
RL0 : MOV R6,#8;每行字节数
RL1: CLR C
SETB P1.0
NOP
NOP
NOP
CLR P1.0
MOV RSH ,#05H ;延时
RL2: DJNZ RSH,RL2
NOP
SETB P1.0
NOP
NOP
NOP
MOV C,P1.0 ;将P1.0位信息放到C
MOV R2, #30
RL3: DJNZ R2,RL3
NOP
NOP
RRC A
DJNZ R6,RL1;判断送完没
MOV @R0,A ;将数据放在TEMPL中
INC R0 ;TEMPH
DJNZ R5, RL0;判断整个数据送完没
RET
/*温度转换子程序*/
WDZ:MOV A,TEMPH
ANL A,#80H;判断温度正负
JZ WD2;正温度跳转WD2
SETB P1.1;负温度则使P1.1置1
CLR C ;负温度转换部分
MOV A,TEMPL
CPL A ;取反
ADD A,#01H;加1
MOV TEMPL,A
MOV A,TEMPH
CPL A
ADDC A,#00H
MOV TEMPH,A
WD1:MOV A,TEMPL
ANL A, #0F0H;屏蔽小数位
SWAP A
MOV TEMPL,A
MOV A,TEMPH
ANL A,#0FH ;屏蔽符号位
SWAP A
ORL A,TEMPL
MOV TEMP,A ;将转换后温度置及8字节数据放在TEMP
RET
WD2:CLR P1.1 ;使P1.1清零作为正温度标志
LCALL WD1 ;转到温度处理部分
RET
/*数码管显示子程序*/
SMX:MOV R5,#0
MOV R0,#51H
MOV A,TEMP
MOV B,#100 ;百位数据
DIV AB
MOV 51H,A;将百位数据放在51H
MOV 54H,B ;十位数据
MOV B,#10
MOV A,54H
DIV AB
MOV 52H,A ;十位数据送到52H
MOV 57H,B ;个位数据
MOV B,#1
MOV A,57H
DIV AB
MOV 53H,A ;个位数据放到53H
MOV 54H,B ;小数位为零放到54H
S1: MOV DPTR,#TABF
MOV A,R5
MOVC A,@A+DPTR ;查表2
MOV P3,A
MOV DPTR,#TABE
JB P1.1, S3 ;判断温度正负,负温度跳到S3
MOV A,51H
CJNE A,#0,S7;判断百位是否为零,为零则不显
MOV 51H,#0AH
MOV A,52H;判断十位是否为零,为零不显
CJNE A,#0,S7
MOV 52H,#0AH
S7: MOV A,@R0
S8: MOVC A,@A+DPTR;查表1
MOV 56H,A
MOV A,R5
CJNE A,#2,S4;处理后个位后显示点
MOV A,56H
ORL A,#80H
S5: MOV P2,A
ACALL DELAY2
INC R5
INC R0
CJNE R5, #4,S1
RET
S3: MOV A,52H;判断温度十位是否为零
CJNE A,#0,S31;不为零则百位显示—号
MOV 51H,#0AH;直接使负温度百位不显
MOV 52H,#0BH;负温度显示—号
LCALL S32
RET
S31: MOV 51H,#0BH;使百位显示--号
S32: LCALL S7
RET
S4: MOV A,56H
LCALL S5
RET
/*延时子程序*/
DELAY1:MOV R0,#10
DE1: MOV R1,#25
DE2: DJNZ R1,DE2
DJNZ R0, DE1
RET
/*延时子程序*/
DELAY2:MOV R7,#50
DE3: MOV R6,#100
DE4: DJNZ R6,DE4
DJNZ R7,DE3
RET
TABE:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,00H,40H
;0 ,1,2,3,4,5,6,7,8,9,消零,--
TABF:DB 0FEH,0FDH,0FBH,0F7H
;百位,十位,个位,小位
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -