?? 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 ; 發(fā)出讀溫度命令
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
;把時間數(shù)據(jù)分開,放入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 ; 發(fā)出溫度轉換命令
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 ; 發(fā)出讀溫度命令
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中讀出兩個字節(jié)的溫度數(shù)據(jù)
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中讀出的溫度數(shù)據(jù)進行轉換
TEMPER_COV:
MOV 24H,TEMPER_L ;保存溫度低8位
MOV A,#0F0H
ANL A,TEMPER_L ; 舍去溫度低位中小數(shù)點后的四位溫度數(shù)值
SWAP A
MOV TEMPER_NUM,A
MOV A,TEMPER_H
ANL A,#07H
SWAP A
ORL A,TEMPER_NUM
MOV TEMPER_NUM,A ; 保存變換后的溫度數(shù)據(jù)
mov temper_numhex,a
LCALL BIN_BCD
RET
;-------------------將16進制的溫度數(shù)據(jù)轉換成壓縮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 ;調(diào)用時間(分)設置子程序
mov 41h,#20h
MOV A,#91H ;DDRAM第1行首地址
ACALL WRI
LCALL WRD
;小時設置子程序
mov 44h,#3ch
MOV A,#8eH ;DDRAM第1行首地址
ACALL WRI
MOV A,#3ch ;寫修改標志
LCALL WRD
lcall timeset2 ;調(diào)用小時設置子程序
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 + -