OpenEdv-开源电子网

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

求教,关于温度传感器

[复制链接]

18

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2016-7-28
在线时间
19 小时
发表于 2016-9-21 11:04:31 | 显示全部楼层 |阅读模式
5金钱
void DS18B20_Write_Byte(u8 dat)     
{            
    u8 j;
    u8 testb;
        DS18B20_IO_OUT();        //SET PG11 OUTPUT;
    for (j=1;j<=8;j++)
        {
        testb=dat&0x01;
        dat=dat>>1;
        if (testb)
        {
            DS18B20_DQ_OUT=0;        // Write 1
            delay_us(2);                           
            DS18B20_DQ_OUT=1;
            delay_us(60);            
        }
        else
        {
            DS18B20_DQ_OUT=0;        // Write 0
            delay_us(60);            
            DS18B20_DQ_OUT=1;
            delay_us(2);                          
        }
    }
}

18B20写时序包括写0时序和写 1时序,写1还是写0为什么由testb决定,请大神指导,谢谢

最佳答案

查看完整内容[请看2#楼]

认真看testb是怎么来的。testb=dat&0x01;dat=dat>>1;说明test是提取出来的dat的每个bit!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2016-9-21 11:04:32 | 显示全部楼层
认真看testb是怎么来的。testb=dat&0x01;dat=dat>>1;说明test是提取出来的dat的每个bit!
回复

使用道具 举报

5

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
368
金钱
368
注册时间
2015-9-7
在线时间
82 小时
发表于 2016-9-21 11:25:36 | 显示全部楼层
testb 是你写的数据的每个位决定的啊,为1写1,为0写0啊
回复

使用道具 举报

18

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2016-7-28
在线时间
19 小时
 楼主| 发表于 2016-9-21 20:32:23 | 显示全部楼层
zuozhongkai 发表于 2016-9-21 11:08
认真看testb是怎么来的。testb=dat&0x01;dat=dat>>1;说明test是提取出来的dat的每个bit!

谢谢,明白了
回复

使用道具 举报

18

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2016-7-28
在线时间
19 小时
 楼主| 发表于 2016-9-21 20:32:42 | 显示全部楼层
淡淡的鼬殇 发表于 2016-9-21 11:25
testb 是你写的数据的每个位决定的啊,为1写1,为0写0啊

谢谢,明白了
回复

使用道具 举报

18

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2016-7-28
在线时间
19 小时
 楼主| 发表于 2016-9-21 20:46:56 | 显示全部楼层
淡淡的鼬殇 发表于 2016-9-21 11:25
testb 是你写的数据的每个位决定的啊,为1写1,为0写0啊

   if(TH>7)
    {
        TH=~TH;
        TL=~TL;
        temp=0;                                        //温度为负
    }else temp=1;                                //温度为正                    
    tem=TH;                                         //获得高8位
    tem<<=8;   
    tem+=TL;                                        //获得低8位
  tem=(float)tem*0.625;                //转换   
        if(temp)return tem;                 /返还温度值
        else return -tem;

tem在获得低8位后是16位的二进制数,怎么就  通过tem=(float)tem*0.625;        转换为实数了呢,求教
回复

使用道具 举报

18

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2016-7-28
在线时间
19 小时
 楼主| 发表于 2016-9-21 20:47:55 | 显示全部楼层
淡淡的鼬殇 发表于 2016-9-21 11:25
testb 是你写的数据的每个位决定的啊,为1写1,为0写0啊

if(TH>7)
    {
        TH=~TH;
        TL=~TL;
        temp=0;                                        //温度为负
    }else temp=1;                                //温度为正                    
    tem=TH;                                         //获得高8位
    tem<<=8;   
    tem+=TL;                                        //获得低8位
  tem=(float)tem*0.625;                //转换   
        if(temp)return tem;                 /返还温度值
        else return -tem;

tem在获得低8位后是16位的二进制数,怎么就  通过tem=(float)tem*0.625;        转换为实数了呢,求教
回复

使用道具 举报

18

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2016-7-28
在线时间
19 小时
 楼主| 发表于 2016-9-21 20:48:16 | 显示全部楼层
zuozhongkai 发表于 2016-9-21 11:04
认真看testb是怎么来的。testb=dat&0x01;dat=dat>>1;说明test是提取出来的dat的每个bit!

if(TH>7)
    {
        TH=~TH;
        TL=~TL;
        temp=0;                                        //温度为负
    }else temp=1;                                //温度为正                    
    tem=TH;                                         //获得高8位
    tem<<=8;   
    tem+=TL;                                        //获得低8位
  tem=(float)tem*0.625;                //转换   
        if(temp)return tem;                 /返还温度值
        else return -tem;

tem在获得低8位后是16位的二进制数,怎么就  通过tem=(float)tem*0.625;        转换为实数了呢,求教
回复

使用道具 举报

5

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
368
金钱
368
注册时间
2015-9-7
在线时间
82 小时
发表于 2016-9-22 10:16:42 | 显示全部楼层
渣渣 发表于 2016-9-21 20:48
if(TH>7)
    {
        TH=~TH;

tem先通过(float)强制转换成float型,然后再与0.625相乘 不就是实数了
回复

使用道具 举报

18

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2016-7-28
在线时间
19 小时
 楼主| 发表于 2016-9-22 10:18:25 | 显示全部楼层
淡淡的鼬殇 发表于 2016-9-22 10:16
tem先通过(float)强制转换成float型,然后再与0.625相乘 不就是实数了

为什么乘0.625呢
回复

使用道具 举报

5

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
368
金钱
368
注册时间
2015-9-7
在线时间
82 小时
发表于 2016-9-22 13:43:53 | 显示全部楼层

温度传感器的精度为用户可编程的9,10,11或12位,分别以0.5℃,0.25℃,0.125℃和0.0625℃增量递增。在上电状态下默认的精度为12位

也就是说  tem的十六进制的值转化为十进制后再乘以0.0625就是当前的温度值
回复

使用道具 举报

18

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2016-7-28
在线时间
19 小时
 楼主| 发表于 2016-9-23 09:45:19 | 显示全部楼层
淡淡的鼬殇 发表于 2016-9-22 13:43
温度传感器的精度为用户可编程的9,10,11或12位,分别以0.5℃,0.25℃,0.125℃和0.0625℃增量递增。在 ...

谢谢不吝指教
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-28 23:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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