📄 18b20.asm
字号:
;///汇编源程序!!
;晶振:12M
TEMP EQU 37H
TEMPER_L EQU 36H
TEMPER_H EQU 35H
TEMPER_M EQU 34H
TEMPER_NUM EQU 60H
TEMPER EQU 33H
FLAG1 BIT 00H
DQ BIT P0.4
RS EQU P0.5
RW EQU P0.6
E EQU P0.7
AAA:MOV SP,#70H
lcall lcd_rest
mov dptr,#str6
lcall write1
mov p2,#0c0h
lcall enable
mov dptr,#str7
lcall write1
LCALL GET_TEMPER
LCALL GET_TEMPER
LCALL TEM_COV
lcall tem_chk
lcall lcd_rest
mov dptr,#str5
lcall write1
lcall disp
lcall disp_st
sjmp aaa
disp:
mov a,temp
lcall lcd_w
mov a,temper_h
lcall lcd_w
mov a,temper_m
lcall lcd_w
mov a,#2eh
lcall lcd_w
mov a,temper_l
lcall lcd_w
mov a,#5eh
lcall lcd_w
mov a,#43h
lcall lcd_w
ret
disp_st: mov p2,#0C0h;;第一行的位置
call enable
mov dptr,#str2;送数据表3,SXJ1974@163.COM
call write1
mov p2,#0C0h;;第一行的位置
call enable
call delay
call delay
call delay
call delay
call delay
MOV DPTR,#STR3
CALL WRITE1
call delay
MOV P2,#07H
CALL ENABLE
write1: ;;写数据
mov r1,#00h
a1: mov a,r1
movc a,@a+dptr
call lcd_w
inc r1
cjne a,#00h,a1
call delay
call delay
call delay
ret
;------------------读出转换后的温度值
GET_TEMPER:
SETB DQ ; 定时入口
BCD:LCALL INIT_1820
JB FLAG1,S22
LJMP BCD ; 若DS18B20不存在则返回
S22:LCALL DELAY1
MOV A,#0CCH ; 跳过ROM匹配------0CC
LCALL WRITE_1820
MOV A,#44H ; 发出温度转换命令
LCALL WRITE_1820
NOP
LCALL DELAY
LCALL DELAY
CBA:LCALL INIT_1820
JB FLAG1,ABC
LJMP CBA
ABC:LCALL DELAY1
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ; 发出读温度命令
LCALL WRITE_1820
LCALL READ_18200 ;READ_1820
RET
;------------------读DS18B20的程序,从DS18B20中读出一个字节的数据
READ_1820:
MOV R2,#8
RE1:
CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#7
DJNZ R3,$
MOV C,DQ
MOV R3,#23
DJNZ R3,$
RRC A
DJNZ R2,RE1
RET
;-------------------写DS18B20的程序
WRITE_1820:
MOV R2,#8
CLR C
WR1:
CLR DQ
MOV R3,#6
DJNZ R3,$
RRC A
MOV DQ,C
MOV R3,#23
DJNZ R3,$
SETB DQ
NOP
DJNZ R2,WR1
SETB DQ
RET
;-------------------读DS18B20的程序,从DS18B20中读出两个字节的温度数据
READ_18200:
MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
MOV R1,#36H ; 低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)
RE00:
MOV R2,#8
RE01:
CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#7
DJNZ R3,$
MOV C,DQ
MOV R3,#23
DJNZ R3,$
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
;-----------------------------TEM_COV
TEM_COV:
MOV DPTR,#NUM_TAB
MOV A,#0FH
ANL A,TEMPER_H
SWAP A
MOV TEMPER_H,A
MOV A,#0F0H
ANL A,TEMPER_L
SWAP A
ORL A,TEMPER_H
MOV TEMPER,A
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV TEMPER_H,A
MOV A,B
MOVC A,@A+DPTR
MOV TEMPER_M,A
MOV A,#0FH
ANL A,TEMPER_L
MOV DPTR,#NUM_TAB2
MOVC A,@A+DPTR
MOV TEMPER_L,A
RET
NUM_TAB:
DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,41H,42H,43H,44H,45H,46H
NUM_TAB2:
DB 30H,30H,31H,32H,32H,33H,34H,34H,35H,35H,36H,37H,37H,38H,39H,39H
;-------------------DS18B20初始化程序
INIT_1820:
SETB DQ
NOP
CLR DQ
MOV R0,#80H
TSR1:
DJNZ R0,TSR1 ; 延时
SETB DQ
MOV R0,#25H ;96US-25H
TSR2:
DJNZ R0,TSR2
JNB DQ,TSR3
LJMP TSR4 ; 延时
TSR3:
SETB FLAG1 ; 置标志位,表示DS1820存在
LJMP TSR5
TSR4:
CLR FLAG1 ; 清标志位,表示DS1820不存在
LJMP TSR7
TSR5:
MOV R0,#06BH ;200US
TSR6:
DJNZ R0,TSR6 ; 延时
TSR7:
SETB DQ
RET
;------------------重新写DS18B20暂存存储器设定值
RE_CONFIG:
JB FLAG1,RE_CONFIG1 ; 若DS18B20存在,转RE_CONFIG1
RET
RE_CONFIG1:
MOV A,#0CCH ; 发SKIP ROM命令
LCALL WRITE_1820
MOV A,#4EH ; 发写暂存存储器命令
LCALL WRITE_1820
MOV A,#00H ; TH(报警上限)中写入00H
LCALL WRITE_1820
MOV A,#00H ; TL(报警下限)中写入00H
LCALL WRITE_1820
MOV A,#7FH ; 选择12位温度分辨率
LCALL WRITE_1820
RET
;------------------延时子程序
DELAY: MOV R7,#00H
MIN: DJNZ R7,YS500
RET
YS500: LCALL YS500US
LJMP MIN
YS500US:MOV R6,#00H
DJNZ R6,$
RET
DELAY1: MOV R7,#20H
DJNZ R7,$
REt
;;;;;;;;;;;;;;;;;;;;;;显示子程序;;;;;;;;;;;;;;;;;;;
lcd_rest: MOV p2,#01h
ACALL ENABLE
MOV p2,#38h ;8位2行5x7点阵
ACALL ENABLE
MOV p2,#0fh ;显示器开、光标开、闪烁开
ACALL ENABLE
MOV p2,#06h
ACALL ENABLE
MOV p2,#80H
ACALL ENABLE
ret
lcd_w: MOV p2,a
SETB RS ; RS=1
CLR RW ;RW=0
CLR E ;E=0
lCALL DELAY
SETB E ;E=1
ret
ENABLE: CLR RS
CLR RW
CLR E
lCALL DELAY2
SETB E
RET
DELAY2: MOV p2,#0FFH
CLR RS
SETB RW
CLR E
NOP
SETB E
JB p2.7,DELAY ;如果P1.7为高电平表示忙就循环等待
RET
TEM_CHK:
MOV A,TEMPER_H
ANL A,#0F0H
CJNE A,#0F0H,W_M
MOV A,#2dh
MOV TEMP,A
RET
W_m: MOV A,#2bh
MOV TEMP,A
RET
str1: db 34h,43h,44h,66h,77h,0fh,99h,00h
str2: db 'Merry christmas',00h
str4: db 'Physics department',00h
str3: db 'I will always love you!',00h
str5: db 'temper' ,00h
str6: db 'To mydear hoyden',00h
str7: db 'From gdpiao lab ',00h
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -