📄
字号:
; name: temperature of the ds18b20
; creat by: carol.guo
; date : 2005/10/10
; 定义18B20的暂存存储器
TEMP_L EQU 36H
TEMP_H EQU 35H
TEMP_NUM EQU 40H
tempdoth equ 41h
tempdotl equ 42h
DQ EQU P3.2
FLAG EQU 37H
; 定义595的io端口
ser equ p1.2
sclk equ p1.3
rclk equ p1.4
;定义计数器的个十百千位
a_bit equ 30h;
b_bit equ 31h;
c_bit equ 32h;
d_bit equ 33h;
delbuf equ 34h;
;定义功能键
led equ p1.1
k1 equ p1.5
k2 equ p1.6
k3 equ p1.7
;定义24c01的信号线
sda equ p3.7
scl equ p1.0
ORG 0000H
AJMP MAIN
ORG 0020H
MAIN:
mov a,#00h
mov a_bit,a ;SHI WEI
mov b_bit,a ;GE WEI
mov c_bit,a ;XIAO SHU WEI
MOV a,#0cH
mov d_bit,a ;温度标志符号
LCALL DIS_TEMP
START:
MOV SP,#60H
LCALL GET_TEMP
LCALL TEMP_COV
LCALL DIS_TEMP
SJMP START
GET_TEMP:
CLR PSW.4
SETB PSW.3 ;设置工作寄存器当前所在的区域 08H-0FH
CLR EA ;使18B20 一定要禁止一切中断产生
CLR FLAG
LCALL INITIAL ;调用初始化子程序
MOV A,#0CCH
LCALL WRITE ;送入跳过ROM命令
MOV A,#44H
LCALL WRITE ;送入温度转换命令
LCALL DELAY1S
CHECK:
LCALL INITIAL
JB FLAG,NEXT
LJMP CHECK
NEXT:
LCALL DELAY10MS
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE
MOV A,#0BEH ;发出读温度命令
LCALL WRITE
LCALL READ ;读18B20的温度值
MOV TEMP_L,A
LCALL READ
MOV TEMP_H,A
SETB DQ
RET
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;初始化子程序
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
INITIAL:
CLR EA
L0:
CLR DQ ;DS18B20总线为低复位电平
MOV R2,#200
L1:
CLR DQ
DJNZ R2,L1 ;总线复位电平保持400US
SETB DQ
MOV R2,#30
L2:
DJNZ R2,L2 ;释放DS18B20总线保持60US
CLR C ;清存在信号
ORL C,DQ
JC L6 ;存在么?存在C=0; C=1不存在调转
MOV R6,#80
L3:
ORL C,DQ
JC L4
DJNZ R6,L3 ;持续检测存在信号240US 直到采样结束检测到DQ信号变高为止
SJMP L0
L4:
MOV R2,#240
SETB FLAG
L5:
DJNZ R2,L5
L6: RET
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;写18B20的子程序
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
WRITE:
CLR EA
MOV R3,#8 ;写入DS18B20的BIT数,一个字节8个BIT
WR1:
SETB DQ
MOV R4,#8
RRC A ;把一个字节DATA(A)分成8个BIT环移给C
CLR DQ ;开始写入18B20总线要处于复位状态
WR2:
DJNZ R4,WR2 ;保持16US
MOV DQ,C ;给总线发送一个BIT
MOV R4,#20
WR3:
DJNZ R4,WR3 ;等待40US
DJNZ R3,WR1 ;写入下一个BIT
SETB DQ ;重新释放总线
RET
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;读18B20的子程序
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
READ:
CLR EA
MOV R6,#8
RE1:
CLR DQ ;读前总线保持低电平
MOV R4,#4
NOP
SETB DQ ;开始释放总线
RE2:
DJNZ R4,RE2 ;保持8US
MOV C,DQ ;从1820总线读得一个BIT
RRC A ;把读得的位环移给A
MOV R5,#30
RE3:
DJNZ R5,RE3 ;保持60US
DJNZ R6,RE1 ;读下一个字节
SETB DQ
RET
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; 温度数据转换子程序
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
TEMP_COV:
MOV A,#0F0H
ANL A,TEMP_L
SWAP A
MOV TEMP_NUM,A
MOV A,TEMP_H
ANL A,#07H
SWAP A
ORL A,TEMP_NUM
MOV TEMP_NUM,A ; 保存变换后的温度数据
MOV A,TEMP_NUM
MOV B,#0AH ;数据处理子程序十位个位单独显示
DIV AB
MOV a_bit,A ;十位
MOV b_bit,B ;个位
mov a,#0fh
anl a,temp_l
mov dptr,#temp_tab
movc a,@a+dptr
mov c_bit,a
ret
; mov tempdoth,#00h
; mov tempdotl,#00h
; lcall fenlidot
; mov b,#0ah
; mov a,tempdoth
; div ab
; mov b_bit,a
RET
temp_tab:
db 00h,01h,01h,02h,03h,03h,04h,04h,05h,05h,06h,07h,08h
db 08h,09h,09h
ret
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++
; fen li xiao shu
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++
FenLiDot:
mov a,Temp_l
jnb acc.3,Fen1 ;2^-1
mov r5,#low(5000)
mov r4,#High(5000)
call Add2
Fen1:
jnb acc.2,Fen2 ;2^-2
mov r5,#low(2500)
mov r4,#High(2500)
call Add2
Fen2:
jnb acc.1,Fen3 ;2^-3
mov r5,#low(1250)
mov r4,#High(1250)
call Add2
Fen3:
jnb acc.0,Fen4 ;2^-4
mov r5,#low(625)
mov r4,#High(625)
call Add2
Fen4:
ret
;****************
;TemperDorHL+r4r5=r2r3
;*****************
Add2:
push acc
mov a,TempDotL
add a,r5
mov TempDotL,a
mov a,TempDotH
addc a,r4
mov TempDotH,a
pop acc
ret
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; 74HC595显示子程序
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
DIS_TEMP:
data595:
clr ser
clr sclk
clr rclk
lcall delay10ms
mov dptr,#table
mov a,d_bit
movc a,@a+dptr
mov r7,#08h
data595d:
rlc a
mov ser,c
lcall delay10ms
setb sclk
lcall delay10ms
clr sclk
lcall delay10ms
djnz r7,data595d
mov dptr,#table
mov a,c_bit
movc a,@a+dptr
mov r7,#08h
data595c:
rlc a
mov ser,c
lcall delay10ms
setb sclk
lcall delay10ms
clr sclk
lcall delay10ms
djnz r7,data595c
mov dptr,#table1
mov a,b_bit
movc a,@a+dptr
mov r7,#08h
data595b:
rlc a
mov ser,c
lcall delay10ms
setb sclk
lcall delay10ms
clr sclk
djnz r7,data595b
mov dptr,#table
mov a,a_bit
movc a,@a+dptr
mov r7,#08h
data595a:
rlc a
mov ser,c
lcall delay10ms
setb sclk
lcall delay10ms
clr sclk
djnz r7,data595a
clr ser
clr sclk
setb rclk
lcall delay10ms
clr rclk
RET
;+++++++++++++++++++++++++++++++++++++++
;延时子程序
;+++++++++++++++++++++++++++++++++++++++
delay1S:
mov r5,#20
d1: mov r6,#248
djnz r6,$
djnz r5,d1
ret
delay10ms:
mov delbuf,#18d
del1:
nop
nop
djnz delbuf,del1
ret
table: db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,88h,83h,0c6h,0a1h,86h,8eh,0ffh,0ch,89h,7fh
;0 1 2 3 4 5 6 7 8 9 A b C d E F P H .
table1: db 40h,79h,24h,30h,19h,12h,02h,78h,00h,10h
;0. 1. 2. 3. 4. 5. 6. 7. 8. 9.
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -