📄 18b20-1.asm
字号:
;以下是DS18B20的程序:
;|--------------------------------------------------------------|
;| 获取单个ds1820转化的温度值的应用程序,P1.7接ds1820 |
;|--------------------------------------------------------------|
ORG 0000H
AJMP MAIN
ORG 0100H
MAIN:
LCALL INT
LCALL WAITMCU
LCALL GET_TEMP
LCALL CONVERT
LCALL READ
;***18B20初始化****************************************************
INT: CLR PSW.4
SETB PSW.3 ;设置工作寄存器当前所在的区域RS0
CLR EA ;使用ds1820一定要禁止任何中断产生
L0: CLR P1.7 ;ds1820总线为低复位电平
MOV R2,#200
L1: CLR P1.7
DJNZ R2,L1 ;总线复位电平保持600us
SETB P1.7 ;释放ds1820总线
MOV R2,#5
L4: DJNZ R2,L4 ;释放ds1820总线保持10us
RET
;*********************等待单片机信号
WAITMCU:
CLR C ;清存在信号(存在C=0,不存在C=1)
ORL C,P1.7
JC INIT_18B20 ;存在吗?不存在则重新来
MOV R6,#20 ;原来是80
L5: ORL C,P1.7 ;等待单片机给应答信号 低电平有效
JC INIT_18B20
DJNZ R6,L5
RET
INIT_18B20: CLR P1.7 ;ds1820总线为低复位电平
MOV R2,#200
L2: CLR P1.7
DJNZ R2,L2 ;总线复位电平保持600us
SETB P1.7 ;释放ds1820总线
MOV R2,#5
L3: DJNZ R2,L3 ;释放ds1820总线保持10us
AJMP WAITMCU
;***************写入18B20命令************
GET_TEMP:
LCALL DELAY1MS
MOV A,#0CCH ;送入跳过ROM命令
LCALL WRITE
MOV A,#4EH ;写温度寄存器
LCALL WRITE
MOV A,#63H ;设定温度上限99
LCALL WRITE
MOV A,#01H ;设定温度下线0
LCALL WRITE
MOV A,#1FH ;设定温度精度9位
LCALL WRITE
LCALL INT ;温度转换完全,再次初使化ds1820
LCALL DELAY1MS
LCALL WAITMCU
MOV A,#0CCH ;送入跳过ROM命令
LCALL WRITE
MOV A,#48H ;将寄存器中的温度报警值复制到EPROM中
LCALL WRITE
RET
/* MOV A, #44H
LCALL WRITE ;送入温度转换命令
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
RET
*/
;****写数据****************************************************
WRITE: ;向ds1820写操作命令子程序
CLR EA
MOV R3,#8 ;写入ds1820的bit数,一个字节8个bit
WR1: RRC A
CLR P1.7
JC WRITE1
WRITE0: CLR P1.7 ;写入0
MOV R4,#70
WAIT2: DJNZ R4,WAIT2
SETB P1.7
MOV R4,#2
WAIT3: DJNZ R4,WAIT3
DJNZ R3,WR1
RET
WRITE1: CLR P1.7 ;写入1
MOV R4,#2
WAIT: DJNZ R4,WAIT
SETB P1.7
MOV R4,#70
WAIT1: DJNZ R4,WAIT1
DJNZ R3,WR1
RET
/*CLR EA
MOV R3,#8 ;写入ds1820的bit数,一个字节8个bit
WR1: SETB P1.7
MOV R4,#8
RRC A ;把一个字节data(A)分成8个bit环移给 C
CLR P1.7 ;开始写入ds1820总线要处于复位(低)状态
WR2: DJNZ R4,WR2 ;ds1820总线复位保持16us
MOV P1.7,C ;写入一个bit
MOV R4,#30
WR3: DJNZ R4,WR3 ;原版的是等待40us
DJNZ R3,WR1 ;写入下一个bit
SETB P1.7 ;重新释放ds1820总线
RET*/
;****读温度*****************************************************
READ:
CLR EA
LCALL INT
LCALL WAITMCU
LCALL DELAY1MS
MOV A,#0CCH ;送入跳过ROM命令
LCALL WRITE
MOV A,#0BEH ;read scratchpad命令
LCALL WRITE
;CLR EA
MOV R6,#8 ;连续读8个bit
RE1: CLR P1.7 ;读前总线保持为低
MOV R4,#4
NOP
SETB P1.7 ;开始读,总线释放
RE2: DJNZ R4,RE2 ;持续8us
MOV C,P1.7 ;从ds1820总线读得一个bit
RRC A ;把读得的位值环移给 A
MOV R5,#30
RE3: DJNZ R5,RE3 ;持续60us
DJNZ R6,RE1 ;读下一个bit
SETB P1.7 ;重新释放ds1820总线
MOV R7,A
SETB EA
RET
;*********************延时1MS
DELAY1MS: ;精确延时1ms子程序
MOV R6,#2
YS1MSD:MOV R7,#248
DJNZ R7,$
DJNZ R6,DELAY1MS
RET
;********************转换温度
CONVERT: LCALL INT
LCALL WAITMCU
LCALL DELAY1MS
MOV A,#0CCH ;送入跳过ROM命令
LCALL WRITE
MOV A,#44H ;CONVERT命令
LCALL WRITE
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -