为什么18B20温度测量时,总是跳变!

作者&投稿:贡变 (若有异议请与网页底部的电邮联系)
我用18b20测温,当温度达65度就读出错误温度值,换一个18B20也还是如此.谁知道什么原因吗?~

上升到65度的时候就出错?
前面的数据都正常?
你把你的程序给我瞄瞄。

ORG 0000H
;单片机内存分配申明!
TEMPER_L EQU 29H;用于保存读出温度的低8位
TEMPER_H EQU 28H;用于保存读出温度的高8位
FLAG1 EQU 38H;是否检测到DS18B20标志位
a_bit equ 20h ;数码管个位数存放内存位置
b_bit equ 21h ;数码管十位数存放内存位置
;进行温度显示,这里我们考虑用网站提供的两位数码管来显示温度
;显示范围00到99度,显示精度为1度
;因为12位转化时每一位的精度为0.0625度,我们不要求显示小数所以可以抛弃29H的低4位
;将28H中的低4位移入29H中的高4位,这样获得一个新字节,这个字节就是实际测量获得的温度
;这个转化温度的方法非常简洁无需乘于0.0625系数
MAIN: LCALL GET_TEMPER;调用读温度子程序
MOV A,29H
MOV C,40H;将28H中的最低位移入C
RRC A
MOV C,41H
RRC A
MOV C,42H
RRC A
MOV C,43H
RRC A
MOV 29H,A
LCALL DISPLAY;调用数码管显示子程序
JNB FLAG1,MM1
CLR P1.0
SJMP MAIN
MM1: SETB P1.0
SJMP MAIN
INIT_1820: SETB P2.2 ; 这是DS18B20复位初始化子程序
NOP
CLR P2.2
MOV R1,#3 ;主机发出延时537微秒的复位低脉冲
TSR1: MOV R0,#107
DJNZ R0,$
DJNZ R1,TSR1
SETB P2.2 ;然后拉高数据线
NOP
NOP
NOP
MOV R0,#25H
TSR2: JNB P2.2,TSR3 ;等待DS18B20回应
DJNZ R0,TSR2
LJMP TSR4 ; 延时
TSR3: SETB FLAG1 ; 置标志位,表示DS1820存在
LJMP TSR5
TSR4: CLR FLAG1 ; 清标志位,表示DS1820不存在
LJMP TSR7
TSR5: MOV R0,#70
TSR6: DJNZ R0,TSR6 ; 时序要求延时一段时间
TSR7: SETB P2.2
RET
GET_TEMPER: SETB P2.2 ; 读出转换后的温度值
LCALL INIT_1820;先复位DS18B20
JB FLAG1,TSS2
RET ; 判断DS1820是否存在?若DS18B20不存在则返回
TSS2: MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#44H ; 发出温度转换命令
LCALL WRITE_1820
LCALL DISPLAY ;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒
LCALL INIT_1820;准备读温度前先复位
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ; 发出读温度命令
LCALL WRITE_1820
LCALL READ_18200; 将读出的温度数据保存到35H/36H
RET
WRITE_1820: MOV R2,#8;写DS18B20的子程序(有具体的时序要求),一共8位数据
CLR C
WR1: CLR P2.2
MOV R3,#5
DJNZ R3,$
RRC A
MOV P2.2,C
MOV R3,#21
DJNZ R3,$
SETB P2.2
NOP
DJNZ R2,WR1
SETB P2.2
RET
READ_18200: MOV R4,#2 ; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据,将温度高位和低位从DS18B20中读出
MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
RE00: MOV R2,#8;数据一共有8位
RE01: CLR C
SETB P2.2
NOP
NOP
CLR P2.2
NOP
NOP
NOP
SETB P2.2
MOV R3,#8
RE10: DJNZ R3,RE10
MOV C,P2.2
MOV R3,#21
RE20: DJNZ R3,RE20
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
display: mov a,29H;显示子程序将29H中的十六进制数转换成10进制
mov b,#10 ;10进制/10=10进制
div ab
mov b_bit,a ;十位在a
mov a_bit,b ;个位在b
mov dptr,#numtab ;指定查表启始地址
mov r0,#4
dpl1: mov r1,#250 ;显示1000次
dplop: mov a,a_bit ;取个位数
MOVC A,@A+DPTR ;查个位数的7段代码
mov p0,a ;送出个位的7段代码
clr p2.6 ;开个位显示
acall d1ms ;显示1ms
setb p2.6
mov a,b_bit ;取十位数
MOVC A,@A+DPTR ;查十位数的7段代码
mov p0,a ;送出十位的7段代码
clr p2.7 ;开十位显示
acall d1ms ;显示1ms
setb p2.7
djnz r1,dplop ;100次没完循环
djnz r0,dpl1 ;4个100次没完循环
ret
D1MS: MOV R7,#80 ;1MS延时
DJNZ R7,$
RET
numtab: DB 0C0H,0F9H,0A4H,0B0H, 099H, 092H, 082H,0F8H 080H, 090H ;实验板上的7段数码管0~9数字的共阴显示代码
end

你看看这个温度的计算 正常18b20是12位温度 这个程序温度计算的很粗略 估计是你说的这种情况 你温度用查表显示就能好很多
code uchar table_tempfh[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};//这个是温度小数位的查表,精确到0.1
a=ReadOneChar(); //读取温度值低位
b=ReadOneChar(); //读取温度值高位
temp_value=b<<4;
temp_value+=(a&0xf0)>>4;
temp_xiaoshu=table_tempfh[a&0x0f]; //小数部分(查表对照,获取小数位)

1. 程序中,没有考虑到18B20的转换时间;
2. 读出的温度数据,是两个字节,合并成温度数值,应有16位数的变量,但是:
unsigned char i=0; //这是8位的变量,丢失信息了
while(1)
{
i=ReadTemperature();//读温度 显然不会正确
}

protues仿真18B20读温度正常, 但是为什么有时候读出0度有时候读出2倍当...
答:可能你的数据换算出现了问题,数据类型不合适导致数据长度溢出这种。也可能你的读写时序出现了问题,或者逻辑出现错误。

DS18B20的精度问题
答:18b20的测量精度是正负0.5摄氏度,最高分辨率是0.0625摄氏度(可设置采样精度来改变分辨率)。可以将分辨率提高或减小,但是精度是改不了的,由芯片决定了,可查阅datasheet。比方说,你测得数据是:25.4325摄氏度,实际温度有可能是25.9度,也有可能是24度,这还不包括热传导带来的精度影响。改变分辨率...

你好。我的18B20测温度,到40度的时候,就出现乱码,请告诉我。我改怎么...
答:你好,如果低于40度时有部分区间可以正常显示,那可以几乎肯定是你的程序出现了问题。你的温度部分程序可分为 读温度传感器数据--->处理成可显示数据--->送出显示 三部分,问题很可能就出现在 处理成可显示数据 这一环节。除非器件坏了,但可能性非常小。

18B20读温度为什么要除以16
答:为什么要除以100和10呢?读取的温度是一个16位BCD码,怎么能除以100和10?这时温度的分辨率是1/16=0.0625℃。所以数据的低四位是温度的小数部分,高

18B20的中文资料
答:DS18B20的应用非常广泛,包括温度测量、控制系统、医疗设备、家用电器等。在使用DS18B20时,需要注意其供电方式、连接方式以及编程方式。一般来说,DS18B20可以通过外部电源供电,也可以通过寄生电源方式供电。在连接时,需要注意数据线的长度和连接方式,以确保数据传输的稳定性和准确性。在编程时,需要按照...

...指导我用DS18B20传感器是对负温度判断时,为什么还要对低8位进位与...
答:这是12位转化后得到的12位数据,存储在18B20的两个8bit的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测得到的数值乘0.0625即可得到实际温度;如果温度小于0,这5位位1,测得的数值需要取反加1再乘以0.0625即可得到实际温度。例如+125℃的数字输出为07D0H,+25....

18b20采集温度时,偶尔会有值特别大,为什么,如何解决?请帮帮忙
答:不会的,在温度转换时,你延时750毫秒,就不会出问题了。有时候,延时少,能工作,但是不稳定。

18B20测温度并用LED显示 为什么显示到25度就成0了
答:如果你是用C语言的话,你吧定义变量的char改成int的就行了

(单片机89c52)为什么这个用18b20测温度的程序中有用到串口中断语句_百 ...
答:那里用到了串口中断?程序里面虽然有“串口初始化”,但是并没有用。--- 这程序,是不完整的。程序中,虽然有“七段码表”,也没有用上,也没有把温度数据显示出来。整个程序,都是子程序,缺少主程序main()。

ds18b20温度测量程序怎么总是显示85度?
答:硬件电路 如果没问题的话(如果是有电源供电的话,上拉电阻4.7K是必须的)首先检查复位时间是否是 480us, 保证每个数据位的时隙读或写的时间大于或等于65us