社区
单片机/工控
帖子详情
DS18B20问题:温度跳变,比如从18直接跳23,然后又跳回,不知道如何解决?
老顽童
2009-12-21 11:37:59
也不知道是不是我转换频率高了?我2S转换一次。
...全文
2468
26
打赏
收藏
DS18B20问题:温度跳变,比如从18直接跳23,然后又跳回,不知道如何解决?
也不知道是不是我转换频率高了?我2S转换一次。
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
26 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
sim卡2
2010-08-05
打赏
举报
回复
我的也有跳变,1-15度这之间稳定,但是,但是15度时,显示32度,到了48度时,又显示64度!我怀疑是温度的计算出问题了!
kyzf
2009-12-23
打赏
举报
回复
楼主 能分享下吗?
你的DS18b20那些故障到底是什么问题? 怎么解决的? 谢谢哦
老顽童
2009-12-23
打赏
举报
回复
感谢各位帮助,已经解决。接分吧。哈哈
mrmou
2009-12-23
打赏
举报
回复
============================================================
tcdzyq
2009-12-22
打赏
举报
回复
可能:
1 温度确实在跳
2 时序不对
lyj2009
2009-12-22
打赏
举报
回复
楼主外挂了几个18B20? 如果只有一个,不是采样频率的问题,觉得可能是时序问题,可能程序被中断或者其它地方有BUG。
codesnail
2009-12-22
打赏
举报
回复
采样频率高一些
老顽童
2009-12-22
打赏
举报
回复
看了其他帖子,很多人提到国产假货和原厂的问题,不知道如何识别时原厂还试国产山寨货?
老顽童
2009-12-22
打赏
举报
回复
[Quote=引用 8 楼 kyzf 的回复:]
楼主首先 注意下: 读取温度时,对应的延时;另外可以考虑测量N次后,取平均值,再显示一次;
(N可以自由设定;比如测量5次,显示一次)
楼主可以看看:
http://www.unsp.com/app/html/200619181102.shtml
[/Quote]
谢谢你的提示,只是我想先从硬件或时序上解决。
kyzf
2009-12-22
打赏
举报
回复
楼主首先 注意下: 读取温度时,对应的延时;另外可以考虑测量N次后,取平均值,再显示一次;
(N可以自由设定;比如测量5次,显示一次)
楼主可以看看:
http://www.unsp.com/app/html/200619181102.shtml
老顽童
2009-12-22
打赏
举报
回复
谢谢楼上各位,我先去测试下。
qzf368
2009-12-22
打赏
举报
回复
读的时候要关中断
baizi258
2009-12-22
打赏
举报
回复
#pragma disable
#pragma rb(0)
对DS18B20读写时的函数加上关中断、选寄存器组等加预处理指令,可以看一下时序的波形是否正确;
老顽童
2009-12-22
打赏
举报
回复
//DS18B20的读时序
//对于DS18B20的读时序分为读0时序和读1时序两个过程。
//对于DS18B20的读时隙是从主机把单总线拉低之后,在
//15us之内就得释放单总线,以让DS18B20把数据传输到
//单总线上。DS18B20在完成一个读时序过程,至少需要
//60us才能完成。
uchar DS18B20_read()
{
uchar i,in_data,k;
in_data=0;
EA=0;
for(i=0;i<8;i++) //串行发送数据
{
in_data+=in_data;//循环左移1位
DQ=0;
//NOP;
DQ=1;
NOP;
NOP;
NOP;
k=DQ; //读DQ端
if(k==1) //读到的数据是1
{
in_data=in_data|0x01;
}
else
{
in_data=in_data|0x00;
}
NOP;
NOP;
NOP;
NOP;
//sdelay(n)=10+n*7 us
sdelay(6); //延时45us(总60us)
DQ=1;
}
EA=1;
return(in_data);
}
老顽童
2009-12-22
打赏
举报
回复
//DS18B20的写时序
//对于DS18B20的写时序仍然分为写0时序和写1时序两个过程。
//对于DS18B20写0时序和写1时序的要求不同,当要写0时序时,
//单总线要被拉低至少60us,保证DS18B20能够在15us到45us之
//间能够正确地采样IO总线上的“0”电平,当要写1时序时,
//单总线被拉低之后,在15us之内就得释放单总线。
void DS18B20_write(uchar in_data) //写DS18B20的子程序(有具体的时序要求)
{
uchar i,out_data,k;
out_data=in_data;
EA=0;
for(i=0;i<8;i++) //串行发送数据
{
DQ=0;
k=out_data&0x01;
if(k==0x01) //判断数据 写1
{
DQ=1;
}
else //写0
{
DQ=0;
}
sdelay(10); //延时80us(60-120us)
DQ=1;
out_data>>=1; //循环左移1位
}
EA=1;
}
老顽童
2009-12-22
打赏
举报
回复
void Get_Temper(void)
{
uchar T_L,T_H;
DsTemp=0;
DS18B20_init(); //DS18B20初始化
NOP;
if(DS18B20) //判断DS1820是否存在?若DS18B20不存在则返回
{
DsTemp=0;
DS18B20_write(0xcc); // 跳过ROM匹配
DS18B20_write(0x44); //发出温度转换命令
//等待转换结束
while(DQ==0) ldelay(1);
DS18B20_init(); //DS18B20初始化
if(DS18B20) //判断DS1820是否存在?若DS18B20不存在则返回
{
DS18B20_write(0xcc);//跳过ROM匹配
DS18B20_write(0xbe);//发出读温度命令
T_L=DS18B20_read(); //数据读出
T_H=DS18B20_read();
NOP;
T_sign=T_H>0x80?1:0; //温度符号
T_H=T_H&0x07;
NOP;
DsTemp=(T_H*256+T_L)>>4; //温度转换常数
DsTempF=((T_L&0x0F)*10)>>4;
}
}
}
mjwang
2009-12-22
打赏
举报
回复
你在读温度时序中有没有被其他程序中断了,比如用了RTOS,或是有频繁的中断程序,我以前在一个系统里想用,因为有RTOS,温度总是跳,后来才知道DS18B20对时序要求十分严格,在读的期间不能被打断,所以后来选择使用其他芯片了。
空影
2009-12-22
打赏
举报
回复
2s的采用周期已经足够转换时间了,应该是代码的问题,建议楼主把代码传来看下
宇帆
2009-12-22
打赏
举报
回复
估计时序哪里没有处理好,是采集过来的数据有问题呢?还是你显示处理那有问题呢?这要看你代码了
lbing7
2009-12-22
打赏
举报
回复
如果,不能确定自己的延时能超过DS18B20的转换时间的话
那就读18B20的状态,然后确认它是否轮换完成
在读数据的时候如果没有把握
就读CRC出来自己算一下。。。
什么跳变什么的
这个很可能是你的总线协议的问题
本来就是数字电路读寄存器,怎么可能会乱变呢?
呵呵
加载更多回复(6)
STM32F103
DS
18
B20
数字
温度
传感器
基于STM32F103系列单片机,编译环境MDK5,配套
DS
18
B20
数字
温度
传感器,库函数编写
DS
18
B20
读取
温度
C程序
DS
18
B20
读取
温度
C程序
ds
18
b20
的keil工程
DS
18
B20
的at89s52工程可以读出0~99摄氏度,包含hex文件。
DS
18
B20
_stm32f407_
ds
18
b20
_
STM32F407单片机控制
DS
18
B20
温度
传感器获取
温度
,
ds
18
b20
温度
报警程序
ds
18
b20
温度
报警程序,需要的就下吧,呵呵,对学习应该会有帮助的
单片机/工控
27,511
社区成员
28,797
社区内容
发帖
与我相关
我的任务
单片机/工控
硬件/嵌入开发 单片机/工控
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章