DS18B20温度传感器多点测温Proteus仿真+单片机汇编语言程序
时间:2023-09-05 01:07:00
DQ BIT P1.0
FLAG BIT 00H
FLAG_NEG BIT 01H
TEMP_L EQU 30H
TEMP_H EQU 31H
TEMP_INT EQU 32H
TEMP_DP EQU 33H
TEMP_100 EQU 34H
TEMP_10 EQU 35H
TEMP_1 EQU 36H
WR_LCD BIT P3.6
RD_LCD BIT P3.7
ORG 0000H
LJMP START
ORG 1000H
START: MOV SP,#60H
LCALL INIT
MAIN: LCALL READ_TEMP
LCALL PROC_TEMP
LJMP MAIN
;*********************************
READ_TEMP:
SETB DQ
LCALL INI_DQ
JB FLAG,RE_0
RET
RE_0: MOV A,#0CCH
LCALL WRITE_DQ
MOV A,#44H
LCALL WRITE_DQ
LCALL DISPLAY ;调用lcd显示程序并延迟
LCALL INI_DQ
MOV A,#0CCH
LCALL WRITE_DQ
MOV A,#0BEH
LCALL WRITE_DQ
LCALL READ_DQ
RET
;************DS18B20初始化程序***************
INI_DQ:
SETB DQ
NOP
NOP
CLR DQ
MOV R1,#3
INI_0: MOV R0,#80
DJNZ R0,$
DJNZ R1,INI_0
SETB DQ
NOP
NOP
NOP
MOV R7, #25
INI_1:JNB DQ,INI_2
DJNZ R7,INI_1;延时
LJMP INI_3
INI_2: SETB FLAG ;标志位
LJMP INI_4
INI_3: CLR FLAG
LJMP INI_5
INI_4:MOV R0,#80
DJNZ R0,[ DISCUZ_CODE_1 ]nbsp; ;时序要求延迟一段时间
INI_5:SETB DQ
RET
;**************DS18B20写命令******************
WRITE_DQ:
MOV R6, #8
CLR C
Tloop: CLR DQ
MOV R2,#6
DJNZ R2,$
RRC A ;最低位移到C
MOV DQ,C
MOV R2,#23
DJNZ R2,$
SETB DQ
NOP
DJNZ R6,Tloop
SETB DQ
RET
;**************读DS18B20数据函数*************
READ_DQ:
MOV R5, #2
MOV R0, #30H
READ_0: MOV &bsp; R6, #8
READ_1: CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
NOP
SETB DQ
MOV R2,#9
DJNZ R2,$
MOV C,DQ
MOV R3,#23
DJNZ R3,$
RRC A
DJNZ R6, READ_1
MOV @R0,A
INC R0
DJNZ R5,READ_0
SETB DQ
RET
;***************温度数据处理程序*****************
PROC_TEMP:
CLR FLAG_NEG
MOV A,TEMP_L
SWAP A
ORL A,#0F0H
MOV TEMP_INT,A
MOV A,TEMP_H
SWAP A
ORL A,#0FH
ANL TEMP_INT,A
MOV A,TEMP_H
JB ACC.7,NEGTIVE
MOV A,TEMP_L
ANL A,#0FH
MOV DPTR,#TAB3
MOVC A,@A+DPTR
MOV TEMP_DP,A
LJMP PRO_0
NEGTIVE: ;温度值为负时处理程序,按实际情况,处理过程比较复杂
SETB FLAG_NEG
MOV A,TEMP_L
CPL A
ANL A,#0FH
MOV R1,A
CJNE R1,#0FH,PRO_1
PUSH ACC
MOV A,TEMP_INT
SUBB A,#1
MOV TEMP_INT,A
POP ACC
MOV TEMP_DP,#00H
LJMP PRO_2
PRO_1: ADD A,#1
MOV DPTR,#TAB3
MOVC A,@A+DPTR
MOV TEMP_DP,A
PRO_2: MOV A,TEMP_INT
CPL A
MOV TEMP_INT,A
PRO_0: MOV A,TEMP_INT
MOV B,#100
DIV AB
MOV TEMP_100,A
MOV A,B
MOV B,#10
DIV AB
MOV TEMP_10,A
MOV TEMP_1,B
RET
;**************LED显示***********************
;**************LCD初始化**********************
INIT: MOV DPTR,#8000H
SETB WR_LCD
SETB RD_LCD
MOV A,#01H
ACALL F_BUSY
MOVX @DPTR,A
ACALL F_BUSY
MOV A,#38H
MOVX @DPTR,A
ACALL F_BUSY
MOV A,0EH
MOVX @DPTR,A
ACALL F_BUSY
MOV A,#0CH
MOVX @DPTR,A
RET
;***********写LCD函数*************************
DISPLAY: MOV DPTR,#8000H ;写第一行数据
MOV A,#80H
ACALL F_BUSY
MOVX @DPTR,A
MOV DPTR,#8100H
MOV R1,#0
D1: LCALL TRANS1;
ACALL F_BUSY
MOVX @DPTR,A
INC R1
CJNE R1,#16,D1
MOV DPTR,#8000H ;写第二行数据
MOV A,#0C0H
ACALL F_BUSY
MOVX @DPTR,A
MOV DPTR,#8100H
LCALL WRITE_NEGTIVE
ACALL F_BUSY
MOVX @DPTR,A
MOV A,TEMP_100
LCALL WRITE_INT
ACALL F_BUSY
MOVX @DPTR,A
MOV A,TEMP_10
LCALL WRITE_INT
ACALL F_BUSY
MOVX @DPTR,A
MOV A,TEMP_1
LCALL WRITE_INT
ACALL F_BUSY
MOVX @DPTR,A
MOV A,#2EH
ACALL F_BUSY
MOVX @DPTR,A
MOV A,TEMP_DP
LCALL WRITE_INT
ACALL F_BUSY
MOVX @DPTR,A
MOV A,#20H
ACALL F_BUSY
MOVX @DPTR,A
MOV A,#0DFH
ACALL F_BUSY
MOVX @DPTR,A
MOV A,#43H
ACALL F_BUSY
MOVX @DPTR,A
RET
;**************显示第一行******************
TRANS1: PUSH DPH
PUSH DPL
MOV A,R1
MOV DPTR,#TAB1;
MOVC A,@A+DPTR
POP DPL
POP DPH
RET
;**************显示第二行******************
WRITE_NEGTIVE:
JB FLAG_NEG,WN
MOV A,#20H
RET
WN: MOV A,#2DH
RET
WRITE_INT:
PUSH DPH
PUSH DPL
MOV DPTR,#TAB2
MOVC A,@A+DPTR
POP DPL
POP DPH
RET
;***********判断LCD是否忙******************
F_BUSY: PUSH DPH
PUSH DPL
PUSH PSW
PUSH Acc
LOOP: MOV DPTR,#8200H
MOVX A,@DPTR
JB Acc.7,LOOP
POP Acc
POP PSW
POP DPL
POP DPH
RET
DELAY_10MS:
MOV R3,#20
DEL_1: MOV R4,#248
DJNZ R4,$
DJNZ R3,DEL_1
RET
TAB1: DB 20H,20H,20H,'T','e','m','p','r','e','t','u','r','e',20H,20H,20H
;**************LCD数字字模
TAB2: DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
;**********小数位转换********************
TAB3: DB 00H,01H,01H,02H
DB 02H,03H,04H,04H
DB 05H,06H,06H,07H
DB 07H,08H,09H,09H
;************无小数点位的段码******************
TAB4: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
;*****************有小数点**********************
TAB5: DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H
END