📄 18b20温度时间显示键盘设置1113.asm
字号:
TEMPER_L EQU 36H ;用到的ram:35h,36h,(get_temper)
TEMPER_H EQU 35H ;24h,35h,36h,60h(temper_cov)
TEMPER_NUM EQU 60H ;21h-27h(display)
temper_numhex equ 61h ;16进制温度值
minitehex equ 62h ;16进制分值
hourhex equ 63h ;16进制小时
hig equ 37h ;高温报警
lw equ 38h ;低温报警值
FLAG1 BIT 00H ;30h,31h,32h,33h(alarm)
DQ BIT P3.0 ;50h,51h,52h,53h (get_time)
;40h-4fh ,存放时间
ORG 0000H
AJMP MAIN
org 0013h
ajmp int1
ORG 0030H
MAIN: ACALL DL1
MOV SP,#70H
setb ex1
lcall getalarmtem
lcall ds887init
MAIN1:clr ea
LCALL JM202INIT
lcall get_time
LCALL GET_TEMPER
LCALL TEMPER_COV
LCALL DISPLAYTEMP
lcall alarmscan
setb ea
LJMP MAIN1
;读取上次设置的温度报警值
getalarmtem:
LCALL INIT_1820
JB FLAG1,alarmABC
LJMP getalarmtem
alarmABC: LCALL DELAY1
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ; 发出读温度命令
LCALL WRITE_1820
LCALL READ_18200 ;READ_1820
lcall read_18200 ;报警值高位存入36H(TEMPER_L),低位存入35H(TEMPER_H)
mov hig,temper_l
mov lw,temper_h
ret
;------------------液晶初始化
JM202INIT: CLR p2.4 ;RS
CLR p2.5 ;R/W
CLR p2.6 ;E
MOV A,#0CH ;DISPLAY ON
LCALL WRI
MOV A,#38H ;SET NUMBERS OF DISPLAY LINE
LCALL WRI
lcall display2
RET
display2:mov a,#0c3h
lcall wri
mov dptr,#CHATAB
mov r7,#5
ddram1: CLR A
movc a,@a+dptr
lcall wrd
inc dptr
djnz r7,ddram1
ret
;时钟芯片初始化
ds887init: mov dptr,#8f0bh
mov a,#83h
movx @dptr,a
mov dptr,#8f01h ;设置闹钟
mov a,#0ffh
movx @dptr,a
mov dptr,#8f0ah ;初始化寄存器a
mov a,#20h
movx @dptr,a
mov dptr,#8f0ch
movx a,@dptr ;清c
inc dptr
movx a,@dptr ;d 中vrt位只一
mov dptr,#8f0bh
mov a,#32h ;初始化b
movx @dptr,a
ret
;读取时间值
get_time:mov dptr,#8f0ah
movx a,@dptr
jb acc.7,get_time
mov r0,#50h
mov dptr,#8f02h ;minite 50
movx a,@dptr
mov @r0,a
inc r0
mov dptr,#8f04h ;hour 51
movx a,@dptr
mov @r0,a
inc r0
mov dptr,#8f07h ;日 52
movx a,@dptr
mov @r0,a
inc r0
mov dptr,#8f08h ;月 53
movx a,@dptr
mov @r0,a
inc r0
mov dptr,#8f09h ;年 54
movx a,@dptr
mov @r0,a
lcall displaytime
ret
;把时间数据分开,放入4fh开始的单元中
;并送液晶显示,不显示秒
displaytime:mov dptr,#asc11
mov r0,#4fh
mov r1,#54h
mov r4,#5
continue:mov a,@r1
swap a
anl a,#0fh
movc a,@a+dptr
mov @r0,a
dec r0
mov a,@r1
anl a,#0fh
movc a,@a+dptr
mov @r0,a
dec r0
dec r1
cjne r4,#01h,decr0
ajmp finish
decr0: dec r0
finish: djnz r4,continue
mov 4dh,#2fh
mov 4ah,#2fh
mov 47h,#20h
mov 44h,#3ah
displayline1:MOV A,#83H ;DDRAM第1行首地址
ACALL WRI
MOV R0,#4fH
MOV R7,#14
display1:MOV A,@R0
LCALL WRD
dec R0
DJNZ R7,display1
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的程序
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
;-------------------将从DS18B20中读出的温度数据进行转换
TEMPER_COV:
MOV 24H,TEMPER_L ;保存温度低8位
MOV A,#0F0H
ANL A,TEMPER_L ; 舍去温度低位中小数点后的四位温度数值
SWAP A
MOV TEMPER_NUM,A
MOV A,TEMPER_H
ANL A,#07H
SWAP A
ORL A,TEMPER_NUM
MOV TEMPER_NUM,A ; 保存变换后的温度数据
mov temper_numhex,a
LCALL BIN_BCD
RET
;-------------------将16进制的温度数据转换成压缩BCD码
BIN_BCD:
MOV DPTR,#TEMP_TAB
MOV A,TEMPER_NUM
MOVC A,@A+DPTR
MOV TEMPER_NUM,A
RET
;-------------------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
;-----------------液晶温度显示子程序
DISPLAYTEMP:MOV A,TEMPER_NUM
ANL A,#0FH
mov dptr,#asc11
movc a,@a+dptr
MOV 22H,A
MOV A,TEMPER_NUM
SWAP A
ANL A,#0FH
mov dptr,#asc11
movc a,@a+dptr
MOV 21H,A
MOV 23H,#2EH
;温度低4位处理程序
MOV A,#00H
;ANL A,#0FH
jnb 20h,c1
add a,#06h
c1:jnb 21h,c2
add a,#13h
c2:jnb 22h,c3
add a,#25h
c3:jnb 23h,c4
add a,#50h
c4:da a
mov 24h,a
anl a,#0fh
mov dptr,#asc11
movc a,@a+dptr
mov 25h,a
mov a,24h
swap a
anl a,#0fh
mov dptr,#asc11
movc a,@a+dptr
MOV 24H,A
MOV 26H,#0DFH
MOV 27H,#43H
wriline2:MOV A,#0CAH ;DDRAM第二行首地址
LCALL WRI
MOV R0,#21H
MOV R7,#7
DDRAM3:MOV A,@R0
LCALL WRD
INC R0
DJNZ R7,DDRAM3
RET
alarmscan:
mov a,temper_numhex
clr c
subb a,hig
jc gonext
clr p3.4
setb p3.5
;lcall alarm
ret
gonext: CLR C
MOV A,temper_numhex
SUBB A,lw
JNC BACK
CLR P3.5
setb p3.4
;lcall alarm
RET
BACK: SETB P3.4
setb p3.5
RET
;有键按下时,外部中断1子程序
int1: clr ea
mov p2,#0ffh
jb p2.1,timeset ;按下k1,修改报警温度
jnb p2.1,$ ;否则转时间设置子程序
int1CBA:MOV A,#0d1H ;DDRAM第2行首地址
ACALL WRI
MOV A,#3ch ;写修改标志
LCALL WRD
mov 21h,#48h
mov 22h,#49h
mov 23h,#20h
mov r1,hig
lcall dl1
lcall int1reset
mov temper_l,r1
mov hig,r1
mov 21h,#4ch
mov 22h,#57h
mov 23h,#20h
mov r1,lw
acall dl1
lcall int1reset
mov temper_h,r1
mov lw,r1
lcall RE_CONFIG
LCALL GET_TEMPER
LCALL TEMPER_COV
LCALL DISPLAYTEMP
MOV A,#0d1H ;DDRAM第2行首地址
ACALL WRI
MOV A,#20h ;清修改标志
LCALL WRD
setb ea
reti
timeset: ;时间设置
jb p2.0,int1back2
jnb p2.0,$
lcall dl1
ajmp gotimeset
int1back2:setb ea
reti
;时间(分)设置子程序
gotimeset:mov 41h,#3ch
MOV A,#91H ;DDRAM第1行首地址
ACALL WRI
MOV A,#3ch ;写修改标志
LCALL WRD
lcall timeset1 ;调用时间(分)设置子程序
mov 41h,#20h
MOV A,#91H ;DDRAM第1行首地址
ACALL WRI
MOV A,#20h
LCALL WRD
;小时设置子程序
mov 44h,#3ch
MOV A,#8eH ;DDRAM第1行首地址
ACALL WRI
MOV A,#3ch ;写修改标志
LCALL WRD
lcall timeset2 ;调用小时设置子程序
mov 44h,#3ah
MOV A,#8eH ;DDRAM第1行首地址
ACALL WRI
MOV A,#3ah ;清修改标志
LCALL WRD
;日期设置
mov 47h,#3ch
MOV A,#8bH ;DDRAM第1行首地址
ACALL WRI
MOV A,#3ch ;写修改标志
LCALL WRD
lcall timeset3 ;日期设置
mov 47h,#20h
MOV A,#8bH ;DDRAM第1行首地址
ACALL WRI
MOV A,#20h ;清修改标志
LCALL WRD
;月设置
mov 4ah,#3ch
MOV A,#88H ;DDRAM第1行首地址
ACALL WRI
MOV A,#3ch ;写修改标志
LCALL WRD
lcall timeset4 ;月设置
mov 4ah,#2fh
MOV A,#88H ;DDRAM第1行首地址
ACALL WRI
MOV A,#2fh ;清修改标志
LCALL WRD
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -