📄 ds18b20的应用.asm
字号:
DQ BIT P2.0
RS BIT P3.5 ;LCD RS=P3.5
RW BIT P3.6 ;R/W=P3.6
E BIT P3.7 ;E=P3.7
LCD_3 EQU 32H
LCD_2 EQU 33H
LCD_1 EQU 34H
LCD_0 EQU 36H
TEMP_DATA_L EQU 30H
TEMP_DATA_H EQU 31H
ORG 00H
START: MOV P1,#01H ;清除屏幕
CALL ENABLE ;写到指定寄存器
MOV P1,#38H ;功能设定(8位,2行,5*7点阵式)
CALL ENABLE ;写到指定寄存器
MOV P1,#0CH ;显示器ON,光标OFF,闪烁OFF
CALL ENABLE ;写到指定寄存器
MOV P1,#80H ;第一行起始地址
CALL ENABLE ;写到指定寄存器
MOV DPTR,#TABLE1 ;显示“Jiang lao shi”
CALL WRITE1 ;到TABLE1取码并写到数据寄存器
MOV 35H,#2EH
MOV 37H,#0DFH
MOV 38H,#43H
MAIN: LCALL READ_T
LCALL CONVERT_T
LCALL DISPLAY
LJMP MAIN
;*************************************
; 初始化DS18B20
;*************************************
DS18B20_INIT:SETB DQ
NOP
NOP
CLR DQ
MOV R6,#0A0H
DJNZ R6,$
MOV R6,#0A0H
DJNZ R6,$
SETB DQ
MOV R6,#32H
DJNZ R6,$
MOV C,DQ
JC ERROR
MOV R6,#064H
DJNZ R6,$
RET
ERROR: CLR P2.0
SJMP DS18B20_INIT
RET
;**************************************
; 读DS18B20一个字节程序
;**************************************
READ_BYTE: MOV R7,#08H
SETB DQ
NOP
NOP
LOOP: CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R6,#07H
DJNZ R6,$
MOV C,DQ
MOV R6,#3CH
DJNZ R6,$
RRC A
SETB DQ
DJNZ R7,LOOP
MOV R6,#3CH
DJNZ R6,$
RET
;*****************************************
; 写DS18B20程序
;*****************************************
WRITE_BYTE:MOV R7,#08H
SETB DQ
NOP
NOP
LOOP1: CLR DQ
MOV R6,#07H
DJNZ R6,$
RRC A
MOV DQ,C
MOV R6,#34H
DJNZ R6,$
SETB DQ
DJNZ R7,LOOP1
RET
;******************************************
; 读温度程序
;******************************************
READ_T: LCALL DS18B20_INIT
MOV A,#0CCH
LCALL WRITE_BYTE
MOV R6,#34H
DJNZ R6,$
MOV A,#44H
LCALL WRITE_BYTE
MOV R6,#34H
DJNZ R6,$
READ_T1:LCALL DS18B20_INIT
MOV A,#0CCH
LCALL WRITE_BYTE
MOV R6,#34H
DJNZ R6,$
MOV A,#0BEH
LCALL WRITE_BYTE
MOV R6,#34H
DJNZ R6,$
LCALL READ_BYTE
MOV TEMP_DATA_L,A
LCALL READ_BYTE
MOV TEMP_DATA_H,A
RET
;********************************************
; 处理温度数据程序
;********************************************
CONVERT_T: MOV A,TEMP_DATA_H
ANL A,#80H
JZ TEMPC1
CLR C
MOV A,TEMP_DATA_L
CPL A
ADD A,#01H
MOV TEMP_DATA_L,A
MOV A,TEMP_DATA_H
CPL A
ADDC A,#00H
MOV TEMP_DATA_H,A
MOV A,TEMP_DATA_L
ANL A,#0FH
MOV DPTR,#TABLE3
MOVC A,@A+DPTR
MOV LCD_0,A
MOV A,TEMP_DATA_L
ANL A,#0F0H
SWAP A
MOV TEMP_DATA_L,A
MOV A,TEMP_DATA_H
ANL A,#0FH
SWAP A
ORL A,TEMP_DATA_L
MOV B,#100
DIV AB
MOV LCD_3,#2DH;'-'
SJMP TEMPC2
TEMPC1: MOV A,TEMP_DATA_L
ANL A,#0FH
MOV DPTR,#TABLE3
MOVC A,@A+DPTR
MOV LCD_0,A
MOV A,TEMP_DATA_L
ANL A,#0F0H
SWAP A
MOV TEMP_DATA_L,A
MOV A,TEMP_DATA_H
ANL A,#0FH
SWAP A
ORL A,TEMP_DATA_L
MOV B,#100
DIV AB
MOV DPTR,#TABLE2
MOVC A,@A+DPTR
MOV LCD_3,A
TEMPC2: MOV A,#10
XCH A,B
DIV AB
MOV DPTR,#TABLE2
MOVC A,@A+DPTR
MOV LCD_2,A
MOV A,B
MOV DPTR,#TABLE2
MOVC A,@A+DPTR
MOV LCD_1,A
RET
;**************************************
; 显示程序
;**************************************
DISPLAY: MOV P1,#0C0H
CALL ENABLE
CALL WRITE3
RET
ENABLE: CLR RS ;RS=0,写到旨令寄存器
CLR RW ;R/W=0
CLR E ;E=1--0使能
CALL DELAY ;调用延时子程序
SETB E ;E=1禁止
RET
WRITE1: MOV R1,#00H ;取码指针
A1: MOV A,R1 ;到TABLE取码
MOVC A,@A+DPTR
CALL WRITE2 ;调用写入到数据寄存器子程序
INC R1 ;取码指针加1
CJNE A,#00H,A1 ;是否取到结束码00H
RET
WRITE3: MOV R2,#7 ;显示8位
MOV R1,#32H ;从左至右显示
A2: MOV A,@R1
CALL WRITE2
INC R1 ;地址减1
DJNZ R2,A2 ;8位是否显示完
MOV R2,#7
RET
WRITE2: MOV P1,A ;将数据码写入数据寄存器
SETB RS ;RS=1
CLR RW ;R/W=0
CLR E ;E=1--0 使能
CALL DELAY
SETB E ;E=1 禁止
RET
DELAY: MOV R4,#05 ;延时子程序
D1: MOV R5,#0FFH
DJNZ R5,$
DJNZ R4,D1
RET
TABLE1: DB 'Temperature is :',00H
TABLE2: DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,3AH
TABLE3: DB 30H,31H,31H,32H,33H,33H,34H,34H,35H,36H,36H,37H,38H,38H,39H,39H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -