📄 d18b203.asm
字号:
;****************************************************************
;/* 这是DS18B20的汇编程序, 文件名D18B203.ASM */
;/* 功能:本程序主要是读出多个DS18B20芯片转换后的温度值,这里用 */
;/* 两个DS18B20芯片。单片机的P1.0接DS18B20的BQ。第1个DS18B20 */
;/* 芯片的温度值放在50H和51H单元(高字节在50H中),第2个DS18B20*/
;/* 芯片的温度值放在52H和53H单元(高字节在52H中)。本程序适合 */
;/* 多个DS18B20 和51单片机的连接,晶振为12MHZ左右。 */
;******************************************************************
DQ EQU P1.0
ORG 0000H
AJMP MAIN
ORG 0020H
MAIN:
MOV SP,#60H
LCALL GET_TEMP
SJMP $
GET_TEMP:
CLR PSW.4
SETB PSW.3 ;设置工作寄存器当前所在的区域
CLR EA ;使用ds1820一定要禁止任何中断产生
LCALL INT ;调用初使化子程序
MOV A,#0CCH
LCALL WRITE ;送入跳过ROM命令
MOV A, #44H
LCALL WRITE ;送入温度转换命令
LCALL INT ;温度转换完全,再次初使化ds1820
MOV A,#55H
LCALL WRITE ;送入匹配ROM命令
MOV A,#28H
LCALL WRITE ;发第1个DS18B20序列号(28H,10H,46H,0E2H,00,00,00,7EH)
MOV A,#10H
LCALL WRITE
MOV A,#46H
LCALL WRITE
MOV A,#0E2H
LCALL WRITE
MOV A,#00H
LCALL WRITE
MOV A,#00H
LCALL WRITE
MOV A,#00H
LCALL WRITE
MOV A,#7EH
LCALL WRITE
MOV A,#0BEH
LCALL WRITE ;送入读温度暂存器命令
LCALL READ
MOV 51H,A ;读出温度值低字节存入51H
CALL READ
MOV 50H,A ;读出谩度值高字节存入50H
LCALL INT ;再次初使化ds1820
MOV A,#55H
LCALL WRITE ;送入匹配ROM命令
MOV A,#28H
LCALL WRITE ;发第2个DS18B20序列号(28H,24H,0C5H,39H,00,00,00,5FH)
MOV A,#24H
LCALL WRITE
MOV A,#0C5H
LCALL WRITE
MOV A,#39H
LCALL WRITE
MOV A,#00H
LCALL WRITE
MOV A,#00H
LCALL WRITE
MOV A,#00H
LCALL WRITE
MOV A,#5FH
LCALL WRITE
MOV A,#0BEH
LCALL WRITE ;送入读温度暂存器命令
LCALL READ
MOV 53H,A ;读出温度值低字节存入53H
CALL READ
MOV 52H,A ;读出谩度值高字节存入52H
SETB EA
RET
INT: ;初始化ds1820子程序
CLR EA
L0: CLR DQ ;ds1820总线为低复位电平
MOV R2,#200
L1: CLR DQ
DJNZ R2,L1 ;总线复位电平保持400us
SETB DQ ;释放ds1820总线
MOV R2,#30
L4: DJNZ R2,L4 ;释放ds1820总线保持60us
CLR C ;清存在信号
ORL C,DQ
JC L0 ;存在吗?不存在则重新来
MOV R6,#80
L5: ORL C,DQ
JC L3
DJNZ R6,L5
SJMP L0
L3: MOV R2,#240
L2: DJNZ R2,L2
RET
WRITE: ;向ds1820写操作命令子程序
CLR EA
MOV R3,#8 ;写入ds1820的bit数,一个字节8个bit
WR1:SETB DQ
MOV R4,#8
RRC A ;把一个字节data(A)分成8个bit环移给 C
CLR DQ ;开始写入ds1820总线要处于复位(低)状态
WR2:DJNZ R4,WR2 ;ds1820总线复位保持16us
MOV DQ,C ;写入一个bit
MOV R4,#20
WR3:DJNZ R4,WR3 ;等待40us
DJNZ R3,WR1 ;写入下一个bit
SETB DQ ;重新释放ds1820总线
RET
READ:
CLR EA
MOV R6,#8 ;连续读8个bit
RE1:CLR DQ ;读前总线保持为低
MOV R4,#4
NOP
SETB DQ ;开始读总线释放
RE2:DJNZ R4,RE2 ;持续8us
MOV C,DQ ;从ds1820总线读得一个bit
RRC A ;把读得的位值环移给 A
MOV R5,#30
RE3:DJNZ R5,RE3 ;持续60us
DJNZ R6,RE1 ;读下一个bit
SETB DQ ;重新释放ds1820总线
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -