文档库 最新最全的文档下载
当前位置:文档库 › DS18B20的使用方法和注意事项

DS18B20的使用方法和注意事项

DS18B20是美国DALLAS半导体公司继DS1820之后最新推出的一种改进型智能温度传感器。与传统的热敏电阻相比,他能够直接读出被测温度并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。可以分别在93.75 ms和750 ms内完成9位和12位的数字量,并且从DS18B20读出的信息或写入DS18B20的信息仅需要一根口线(单线接口)读写,温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源。因而使用DS18B20可使系统结构更趋简单,可靠性更高。他在测温精度、转换时间、传输距离、分辨率等方面较DS1820有了很大的改进,给用户带来了更方便的使用和更令人满意的效果。
DS18B20简介
(1)独特的单线接口方式:DS18B20与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
(2)在使用中不需要任何外围元件。
(3)可用数据线供电,电压范围:+3.0~ +5.5 V。
(4)测温范围:-55 ~+125 ℃。固有测温分辨率为0.5 ℃。
(5)通过编程可实现9~12位的数字读数方式。
(6)用户可自设定非易失性的报警上下限值。
(7)支持多点组网功能,多个DS18B20可以并联在惟一的三线上,实现多点测温。
(8)负压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。
单线(1—wire)技术
该技术采用单根信号线,既可传输时钟,也能传输数据,而且是双向传输!适用于单主机系统,主机能够控制一个或多个从机设备,通过一个漏极开路或三态端
口连至该数据线,以允许设备在不发送数据时能释放该线,而让其他设备使用。单线通常要求外接一个5K的上拉电阻,这样当该线空闲时!其状态为高电平!
主机和从机之间的通讯分三个步骤:初始化单线器件!识别单线器件和单线数据传输!
单线1—wire协议由复位脉冲,应答脉冲,写0,写1,读0,读1这几种信号类型实现,这些信号中除了应答脉冲其他都由主机发起!并且所有指令和数据字节都是低位在前!

芯片图自己找!!!

NC:1、2、6、7、8脚 空悬空不使用
VDD:可选电源脚,电源电压范围3——5.5V,当工作于寄生电源时,此脚必须接地
DQ:数据输入/输出脚。漏极开路,常态下高电平
GND:地,采用外部电源方式,此脚不可悬空。
DS18B20主要有四个内部部件:64位激光ROM、温度传感器、非易失性温度告警触发器(TH和TL)和配置寄存器。
每个DS18B20都有一个唯一的64位ROM编码!存放于64位激光ROM中!前8位是单线产品的系列编号(DS18B20为28H),接着48位是唯一的产品序列号,最后8位是前 56的CRC校验值!存储器由一个中间结果暂存RA

M和一个非易性电可擦除E2RAM组成!E2RAM存储高低温触发器TH、TL和配置寄存器。暂存存储器的头2个字节为测得温度信息的低位和高位字节:第3、4字节是TH和TL的易失性COPY,在每一次上电复位时都会被刷新!第5字节是配置寄存器的易失性COPY,上电复位也会被刷新!
暂存寄存器:
MSB LSB
0 R1 RO 1 1 1 1 1
0 0 9位 0.5℃ 93.75MS
0 1 10位 0.25℃ 187.50MS
1 0 11位 0.125℃ 375MS
1 1 12位 0.0625℃ 750MS(出厂默认)
温度传感器:
低位字节:
MSB LSB
8 4 2 1 1/2 1/4 1/8 1/16
高位字节
MSB LSB
S S S S S 64 32 16
S=1 表明温度为-
S=0 温度为+
如125℃ 可表示为 00000111 10110000 0X07DOH
如-125℃ 可表示为 11111111 10110000 0XFFDOH
硬件原理为STC89C54RD+的P3.7接DQ,采用20M晶震倍频为40M!DQ接4.7K电阻上拉至正电源!
DS18B20的1-WIRE协议和命令:
初始化:主机通过拉低单线480US以上,产生复位脉冲,然后释放该线,进入Rx接受模式。主机释放总线时,会产生一个上升沿,DS18B20检测到该上升沿后,延时15 —60US,通过拉低总线60—240US来产生应答脉冲。主机收到从机的应答脉冲后,说明有单线器件在线。
ROM操作命令:一旦总线主机检测到应答脉冲,便可以发起ROM操作命令。共有5位ROM操作命令:

