📄 551.asm
字号:
;基于DS18B20温度传感器的设计程序
ORG 0000H
SJMP START
ORG 0030H
START:
MOV SP,#60H ;初始化
MOV P0,#0FFH
MOV P1,#0FFH
MOV P2,#0FFH
MOV P3,#0FFH
MAIN:
LCALL GET_TEMPER ;调用读温度子程序
LCALL DISP ;调用数码管显示子程序
AJMP MAIN ;重复循环
;------ 读DS18B20传感器的温度值 ------
GET_TEMPER:
SETB P2.7
LCALL RST18B20 ;复位DS18B20
JB 00H,DSS2
RET
DSS2:
MOV A,#0CCH ;跳过ROM匹配
LCALL WR18B20
MOV A,#44H ;向DS18B20发出温度转换命令
LCALL WR18B20
LCALL RST18B20 ;准备读温度前先复位DS18B20
MOV A,#0CCH ;跳过ROM匹配
LCALL WR18B20
MOV A,#0BEH ;向DS18B20发出读温度命令
LCALL WR18B20
LCALL RE18B20 ;读出温度数据
RET
;------ DS18B20复位初始化程序 ------
RST18B20:
SETB P2.7
NOP
CLR P2.7
MOV R0,#06BH ;主机发出复位低脉冲
MOV R1,#03H
DSR1:
DJNZ R0,DSR1
MOV R0,#6BH
DJNZ R1,DSR1
SETB P2.7 ;拉高数据线
NOP
NOP
NOP
MOV R0,#25H
DSR2:
JNB P2.7,DSR3 ;等待DS18B20回应
DJNZ R0,DSR2
LJMP DSR4
DSR3:
SETB 00H ;置标志位,表示DS1820存在
LJMP DSR5
DSR4:
CLR 00H ;清标志位,表示DS1820不存在
LJMP DSR7
DSR5:
MOV R0,#06BH
DSR6:
DJNZ R0,DSR6 ;延时一段时间
DSR7:
SETB P2.7
RET
;------ 写DS18B20的子程序 ------
WR18B20:
MOV R2,#8
CLR C
WR1:
CLR P2.7
MOV R3,#6 ;delay
DJNZ R3,$
RRC A
MOV P2.7,C
MOV R3,#23 ;delay
DJNZ R3,$
SETB P2.7
NOP
DJNZ R2,WR1
SETB P2.7
RET
;------ 从DS18B20中读温度数据程序 ------
RE18B20:
MOV R4,#2
MOV R1,#2FH
;***********************************
RE00:
MOV R2,#8
RE01:
CLR C
SETB P2.7
NOP
NOP
CLR P2.7
NOP
NOP
NOP
SETB P2.7
MOV R3,#09 ;delay
RE10:
DJNZ R3,RE10
MOV C, P2.7
MOV R3,#23 ;delay
RE20:
DJNZ R3,RE20
RRC A
DJNZ R2,RE01
;------------温度处理子程序----------
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
DISP:
MOV A,2EH ;
ANL A,#80H ;
JZ TEMPC1 ; 判断温度是否在零下?
CLR C ; 温度值补码变成原码
MOV A,2FH ;
CPL A
ADD A,#01H ;
MOV 2FH,A ;
MOV A, 2EH ;
CPL A ;
ADDC A,#00H ;
MOV 2EH,A
MOV 33H,#0BH ; 置"-"标志
SJMP TEMPC11 ;
TEMPC1:
MOV 33H,#0AH ; 置"+"标志
;---------将待显示数据送缓冲区------------
TEMPC11:
MOV A,2FH ;得到小数位
ANL A,#0FH
MOV B,#10
MUL AB
MOV B,#16
DIV AB
MOV 30H,A
MOV A,2FH ;得到整数位
SWAP A
ANL A,#0FH
MOV 2FH,A
MOV A,2EH
SWAP A
ANL A,#0F0H
ORL A,2FH
MOV B,A
SUBB A,#100 ;判断一下是否大于100
JNC DISP_ERR ;大于100转出错显示
MOV A,B
MOV B,#10
DIV AB
MOV 32H,A ;得到十位
MOV 31H,B ;得到个位
;-------------显示程序------------------
DISPLAY:
MOV R0,#30H
MOV R2,#22H
MOV A,R2
MOV R1,#04H
LOOP:
MOV A,@R0
MOV DPTR,#NUMTAB
MOVC A,@A+DPTR
MOV P1,A
MOV A,R2
CJNE A,#44H,NEXT
CLR P1.7
NEXT:
LCALL DELAY
MOV P3,A
RL A
MOV R2,A
INC R0
DJNZ R1,LOOP
;----------------点灯子程序---------------
CLR P2.0
CLR P2.1
CLR C
MOV A,32H
SUBB A,#5 ;判断是否大于50
JC SETGREEN ;小于50转绿灯亮
SETB P2.0 ;大于50红灯亮
RET
SETGREEN:
SETB P2.1
RET
;---------------出错显示子程序------------
DISP_ERR:
MOV 30H, #0DH
MOV 31H, #0DH
MOV 32H, #0CH
MOV 33H, #0AH
LCALL DISPLAY
RET
;---------------延时子程序---------------
DELAY:
MOV R6 ,#5
L1:
MOV R7,#200
DJNZ R7,$
DJNZ R6,L1
RET
;--------- 七段数码管显示器字型码表 -------------
NUMTAB:
DB 0C0H,0F9H,0A4H,0B0H, 99H,92H,82H,0F8H,80H,90H, 0FFH, 0BFH,86H,0CEH ;共阳极
; DB 22H,0FAH, 31H, 25H,0ACH,64H,60H, 2FH,20H,24H, 0FFH, 0FDH,79H, 31H ;共阴极
; "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-" "E" "R"
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -