📄 d18b20.asm
字号:
;/*****************************************************************
;/* 这是DS18B20的汇编程序, 文件名D18B20.ASM */
;/* 功能:本程序主要是读出芯片DS18B20固有的序列号,序列号共64位, */
;/* 也就是8个字节,读出后依次放在单片机的RAM 40H,41H,...47H中。*/
;/* 单片机的P1.0接DS18B20的BQ。 */
;/* 本芯片的序列号为: 28h,10h,46h,e2h,00,00,00,7eh */
;/*****************************************************************
DQ EQU P1.0
ORG 0000H
AJMP MAIN
ORG 0020H
MAIN:
MOV SP,#60H
CLR EA ;使用ds1820一定要禁止任何中断产生
LCALL INT ;初始化ds1820
MOV A,#33H
LCALL WRITE ;送入读ds1820的ROM命令
LCALL READ ;开始读出当前ds1820序列号
MOV 40H,A
LCALL READ
MOV 41H,A
LCALL READ
MOV 42H,A
LCALL READ
MOV 43H,A
LCALL READ
MOV 44H,A
LCALL READ
MOV 45H,A
LCALL READ
MOV 46H,A
LCALL READ
MOV 47H,A
SETB EA
SJMP $
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 + -