目录

DS18B20是Dallas公司生产的、具有one-Wire协议的数字式温度传感器,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。
one-Wire(单线制串行总线)是Dallas公司研制开发是一种协议,由一个总线主节点、一个或多个从节点组成系统,通过一根信号线对芯片进行数据读取。
测温范围:-55摄氏度~+125摄氏度
转换精度:9~12位二进制数(含1位符号位)
测温精度:9位精度为0.5摄氏度;12位精度为0.0625摄氏度。
转换时间:9位精度时为93.75ms;10位精度时为187.5ms;12位精度时为750ms。
通信方式:单总线,数据线接上拉电阻,使总线空闲时处于高电平。
DS18B20内部有9字节的高速寄存器

对应功能讲解:
| 对应的字节 | 寄存器编址 | 功能作用 |
| 第0字节 | 00H | 温度转换值低8位 |
| 第1字节 | 01H | 温度转换值高8位 |
| 第2字节 | 02H | 温度上限寄存器TH |
| 第3字节 | 03H | 温度下限寄存器TL |
| 第4字节 | 04H | 系统配置寄存器 |
| 第5字节 | 05H | 保留(FFH) |
| 第6字节 | 06H | 保留(0CH) |
| 第7字节 | 07H | 保留(10H) |
| 第8字节 | 08H | CRC校验 |
DS18B20系统配置寄存器有8位,低5位值永远为1,最高位为TM,TM是测试模式为,用于设置DS18B20在工作模式还是测试模式。在出厂时被设置为0,需要时可以修改,R1和R0用于设置分辨率(DS18B20在出厂时被设置为12位的分辨率,需要时可以修改)。DS18B20系统配置寄存器数据格式如下:

DS18B20分辨率设置如下:

DS18B20可完成对温度的测量,下面以12位精度为例。以16位带符号位扩展的二进制补码形式读出。低4位为小数部分,中间7位为整数部分,高5位为扩展符号位,

其中,S为符号扩展位,S=1 表示温度为负值,S=0表示温度为正值。
输出数据和实际温度值之间的关系如下:

注:DS18B20的温度数据是以补码形式表示。
计算方法:
DS18B20的12位精度的分辨率为0.0625。当读出数据为正温度时,将LSB和MSB整合成的16位整数,再分辨率(即0.0625)即可;当读出数据为负温度时,将LSB和MSB整合成的16位整数,再取反加1后,最后乘以0.0625即可。
(四)DS18B20时序复位设计

下面为蓝桥杯官方提供的底层驱动代码:
//DS18B20设备初始化
bit init_ds18b20(void)
{
bit initflag = 0;
DQ = 1;
Delay_OneWire(12);
DQ = 0;
Delay_OneWire(80);
DQ = 1;
Delay_OneWire(10);
initflag = DQ;
Delay_OneWire(5);
return initflag;
}

