找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2676|回复: 5
打印 上一主题 下一主题
收起左侧

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);

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




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

7#
ID:472242 发表于 2019-3-2 11:41
这个张志良怎么这么无自知之明呢,51黑的案例比他多了去,还来这里班门弄斧!

6#
ID:471066 发表于 2019-3-1 20:52 | 只看该作者
ds18b20很基础的东东,坛子里有教程,多看看就明白了!
回复

使用道具 举报

5#
ID:223841 发表于 2019-3-1 17:16 | 只看该作者
zl2168 发表于 2017-8-22 15:58
给你推荐一实例程序,其中测温数据转换有详细解释。

就一个hex文件,没什么实质用处
回复

使用道具 举报

地板
ID:111634 发表于 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文件能在清华出版社网站免费下载,程序源代码只能到书上看了。到图书馆借,或到新华书店翻阅,或到网上书店打折购买。


回复

使用道具 举报

板凳
ID:223841 发表于 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的这个算法到底是什么意思?什么意义?
回复

使用道具 举报

沙发
ID:149988 发表于 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黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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