标题: ds18b20 的程序分析 [打印本页]

作者: 51黑51    时间: 2017-8-21 19:29
标题: ds18b20 的程序分析

u16 ds18b20_read_temp_val()
{
        u16 temp_16_bit=0;
        u8  temp_L=0;
        u8  temp_H=0;
        ds18b20_ready_read_temp();
        temp_L=ds18b20_read_one_char();//读取温度低八位
        temp_H=ds18b20_read_one_char();//读取温度高八位
        if(temp_H>0x7f)
        {
                temp_L=~temp_L;                                        //补码转换,取反加一
                temp_H=~temp_H+1;  
                temp_16_bit=100;
        }
        temp_16_bit=temp_16_bit+temp_H*16+temp_L/16;          ///   这以下
        temp_16_bit=temp_16_bit*100;
        temp_16_bit=temp_16_bit+((temp_L&0x0f)*10/16)*10;     ///
        temp_16_bit=temp_16_bit+(temp_L&0x0f)*100/16%10;      ///这以上
        return (u16)(temp_16_bit);
}

从这以下到 这以上 ,
        temp_16_bit=temp_16_bit+temp_H*16+temp_L/16;          ///   这以下
        temp_16_bit=temp_16_bit*100;
        temp_16_bit=temp_16_bit+((temp_L&0x0f)*10/16)*10;     ///
        temp_16_bit=temp_16_bit+(temp_L&0x0f)*100/16%10;      ///这以上
        return (u16)(temp_16_bit);

没看太明白什么意思。请各位指点一下,谢谢。





作者: 不倒翁.WZT    时间: 2017-8-22 08:38
标题: RE: ds18b20 的程序分析
temp_16_bit=temp_16_bit+temp_H*16+temp_L/16;          ///   这以下
temp_16_bit=temp_16_bit*100;
temp_16_bit=temp_16_bit+((temp_L&0x0f)*10/16)*10;     ///
temp_16_bit=temp_16_bit+(temp_L&0x0f)*100/16%10;      ///这以上
return (u16)(temp_16_bit);

如果上5个语句是同一个程序中连续的5个语句,那么:
因为:temp_16_bit=100、
temp_H=ds18b20_read_one_char();//读取温度高八位、
temp_L=ds18b20_read_one_char();//读取温度低八位。
所以:temp_16_bit=temp_16_bit+temp_H*16+temp_L/16; ///这以下。
可以写为:
temp_16_bit=100+(读取温度高八位*16)+(读取温度低八位/16); 本语句的意思是:将temp_16_bit本身的值100  加上  读取温度高八位乘以16  再加上  读取温度低八位除以16  后存于  temp_16_bit中。
temp_16_bit=temp_16_bit*100; 本语句的意思是:将上式temp_16_bit取得的新值再乘上100,并存于temp_16_bit中。
temp_16_bit=temp_16_bit+((temp_L&0x0f)*10/16)*10; ///  该语句中 temp_L&0x0f意思是:读取温度低八位数同0x0f相与,其意义是保留  读取温度低八位数中低四位。屏蔽掉高四位。将相与后的新数先乘以10再除以16,最后加上temp_16_bit中的值,再存入temp_16_bit中去。
temp_16_bit=temp_16_bit+(temp_L&0x0f)*100/16%10; ///这以上。该语句同上一句意识相同,只是多了个%10,%10的意思是:取余数的意思,就是将(temp_L&0x0f)*100/16结果除10,取其余数。最后加上temp_16_bit中值再存入temp_16_bit中去。






作者: 51黑51    时间: 2017-8-22 13:57
不倒翁.WZT 发表于 2017-8-22 08:38
temp_16_bit=temp_16_bit+temp_H*16+temp_L/16;          ///   这以下
temp_16_bit=temp_16_bit*100;
te ...

首先,谢谢您的详细解释。   您说的这些 我看懂了,可能是我表达不准确。 这几条语句的 DS18B20的这个算法到底是什么意思?什么意义?
作者: zl2168    时间: 2017-8-22 15:58
本帖最后由 zl2168 于 2017-8-22 16:14 编辑

给你推荐一实例程序,其中测温数据转换有详细解释。


实例97 一线式DS18B20测温
实例97 DS18B20测温.rar (51.78 KB, 下载次数: 6)

Proteus仿真一下,确认有效。
以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1,内有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行。仿真电路和Hex文件能在清华出版社网站免费下载,程序源代码只能到书上看了。到图书馆借,或到新华书店翻阅,或到网上书店打折购买。



作者: 51黑51    时间: 2019-3-1 17:16
zl2168 发表于 2017-8-22 15:58
给你推荐一实例程序,其中测温数据转换有详细解释。

就一个hex文件,没什么实质用处
作者: #include51.h    时间: 2019-3-1 20:52
ds18b20很基础的东东,坛子里有教程,多看看就明白了!




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1