OpenEdv-开源电子网

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

温度传感器的得到温度值函数short DS18B20_Get_Temp(void)有一些疑问,求大神指导

[复制链接]

2

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2014-11-3
在线时间
0 小时
发表于 2015-5-7 12:27:48 | 显示全部楼层 |阅读模式
5金钱
//从ds18b20得到温度值
//精度:0.1C
//返回值:温度值 (-550~1250) 
//short DS18B20_Get_Temp(void)
//{
//    u8 temp;
//    u8 TL,TH;
// short tem;
//    DS18B20_Start ();                    // ds1820 start convert
//    DS18B20_Rst();
//    DS18B20_Check();  
//    DS18B20_Write_Byte(0xcc);// skip rom
//    DS18B20_Write_Byte(0xbe);// convert    
//    TL=DS18B20_Read_Byte(); // LSB   
//    TH=DS18B20_Read_Byte(); // MSB  
//      
//    if(TH>7)
//    {
//        TH=~TH;
//        TL=~TL; 
//        temp=0;//温度为负  
//    }else temp=1;//温度为正    
//    tem=TH; //获得高八位
//    tem<<=8;    
//    tem+=TL;//获得底八位
//    tem=(float)tem*0.625;//转换     
// if(temp)return tem; //返回温度值
// else return -tem;    
//} 
标红的那几行理解有些问题,我的理解是先读低8位,然后读高8位,是因为DS18B20数字输出的是16位,那么问题来了,我把TH,TL直接用一个16位的变量TT表示,如果TT的最高位为1(不超过32767),temp就为负值,程序如下;
short DS18B20_Get_Temp(void)
{
    u8 temp;
   // u8 TL,TH;
u16 TT;
short tem;
    DS18B20_Start ();                    // ds1820 start convert
    DS18B20_Rst();
    DS18B20_Check();  
    DS18B20_Write_Byte(0xcc);// skip rom
    DS18B20_Write_Byte(0xbe);// convert    
   
TT=DS18B20_Read_Byte();    

if(TT>32767)
{
    TT=~TT;
        temp=0;//温度为负  
    }else temp=1;//温度为正    
tem=TT;
    tem=(float)tem*0.625;//转换     
if(temp)return tem; //返回温度值
else return -tem;    
}
编译没问题,但是显示的温度是10度(正常该为23度左右的),小弟初学,不知道对上面的TL,TH理解有没有错,另外请问大神修改后的程序有什么问题吗?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

13

主题

611

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1929
金钱
1929
注册时间
2014-10-6
在线时间
625 小时
发表于 2015-5-7 16:38:56 | 显示全部楼层
TT=DS18B20_Read_Byte();你执行一次得到的只有低8位,要得到高8位你要接着再执行一次DS18B20_Read_Byte();然后再处理数据!
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2014-11-3
在线时间
0 小时
 楼主| 发表于 2015-5-7 17:05:44 | 显示全部楼层
回复【2楼】烟酒不沾:
---------------------------------
对,我忘了改前面DS18B20_Read_Byte读取字节函数的位数了,修改了一下位数和程序,发现显示的温度是28.3度,用原子的程序显示的是27.8度,嘿嘿,差不多,看来我的理解还是正确的对吧?
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2014-11-3
在线时间
0 小时
 楼主| 发表于 2015-5-7 17:07:21 | 显示全部楼层
回复【2楼】烟酒不沾:
---------------------------------
还有一个疑问:就是直接16位就可以实现的,为什么要分开,写成TL,TH的形式?这样做有什么用?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-22 18:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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