📄 readds18b20temp.asm
字号:
;|----------------------------------------------------------------------------|
;| 读出ds1820序列号应用程序,P0.0接ds1820 |
;|----------------------------------------------------------------------------|
DIO bit P0.0
BUF EQU 30H
ORG 0000H
AJMP MAIN
ORG 0023H
JMP SERIAL
ORG 0030H
MAIN:
MOV A,#0FFH
MOV P0, A
MOV P1, A
MOV P2, A
MOV P3, A
MOV SP, #70H
clr p0.1 ;拉低GND
;MOV RCAP2H, #0FFH ;波特率(9600bps)
;MOV RCAP2L, #0B8H
MOV RCAP2H, #0FFH ;波特率(9600bps)
MOV RCAP2L, #0DCH
MOV TH2, #0FFH
MOV TL2, #70H
MOV SCON, #40H
MOV T2CON, #34H
MOV DPTR, #0000H
MOV 20H, #00H
MOV 21H, #00H
MOV 22H, #00H
MOV 23H, #00H
;movx a,@dptr
CLR EA ;使用ds1820一定要禁止任何中断产生
LCALL INT ;初始化ds1820
MOV A,#33H
LCALL WRITE ;送入读ds1820的ROM命令
LCALL READ ;开始读出当前ds1820序列号
MOV 50H,A
LCALL READ
MOV 51H,A
LCALL READ
MOV 52H,A
LCALL READ
MOV 53H,A
LCALL READ
MOV 54H,A
LCALL READ
MOV 55H,A
LCALL READ
MOV 56H,A
LCALL READ
MOV 57H,A
SETB EA
CLR TI
MOV R6,#02
H1:
MOV R7,#08h
MOV R0,#50H
HH:
CLR TI
MOV SBUF,@R0
JNB TI,$
CLR TI
INC R0
DJNZ R7,HH
DJNZ R6,H1
KL:
CALL GET_TEMP
JMP KL
Delay:
MOV R6,#0ffH
HL1:
MOV R7,#0ffH
HL:
NOP
NOP
NOP
DJNZ R7,HL
DJNZ R6,HL1
RET
INT: ;初始化ds1820子程序
CLR EA
L0:
CLR DIO ;ds1820总线为低复位电平
MOV R2,#250
L1:
;NOP
;NOP
CLR DIO
DJNZ R2,L1 ;总线复位电平保持400us
SETB DIO ;释放ds1820总线
MOV R2,#30
;MOV R2,#60
L4:
DJNZ R2,L4 ;释放ds1820总线保持60us
CLR C ;清存在信号
ORL C,DIO
JC L0 ;存在吗?不存在则重新来
MOV R6,#80
;MOV R6,#160
L5:
ORL C,DIO
JC L3
DJNZ R6,L5
SJMP L0
L3:
MOV R2,#250
L2:
;NOP
;NOP
;NOP
DJNZ R2,L2
RET
WRITE: ;向ds1820写操作命令子程序
CLR EA
MOV R3,#8 ;写入ds1820的bit数,一个字节8个bit
WR1:
SETB DIO
;MOV R4,#12
MOV R4,#6
RRC A ;把一个字节data(A)分成8个bit环移给 C
CLR DIO ;开始写入ds1820总线要处于复位(低)状态
WR2:
DJNZ R4,WR2 ;ds1820总线复位保持16us
MOV DIO,C ;写入一个bit
MOV R4,#25
;MOV R4,#50
WR3:
DJNZ R4,WR3 ;等待40us
DJNZ R3,WR1 ;写入下一个bit
SETB DIO ;重新释放ds1820总线
RET
READ:
CLR EA
MOV R6,#8 ;连续读8个bit
RE1:
CLR DIO ;读前总线保持为低
MOV R4,#4
;MOV R4,#8
NOP
SETB DIO ;开始读总线释放
RE2:
DJNZ R4,RE2 ;持续8us
MOV C,DIO ;从ds1820总线读得一个bit
RRC A ;把读得的位值环移给 A
;MOV R5,#60
MOV R5,#30
RE3:
DJNZ R5,RE3 ;持续60us
DJNZ R6,RE1 ;读下一个bit
SETB DIO ;重新释放ds1820总线
RET
;|----------------------------------------------------------------------------------------------|
;| 获取单个ds1820转化的温度值的应用程序,P0.0接ds1820 |
;|----------------------------------------------------------------------------------------------|
GET_TEMP:
CLR RS1
SETB RS0 ;设置工作寄存器当前所在的区域
CLR EA ;使用ds1820一定要禁止任何中断产生
LCALL INT ;调用初使化子程序
MOV A,#0CCH
LCALL WRITE ;送入跳过ROM命令
MOV A, #44H
LCALL WRITE ;送入温度转换命令
LCALL Delay ;廷时
LCALL INT ;温度转换完全,再次初使化ds1820
MOV A,#0CCH
LCALL WRITE ;送入跳过ROM命令
MOV A,#0BEH
LCALL WRITE ;送入读温度暂存器命令
LCALL READ
MOV R7,A ;读出温度值低字节存入R7
LCALL READ
MOV R6,A ;读出谩度值高字节存入R6
SETB EA
MOV A,#7FH
CLR C
SUBB A,R6
JNC LLL
LCALL DOU_BM
MOV A,#80H
ADD A,R6
MOV R6,A
LLL:
MOV R2,#02H
MOV R3,#71H
LCALL DOU_MUL_SNG
MOV A,R4
ANL A,#0F0H
SWAP A
MOV BUF,A
MOV A,R4
ANL A,#0FH
MOV BUF+1,A
MOV A,R5
ANL A,#0F0H
SWAP A
MOV BUF+2,A
MOV A,R5
ANL A,#0FH
MOV BUF+3,A
MOV A,R6
ANL A,#0F0H
SWAP A
MOV BUF+4,A
MOV A,R6
ANL A,#0FH
MOV BUF+5,A
MOV A,R7
ANL A,#0F0H
SWAP A
MOV BUF+6,A
MOV A,R7
ANL A,#0FH
MOV BUF+7,A
; MOV SBUF,R6
; JNB TI,$ ;通过串口发送温度数据
; CLR TI
; MOV SBUF,R7
; JNB TI,$
; CLR TI \\
MOV B,BUF
CALL ASII
MOV SBUF,A
JNB TI,$ ;通过串口发送温度数据
CLR TI
MOV B,BUF+1
CALL ASII
MOV SBUF,A
JNB TI,$
CLR TI
MOV B,BUF+2
CALL ASII
MOV SBUF,A
JNB TI,$ ;通过串口发送温度数据
CLR TI
MOV B,BUF+3
CALL ASII
MOV SBUF,A
JNB TI,$
CLR TI
MOV B,BUF+4
CALL ASII
MOV SBUF,A
JNB TI,$ ;通过串口发送温度数据
CLR TI
MOV B,BUF+5
CALL ASII
MOV SBUF,A
JNB TI,$
CLR TI
MOV B,BUF+6
CALL ASII
MOV SBUF,A
JNB TI,$ ;通过串口发送温度数据
CLR TI
MOV B,BUF+7
CALL ASII
MOV SBUF,A
JNB TI,$
CLR TI
RET
ASII:
MOV A,#9H
CLR C
SUBB A,B
JNC DD
MOV A,B
ADD A,#37H
RET
DD:
MOV A,B
ADD A,#30H
RET
;*************************************************
; 双字节求补码 ;(/R6/R7)+1=R6R7 求补码
;*************************************************
DOU_BM:
MOV A, R7
CPL A
ADD A, #01H
MOV R7, A
MOV A, R6
CPL A
ADDC A, #00H
MOV R6, A
RET
;*************************************************
; 双字节加法 ;R2R3+R6R7=R4R5
;*************************************************
DOUBL_ADD:
MOV A, R3
ADD A, R7
MOV R5, A
MOV A, R2
ADDC A, R6
MOV R4, A
RET
;*************************************************
; 双字节减法 ;R2R3-R6R7=R4R5
;*************************************************
DOUBL_SUB:
CLR C
MOV A, R3
SUBB A, R7
MOV R5, A
MOV A, R2
SUBB A, R6
MOV R4, A
RET
;*************************************************
; ;双字节带符号减法
;*************************************************
SUBB_SNG:
MOV A, R6
CPL ACC.7
MOV R6, A
ADD_SNG: ;带符号加法
MOV A, R2
MOV C, ACC.7
MOV F0, C
XRL A, R6
MOV C, ACC.7
MOV A, R2
CLR ACC.7
MOV R2, A
MOV A, R6
CLR ACC.7
MOV R6, A
JC L0798H
ACALL DOUBL_ADD
MOV A, R4
JB ACC.7, L0796H
L0790H:
MOV C, F0
MOV ACC.7, C
MOV R4, A
RET
L0796H:
SETB C
RET
L0798H:
LCALL DOUBL_SUB
MOV A, R4
JNB ACC.7, L0790H
LCALL DOU_BM
CPL F0
SJMP L0790H
;*************************************************
; 双字节乘法 ;R2R3*R6R7=R4R5R6R7
;*************************************************
DOUBLE_MUL:
MOV R4, #00H
MOV R5, #00H
MOV R0, #10H
CLR C
L07ADH:
MOV A, R4
RRC A
MOV R4, A
MOV A, R5
RRC A
MOV R5, A
MOV A, R6
RRC A
MOV R6, A
MOV A, R7
RRC A
MOV R7, A
JNC L07C1H
MOV A, R5
ADD A, R3
MOV R5, A
MOV A, R4
ADDC A, R2
MOV R4, A
L07C1H:
DJNZ R0, L07ADH
MOV A, R4
RRC A
MOV R4, A
MOV A, R5
RRC A
MOV R5, A
MOV A, R6
RRC A
MOV R6, A
MOV A, R7
RRC A
MOV R7, A
RET
;*************************************************
; 双字节除法 ;R2R3R4R5/R6R7=R4R5
;*************************************************
DOUBLE_DIV:
MOV A, R3
CLR C
SUBB A, R7
MOV A, R2
SUBB A, R6
JNC L0819H
MOV B, #10H
L07DAH: ;除数带部分余数左移一位
CLR C
MOV A, R5
RLC A
MOV R5, A
MOV A, R4
RLC A
MOV R4, A
MOV A, R3
RLC A
MOV R3, A
XCH A, R2
RLC A
XCH A, R2
MOV F0, C
CLR C
SUBB A, R7
MOV R1, A
MOV A, R2
SUBB A, R6
JB F0, L07F3H
JC L07F7H
L07F3H:
MOV R2, A
MOV A, R1
MOV R3, A
INC R5 ;商加 1
L07F7H:
DJNZ B, L07DAH ;除完否
CLR F0
MOV A, R2
RLC A
JC L080EH
MOV A, R3 ;四舍五入
RLC A
MOV R3, A
MOV A, R2
RLC A
SUBB A, R6
JC L0817H
JNZ L080EH
MOV A, R3
SUBB A, R7
JC L0817H
L080EH: ;商加 1
CLR C
MOV A, R5
ADD A, #01H
MOV R5, A
MOV A, R4
ADDC A, #00H
MOV R4, A
L0817H:
CLR A
RET
L0819H:
SETB F0
RET
;*************************************************
; ;带符号数双字节乘法 R2R3*R6R7=R4R5R6R7
;*************************************************
DOU_MUL_SNG:
MOV A, R2
XRL A, R6
MOV C, ACC.7 ;保存符号位
MOV 01H, C
MOV A, R2 ;作为无符号数乘
CLR ACC.7
MOV R2, A
MOV A, R6
CLR ACC.7
MOV R6, A
LCALL DOUBLE_MUL
MOV A, R4
MOV C, 01H
MOV ACC.7, C
MOV R4, A ;恢复符号位
RET
;*************************************************
; ;带符号数双字节除法 R2R3R4R5/R6R7=R4R5
;*************************************************
DOU_DIV_SNG:
MOV A, R2
XRL A, R6
MOV C, ACC.7 ;保存符号位
MOV 01H, C
MOV A, R2
CLR ACC.7
MOV R2, A
MOV A, R6
CLR ACC.7
MOV R6, A
LCALL DOUBLE_DIV ;作为无符号数除
MOV A, R4
JB ACC.7, L084FH ;恢复符号位
MOV C, 01H
MOV ACC.7, C
MOV R4, A
RET
L084FH:
SETB F0 ;溢出
RET
SERIAL:
NOP
CLR RI
CLR TI
RETI
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -