|
DQ bit p3.3
tmph data 28h
tmpl data 29h
temp_now data 30h
now data 40h;存放當(dāng)前時(shí)間,日期首地址
RS BIT P2.0 ;
RW BIT P2.1
E BIT P2.2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
org 0000h
jmp reset
org 0030h
reset:mov sp,#60h
main:
call DS18B20_Reset
mov a,#0cch
call DS18B20_Write
mov a,#44h
call DS18B20_Write
led_1:
call DS18B20_Reset
mov a,#0cch
call DS18B20_Write
mov a,#0beh
call DS18B20_Write
call DS18B20_Read
mov tmpl,a
call DS18B20_Read
mov tmph,a
lcall Cvttmp
lcall disp
lcall delay_1
lcall delay_1
ajmp main
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
disp: LCALL INITIAL
DISP1: MOV A,#30H
ORL temp_now+3, A
ORL temp_now+2, A
ORL temp_now+1, A
ORL temp_now, A
DISP2: MOV A,temp_now+3
LCALL WRITE_LCDDATA
MOV A,temp_now+2
LCALL WRITE_LCDDATA
MOV A,temp_now+1
LCALL WRITE_LCDDATA
MOV A,#2EH ;'.'字符
LCALL WRITE_LCDDATA
MOV A,temp_now
LCALL WRITE_LCDDATA
MOV A,#0DFH ;下面兩個(gè)是攝氏度的數(shù)字符號
LCALL WRITE_LCDDATA
MOV A,#43H
LCALL WRITE_LCDDATA
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Cvttmp:mov a,tmph
anl a,#08h
jz Tmpc1
clr c
mov a,tmpl
cpl a
add a,#1
mov tmpl,a
mov a,tmph
cpl a
addc a,#0
mov tmph,a
mov temp_now+3,#2DH;在百位數(shù)位置放負(fù)號
sjmp Tmpc11
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Tmpc1:mov temp_now+3,#20H ;溫度為正值
Tmpc11:mov a,tmpl
anl a,#0fH
mov dptr,#Tmptab
movc a,@a+dptr
mov temp_now,a
mov a,tmpl
anl a,#0f0h
swap a
mov tmpl,a
mov a,tmph
anl a,#0fh
swap a
orl a,tmpl
;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;
H2bcd:mov b,#100
div ab
jz B2bcd1
mov temp_now+3,a
;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;
B2bcd1:mov a,#10
xch a,b
div ab
mov temp_now+2,a
mov temp_now+1,b
Tmpc12:nop
Disbcd:mov a,temp_now+3
anl a,#0fh
cjne a,#01,Disbcd0
ret
Disbcd0:mov a,temp_now+2
anl a,#0fh
jnz Disbcd1
mov a,temp_now+3
mov temp_now+2,a
mov temp_now+3,#20H
Disbcd1:ret
tmptab:db 0,1,2,3,3,4,4,5,6,6,7,8,8,9,9
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DS18B20_Reset:
clr DQ
mov r7,#48
call delay_0
setb DQ
mov r7,#6
call delay_0
mov c,DQ
mov r7,#42
call delay_0
jc DS18B20_Reset
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
delay_0:
nop
nop
nop
nop
nop
nop
nop
nop
djnz r7,delay_0
ret
delay_1:mov r6,#50
dl1: mov r7,#50
djnz r7,$
djnz r6,dl1
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DS18B20_Write:
push b
mov b,#08
write_0:
clr DQ
nop
nop
rrc a
mov DQ,c
mov r7,#6
call delay_0
setb DQ
djnz b,write_0
pop b
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DS18B20_Read:
clr a
push b
mov b,#08
read_0:
clr DQ
nop
nop
setb DQ
nop
nop
mov c,DQ
rrc a
mov r7,#6
call delay_0;延遲時(shí)間
djnz b,read_0
pop b
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;---液晶屏初始化,具體請參考資料-------------------------------------------------
INITIAL:MOV A, #01H
LCALL WRITE_INSTRUCTION
MOV A, #38H
LCALL WRITE_INSTRUCTION
MOV A, #0FH
LCALL WRITE_INSTRUCTION
MOV A, #06H
LCALL WRITE_INSTRUCTION
RET
;----寫液晶指令的子程序------------------------------------------
WRITE_INSTRUCTION:
MOV P0, A
CLR RS ;寫入控制命令
CLR RW
lcall DELAY1MS
clr E
lcall DELAY1MS
LCALL DELAY
setb E
RET
;----寫液晶數(shù)據(jù)的子程序---------------------------------------------
WRITE_LCDDATA:
MOV P0,A
SETB RS ;寫入數(shù)據(jù)
CLR RW
lcall DELAY1MS
clr E
lcall DELAY1MS
LCALL DELAY ;判斷液晶模塊是否忙?
setb E
RET
;----查看液晶忙碌信號的子程序---------------------------------------------------------
DELAY: MOV P0,#0FFH ;判斷液晶顯示器是否忙的子程序
CLR RS
SETB RW
CLR E
NOP
SETB E
JB P0.7,DELAY ;如果P0.7為高電平表示忙就循環(huán)等待
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELAY1MS:
MOV R6,#66H
DL10:
MOV R5,#03H
DJNZ R5,$ ;延時(shí)1ms
DJNZ R6,DL10
RET
end
仿真的時(shí)候一直顯示096.4℃
|
|