当前位置:首页 > 技术学院 > 技术前线
[导读]#51单片机#DS18B20硬件原理以及通信的工作时序

DS18B20的硬件原理——温度存储器

DS18B20的温度测量范围:-55~+125°C。


ds18b20与单片机如何通信的

如上图所示,DS18B20温度存储器一共有两个字节。LSB低字节,MSB高字节。Msb字节高位,Lsb字节低位。图中的S表示的是符号位。

通过编程,DS18B20可实现最高12位的温度存储器。以补码的格式存储在寄存器中。

结合下面寄存器温度对应存储数值的表格,理解DS18B20温度存储器。


ds18b20与单片机如何通信的

ps:二进制数最低位变化1,代表温度变化0.0625°C。

DS18B20与单片机通信

单片机可通过1-Wire协议与DS18B20通信,读取温度

1-Wire总线的硬件接口简单,时序复杂。

下面可根据DS18B20工作协议过程,了解其工作时序。

1)初始化

类似于I2C寻址。开始时,1-Wire总线也需检测总线上是否存在DS18B20器件。若存在,则总线根据时序要求返回一个低电平脉冲,若不存在,则无返回脉冲,即总线保持高电平。习惯上将这个动作称为检测存在脉冲。该动作除了有检测DS18B20器件的功能外,还有通知DS18B20做准备的作用。

下图是关于存在脉冲检测的时序图,以便直观感受时间与脉冲变化的关系。


ds18b20与单片机如何通信的

图中可以看到,首先单片机拉低引脚,持续480 ~ 960μs。然后,单片机释放总线,即给总线高电平。DS18B20等待15 ~ 60μs,主动拉低这个引脚。60 ~ 240μ后,DS18B20主动释放总线。之后IO口被上拉电阻拉高。

2)ROM操作指令

类似于I2C,1-Wire总线也可挂多个器件。

该操作应用于一个总线上挂多个器件的情况下,对不同器件进行区分。

每个DS18B20内部都有一个唯一的64位长的序列号。序列号值存在于DS18B20内部的ROM中。其首8位是产品类型编码,末8位是CRC效验码,中间48位是每个器件的唯一序号。单片机可通过与DS18B20的通信,获取数据发送指令。这些指令相对复杂。应用不多。这里不介绍这部分,需要时可查看手册。

下面只介绍一个总线接一个器件的指令和程序。

Skip ROM:0XCC。当总线上只有一个器件时,可跳过ROM,不进行ROM检测。

3)RAM存储器操作指令。

这里介绍两条,其他有需要再查资料。

Read Scratchpad(读暂存寄存器):0XBE。

注意:DS18B20温度数据有两个字节。读取数据时,每个字节从低位读起,先读低字节再读高字节。

Convert Temperature(启动温度转换):0X44。

发送指令后,开始温度转换。这个过程需要一定时间,时长取决于DS18B20精度。温度数据用到的位数越高,精度越高,速度越慢。例子:9位模式与12位模式的最低变化值分别为0.5和0.0625,9位的转换速度更快。

下图为9位模式下的DS18B20温度转换时间表


ds18b20与单片机如何通信的

其中寄存器R1和R0决定了转换的位数。他们的出厂设置默认值为11。即12位表示温度,最大转换时间750μs。启动转换后,至少要再等750μs才能读取温度。否则就有可能读错。

4)DS18B20的位写时序

下面是一张DS18B20写入操作的时序图:


ds18b20与单片机如何通信的

当要给DS18B20写入0时,单片机拉低引脚。持续时间在60~120μs之间。

图中可见,单片机先拉低15μs之后,DS18B20会在15~60μs这个时间段读取这一位,典型值是在30μs时刻读取。持续时间超过60μs,DS18B20必定读取完毕。

当要给DS18B20写入1时,单片机拉低引脚。拉低时间>1μs,紧接着马上释放总线,即拉高引脚,持续时间>60μs。

ps:DS18B20时序较严格,写的过程中最好不要有中断,但是两个位之间的间隔处是例外,可以开启中断。

5)DS18B20的位读时序


ds18b20与单片机如何通信的

当读取DS18B20数据时,单片机拉低引脚,至少保持1μs,然后释放引脚,释放完毕后要尽快读取。从拉低引脚到读取引脚状态不可超过15μs。

下面是DS18B20的操作代码(读写,检测脉冲,温度转换)

#include

#include

sbit IO_18B20 = P3^5; //DS18B20通信引脚

//软件延时函数,延时(t*10)μs

void Delay(unsigned char t)

{

do{

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

}while(--t);

}

//复位总线,获取存在脉冲,准备启动一次读写操作

bit Get18B20Ack()

{

bit ack;

EA = 0; //禁止中断

IO_18B20 = 0; //产生500微秒复位脉冲

Delay(50);

IO_18B20 = 1;

Deylay(60);

ack = IO_18B20; //读取存在脉冲

while(!IO_18B20); //等待存在脉冲结束

EA = 1; //重新使能总中断

return ack;

}

//向DS18B20写入一个字节,dat为待写入字节

void Write18B20(unsigned char dat)

{

unsigned char mask;

EA = 0; //禁止中断

for(mask = 0X01;mask!=0;mask<<=1) //低位在前,依次移出8个bit

{

IO_18B20 = 0; //产生2微秒低电平脉冲

_nop_();

_nop_();

if((mask&dat) == 0) //输出该bit值

IO_18B20 = 0;

else

IO_18B20 = 1;

Delay(6); //延时60微秒

IO_18B20 = 1; //拉高通信引脚

}

EA = 1; //重新使能总中断

}

//从DS18B2读取一个字节,返回值为读到的字节

unsigned char Read18B20()

{

unsigned char dat;

unsigned char mask;

EA = 0; //禁止总中断

for(mask = 0X01;mask != 0;mask <<= 1)//低位在先,依次采集8个bit

{

IO_18B20 = 0; //产生2微秒低电平脉冲

_nop_();

_nop_();

IO_18B20 = 1; //结束低电平脉冲,等待18B20输出数据

_nop_(); //延时2微秒

_nop_();

if(!IO_18B20) //读取通信引脚上的值

dat &= ~mask;

else

dat |= mask;

Delay(60); //再延时60微秒

}

EA = 1; //重新使能总中断

return dat;

}

//启动一次18B20温度转换,返回值为表示是否启动成功

bit Start18B20()

{

bit ack;

ack = Get18B20Ack(); //执行总线,获取18B20应答

if(ack == 0) //若18B20正确应答,则启动一次转换

{

Write18B20(0XCC); //跳过ROM操作

Write18B20(0X44); //启动一次温度转换

}

return ~ack; //ack=0表示操作成功,故取反返回值

}

//读取DS18B20转换的温度值,返回值为是否读取成功

bit Get18B20Temp(int *temp)

{

bit ack;

unsigned char LSB,MSB; //16bit温度值的高低字节

ack = Get18B20Ack(); //执行总线,获取18B20应答

if(ack == 0) //若18B20正确应答,则启动一次转换

{

Write18B20(0XCC); //跳过ROM操作

Write18B20(0XBE); //发送读命令

LSB = Read18B20(); //读温度值的低字节

MSB = Read18B20(); //读温度值的高字节

*temp = ((int)MSB<<8)+LSB;//合并成为16bit整型数

}

return ~ack;//ack=0表示操作成功,故取反返回值

}

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