DSB温传感器的设计.docx

上传人:b****8 文档编号:10506163 上传时间:2023-02-17 格式:DOCX 页数:21 大小:24.63KB
下载 相关 举报
DSB温传感器的设计.docx_第1页
第1页 / 共21页
DSB温传感器的设计.docx_第2页
第2页 / 共21页
DSB温传感器的设计.docx_第3页
第3页 / 共21页
DSB温传感器的设计.docx_第4页
第4页 / 共21页
DSB温传感器的设计.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

DSB温传感器的设计.docx

《DSB温传感器的设计.docx》由会员分享,可在线阅读,更多相关《DSB温传感器的设计.docx(21页珍藏版)》请在冰豆网上搜索。

DSB温传感器的设计.docx

DSB温传感器的设计

封面

作者:

PanHongliang

仅供个人学习

学习情境4-温度传感器的设计

之基于DS18B20温度传感器的设计

☆点名,引言

Dallas公司的数字化温度传感器DS1820是世界上第一片支持"一线总线"接口的温度传感器。

一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。

其测量温度范围为-55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C。

现场温度直接以"一线总线"的数字方式传输,大大提高了系统的抗干扰性。

适合于恶劣环境的现场温度测量,如:

环境控制、设备或过程控制、测温类消费电子产品等。

DS18B20可以程序设定9~12位的分辨率,精度为±0.5°C。

可选更小的封装方式,更宽的电压适用范围。

分辨率设定,及用户设定的报警温度存储在EEPROM中,掉电后依然保存。

DS18B20的性能是新一代产品中最好的!

性能价格比也非常出色!

省略了存储用户定义报警温度、分辨率参数的EEPROM,精度降低为±2°C,适用于对性能要求不高,成本控制严格的应用,是经济型产品。

☆新课讲授

4.1基于DS18B20温度传感器的设计表

4.1.1DS18B20技术资料

1. DS18B20的新性能

 

(1) 可用数据线供电,电压范围:

3.0-5.5V;

 

(2) 测温范围:

-55-+125℃,在-10-+85℃时精度为±0.5℃;

 (3) 可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃;

 (4) 12位分辨率时最多在750ms内把温度值转换为数字;

 (5) 负压特性:

电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。

2.DS18B20的外形和内部结构

   DS18B20内部结构主要由四部分组成:

64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。

DS18B20的管脚排列如下:

图4-1-1DS18B20外形图

引脚定义:

(1)   DQ为数字信号输入/输出端;

(2)   GND为电源地;

(3)   VDD为外接供电电源输入端(在寄生电源接线方式时接地)。

内部结构:

图 4-1-2 DS18B20内部结构图

DS18B20有4个主要的数据部件:

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

64位光刻ROM的排列是:

开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。

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

(2) DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:

用16位符号扩展的二进制补码读数形式提供,以0.0625℃/LSB形式表达,其中S为符号位。

表1DS18B20温度值格式表

这是12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。

例如+125℃的数字输出为07D0H,+25.0625℃的数字输出为0191H,-25.0625℃的数字输出为FF6FH,-55℃的数字输出为FC90H。

(3)DS18B20温度传感器的存储器

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

(4)配置寄存器

该字节各位的意义如下:

低五位一直都是1,TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。

在DS18B20出厂时该位被设置为0,用户不要去改动。

R1和R0用来设置分辨率,如下表所示:

(DS18B20出厂时被设置为12位)

表2配置寄存器结构

TM

R1

R0

1

1

1

1

1

表3温度值分辨率设置表

R1

R0

分辨率

温度最大转换时间

0

0

9位

93.75ms

0

1

10位

187.5ms

1

0

11位

375ms

1

1

12位

750ms

3.高速暂存存储器

高速暂存存储器由9个字节组成,其分配如表5所示。

当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。

单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式如表1所示。

对应的温度计算:

当符号位S=0时,直接将二进制位转换为十进制;当S=1时,先将补码变为原码,再计算十进制值。

表 2是对应的一部分温度值。

第九个字节是冗余检验字节。

表4DS18B20暂存寄存器分布

寄存器内容

字节地址

温度值低位

0

温度值高位

1

高温限值TH

2

低温限值TL

3

配置寄存器

4

保留

5

保留

6

保留

7

CRC检验

8

根据DS18B20的通讯协议,主机控制DS18B20完成温度转换必须经过三个步骤:

每一次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。

复位要求主CPU将数据线下拉500微秒,然后释放,DS18B20收到信号后等待16~60微秒左右,后发出60~240微秒的存在低脉冲,主CPU收到此信号表示复位成功。

