DS18B20温度传感器及C51Word格式.docx
《DS18B20温度传感器及C51Word格式.docx》由会员分享,可在线阅读,更多相关《DS18B20温度传感器及C51Word格式.docx(8页珍藏版)》请在冰豆网上搜索。
DS18B20的内部结构
Forpersonaluseonlyinstudyandresearch;
notforcommercialuse
DS18B20内部结构主要由四部分组成:
64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
DS18B20的管脚排列如下:
DQ为数字信号输入/输出端;
GND为电源地;
VDD为外接供电电源输入端(在寄生电源接线方式时接地)。
光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。
64位光刻ROM的排列是:
开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。
光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。
DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:
用16位符号扩展的二进制补码读数形式提供,以0.0625℃/LSB形式表达,其中S为符号位。
这是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。
DS18B20温度传感器的存储器
DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的E2RAM,后者存放高温度和低温度触发器TH、TL和结构寄存器。
暂存存储器包含了8个连续字节,前两个字节是测得的温度信息,第一个字节的内容是温度的低八位,第二个字节是温度的高八位。
第三个和第四个字节是TH、TL的易失性拷贝,第五个字节是结构寄存器的易失性拷贝,这三个字节的内容在每一次上电复位时被刷新。
第六、七、八个字节用于内部计算。
第九个字节是冗余检验字节。
该字节各位的意义如下:
TMR1R011111低五位一直都是1,TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。
在DS18B20出厂时该位被设置为0,用户不要去改动。
R1和R0用来设置分辨率,如下表所示:
(DS18B20出厂时被设置为12位)分辨率设置表:
R1
R0
分辨率
温度最大转换时间
9位
93.75ms
1
10位
187.5ms
11位
375ms
12位
750ms
根据DS18B20的通讯协议,主机控制DS18B20完成温度转换必须经过三个步骤:
每一次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。
复位要求主CPU将数据线下拉500微秒,然后释放,DS18B20收到信号后等待16~60微秒左右,后发出60~240微秒的存在低脉冲,主CPU收到此信号表示复位成功。
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和地线,屏蔽层在源端单点接地。
DS18B20温度传感器C51程序,无CRC2008-06-3011:
18
/*********************************************************DS18B20温度传感器
**
C51
**yajou2008-06-28
无CRC
*********************************************************/
#include"
reg51.h"
intrins.h"
DS18B20.h"
/*********************************************************us延时程序
*********************************************************/voidDelayus(ucharus)
{
while(us--);
//12M,一次6us,加进入退出14us(8M晶振,一次9us)}
/*********************************************************DS18B20初始化
*********************************************************/bitDs18b20_Init(void)//存在返0,否则返1{bittemp=1;
ucharouttime=ReDetectTime;
//超时时间while(outtime--&
&
temp){
Delayus(10);
//(250)1514us时间可以减小吗
ReleaseDQ();
Delay2us();
PullDownDQ();
Delayus(100);
//614us(480-960)
//73us(>
60)
temp=dq;
Delayus(70);
//us}returntemp;
}
/*********************************************************写bit2DS18B20
*********************************************************/voidDs18b20_WriteBit(bitbitdata){if(bitdata){
//2us(>
1us)
//(上述1-15)
Delayus(12);
//86us(45-x,总时间>
60)}else{
//86us(60-120)}ReleaseDQ();
Delay2us();
1us)}
/*********************************************************写ByteDS18B20
*********************************************************/voidDs18b20_WriteByte(ucharchrdata){ucharii;
for(ii=0;
ii<
8;
ii++){
Ds18b20_WriteBit(chrdata&
0x01);
chrdata>
>
=1;
}}
/*********************************************************写DS18B20
*********************************************************///voidDs18b20_Write(uchar*p_readdata,ucharbytes)//{//while(bytes--)//{//
Ds18b20_WriteByte(*p_readdata);
//
p_readdata++;
//}//}
/*********************************************************读bitFromDS18B20
*********************************************************/bitDs18b20_ReadBit(void){bitbitdata;
PullDownDQ();
//2us(>
1us)ReleaseDQ();
Delay8us();
//8us(<
15us)bitdata=dq;
Delayus(7);
//86us(上述总时间要>
60us)returnbitdata;
/*********************************************************读ByteDS18B20
*********************************************************/ucharDs18b20_ReadByte(void){ucharii,chardata;
ii++){
chardata>
if(Ds18b20_ReadBit())chardata|=0x80;
}returnchardata;
/*********************************************************读DS18B20ROM
*********************************************************/bitDs18b20_ReadRom(uchar*p_readdata)//成功返0,失败返1{ucharii=8;
if(Ds18b20_Init())return1;
Ds18b20_WriteByte(ReadROM);
while(ii--){
*p_readdata=Ds18b20_ReadByte();
}return0;
/*********************************************************读DS18B20EE
*********************************************************/bitDs18b20_ReadEE(uchar*p_readdata)//成功返0,失败返1{ucharii=2;
Ds18b20_WriteByte(SkipROM);
Ds18b20_WriteByte(ReadScr);
/*********************************************************温度采集计算
*********************************************************/bitTempCal(float*p_wendu)//成功返0,失败返1(温度范围-55---+128){uchartemp[9],ii;
uinttmp;
floattmpwendu;
TR1=0;
TR0=0;
//读暂存器和CRC值-----------------------if(Ds18b20_ReadEE(temp)){
TR1=1;
TR0=1;
return1;
}//-------------------------------------
//CRC校验------------------------------////此处应加入CRC校验等//////-------------------------------------
//使温度值写入相应的wendu[i]数组中-----for(ii=i;
ii>
0;
ii--){
p_wendu++;
}i++;
if(i>
4)i=0;
//-------------------------------------
//温度正负数处理-----------------------//
//温度计算-----------------------------tmp=temp[1];
//tmp<
<
=8;
//tmp|=temp[0];
//组成温度的两字节合并tmpwendu=tmp;
*p_wendu=tmpwendu/16;
//开始温度转换-------------------------if(Ds18b20_Init()){
}Ds18b20_WriteByte(SkipROM);
Ds18b20_WriteByte(Convert);
ReleaseDQ();
//寄生电源时要拉高DQ//------------------------------------
TR1=1;
TR0=1;
return0;
//////////DS18B20.h/////////////////////////
/*********************************************************I/O口定义
*********************************************************/sbitdq=P1^3;
sbitdv=P1^4;
//DS18B20强上拉电源
/*********************************************************命令字定义
*********************************************************/#defineucharunsignedchar#defineuintunsignedint
#defineReleaseDQ()
dq=1;
//上拉/释放总线#definePullDownDQ()dq=0;
//下拉总线
#defineDelay2us()
_nop_();
_nop_();
//延时2us,每nop1us#defineDelay8us()
//设置重复检测次次数,超出次数则超时#define
ReDetectTime
20
//ds18b20命令#define
SkipROM
0xCC#define
MatchROM
0x55#define
ReadROM
0x33#define
SearchROM
0xF0#define
AlarmSearch0xEC
#define
Convert
0x44#define
WriteScr
0x4E#define
ReadScr
0xBE#define
CopyScr
0x48#define
RecallEE
0xB8#define
ReadPower
0xB4
/*********************************************************函数
*********************************************************/voidDelayus(ucharus);
//voidDog(void);
bitDs18b20_Init(void);
//DS18B20初始化,存在返0,否则返1voidDs18b20_WriteBit(bitbitdata);
//写bit2DS18B20voidDs18b20_WriteByte(ucharchrdata);
//写ByteDS18B20voidDs18b20_Write(uchar*p_readdata,ucharbytes);
//写DS18B20bitDs18b20_ReadBit(void);
//读bitFromDS18B20ucharDs18b20_ReadByte(void);
//读ByteDS18B20bitDs18b20_ReadRom(uchar*p_readdata);
//读DS18B20ROM:
成功返0,失败返1bitDs18b20_ReadEE(uchar*p_readdata);
//读DS18B20EE:
成功返0,失败返1bitTempCal(float*p_wendu);
//成功返0,失败返1(温度范围-55---+128)
仅供个人用于学习、研究;
不得用于商业用途。
notforcommercialuse.
Nurfü
rdenpersö
nlichenfü
rStudien,Forschung,zukommerziellenZweckenverwendetwerden.
Pourl'
é
tudeetlarechercheuniquementà
desfinspersonnelles;
pasà
desfinscommerciales.
толькодлялюдей,которыеиспользуютсядляобучения,исследованийинедолжныиспользоватьсявкоммерческихцелях.
以下无正文