西南交通大学本科毕业设计(论文) 第29页
DJNZ B,RLOP ;8位读完? POP
B ;恢复B
RET
3.3.4多路测试
每一片DSl820 在其ROM 中都存有其唯一的48 位序列号 在出厂前已写入片内ROM中主机在进入操作程序前必须逐一接入1820 用读ROM(33H)命令将该l 820 的序列号读出并登录当主机需要对众多在线 1820的某一个进行操作时 首先要发出
匹配ROM 命令(55H)紧接着主机提供64 位序列(包括该1820 的48 位序列号) 之后的操作就是针对该1820 的 而所谓跳过ROM 命令即为 之后的操作是对所有
1820 的 框图中先有跳过ROM即是启动所有1820 进行温度变换之后通过匹配ROM 再逐一地读回每个1820的温度数据在 1820 组成的测温系统中 主机在发出跳过 ROM 命令之后 再发出统一的温度转换启动码44H就可以实现所有1820 的统一转换 再经过1s 后 就可以用很少的时间去逐一读取 这种方式使其T 值往往小于传统方式 由于采取公用的放大电路和AD 转换器 只能逐一转换显然通道数越多这种省时效应就越明显。
开始设置DS18B20个数BDS18B20初始化匹配ROM否跳过ROMDS18B20初始化变换温度读存储器等待1S存在缓冲区指针增1DS18B20初始化DS18B20初始化B-1=0?是 图3-20 多路测试程序框图
西南交通大学本科毕业设计(论文) 第30页
3.3.5 读DS18B20序列号
一条总线连接多个温度传感器是,若要对一个传感器进行操作,必须要知道其序列号。下面为获取DS18B20序列号应用程序,P1.6接DS18B20:
ORG 0000H AJMP MAIN ORG 0020H MAIN: MOV CLR
SP,#60H
EA ;使用DS18B20一定要
MOV 46H,A LCALL READ MOV 47H,A SETB
EA
SJMP $
INT: ;初始化DS18B20子程序 CLR EA
L0:CLR P1.6 ;DS18B20总线为低复位电平 MOV R2,#200 L1:CLR P1.6 DJNZ 400us SETB
P1.6 ;释放DS18B20总线 R2,L1 ;总线复位电平保持
禁止任何中断产生
LCALL INT ;初始化DS18B20 MOV
A,#33H
LCALL WRITE ;送入读DS18B20的ROM命令
LCALL READ :开始读出当前DS18B20序列号
MOV
40H,A
LCALL READ MOV
41H,A
MOV R2,#30 L4: DJNZ
R2,L4 ;释放DS18B20总线保
LCALL READ MOV 42H,A LCALL READ MOV 43H,A LCALL READ MOV 44H,A LCALL READ MOV 45H,A LCALL READ
持60us
CLR C ;清存在信号 ORL C,P1.6 JC
L0 ;存在吗?不存在则重新来
MOV R6,#80 L5:
ORL JC
C,P1.6 L3
西南交通大学本科毕业设计(论文) 第31页
DJNZ R6,L5 SJMP L0 L3:MOV
R2,#240
DJNZ SETB RET
READ: ;从DS18B20读出一个字节 CLR EA
MOV R6,#8 ;连续读8个bit RE1: CLR P1.6 ;读前总线保持为低
EA
R3,#8 ;写入DS18B20的
MOV R4,#4 NOP SETB
P1.6 ;开始读总线释放 R3,WR1 ;写入下一个bit P1.6 ;重新释放DS18B20总线
L2:DJNZ R2,L2 RET
WRITE: ;向DS18B20写操作命令子程序
CLR MOV
bit数,一个字节8个bit
WR1: SETB P1.6 MOV
R4,#8
RE2:DJNZ R4,RE2 ;持续8us MOV C,P1.6 ;从DS18B20总线读得一个bit
RRC A ;把读得的位值环移给 A MOV R5,#30
RE3:DJNZ R5,RE3 ;持续60us DJNZ SETB RET END
R6,RE1 ;读下一个bit P1.6 ;重新释放DS18B20总线
RRC A ;把一个字节data(A)分成8个bit环移给 C
CLR P1.6 ;开始写入DS18B20总线要处于复位(低)状态
WR2: DJNZ R4,WR2 ;DS18B20总线复位保持16us
MOV P1.6,C ;写入一个bit MOV R4,#20
WR3: DJNZ R4,WR3 ;等待40us
通过上面的读DS18B20序列程序,读出本次设计中应用到的DS18B20的序列号。将使用的三个DS18B20命名为DS18B20-1、DS18B20-2、DS18B20-3。这三个DS18B20的序列号为:
DS18B20-1 DS18B20-2 DS18B20-3
28F0149201000042; 28A20F920100000E; 28E54F9201000017。
西南交通大学本科毕业设计(论文) 第32页
3.3.6 温度转换和读取
获取单个DS18B20转化的温度值的应用程序,P1.6接DS18B20数据通信接口。 ORG
0000H
MAIN: MOV
SP,#60H
LCALL GET_TEMP ;调用获取温度子程序 SJMP $
GET_TEMP: 获取温度值子程序 CLR
PSW.4
SETB PSW.3 ;设置工作寄存器当前所在的区域 CLR
EA ;使用DS18B20一定要禁止任何中断产生
LCALL INT ;调用初使化子程序 MOV
A,#0CCH
LCALL WRITE ;送入跳过ROM命令 MOV
A,#44H
LCALL WRITE ;送入温度转换命令
LCALL INT ;温度转换完全,再次初使化DS18B20 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
西南交通大学本科毕业设计(论文) 第33页
3.4 按键程序
多个温度传感器进行温度测试后,将所测得到温度值存储在特定的存储单元。接下来应该选择将哪个温度传感器测得的温度进行显示。首先,选择一个特定的存储单元(命名为JISHU)用来计数,计数单元的值为多少就选择第几个DS18B20测得的温度进行显示。
由框图3-21可知:首先判断有无按键按下,如果没有就跳出子程序,如果有按键按下,接着判断是那个键按下,如果是P1.1按下,则判断JISHU内容是否为1:是,则置JISHU为4,再执行减1操作,最后跳出按键子程序;否,则直接执行减1操作,然后跳出子程序。如果是P1.0按下,则判断JISHU内容是否为3:是,则置JISHU为0,再执行加1操作,最后跳出按键子程序;否,则直接执行加1操作,然后跳出子程序。
开始按下键否是按下P1.1按下P1.0否JISHU=1JISHU-1是JISHU=4JISHU=3是JISHU=0否JISHU=1
图3-21 按键程序框图
按键子程序: KEY: MOV
A,P0;读P0口