DS18B20实验箱创新实训Word格式文档下载.docx
《DS18B20实验箱创新实训Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《DS18B20实验箱创新实训Word格式文档下载.docx(14页珍藏版)》请在冰豆网上搜索。
他在测温精度、转换时间、传输距离、分辨率等方面较DS1820有了很大的改进,给用户带来了更方便的使用和更令人满意的效果。
1.DS18B20的主要性能:
(1)独特的单线接口方式:
DS18B20与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
(2)在使用中不需要任何外围元件。
(3)可用数据线供电,电压范围:
+3.0~+5.5V。
(4)测温范围:
-55~+125℃。
固有测温分辨率为0.5℃。
(5)通过编程可实现9~12位的数字读数方式。
(6)用户可自设定非易失性的报警上下限值。
(7)支持多点组网功能,多个DS18B20可以并联在惟一的三线上,实现多点测温。
(8)负压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。
图2-3DS18B20的引脚排列
2.DS18B20引脚定义:
(1)DQ为数字信号输入/输出端;
(2)GND为电源地;
(3)VDD为外接供电电源输入端(在寄生电源接线方式时接地)。
3.内部结构图
4.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为符号位。
表1:
DS18B20温度值格式表
这是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。
表2:
DS18B20温度数据表
(3)DS18B20温度传感器的存储器
DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的EEPRAM,后者存放高温度和低温度触发器TH、TL和结构寄存器。
(4)配置寄存器
该字节各位的意义如下:
表3:
配置寄存器结构
TM
R1
R0
1
低五位一直都是"
1"
,TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。
在DS18B20出厂时该位被设置为0,用户不要去改动。
R1和R0用来设置分辨率,如下表所示:
(DS18B20出厂时被设置为12位)
表4:
温度分辨率设置表
分辨率
温度最大转换时间
9位
93.75ms
10位
187.5ms
11位
375ms
12位
750ms
5.高速暂存存储器:
高速暂存存储器由9个字节组成,其分配如表5所示。
当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。
单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式如表1所示。
对应的温度计算:
当符号位S=0时,直接将二进制位转换为十进制;
当S=1时,先将补码变为原码,再计算十进制值。
表?
2是对应的一部分温度值。
第九个字节是冗余检验字节。
表5:
DS18B20暂存寄存器分布
寄存器内容
字节地址
温度值低位(LSByte)
温度值高位(MSByte)
高温限值(TH)
2
低温限值(TL)
3
配置寄存器
4
保留
5
6
7
CRC校验值
8
6.芯片指令:
根据DS18B20的通讯协议,主机(单片机)控制DS18B20完成温度转换必须经过三个步骤:
每一次读写之前都要对DS18B20进行复位操作,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。
复位要求主CPU将数据线下拉500微秒,然后释放,当DS18B20收到信号后等待16~60微秒左右,后发出60~240微秒的存在低脉冲,主CPU收到此信号表示复位成功。
表6:
ROM指令表
指令
约定代码
功能
读ROM
33H
读DS1820温度传感器ROM中的编码(即64位地址)
符合ROM
55H
发出此命令之后,接着发出64位ROM编码,访问单总线上与该编码相对应的DS1820使之作出响应,为下一步对该DS1820的读写作准备。
搜索ROM
0FOH
用于确定挂接在同一总线上DS1820的个数和识别64位ROM地址。
为操作各器件作好准备。
跳过ROM
0CCH
忽略64位ROM地址,直接向DS1820发温度变换命令。
适用于单片工作。
告警搜索命令
0ECH
执行后只有温度超过设定值上限或下限的片子才做出响应。
表7:
RAM指令表
温度变换
44H
启动DS1820进行温度转换,12位转换时最长为750ms(9位为93.75ms)。
结果存入内部9字节RAM中。
读暂存器
0BEH
读内部RAM中9字节的内容
写暂存器
4EH
发出向内部RAM的3、4字节写上、下限温度数据命令,紧跟该命令之后,是传送两字节的数据。
Writesthreebytestoscratchpad(TH,TL,andconfig).
复制暂存器
48H
将RAM中第3、4字节的内容复制到EEPROM中。
重调EEPROM
0B8H
将EEPROM中内容恢复到RAM中的第3、4字节。
读供电方式
0B4H
读DS1820的供电模式。
寄生供电时DS1820发送“0”,外接电源供电DS1820发送“1”。
5.控制时序:
复位时序
读写时序
详细读操作时序
四、软件设计
1.程序流程图
2.程序代码:
程序:
/******************************************
************DS18B20温度传感器*************
******************************************/
#include<
reg52.h>
intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
uchartplsb,tpmsb;
//温度值低位、高位字节
sbitDQ=P3^7;
//数据通信线DQ
/*延时t毫秒*/
voiddelay(uintt)
{
uinti;
while(t--)
{
/*对于11.0592MHZ的时钟,约延时1ms*/
for(i=0;
i<
125;
i++)
{;
}
}
}
/*产生复位脉冲初始化DS18B20*/
voidTxReset(void)
DQ=0;
/*拉低约900us*/
i=100;
while(i>
0)i--;
DQ=1;
//产生上升沿
i=4;
/*等待应答脉冲*/
voidRxWait(void)
while(DQ);
while(~DQ);
//检测到应答脉冲
/*读取数据的一位,满足读时隙要求*/
bitRdBit(void)
bitb;
i++;
i++;
//延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效
b=DQ;
i=8;
while(i>
return(b);
/*读取数据的一个字节*/
ucharRdByte(void)
uchari,j,b;
b=0;
for(i=1;
=8;
j=RdBit();
b=(j<
<
7)|(b>
>
1);
return(b);
/*写数据的一个字节,满足写1和写0的时隙要求*/
voidWrByte(ucharb)
ucharj;
bitbtmp;
for(j=1;
j<
j++)
btmp=b&
0x01;
b=b>
1;
//取下一位(由低位向高位)
if(btmp)
{
/*写1*/
DQ=0;
i++;
//延时,使得15us以内拉高
DQ=1;
i=8;
while(i>
//整个写1时隙不低于60us
}
else
/*写0*/
//保持低在60us到120us之间
/*启动温度转换*/
voidconvert(void)
TxReset();
//产生复位脉冲,初始化DS18B20
RxWait();
//等待DS18B20给出应答脉冲
delay
(1);
//延时
WrByte(0xcc);
//skiprom命令
WrByte(0x44);
//convertT命令
/*读取温度值*/
voidRdTemp(void)
//产生复位脉冲,初始化DS18B20
WrByte(0xbe);
//readscratchpad命令
tplsb=RdByte();
//温度值低位字节(其中低4位为二进制的“小数”部分)
tpmsb=RdByte();
//高位值高位字节(其中高5位为符号位)
/*主程序,读取的温度值最终存放在tplsb和tpmsb变量中。
tplsb其中低4位为二进制的“小数”部分;
tpmsb其中高
5位为符号位。
真正通过数码管输出时,需要进行到十进
制有符号实数(包括小数部分)的转换。
*/
voidmain(void)
do
{
delay
(1);
//延时1ms
convert();
//启动温度转换,需要750ms
delay(1000);
//延时1s
RdTemp();
//读取温度
while
(1);