表5ROM指令表

指令

约定代码

功能

读ROM

33H

读DS1820ROM中的编码(即64位地址)

符合ROM

55H

发出此命令之后,接着发出64位ROM编码,访问单总线上与该编码相对应的DS1820使之作出响应,为下一步对该DS1820的读写作准备。

搜索ROM

0F0H

用于确定挂接在同一总线上DS1820的个数和识别64位ROM地址。

为操作各器件作好准备。

跳过ROM

0CCH

忽略64位ROM地址,直接向DS1820发温度变换命令。

适用于单片工作。

告警搜索命令

0ECH

执行后只有温度超过设定值上限或下限的片子才做出响应。

表6RAM指令表

指令

约定代码

功能

温度变换

44H

启动DS1820进行温度转换,转换时最长为500ms(典型为200ms)。

结果存入内部9字节RAM中。

读暂存器

0BEH

内部RAM中9字节的内容

写暂存器

4EH

发出向内部RAM的3、4字节写上、下限温度数据命令,紧跟该命令之后,是传送两字节的数据。

复制暂存器

48H

将RAM中第3、4字节的内容复制到EEPROM中。

重调EEPROM

0B8H

将EEPROM中内容恢复到RAM中的第3、4字节。

读供电方式

0B4H

读DS1820的供电模式。

寄生供电时DS1820发送“0”,外接电源供电DS1820发送“1”。

5.DS1820使用中注意事项

  DS1820虽然具有测温系统简单、测温精度高、连接方便、占用口线少等优点,但在实际应用中也应注意以下几方面的问题:

  

(1)较小的硬件开销需要相对复杂的软件进行补偿,由于DS1820与微处理器间采用串行数据传送,因此,在对DS1820进行读写编程时,必须严格的保证读写时序,否则将无法读取测温结果。

在使用PL/M、C等高级语言进行系统程序设计时,对DS1820操作部分最好采用汇编语言实现。

  

(2)在DS1820的有关资料中均未提及单总线上所挂DS1820数量问题,容易使人误认为可以挂任意多个DS1820,在实际应用中并非如此。

当单总线上所挂DS1820超过8个时,就需要解决微处理器的总线驱动问题,这一点在进行多点测温系统设计时要加以注意。

  (3)连接DS1820的总线电缆是有长度限制的。

试验中,当采用普通信号电缆传输长度超过50m时,读取的测温数据将发生错误。

当将总线电缆改为双绞线带屏蔽电缆时,正常通讯距离可达150m,当采用每米绞合次数更多的双绞线带屏蔽电缆时,正常通讯距离进一步加长。

这种情况主要是由总线分布电容使信号波形产生畸变造成的。

因此,在用DS1820进行长距离测温系统设计时要充分考虑总线分布电容和阻抗匹配问题。

  (4)在DS1820测温程序设计中,向DS1820发出温度转换命令后,程序总要等待DS1820的返回信号,一旦某个DS1820接触不好或断线,当程序读该DS1820时,将没有返回信号,程序进入死循环。

这一点在进行DS1820硬件连接和软件设计时也要给予一定的重视。

    测温电缆线建议采用屏蔽4芯双绞线,其中一对线接地线与信号线,另一组接VCC和地线,屏蔽层在源端单点接地。

4.1.2系统硬件设计

硬件结构比较简单,具体连接如图4-1-3所示:

图4-1-3硬件系统结构

4.1.3软件系统设计

DSl8B20必须严格按照单总线通信协议,以保证数据的完整性。

该协议定义了几种时隙类型:

初始化、应答、写1、写0、读1、读0。

除了应答时隙所有这些时隙都是有主机发出。

总线上所传输的所有命令和数据都是字节的低位在前。

(1)初始化时隙

复位时隙和应答时隙。

在初始化过程中,主机发送复位脉冲(最短为480μs的低电平信号)接着,释放总线并进入接收状态。

当总线被释放后上拉电阻将总线拉高。

DSl8B20在检测到总线的上升沿之后等待15-60us接着发出应答脉冲(低电平持续60-240μs)。

(2)读和写时隙

在写时隙期间,主机向DS18B20写入数据;而在读时隙期间,主机读入来自DS18B20的数据。

在每一个时隙,总线只能传输一位数据。

存在两种写时隙,即写1和写0。

主机在写1时隙向DS18B20写入逻辑1。

而在写0时隙向DS18B20写入逻辑0。

所有写时隙至少需要60μS,而且两次写l时隙之间至少需要lμS的恢复时间。

两种写时隙均以主机拉低总线开始。

