OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9426|回复: 13

ds18b20读字节的问题,求指点

[复制链接]

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
发表于 2013-5-7 00:29:28 | 显示全部楼层 |阅读模式

ds18b20读字节的问题,求指点!既然我们要读的是ds18b20的低位字节,为什么不直接操作 temp_data[0]呢?何必对高位temp_data[1]进行操作?

int16 read_temp(void)
{
 uint8 temp_data[2]; // 读出温度暂放
 int16 temp;

 DS18b20_reset();  // 复位
 write_byte(0xCC); // 发Skip ROM命令
 write_byte(0xBE); // 发读命令
 temp_data[0]=read_byte();  //温度低8位
 temp_data[1]=read_byte();  //温度高8位

 temp = temp_data[1];

 temp <<= 8;
  
 temp |= temp_data[0];
 temp >>= 4;
 return temp;
}

手艺人要内外兼修。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-5-7 10:10:54 | 显示全部楼层
回复【楼主位】wangyan915205:
---------------------------------
和mcu的大小端有关系。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

头像被屏蔽

6168

主题

7036

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
19705
金钱
19705
注册时间
2012-12-27
在线时间
25 小时
发表于 2013-5-9 12:05:04 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
 楼主| 发表于 2013-5-9 12:21:10 | 显示全部楼层
回复【3楼】xouou_53320:
---------------------------------
谢谢!带了反馈位,好。思路!
手艺人要内外兼修。
回复 支持 反对

使用道具 举报

头像被屏蔽

6168

主题

7036

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
19705
金钱
19705
注册时间
2012-12-27
在线时间
25 小时
发表于 2013-5-9 13:57:06 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
 楼主| 发表于 2013-5-9 14:09:58 | 显示全部楼层
搞定了!
回复 支持 反对

使用道具 举报

21

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2013-8-22
在线时间
1 小时
发表于 2013-12-19 14:35:44 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
我这个程序现在经常会误读0值 我原本是想温度小于0的显示0,温度大于99的显示99 其他显示正常。可是现在改不好了,求大神看看!
uchar Measure_Temp1(void)
 {
uchar temp;
uint templow,temphigh;
uint  a;
static uchar catch_error_count=0;
static uchar catch_error_count1=0;
static bit Tbit=0;
 
if(Tbit==1) goto TNEXT;
Tbit=1;
DS18B20_Reset1();
DS18B20_Write1(0xcc);   //跳过ROM
DS18B20_Write1(0x44);   //温度转换750ms 12bits精度
return NOTHING;
//→延时大约750~900ms
TNEXT:
Tbit=0;
  DS18B20_Reset1();
DS18B20_Write1(0xcc);   //跳过ROM
DS18B20_Write1(0xbe);   //读取RAM
templow=DS18B20_Read1();//读低8位
temphigh=DS18B20_Read1(); //读高8位
  DS18B20_Reset1();
if((temphigh&0x8000)==0x8000) temp=0;  //如果符号位为1的话,temp=0         
else {
        a=(temphigh<<8)|templow;
    if(a>=0x640)  a= 0x630; //如果temp≥100,则temp=99
temp=a*0.0625;     //0.0625=xx,0.625=xx.x,6.25=xx.xx,小数点位置
     }
 

 /* 上电-85;拔掉传感器-0xff(255);再插上传感器-85;正常会偶尔出现-0xff(255)*/
//------------------------------------------------------------------------
        if(temp==255)
    {
      catch_error_count++;
   if(catch_error_count==CATCH_ETTOR_TIMES1) 
   {
  catch_error_count=0;
return 0;
   }  
    }
    else
    {
      catch_error_count=0;
     if(temp<MAX_TEMP)
     {
  if(temp==85) return 0; //上电值
  else return temp;
     }
    }
 }
 



我的读字节程序是这样的 
uchar DS18B20_Read1(void)
 {
   uchar i,byte=0;
 
  for(i=0;i<8;i++)
{
byte>>=1;
DQ1=0;      //拉低总线,启动输入
//delayus(1);
DQ1=1;
delayus(5);      //释放总线
if(DQ1==1) byte|=0x80;
delayus(47);//45~50
DQ1=1;
}
return byte;
 }
爱我所爱!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-12-19 16:13:47 | 显示全部楼层
回复【7楼】陈晓琳:
---------------------------------
仿真找问题。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2013-12-19 17:05:26 | 显示全部楼层
回复【7楼】陈晓琳:
---------------------------------
我的读函数是这样写的
u8 DS1820_Read_Byte(void)
{
    u8 i;
    u8 read_data;

    for(i = 0;i < 8;i++)
    {
        DS1820_DQ_OUT();    //设置总线输出方向
        
        DS1820_DQ = 0;  //钳住总线
        
        read_data >>= 1;    //右移,先读取出来的是低位
        delay_us(2);
        DS1820_DQ = 1;  //发出脉冲
        delay_us(15);

        DS1820_DQ_IN(); //设置总线方向为输入方向

        if(IN_DS1820_DQ == 1)   read_data |= 0x80;  //读取到1

        delay_us(50);
    }
//    DS1820_DQ = 1;  //释放总线
    return read_data;
}
认真看下数据手册上的读时序图和写时序图,上面标注都很明白了,呵呵
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

21

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2013-8-22
在线时间
1 小时
发表于 2013-12-23 09:42:04 | 显示全部楼层
回复【9楼】Badu_Space:
---------------------------------
大神,我现在还有一点搞晕了。temp=((temphigh<<8|templow)*0.0625;是怎么计算的呀?比如如果是温度是零下的话,可是它的符号位有五位啊?
T:-0.5 temphigh:1111 1111 templow:1111 1000       
T:-55  temphigh:1111 1100 templow:1001 0000
请问一下,这个怎么处理的呀?谢谢!
爱我所爱!
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2013-12-23 10:54:33 | 显示全部楼层
仔细看下这段说明



ds18b20.zip

3.4 KB, 下载次数: 612

现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2013-12-23 10:56:01 | 显示全部楼层
回复【10楼】陈晓琳:
---------------------------------
看下10楼,附件是我写的代码,可以参考下,还有些功能我没加进去,只是用作温度读取而已,其他没完善
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
 楼主| 发表于 2013-12-23 11:26:12 | 显示全部楼层
谢谢!
回复 支持 反对

使用道具 举报

21

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2013-8-22
在线时间
1 小时
发表于 2013-12-23 16:30:14 | 显示全部楼层
回复【12楼】Badu_Space:
---------------------------------
谢谢,前段时间看DS18B20的资料没仔细看!太感谢您了!
爱我所爱!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 23:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表