历史上的今天
返回首页

历史上的今天

今天是:2024年11月02日(星期六)

2021年11月02日 | DS18B20温度传感器 ------ 自学笔记

2021-11-02 来源:eefocus

一、简介

DS18B20数字温度传感器接线方便,封装后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式。主要根据应用场合的不同而改变外观。具有耐磨,防高温,体积小,封装形式多样等特点。适用于各种狭小空间设备数字测温和控制领域。


二、DS18B20的特点

适用电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电(寄生电源:不是实际的电源器件,而是一种供电方式,即通过数据线供电)

独特的单线接口方式(一条总线),DS18B20在与微处理连接时仅需要一条线即可实现微处理器与DS18B20的双向通信。


DS18B20支持多点网络功能,多个DS18B20可以并联在唯一的三线上,实现网络多点测温。


DS18B20在使用中不需要任何外围元件,全部传感器元件及转换电路集成在形如一只三极管的集成电路内

温范围-55摄氏度~+125摄氏度,在-10摄氏度~+85摄氏度时精度位正负0.5摄氏度。

可编程的分辨率位9~12位,对应的可分辨温度为0.5摄氏度,0.25摄氏度,0.125摄氏度和0.0625摄氏度,可实现高精度测温

在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率是最多750ms内把温度值转换位数字,速度更快。

测量结果直接输出数字温度,以“一根总线”串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力。

负压特性:电源反接时,芯片不会因发热而烧毁,但不能正常工作。


三、DS18B20实物图

四、DS18B20的内部结构

4.1、64位(激)光刻只读存储器

光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列号,


64位光刻ROM的排列是:起始8位(28H)是产品类型标号

接着的48位是该DS18B20自身的序列号

最后的8位是前面56位的循环冗余码

光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上接多个DS18B20的目的。


4.2、DS18B20温度转换规则

DS18B20的核心功能:直接读出数字的温度值。

温度传感器的精度位用户可编程的9,10,11或12位,分别位0.5摄氏度,0.25摄氏度,0.125摄氏度,0.0625摄氏度增量递增。

在上电状态默认的精度位12位。

 

DS18B20启动保持低功耗等待状态,当需要执行温度测量和AD转换 时,总线控制器必须发出[44h]命令,转换完以后,产生的温度数据以两个字节的形式被存储到高速暂存器的温度寄存器中,DS18B20继续保持等待状态。


这12位转化后得到的12位数据,存储器DS18B20的两个8位的RAM中,高字节的前5位是字符位,如果测得的温度大于0,这5位为‘0’,只要将测到的数值乘以0.0625即可得到实际温度;如果温度小于0,这5位为‘1’,测到的数值需要先减1再取反再乘以0.0625即可得到实际的温度。

 

4.3、DS18B20温度传感器的存储器

DS18B20温度传感器的内部存储器包括一个高精度的暂存器RAM和一个非易失性的带电擦除可编程存储器(EEPROM),后者存放高温度和低温度触发器TH、TL和结构存储器。


4.4、配置寄存器

存储器的第四位位配置寄存器,其组织如下图,用好可以按下表设置R0和R1位来设定DS18B20的精度,上电默认设置:R0=1,R1=1(12位精度)。注意:精度和转换时间之间有直接的关系。暂存器的位7和位0-4被器件保留禁止写入。

4.5、DS18B20的ROM指令表

image.png?imageView2/2/w/550

4.6、DS18B20的RAM指令表

image.png?imageView2/2/w/550

4.7、DS18B20初始化

数据线拉到低电平“0”。

延时480us(该时间的时间范围可以从480到960us)

数据线拉到高电平“1”

延时函数等待80us,如果初始化成功则在15~60us时间内产生一个由DS18B20所返回的低电平“0”,根据该状态可以来确定它的存在,但是注意不能无限的进行等待,不然会使程序进入死循环,所以要进行超时判断。

若CPU读到了数据线上的低电平“0”后,还要做延时,其延时的时间从出发的高电平算起(第三步的时间算起),最少要480us


4.8、DS18B20读时序