产生写1时隙:

主机拉低总线后,必须在15uS内释放总线。

然后由上拉电阻将总线拉至高电平。

产生写0时隙:

主机拉低总线后,必须在整个时隙期间保持低电平(至少60μS)。

在写时隙开始后的15~60μS期间,DSl8B20采样总线的状态。

如果总线为高电,则逻辑1被写入DSl8B20;如果总线为低电平,则0逻辑被写入DSl8B20。

读时隙:

DSl8B20只能在主机发出读时隙时才能向主机传送数据。

所以主机在发出读数据命令后,必须马上产生读时隙,以便DSl8B20能够传送数据。

所有读时隙至少60μs,且在两次独立的读时隙之间至少需要1μS的恢复时间。

每次读时隙由主机发起,拉低总线至少1μS。

在主机发起读时隙之后,DSl8B20开始在总线上传送1或0。

若DS18B20发送1,则保持总线为高电平;若发送O,则拉低总线。

当传送0时,DSl8B20在该时隙结束时释放总线,再由上拉电阻将总线拉回空闲高电平状态。

DS18B20发出的数据在读时隙下降沿起始后的15uS内有效,因此主机必须在读时隙开始后的15μS内释放总线,并且采样总线状态。

其程序流程图如下图所示。

图4-1-3DS18B20程序流程

所以在软件设计方面,我们主要是读取温度函数和温度显示函数的编写。

1、读取温度函数

图4-1-4读温度子程序流程图

图4-1-5温度转换子程序流程图

voidRead_Temperature()

{

if(Init_DS18B20()==1)//DS18B20故障

DS18B20_IS_OK=0;

else

{

WriteOneByte(0xcc);//跳过读取DS18B20的系列号

WriteOneByte(0x44);//启动温度转换

Init_DS18B20();

WriteOneByte(0xcc);//跳过读取DS18B20的系列号

WriteOneByte(0xbe);//读取温度寄存器

Temp_Value[0]=ReadOneByte();//温度低8位

Temp_Value[1]=ReadOneByte();//温度高8位

DS18B20_IS_OK=1;

}

}

上述代码中,未读取DS18B20的系列号。

2、温度显示函数

voidDisplay_Temperature()

{

uchari;

//延时值和负数标志

uchart=150,ng=0;

//高5位全为1(0XF8)则为负数,为负数时取反加1,并设置负数标识

if((Temp_Value[1]&0xf8)==0xf8)

{

Temp_Value[1]=~Temp_Value[1];

Temp_Value[0]=~Temp_Value[0]+1;

if(Temp_Value[0]==0x00)

Temp_Value[1]++;

//负数标识置1

ng=1;

}

//查表得到温度小数部分

Display_Digit[0]=df_Table[Temp_Value[0]&0x0f];

//获取温度整数部分(高字节中的低3位和低字节中高4位,无符号)

CurrentT=((Temp_Value[0]&0xf0)>>4)|((Temp_Value[1]&0x07)<<4);

//将整数部分分解为3位待显示的显示数字

Display_Digit[3]=CurrentT/100;

Display_Digit[2]=CurrentT%100/10;

Display_Digit[1]=CurrentT%10;

//刷新LCD显示缓冲

Current_Temp_Display_Buffer[11]=Display_Digit[0]+'0';

Current_Temp_Display_Buffer[10]='.';

Current_Temp_Display_Buffer[9]=Display_Digit[1]+'0';

Current_Temp_Display_Buffer[8]=Display_Digit[2]+'0';

Current_Temp_Display_Buffer[7]=Display_Digit[3]+'0';

//高位为零时不显示

if(Display_Digit[3]==0)

Current_Temp_Display_Buffer[7]='';

if(Display_Digit[2]==0&&Display_Digit[3]==0)

Current_Temp_Display_Buffer[8]='';

//负数符号显示在恰当的位置

if(ng)

{

if(Current_Temp_Display_Buffer[8]=='')

Current_Temp_Display_Buffer[8]='-';

elseif(Current_Temp_Display_Buffer[7]=='')

Current_Temp_Display_Buffer[7]='-';

else

Current_Temp_Display_Buffer[6]='-';

}

//在第一行显示标题

Set_LCD_POS(0x00);

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

{

Write_LCD_Data(Temp_Disp_Title[i]);

}

//在第二行显示当前温度

Set_LCD_POS(0x40);

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

{

Write_LCD_Data(Current_Temp_Display_Buffer[i]);

}

//显示温度符号

Set_LCD_POS(0x4D);Write_LCD_Data(0x00);

Set_LCD_POS(0x4E);Write_LCD_Data('C');

}

