求教 为什么用1602显示温度的时候温度一直不变 调节ds18b20a温度也不变一直一样
时间:10-02
整理:3721RD
点击:
DQ bit p3.3
tmph data 28h
tmpl data 29h
temp_xiao equ 30h
temp_ge equ 31h
temp_shi equ 32h
temp_bai equ 33h
now data 40h;存放当前时间,日期首地址
IO bit p1.1
sclk bit p1.0
rst bit p1.2
RS BIT P2.0 ;这3位是液晶屏的控制信号,连接方式由具体硬件而定
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_bai, A
ORL temp_shi, A
ORL temp_ge, A
ORL temp_xiao, A
DISP2: MOV A,temp_bai
LCALL WRITE_LCDDATA
MOV A,temp_shi
LCALL WRITE_LCDDATA
MOV A,temp_ge
LCALL WRITE_LCDDATA
MOV A,#2EH ;'.'字符
LCALL WRITE_LCDDATA
MOV A,temp_xiao
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_bai,#2DH;在百位数位置放负号
sjmp Tmpc11
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Tmpc1:mov temp_bai,#20H ;温度为正值
Tmpc11:mov a,tmpl
anl a,#0fH
mov dptr,#Tmptab
movc a,@a+dptr
mov temp_xiao,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_bai,a
;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;
B2bcd1:mov a,#10
xch a,b
div ab
mov temp_shi,a
mov temp_ge,b
Tmpc12:nop
Disbcd:mov a,temp_bai
anl a,#0fh
cjne a,#01,Disbcd0
ret
Disbcd0:mov a,temp_ge
anl a,#0fh
jnz Disbcd1
mov a,temp_bai
mov temp_ge,a
mov temp_bai,#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, #38H
LCALL WRITE_INSTRUCTION
MOV A, #0cH
LCALL WRITE_INSTRUCTION
MOV A, #06H
LCALL WRITE_INSTRUCTION
MOV A, #01H
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
tmph data 28h
tmpl data 29h
temp_xiao equ 30h
temp_ge equ 31h
temp_shi equ 32h
temp_bai equ 33h
now data 40h;存放当前时间,日期首地址
IO bit p1.1
sclk bit p1.0
rst bit p1.2
RS BIT P2.0 ;这3位是液晶屏的控制信号,连接方式由具体硬件而定
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_bai, A
ORL temp_shi, A
ORL temp_ge, A
ORL temp_xiao, A
DISP2: MOV A,temp_bai
LCALL WRITE_LCDDATA
MOV A,temp_shi
LCALL WRITE_LCDDATA
MOV A,temp_ge
LCALL WRITE_LCDDATA
MOV A,#2EH ;'.'字符
LCALL WRITE_LCDDATA
MOV A,temp_xiao
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_bai,#2DH;在百位数位置放负号
sjmp Tmpc11
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Tmpc1:mov temp_bai,#20H ;温度为正值
Tmpc11:mov a,tmpl
anl a,#0fH
mov dptr,#Tmptab
movc a,@a+dptr
mov temp_xiao,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_bai,a
;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;
B2bcd1:mov a,#10
xch a,b
div ab
mov temp_shi,a
mov temp_ge,b
Tmpc12:nop
Disbcd:mov a,temp_bai
anl a,#0fh
cjne a,#01,Disbcd0
ret
Disbcd0:mov a,temp_ge
anl a,#0fh
jnz Disbcd1
mov a,temp_bai
mov temp_ge,a
mov temp_bai,#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, #38H
LCALL WRITE_INSTRUCTION
MOV A, #0cH
LCALL WRITE_INSTRUCTION
MOV A, #06H
LCALL WRITE_INSTRUCTION
MOV A, #01H
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
一、18B20的读取程序是不是有问题
二、1602的刷新频率问题
汇编很牛啊,数字钟+温度计
之前用c写过,汇编不懂,温度显示85一直不变,后来改了几次发现是读写时序的问题。