DQ bit p3.3
tmph data 28h
tmpl data 29h
temp_now data 30h
now data 40h;存放当前时间,日期首地址
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 ;下面两个是摄氏度的数字符号
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;在百位数位置放负号
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;延迟时间
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
;----写液晶数据的子程序---------------------------------------------
WRITE_LCDDATA:
MOV P0,A
SETB RS ;写入数据
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为高电平表示忙就循环等待
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELAY1MS:
MOV R6,#66H
DL10:
MOV R5,#03H
DJNZ R5,$ ;延时1ms
DJNZ R6,DL10
RET
end
仿真的时候一直显示096.4℃
|