文档库 最新最全的文档下载
当前位置:文档库 › DS18B20温度计完整单片机程序(汇编语言)

DS18B20温度计完整单片机程序(汇编语言)

; 20h.0标志18b20初始化 21h.0标志负温度
ORG 0000H
LJMP MAIN
ORG 000bH
LJMP INIT0_P
MAIN:
MOV TMOD,#01H
MOV TH0,#3CH
MOV TL0,#0B0H
SETB EA
SETB ET0
SETB TR0
MOV R3,#20
clr p1.0
setb p1.1
k:call display
sjmp k
;*****************************************
INIT0_P:

MOV TH0,#3CH
MOV TL0,#0B0H
djnz r3,next
MOV R3,#20
call get_temp
call change

nop
next:
reti
;*****************************************
change:
MOV 21h,R7
mov c,21h.7
jc change2
clr p1.0 ;黄灯亮
setb p1.1
change1:
mov a,r7
mov b,#16
mul ab
mov r7,a
mov a,r6
mov b,#16
div ab
mov r6,a
add a,r7
mov 40h,a
ret

change2:
clr p1.1 ;绿灯亮
setb p1.0
mov a, r7
cpl a
mov r7,a
mov a,r6
cpl a
add a,#1
mov r6,a
call change1
nop
ret
;*****************************************
;显示
display:
mov dptr,#table
mov a,40h
mov b,#10
div ab
cjne a,#0,dis
sjmp dis1
dis :
movc a,@a+dptr
CLR P2.2
clr P2.1 ;低位灭
mov p0,a
call delay3
dis1:
mov a,b
movc a,@a+dptr
setb P2.2
clr P2.1 ;高位灭
mov p0,a
call delay3

ret



;;初始化*****************************************

init:
;call delay1 ; 空闲500us准备开始
clr p1.7 ; 拉低数据线
call display ;等待500us 显示代替延时500us

setb p1.7 ; 释放总线
call delay2 ; 等待80us
jb p1.7 ,f ;存在则向下继续
setb 20h.0 ;初始化成功置1
wait1:jnb p1.7,$ ;越过存在低电平
;call delay1 ;越过存在低电平
sjmp f1
f:clr 20h.0 ;初始化失败置0
f1:
ret
;*****************************************
;写一个字节(内容在A中)
write_byte:
mov r1,#8
;写一位
write_bit:
rrc a ;先写低位
mov r2,#28
clr p1.7 ;数据线拉低写开始
nop
nop
nop
nop
nop
mov p1.7,c ;写数据
wait:djnz r2,$ ;等待采样结束 ;越过采样期
setb p1.7 ;释放总线 ;如果不释放则ds18b20又开始采样,导致未写先采样
djnz r1,write_bit
ret
;*****************************************
;读一个字节(内容放在在A中)
read_byte:
mov r2,#8
read_bit:
clr p1.7
nop
nop
nop
nop
setb p1.7 ;释放总线的目的是为了读18b20发出的数据,低电平是不能读的。
nop
nop
nop
nop
mov c ,p1.7 ;采样
rrc a ;放入a中 发出的数据低位在前高位在后,所以先读低位的。
mov r1,#30
wait2:djnz r1,$ ;等待60us
setb p1.7 ;释放总线从新开始读位
djnz r2,read_bit

ret
;*****************************************
;读取温度(内容存于r6,r7)
get_temp:
clr ea ;关中断 ;使时序操作连贯
call init
jnb 20h.0 ,f2 ;初始化成功则向下执行
clr 20h.0
mov a, #0cch ;跳过序列号
call write_byte
;mov a,#1fh ;9位分辨率
;call write_byte
mov a,#44h ;启动温

度转换
call write_byte
call init ;每次读或写之前都要初始化
jnb 20h.0 ,f2 ;初始化成功则向下执行
clr 20h.0
mov a, #0cch ;跳过序列号
call write_byte
mov a,#0BEH ;送入读内部ram命令
call write_byte
call read_byte
mov r6,a
call read_byte
mov r7,a
f2: setb ea ;开中断
ret
;*****************************************

;*****************************************
;延时程序

delay3:
mov r2,#125 ;延时125us
djnz r2,$
ret
delay1:
mov r2,#250 ;延时500us
djnz r2,$
ret
delay2:
mov r2,#40 ; 延时80us
djnz r2,$
ret



TABLE :db 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H

end

相关文档
相关文档 最新文档