主题:[讨论]ds18b20程序问题@@@@!!!!!!!!!急急急~~~~~~~~
;-----------------------DS18B20的温度转换子程序-----------------------
GET_TEMPER:
LCALL Set_18B20
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820
MOV A,#44H ;发出温度转换命令
LCALL WRITE_1820
LCALL DISPLAY ;用显示温度
lcall delay750ms ;(持续1s左右)来等待AD转换结束,12位的话要转换750ms
LCALL Set_18B20 ;准备读温度前先初始化
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ;发出读温度命令
LCALL WRITE_1820
LCALL READ_1820
RET
;--------------------------DS18B20初始化程序--------------------------
Set_18B20:
SETB DAT
NOP
CLR DAT
MOV R2,#100 ;主机发出延时710微秒的复位低脉冲
DJNZ R2,$
DJNZ R2,$
SETB DAT ;然后拉高数据线
MOV R2,#35
DJNZ R2,$ ;延时70us等待DS18B20回应
JNB DAT,INIT2
JMP Set_18B20 ;超时而没有响应,重新初始化
;INIT1: MOV R2,#120
;DJNZ R2,$ ;延时240us
;JB DAT,INIT2 ;数据变高,初始化成功
;ajmp Set_18B20
INIT2: MOV R2,#240
DJNZ R2,$
RET
;-----------------写DS18B20的子程序(有具体的时序要求)-----------------
WRITE_1820:
MOV R2,#8 ;一共8位数据
WR0: CLR DAT ; 拉低数据线
MOV R3,#6 ;延迟15微秒
DJNZ R3,$
RRC A
MOV DAT,C ;从低位到高位发送数据
MOV R3,#20 ;延时45微秒
DJNZ R3,$
SETB DAT
NOP
NOP
DJNZ R2,WR0
SETB DAT ;拉高数据线
RET
;--------------读DS18B20的程序,从DS18B20中读出两个字节的温度数据--------------------------
READ_1820:
MOV R4,#2 ;将温度高位和低位从DS18B20中读出
MOV R1,#TEMPER_L ;低位存入33H(TEMPER_L)
RE0: MOV R2,#8
RE1: SETB DAT ;拉高数据线
NOP ;延时两秒
NOP
CLR DAT ;拉低数据线
MOV R3,#7 ;延时15微秒
DJNZ R3,$
SETB DAT ;拉高数据线
MOV R3,#7 ;延时15微秒
DJNZ R3,$
MOV C,DAT ;读数据线的状态,得到一个状态位
RRC A
MOV R3,#14 ;延时30微秒
DJNZ R3,$
DJNZ R2,RE1
MOV @R1,A
inc R1 ;高位存入34H(TEMPER_H)
DJNZ R4,RE0
RET
请各位看一下,这个ds18b20的初始化,写温度,读温度的程序那里有问题??我用的是12m晶振,主程序中还有定时器中断!!请各位帮忙调试一下,谢谢!!!!!!!!!!!!小弟是在搞不清楚了,在网上查了查,写法各不同,延迟也不同,真被搞糊涂了,谢谢各位了
GET_TEMPER:
LCALL Set_18B20
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820
MOV A,#44H ;发出温度转换命令
LCALL WRITE_1820
LCALL DISPLAY ;用显示温度
lcall delay750ms ;(持续1s左右)来等待AD转换结束,12位的话要转换750ms
LCALL Set_18B20 ;准备读温度前先初始化
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ;发出读温度命令
LCALL WRITE_1820
LCALL READ_1820
RET
;--------------------------DS18B20初始化程序--------------------------
Set_18B20:
SETB DAT
NOP
CLR DAT
MOV R2,#100 ;主机发出延时710微秒的复位低脉冲
DJNZ R2,$
DJNZ R2,$
SETB DAT ;然后拉高数据线
MOV R2,#35
DJNZ R2,$ ;延时70us等待DS18B20回应
JNB DAT,INIT2
JMP Set_18B20 ;超时而没有响应,重新初始化
;INIT1: MOV R2,#120
;DJNZ R2,$ ;延时240us
;JB DAT,INIT2 ;数据变高,初始化成功
;ajmp Set_18B20
INIT2: MOV R2,#240
DJNZ R2,$
RET
;-----------------写DS18B20的子程序(有具体的时序要求)-----------------
WRITE_1820:
MOV R2,#8 ;一共8位数据
WR0: CLR DAT ; 拉低数据线
MOV R3,#6 ;延迟15微秒
DJNZ R3,$
RRC A
MOV DAT,C ;从低位到高位发送数据
MOV R3,#20 ;延时45微秒
DJNZ R3,$
SETB DAT
NOP
NOP
DJNZ R2,WR0
SETB DAT ;拉高数据线
RET
;--------------读DS18B20的程序,从DS18B20中读出两个字节的温度数据--------------------------
READ_1820:
MOV R4,#2 ;将温度高位和低位从DS18B20中读出
MOV R1,#TEMPER_L ;低位存入33H(TEMPER_L)
RE0: MOV R2,#8
RE1: SETB DAT ;拉高数据线
NOP ;延时两秒
NOP
CLR DAT ;拉低数据线
MOV R3,#7 ;延时15微秒
DJNZ R3,$
SETB DAT ;拉高数据线
MOV R3,#7 ;延时15微秒
DJNZ R3,$
MOV C,DAT ;读数据线的状态,得到一个状态位
RRC A
MOV R3,#14 ;延时30微秒
DJNZ R3,$
DJNZ R2,RE1
MOV @R1,A
inc R1 ;高位存入34H(TEMPER_H)
DJNZ R4,RE0
RET
请各位看一下,这个ds18b20的初始化,写温度,读温度的程序那里有问题??我用的是12m晶振,主程序中还有定时器中断!!请各位帮忙调试一下,谢谢!!!!!!!!!!!!小弟是在搞不清楚了,在网上查了查,写法各不同,延迟也不同,真被搞糊涂了,谢谢各位了