将数据线拉低“0”

延时1us

将数据线拉高“1”,释放总线准备读数据

延迟10us

读数据线的状态得到一个状态位,并进行数据处理

延时45us

重复1~7步骤,直到读完一个字节


4.9、DS18B20写时序

将数据拉低“0”

延时15us

按从低位到高位的顺序发送数据(一次只发送一位)

延时60微秒

将数据线拉到高电平

重复1~5步骤,直到发送完整的字节

最后将数据线拉高


4.10、DS18B20电路图

五、软件设计

5.1、DS18.c

#include"DS18.h"

 

// 延时函数    1ms

void Delay1ms(uint y)

{

uint x;

for( ; y>0; y--)

{

for(x=110; x>0; x--);

}

}

 

// 初始化化函数

uchar Ds18b20Init()

{

uchar i =0;

DSPORT=0;        // 数据线拉低

i=70;

while(i--);     // 延时642us

DSPORT = 1;     // 拉高总线,如果DS18B20做出反应将会在15us~60us后总线拉低

i=0;

while(DSPORT)   

{

    Delay1ms(1);

    i++;

    if(i>5)          // 等待>5ms

    {

    return 0;  // 初始化失败

 

    }

}

    return 1;   // 初始化成功

}

 

//  向DS18B20写入一个字节

void Ds18b20WriteByte(uchar dat)

{

uint i,j;

    for(j=0;j<8;j++)

    {

DSPORT=0;       //每写入一位数据之前先把总线拉低1us

i++;

DSPORT = dat & 0x01; // 然后写入一个数据,从最低位开始

i=6;

while(i--);   //延时68us,持续时间最少60us

DSPORT = 1; //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值

dat >>= 1;

    }

}

 

//  读数据

uchar Ds18b20ReadByte()

