用DS18B20 做了个温度计的实验,但是反应好慢的,大家有什么改进的方法?没分了,路过的帮忙看看哦

时间:2021-09-18 01:00:15
程序太长了,如果大家想拿来研究call我邮箱waterh_xs@163.com 有信必回。
只写主要的:
MAIN:
MOV  SP,#70H
DISP_LOOP:
LCALL  GET_TEMPER ;从DS18B20读出温度数据
LCALL TEMPER_COV ;转换读出的温度数据并保存
LCALL  DELAY

MOV MTD,#60H
MOV MTD+1,TEMPER_NUM;温度值低位
ANL MTD+1,#0FH
MOV SLA,#ZLG7290 ;指定器件地址
MOV SUBA,#07H ;指定子地址
MOV NUMBYTE,#02H ;发送2字节数据
LCALL IWRNBYTE ;调用写2字节数据程序

MOV MTD,#61H
MOV A,TEMPER_NUM
SWAP A
ANL A,#0FH
MOV MTD+1,A ;温度值高位
MOV SLA,#ZLG7290 ;指定器件地址
MOV SUBA,#07H ;指定子地址
MOV NUMBYTE,#02H ;发送2字节数据
LCALL IWRNBYTE ;调用写2字节数据程序

LCALL DELAY
SJMP  DISP_LOOP ;温度循环采集显示

;-------读出转换后的温度值
GET_TEMPER:
SETB  DQ  ; 定时入口
BCD:
LCALL  INIT_1820
JB  FLAG1,S22
LJMP  BCD  ; 若DS18B20不存在则返回
S22:
LCALL  DELAY1
MOV  A,#0CCH  ; 跳过ROM匹配------0CC
LCALL  WRITE_1820
MOV  A,#44H  ; 发出温度转换命令
LCALL  WRITE_1820
NOP
LCALL  DELAY
LCALL  DELAY
CBA:
LCALL  INIT_1820
JB  FLAG1,ABC
LJMP  CBA
ABC:
LCALL  DELAY1
MOV  A,#0CCH  ; 跳过ROM匹配
LCALL  WRITE_1820
MOV  A,#0BEH  ; 发出读温度命令
LCALL  WRITE_1820
LCALL  READ_18200  ;READ_1820
RET

;-------读DS18B20的程序,从DS18B20中读出一个字节的数据
READ_1820:
MOV  R2,#8
RE1:
CLR  C
SETB  DQ
NOP
NOP
CLR  DQ
NOP
NOP
NOP
SETB  DQ
MOV  R3,#7
DJNZ  R3,$
MOV  C,DQ
MOV  R3,#23
DJNZ  R3,$
RRC  A
DJNZ  R2,RE1
RET

;-------写DS18B20的程序
WRITE_1820:
MOV  R2,#8
CLR  C
WR1820:
CLR  DQ
MOV  R3,#6
DJNZ  R3,$
RRC  A
MOV  DQ,C
MOV  R3,#23
DJNZ  R3,$
SETB  DQ
NOP
DJNZ  R2,WR1820
SETB  DQ
RET

;-------读DS18B20的程序,从DS18B20中读出两个字节的温度数据
READ_18200:
MOV  R4,#2  ; 将温度高位和低位从DS18B20中读出
MOV  R1,#36H ; 低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)
RE00:
MOV  R2,#8
RE01:
CLR  C
SETB  DQ
NOP
NOP
CLR  DQ
NOP
NOP
NOP
SETB  DQ
MOV  R3,#7
DJNZ  R3,$
MOV  C,DQ
MOV  R3,#23
DJNZ  R3,$
RRC  A
DJNZ  R2,RE01
MOV  @R1,A
DEC  R1
DJNZ  R4,RE00
RET

;-------将从DS18B20中读出的温度数据进行转换
TEMPER_COV:
MOV  A,#0F0H
ANL  A,TEMPER_L ; 舍去温度低位中小数点后的四位温度数值
SWAP  A
MOV  TEMPER_NUM,A
MOV  A,TEMPER_L
JNB  ACC.3,TEMPER_COV1 ; 四舍五入去温度值
INC  TEMPER_NUM

TEMPER_COV1:
MOV  A,TEMPER_H
ANL  A,#07H
SWAP  A
ADD  A,TEMPER_NUM
MOV  TEMPER_NUM,A ; 保存变换后的温度数据
LCALL  BIN_BCD
RET

能不能提高温度计的精度和反应速度呢?

5 个解决方案

#1


晕,又是汇编,你的DS18B20的分辨率用的多少位?转换时间与分辨率有关.
温度是缓变量,DS18B20的最大转换时间好像是750ms,在1S内处理采集的温度是可以接受的

#2


用12位采样芯片,提高精度
温度采集,速度不需要那么快吧

#3


DS18B20精度为0.5,最高分辨率为12位,对应的转换时间为750ms
如果要提高转换速率,就降低其分辨率.设置为8位分辨率最快
看你程序好像用的8位,分辨率却设置为12位,很明显浪费时间

#4


联系我吧  我刚用过18b20 反映好像很快呀 qq:328997835

#5


该回复被版主删除

#1


晕,又是汇编,你的DS18B20的分辨率用的多少位?转换时间与分辨率有关.
温度是缓变量,DS18B20的最大转换时间好像是750ms,在1S内处理采集的温度是可以接受的

#2


用12位采样芯片,提高精度
温度采集,速度不需要那么快吧

#3


DS18B20精度为0.5,最高分辨率为12位,对应的转换时间为750ms
如果要提高转换速率,就降低其分辨率.设置为8位分辨率最快
看你程序好像用的8位,分辨率却设置为12位,很明显浪费时间

#4


联系我吧  我刚用过18b20 反映好像很快呀 qq:328997835

#5


该回复被版主删除