本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
;--------------------------温度转换和读取-----------------------------------
;--------------获取单个ds18b20转换温度的相应值,p1.6接ds18b20---------------
ORG 0000H
AJMP MAIN
ORG 0020H
MAIN:MOV SP,#60H
LCALL RESET
LCALL GET_TEMP
SJMP $
;--------------------DS18B20时序初始化-------------------
RESET:PUSH B
PUSH ACC ;A,B入栈保护
MOV A,#4 ;设置循环次数
CLR P1.6 ;端口复位 GAI
MOV B,#250 ;设置计数次数250次
DJNZ B,$ ;等待,保持500us
SETB P1.6 ;释放总线 GAI
MOV B,#6 ;设置时间常数
CLR C ;清零信号
WAITL:JB P1.6,WH ;若释放总线,跳出循环 GAI
DJNZ B,WAITL ;总线低,等待
DJNZ ACC,WAITL ;释放总线一段时间
SJMP SHORT
WH:MOV B,#111
WH1:ORL C,P1.6 ;GAI
DJNZ B,WH1 存在时间等待
SHORT:POP ACC
POP B
;RET
GET_TEMP:CLR PSW.4
SETB PSW.3 ;设置工作寄存器当前工作区域
CLR EA ;禁止中断
LCALL INT ;调用初始化子程序
MOV A,#0CCH
LCALL WRITE ;送入跳过ROM命令
MOV A,#44H
LCALL WRITE ;送入温度转换命令
LCALL INT ;温度转化完,再次初始化
MOV A,#0CCH
LCALL WRITE
MOV A,#0BEH
LCALL WRITE
LCALL READ
MOV R7,A ;读出温度值低位送R7
LCALL READ
MOV R6,A ;高字节送R6
SETB EA
RET
INT:CLR EA ;初始化DS18B20程序
L0:CLR P1.6 ;DS18B20总线为低电平复位
MOV R2,#200 ;????????????????
L1:CLR P1.6
DJNZ R2,L1 ;保持总线复位电平400us
SETB P1.6 ;释放总线
MOV R2,#30 ;、、、、、、、????
L4:DJNZ R2,L4 ;释放总线,保持60us???
CLR C ;清除存在的信号
ORL C,P1.6 ;
JC L0 ;判断是否存在,不存在则重新再来??
MOV R6,#80
L5:ORL C,P1.6
JC L3
DJNZ R6,L5
SJMP L0
L3:MOV R2,#240
L2:DJNZ R2,L2
RET
;-------------------------向DS18B20写操作子程序------------------------------
WRITE:CLR EA
MOV R3,#8 ;一个字节8bits,写入ds18b20的 BIT数
WR1:SETB P1.6
MOV R4,#8
RRC A ;把A中一个字节(即8bits)的数据传入C中
CLR P1.6 ;开始写入ds18b20,总线要处于复位状态(即低电平
WR2:DJNZ R4,WR2 ;总线复位保持16us
MOV P1.6,C ;写入一个bits
MOV R4,#20
WR3:DJNZ R4,WR3 ;等待40us
DJNZ R3,WR1 ;写入下一个bits
SETB P1.6 ;释放总线
RET
;------------------------
READ:CLR EA
MOV R6,#8 ;连续8个bits
RE1:CLR P1.6 ;读前总线保持为低
MOV R4,#4
NOP
SETB P1.6
RE2:DJNZ R2,RE2 ;持续8us
MOV C,P1.6 ;从总线读得一个bits
RRC A
MOV R5,#30
RE3:DJNZ R5,RE3 ;持续60us
DJNZ R6,RE1 ;读下一位
SETB P1.6
RET
;---------------------写时间隙------------------------- (为什么?)
;---------------------写位子程序,待写位内容在C中------------------
WRBIT:PUSH B
MOV B,#28 ;设置时间常数
CLR P1.6 ;清零,写开始 GAI
NOP
NOP
NOP
NOP
NOP ;产生5us等待
MOV P1.6,C ;将C中内容写入p1.0总线中 GAI
WDLT:DJNZ B,WDLT ;等待56us --------------------为什么?
POP B
SETB P1.6 ;释放总线 GAI
RET
;-------------------写字节程序,待写内容在A中-----------------------
WRBYTB:PUSH B
MOV B,#8H ;设置写位个数
WLOP:RRC A ;把写位放入C中
ACALL WRBIT ;调写1位子程序
DJNZ B,WLOP ;判断8位全部写完?
POP B
RET
;---------------------读时间隙---------------------------------------
;-------------------读位子程序,读得位放入C中------------------------
RDBIT:PUSH B
PUSH ACC
MOV B,#23H ;设置时间常数-------------为什么是23H?
CLP P1.6 ;按位取反,读开始 GAI
NOP
NOP
NOP
NOP ;产生4us等待
RDDLT:DJNZ B,RDDLT ;等待46us-----------------为什么???
SETB P1.6 ;释放总线 GAI
POP ACC
POP B
RET
;-------------------读字节子程序,读得内容放入A中--------------------
RDBYTB:PUSH B
RLOP:MOV B,#8H ;设置读位数
ACALL RDBIT ;调读 1位子程序
RRC A ;把读到位放入C中,并依次送入A中
DJNZ B,RLOP ;判断8位是否读完
POP B
RET
;-----------------------多路测量程序------------------------------------
;-------------------每片的ROM中都有为唯一的出厂序列号,在接
;操作程序之前,先用读ROM(33H)指令将1
;--------820序列号读出并登陆-----------
;--------------DS18B20 序列号的获得(假设p1.6接1820)----------
;ORG 0000H
;AJMP MAIN
;ORG 0020H
;MAIN:MOV SP,#6OH ;-------------------------该句??
; CLR EA ;EA中断标志位,置零,禁止任何中断(DS18B20的要
; LCALL INT ;初始化DS18B20 --------------------?????????
; MOV A,#33H
; LCALL WRITE ;读DS18B20ROM命令
;; LCALL READ ;读当前DS18B20序列号
; MOV 40,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 ;EA置1,开??????????
; RET
; SJMP $ ;、、、、、、、、、、、、????
END
DJNZ B,WH1 这句话怎么改都是错误
要是谁有ds18b20多路温度检测的程序分享一下吧,本人急需,谢拉
(发邮箱里也可以zhangfei19871023@163.com) |