下面为蓝桥杯官方提供的底层驱动代码:
//通过单总线向DS18B20写一个字节
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = dat&0x01;
Delay_OneWire(5);
DQ = 1;
dat >>= 1;
}
Delay_OneWire(5);
}
//从DS18B20读取一个字节
unsigned char Read_DS18B20(void)
{
unsigned char i;
unsigned char dat;
for(i=0;i<8;i++)
{
DQ = 0;
dat >>= 1;
DQ = 1;
if(DQ)
{
dat |= 0x80;
}
Delay_OneWire(5);
}
return dat;
}
CCH:跳过ROM指令。跳过64位ROM地址,直接向DS18B20发起各种执行指令。
44H:温度转换指令。启动DS18B20进行温度转换。
BEH:读取暂存器指令。
下面为蓝桥杯官方提供的底层驱动代码:
#include "reg52.h"
sbit DQ = P1^4; //单总线接口
//单总线延时函数
void Delay_OneWire(unsigned int t) //STC89C52RC
{
while(t--);
}
//通过单总线向DS18B20写一个字节
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = dat&0x01;
Delay_OneWire(5);
DQ = 1;
dat >>= 1;
}
Delay_OneWire(5);
}
//从DS18B20读取一个字节
unsigned char Read_DS18B20(void)
{
unsigned char i;
unsigned char dat;
for(i=0;i<8;i++)
{
DQ = 0;
dat >>= 1;
DQ = 1;
if(DQ)
{
dat |= 0x80;
}
Delay_OneWire(5);
}
return dat;
}
//DS18B20设备初始化
bit init_ds18b20(void)
{
bit initflag = 0;
DQ = 1;
Delay_OneWire(12);
DQ = 0;
Delay_OneWire(80);
DQ = 1;
Delay_OneWire(10);
initflag = DQ;
Delay_OneWire(5);
return initflag;
}
在CT107D单片机综合训练平台上,实现实时温度测量。
#include "reg52.h"
#include "onewire.h"
unsigned char temp=0;
unsigned char code SMG_NoDot[18] = {0xc0,0xf9,0xa4,
0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,
0xc0,0x86,0x8e,0xbf,0x7f};
unsigned char code SMG_IsDot[10] = {0x40,0x79,0x24,
0x30,0x19,0x12,0x02,0x78,0x00,0x10};
void SelectHC573(unsigned char channel)
{
switch(channel)
{
case 4:
P2=(P2 & 0x1f) | 0x80;
break;
case 5:
P2=(P2 & 0x1f) | 0xa0;
break;
case 6:
P2=(P2 & 0x1f) | 0xc0;
break;
case 7:
P2=(P2 & 0x1f) | 0xe0;
break;
case 0:
P2=(P2 & 0x1f) | 0x00;
break;
}
}
void DelaySMG(unsigned int t)
{
while(t--);
}
void DisplaySMG_Bit(unsigned char pos,unsigned char value)
{
SelectHC573(7);
P0=0xff;
SelectHC573(6);
P0=0x01<<pos;
SelectHC573(7);
P0=value;
}
void DisplaySMG_Temp()
{
DisplaySMG_Bit(7,SMG_NoDot[12]);
DelaySMG(100);
DisplaySMG_Bit(6,SMG_NoDot[temp%10]);
DelaySMG(100);
DisplaySMG_Bit(5,SMG_IsDot[(temp/10)%10]);
DelaySMG(100);
DisplaySMG_Bit(4,SMG_NoDot[(temp/100)%10]);
DelaySMG(100);
DisplaySMG_Bit(3,0xff);
DelaySMG(100);
DisplaySMG_Bit(2,0xff);
DelaySMG(100);
DisplaySMG_Bit(1,0xff);
DelaySMG(100);
DisplaySMG_Bit(0,0xff);
DelaySMG(100);
}
void Delay(unsigned int t)
{
while(t--)
{
DisplaySMG_Temp();
}
}
void DA18B10()
{
unsigned char LSB,MSB;
init_ds18b20();
Write_DS18B20(0xCC);
Write_DS18B20(0x44);
Delay(1000);
init_ds18b20();
Write_DS18B20(0xCC);
Write_DS18B20(0xBE);
LSB=Read_DS18B20();
MSB=Read_DS18B20();
init_ds18b20();
temp=0x0000;
temp=MSB;
temp<<=8;
temp=temp | LSB; //整合成16位的整数
if((temp & 0xf800)==0x0000)
{
temp>>=4; //移出小数,对整数部分计算
temp=temp*10; //放大10部,然后加上小数部分
temp=temp+(LSB & 0x0f)*0.625;
}
}
void main()
{
while(1)
{
DisplaySMG_Temp();
DA18B10();
}
}
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
我正在使用i18n从头开始构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在rubyonrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi
我看到这个错误:translationmissing:da.datetime.distance_in_words.about_x_hours我的语言环境文件:http://pastie.org/2944890我的看法:我已将其添加到我的application.rb中:config.i18n.load_path+=Dir[Rails.root.join('my','locales','*.{rb,yml}').to_s]config.i18n.default_locale=:da如果我删除I18配置,帮助程序会处理英语。更新:我在config/enviorments/devolpment
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or
我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c
我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的
如果我使用ruby版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更
我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co