1: READ ROM 33H 读取激光ROM64位
2: MATCH ROM 55H 匹配ROM,后跟序列号,只有匹配才能进行操作
3: SKIP ROM CCH 跳过ROM,无需序列号就可以进行内存操作,只适用于单个DS18B20
4: SEARCH ROM FOH 搜索ROM
5: ALARM SEARCH ECH 告警搜索
内存操作命令:只有成功进行ROM操作命令后,才可以使用内存操作命令。共6种内存操作命令:

1:WRITE SCRATCHPAD 4EH 写TH,TL和配置寄存器三个字节
2:READ SCRATCHPAD BEH 读暂存寄存器共9个字节
3:COPY SCRATCHPAD 48H 将暂存器中内容复制进E2ROM中
4:CONVERT T 44H 开始温度转换操作。
5:RECALL E2 B8H 将E2ROM中的内容重新COPY到暂存器中
6:READ POWER SUPPLY B4H 读供电方式 0为寄生电源 1为外部供电方式 本列采用外部供电方式
软件思路为:通过定时器0 10S定时取一次温度;
#include
#include
sbit DQ=P3^7;
unsigned int t=0;
unsigned int tmp;
bit scan_fg=0; //扫描标志
#define DYWAIT {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
void delay_xms(unsigned int count) //延时函数 40M晶震
{
register unsigned ch

ar j;
while (count --)
{
reset_dog;
for (j=0;j<230;j++) DYWAIT;
}
}
void reset() //产生复位脉冲
{
unsigned int i;
DQ=0; //总线拉低
i=200;
while(i>0) i--;
DQ=1; //延时约700US拉高 产生上升沿
i=8;
while(i>0) i--; //延时约60US等待应答脉冲
}
void wait_ack() // 等待应答脉冲
{
unsigned int i;
while(DQ)
while(~DQ) //检测到应答脉冲
i=8;
while(i>0) i--; //延时约60US来产生应答脉冲
}
bit read_bit() // 读一个BIT
{
unsigned int i;
bit fg;
DQ=0;
i++; //保持底至少1US
DQ=1;
i++;i++;i++; //延时约20US,读时隙下降沿后15US,DS18B20输出数据才有效
fg=DQ;
i=16; //读时隙不低于60US
while(i>0) i--;
return (b);
}
unsigned char read_byte()//读一个字节
{
unsigned char i,j;
unsigned char x=0;
for(i=0;i<8;i++)
{
j=read_bit();
x=(j<<7)|(b>>1); //讲读出的BIT填到最高位,原来的值后移一位!循环8次可得到一个BYTE
}
return (x);
}
void write_byte(unsigned char b) //写一个字节
{
unsigned int i;
unsigned char j;
bit tmp;
for(j=0;j<8;j++)
{
tmp=b&0x01; //取最低位BIT
b>>=1; //右移一位第二字节变最低位BIT
if(tmp) //如果为1
{
DQ=0;
i++;i++;i++;
DQ=1;
i=16; //整个写1时隙不低于60US
while(i>0) i--;
}
else //写0
{
DQ=0;
i=16;
while(i>0) i--; //保持低在60-120US之间
DQ=1;
i++;i++;i++;
}
}
void convert() //温度转换
{
reset(); //复位脉冲
wait_ack();//等待应答脉冲
delay_xms(1);
write_byte(0xcc); //写ROM操作命令 SKIP ROM
write_byte(0x44); //开始温度转换
}
unsigned int read_temp(void)//读温度
{
unsigned char tmphigh,tmplow;
reset(); //复位脉冲
wait_ack();//等待应答脉冲
delay_xms(1);
write_byte(0xcc); //写ROM操作命令 SKIP ROM
write_byte(0xbe); //读暂存寄存器
tmplow=read_byte(); //都两字节为温度字节
tmphigh=read_byte();
return ((tmphigh<<8)|(tmplow)); //返回温度值
}
void timer0_int(void) interrupt 1 using 0 //定时器0中断服务函数
{

TR0=0;
TH0=0x7d; //定时器载入10MS中断初值
TL0=0xca;

TR0=1;
t++;
if(t==1000) //如果计数到10S
{
scan_fg=1; //置位扫描标志
t=0; //计数清0
}
}
void main() //入口函数
{
PCON=0X80;
TMOD=0x01; //T0 工作方式1
TH0=0x7d;
TL0=0xca;
ET0=1; //cpu 响应T0中断
EA=1; //开中断
while(1)
{
if(scan_fg)
{

TR0=0;
scan_fg=0;
delay_xms(1);
convert();
delay_xms(1000);
tmp=read_tmp();
}

TR0=1;
}
}


相关文档
相关文档 最新文档