{

uchar byte, bi;

uint i, j;

for(j=8; j>0; j--)

{

DSPORT = 0;//先将总线拉低1us

i++;

DSPORT = 1;//然后释放总线

i++;

i++;//延时6us等待数据稳定

bi = DSPORT; //读取数据,从最低位开始读取

/*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/

byte = (byte >> 1) | (bi << 7);   

i = 4; //读取完之后等待48us再接着读取下一个数

while(i--);

}

return byte;

}

 

 // 让18b20开始转换温度

void  Ds18b20ChangTemp()

{

Ds18b20Init();

Delay1ms(1);

Ds18b20WriteByte(0xcc); //跳过ROM操作命令  

Ds18b20WriteByte(0x44);     //温度转换命令

//Delay1ms(100); //等待转换成功,而如果你是一直刷着的话,就不用这个延时了

   

}

 

  //  发送读取温度命令

void  Ds18b20ReadTempCom()

{

 

Ds18b20Init();

Delay1ms(1);

Ds18b20WriteByte(0xcc); //跳过ROM操作命令

Ds18b20WriteByte(0xbe); //发送读取温度命令

}

 

 //   读取温度

int Ds18b20ReadTemp()

{

int temp = 0;

uchar tmh, tml;

Ds18b20ChangTemp(); //先写入转换命令

Ds18b20ReadTempCom(); //然后等待转换完后发送读取温度命令

tml = Ds18b20ReadByte(); //读取温度值共16位,先读低字节

tmh = Ds18b20ReadByte(); //再读高字节

temp = tmh;

temp <<= 8;

temp |= tml;

return temp;

}

 

 

5.2、DS18.h

#ifndef _DS18_

#define _DS18_

 

#include

// 定义关键词

#ifndef uchar               // 如果没有定义uchar

#define uchar unsigned char // 那么就定义无符号的uchar

#endif                     // 结束

 

#ifndef uint

#define uint unsigned int

#endif

 

// 定义使用的IO口

sbit DSPORT=P3^7;

 

//声明全局函数

void Delaylms(uint);

uchar Ds1820Init();

void Ds1820WriteByte(uchar com);

uchar Ds18b20ReadByte();

void Ds18b20ChangTemp();

void Ds1820ReadTempCom();

int Ds18b20ReadTemp();

 

#endif

5.3、main.c

#include "reg52.h"

#include "DS18.h"

 

typedef unsigned int u16;    //  对数据类型进行声明定义

typedef unsigned char u8;

 

sbit LSA = P2^2;

sbit LSB = P2^3;

sbit LSC = P2^4;

 

char num = 0;

u8 DisplayData[8];

u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示0~9的数字

 

//  延时函数

void delay(u16 i)

{

while(i--);    // i=1时 大约延时10us

}

 

// 温度读取处理转换函数

void datapros(int temp)

{

    float tp;  

if(temp< 0) //当温度值为负数

  {

DisplayData[0] = 0x40;   //   -

//因为读取的温度是实际温度的补码,所以减1,再取反求出原码

temp=temp-1;

temp=~temp;

tp=temp;

temp=tp*0.0625*100+0.5;

//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点

//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就

//算加上0.5,还是在小数点后面。

 

  }

  else

  {

DisplayData[0] = 0x00;

tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量

//如果温度是正的那么,那么正数的原码就是补码它本身

temp=tp*0.0625*100+0.5;

//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点

//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就

//算加上0.5,还是在小数点后面。

}

DisplayData[1] = smgduan[temp % 10000 / 1000];

DisplayData[2] = smgduan[temp % 1000 / 100];

DisplayData[3] = smgduan[temp %  100 / 10];

DisplayData[4] = smgduan[temp %  10 / 1];

 

 

}

 

//  数码管显示函数

void DigDisplay()

{

u8 i;

for(i=0;i<6;i++)

{

switch(i) //位选,选择点亮的数码管,

{

case(0):

LSA=1;LSB=1;LSC=1; break;//显示第0位

case(1):

LSA=0;LSB=1;LSC=1; break;//显示第1位

case(2):

LSA=1;LSB=0;LSC=1; break;//显示第2位

case(3):

LSA=0;LSB=0;LSC=1; break;//显示第3位

case(4):

LSA=1;LSB=1;LSC=0; break;//显示第4位

case(5):

LSA=0;LSB=1;LSC=0; break;//显示第5位

}

P0=DisplayData[i];//发送数据

delay(100); //间隔一段时间扫描

P0=0x00;//消隐

}

}

 

 void main()

{

while(1)

{

datapros(Ds18b20ReadTemp()); //数据处理函数

DigDisplay();//数码管显示函数

}

}

推荐阅读

史海拾趣

爱普特微(aptchip)公司的发展小趣事

随着产品的广泛应用和市场的不断拓展,爱普特微电子逐渐获得了业界的广泛认可。公司屡获殊荣,包括“国家级专精特新小巨人”、“中国IC独角兽”、“中国TOP 50国产MCU厂商”等。这些荣誉的获得,不仅是对公司技术实力和市场表现的肯定,更是对公司未来发展的鼓励和期待。

DESCO公司的发展小趣事

作为一家有社会责任感的企业,DESCO公司始终关注环境保护和可持续发展。公司采用环保材料和生产工艺,减少生产过程中的污染排放。同时,DESCO还积极参与社会公益活动,为当地社区和弱势群体提供帮助和支持。这些举措赢得了社会各界的广泛赞誉和认可。

Baton Lock公司的发展小趣事

在快速发展的过程中,Baton Lock意识到产品质量是公司生存和发展的关键。因此,公司投入大量资源加强品质管理,从原材料采购到生产流程控制,再到产品检测,都实施了严格的标准和程序。这一举措有效提升了产品的稳定性和可靠性,赢得了客户的信任。

屹晶微(EG)公司的发展小趣事

随着业务的不断拓展和市场的不断扩大,屹晶微逐渐意识到与合作伙伴建立长期战略合作关系的重要性。于是,在2023年,他们与电子产业一站式服务平台华秋电子达成了授权代理合作。这一合作不仅为屹晶微提供了更广阔的市场渠道和客户资源,也为其未来的发展奠定了坚实的基础。

在合作过程中,华秋电子为屹晶微提供了全方位的支持和服务。他们共同推广屹晶微的芯片产品,为客户提供更优质的解决方案和服务。同时,华秋电子还利用自身的技术优势和渠道优势,帮助屹晶微拓展海外市场,提升品牌知名度和影响力。

以上两个故事只是屹晶微在电子行业中发展起来的一部分。他们的发展历程充满了挑战和机遇,但黄米龙和他的团队始终保持着坚定的信念和不懈的努力,为中国的芯片产业做出了积极的贡献。

Aplus Flash Technology Inc公司的发展小趣事

近年来,电子行业面临着原材料价格上涨、贸易壁垒增多等挑战。Aplus Flash Technology Inc公司也受到了这些因素的影响,生产成本上升,市场竞争压力加大。为了应对这些挑战,公司及时调整了发展战略,加大了对技术研发的投入,提高了生产效率和质量。同时,公司还积极开拓国际市场,通过参加国际电子展会、建立海外销售网络等方式,拓展海外市场份额。这些举措使公司在面对市场挑战时保持了稳健的发展态势。

明波通信(BWAVE)公司的发展小趣事

随着汽车产业的快速发展,车载电子系统成为了新的增长点。明波通信凭借在通信领域的深厚积累,迅速拓展车载电子系统业务。公司成功开发了车载导航、车载音响系统等项目,并与多家知名汽车厂商建立了合作关系。这一举措不仅为明波通信带来了新的增长点,也进一步巩固了其在电子行业的地位。

问答坊 | AI 解惑

Protel DXP2004 简体中文破解版

Altium Protel DXP是第一套完整的板卡级设计系统,真正实现在单个应用程序中的集成。设计从一开始的目的就是为了支持整个设计过程,Protel DXP让你可以选择最适当的设计途径来按你想要的方式工作。Protel DXP PCB线路图设计系统完全利用了Windows X ...…

查看全部问答>

Cadence中的psm文件

我前几天下了个Cadence软件,主要是查看芯片封装信息的,其中主要有两个文件,一个是pad格式,可以打开,另一个是psm格式的文件 怎么也打不开。气死了,现在很急,希望哪位高手可以帮助我。。。:Q…

查看全部问答>

MSP430F1系列单片机,串口中断问题

MSP430F149单片机,中断发送函数         我理解的发送过程是这样的,大家先看下这样理解对不对?:首先,代码设置中断标志,UTXIFG1 = 1,程序进入发送中断函数发送一个字节,发送完毕后,MCU自动复位UTXIFG1 = 0, 然后退出 ...…

查看全部问答>

有谁收到过这个通知吗?中国嵌入式课件大赛

2009中国嵌入式系统教学课件大赛----参赛费free,奖金最高3万元!    大赛评委由工业界、教育界资深专家共同担任。其中,院士3人,教育部教学指导委员会主任级专家4人,嵌入式知名企业的管理人员和技术工程师多人。  大赛面向 ...…

查看全部问答>

gooogleman 看到该贴请进

gooogleman, 我听论坛的兄弟说你有WINCE下的 SKYPE软件, 不知能发给我一份吗? 我找了好几天了也没找到。急用. 非常感谢. EMAIL:  LHEART@263.NET…

查看全部问答>

对51单片机中断 的一点疑问

程序如下 #include   unsigned int  count=0; unsigned int  count1=0; sbit  P15=P1^5 ;//蜂鸣器 main() { TMOD=0X01;//选择定时器0方式1 TH0=(65536-50000)/256;//定时器置初值,定时50ms ...…

查看全部问答>

嵌入式怎么学呀?

书有很多但讲的都是不同的模块芯片。 1应该先学哪个芯片呀? 2学这个还要一些硬件,应该买哪个合适?都多少钱? …

查看全部问答>

Rt_thread中如何用FinSH shell查看一个线程使用的栈最大深度

请教了:RT中定义堆栈是一个麻烦事,我们要怎样用FinSH shell来查看一个线程使用的栈的最大深度喃? 哪位说说看。。。。。…

查看全部问答>