☆课堂小结

这节课我们主要介绍了温度传感器DS18B20的工作特点,控制指令以及应用方法。

着重分析了读取温度函数的设计和温度显示函数的编写。

为我们学习其他温度传感器打下了一定的基础。

☆完整程序代码

#include

#include

#defineuintunsignedint

#defineucharunsignedchar

#definedelayNOP(){_nop_();_nop_();_nop_();_nop_();}

sbitDQ=P3^3;

sbitLCD_RS=P2^0;

sbitLCD_RW=P2^1;

sbitLCD_EN=P2^2;

ucharcodeTemp_Disp_Title[]={"CurrentTemp(zxb)"};

ucharCurrent_Temp_Display_Buffer[]={"Temp="};

//温度字符

ucharcodeTemperature_Char[8]={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00};

//温度小数位对照表

ucharcodedf_Table[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};

ucharCurrentT=0;//当前读取的温度整数部分

ucharTemp_Value[]={0x00,0x00};//从DS18B20读取的温度值

ucharDisplay_Digit[]={0,0,0,0};//待显示的各温度数位

bitDS18B20_IS_OK=1;//传感器正常标志

voidDelayXus(uintx)

{

uchari;

while(x--)

{

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

}

}

bitLCD_Busy_Check()

{

bitresult;

LCD_RS=0;

LCD_RW=1;

LCD_EN=1;

delayNOP();

result=(bit)(P0&0x80);

LCD_EN=0;

returnresult;

}

voidWrite_LCD_Command(ucharcmd)

{

while(LCD_Busy_Check());

LCD_RS=0;

LCD_RW=0;

LCD_EN=0;

_nop_();

_nop_();

P0=cmd;

delayNOP();

LCD_EN=1;

delayNOP();

LCD_EN=0;

}

voidWrite_LCD_Data(uchardat)

{

while(LCD_Busy_Check());

LCD_RS=1;

LCD_RW=0;

LCD_EN=0;

P0=dat;

delayNOP();

LCD_EN=1;

delayNOP();

LCD_EN=0;

}

voidLCD_Initialise()

{

Write_LCD_Command(0x01);DelayXus(5);

Write_LCD_Command(0x38);DelayXus(5);

Write_LCD_Command(0x0c);DelayXus(5);

Write_LCD_Command(0x06);DelayXus(5);

}

voidSet_LCD_POS(ucharpos)

{

Write_LCD_Command(pos|0x80);

}

voidDelay(uintx)

{

while(--x);

}

ucharInit_DS18B20()//初始化

{

ucharstatus;

DQ=1;

Delay(8);

DQ=0;

Delay(90);

DQ=1;

Delay(8);

status=DQ;

Delay(100);

DQ=1;

returnstatus;

}

ucharReadOneByte()//读一个字节

{

uchari,dat=0;

DQ=1;_nop_();

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

{

DQ=0;

dat>>=1;

DQ=1;

_nop_();_nop_();

if(DQ)

dat|=0X80;

Delay(30);

DQ=1;

}

returndat;

}

voidWriteOneByte(uchardat)//写一个字节

{

uchari;

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

{

DQ=0;

DQ=dat&0x01;

Delay(5);

DQ=1;

dat>>=1;

}

}

voidRead_Temperature()//读取温度

{

if(Init_DS18B20()==1)//DS18B20故障

DS18B20_IS_OK=0;

else

{

WriteOneByte(0xcc);//跳过读取DS18B20的系列号

WriteOneByte(0x44);//启动温度转换

Init_DS18B20();

WriteOneByte(0xcc);//跳过读取DS18B20的系列号

WriteOneByte(0xbe);//读取温度寄存器

Temp_Value[0]=ReadOneByte();//温度低8位

Temp_Value[1]=ReadOneByte();//温度高8位

DS18B20_IS_OK=1;

}

}

voidDisplay_Temperature()//在LCD上显示当前温度

{

uchari;

//延时值和负数标志

uchart=150,ng=0;

//高5位全为1(0XF8)则为负数,为负数时取反加1,并设置负数标识

if((Temp_Value[1]&0xf8)==0xf8)

{

Temp_Value[1]=~Temp_Value[1];

Temp_Value[0]=~Temp_Value[0]+1;

if(Temp_Value[0]==0x00)

Temp_Value[1]++;

ng=1;//负数标识置1

}

//查表得到温度小数部分

Display_Digit[0]=df_Table[Temp_Value[0]&0x0f];

//获取温度整数部分

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 管理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1