ds18b20温度转换
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2、读时序
3、程序
uchar ds1820rd()//读数据
{
uchar a,b,i,dat = 0,dat1 = 0;
for (i=8;i>0;i--)
{
DQ = 0; //给脉冲信号延时1us
_nop_();
DQ = 1; //给脉冲信号准备读数据
if(DQ)//读判为1为0
{dat|=0x01;}
if(DQ)//读判为1为0
{dat|=0x01;}
else
{dat&=0xfe;}
dat=_cror_(dat,1);
for(b=3;b>0;b--)//60us
for(a=8;a>0;a--);
}
return(dat);
}
teml()//温度转换子程序
{ uint b,t,a;
init_1820();//初始化
init_1820()//1820初始化
{
unsigned char a,b,c;
DQ=1;//复位
DQ=0;//拉低800us
for(c=1;c>0;c--)//延时800us
for(b=2;b>0;b--)
for(a=197;a>0;a--);
DQ=1;//产生一个上升沿,进入等待应答状态
for(b=1;b>0;b--)//延时50us
a=ds1820rd();//读低8位
b=ds1820rd();//读高8位
t=b;
t<<=8;//高八位左移
t=t|a;//高低八位组合
t=t*0.0625;//转换温度值
return(t);
}
display(uint c)//显示子程序
{
SBUF=tab[c%10];
while(TI==0);
TI=0;
2、存储器操作命令
ConvertT[44h]启动温度变换
这条命令启动一次温度转换而无需其他数据。温度转换命令被执行后DS1820白痴等待转换状态。
ReadScratchpad[BEh]读暂存存储器
这个命令读取暂存器的内容。读取从字0开始,一直进行下去,直到第9(字节8,CRC)字节读完
四、流程
初始化
1
0
800us
1
50us
检测0
检测1
nop
nop
写指令
a=数&0x01
a==0
写0
0
60us
1
nop
a==1
写1
0
nop
1
nop
左移数
循环8次
nop
nop
读数据
0
nop
1
nop
读为1 a|=0x01
为0 a&=0xfe
左移a
60us
循环8次
主函数
初始化
写指令0xcc
写指令0x44
初始化
写指令0xcc
4、程序:
init_1820()//1820初始化
{
unsigned char a,b,c;
p23=1;//复位
p23=0;//拉低800us
for(b=2;b>0;b--)
for来自百度文库a=200;a>0;a--);
p23=1;//产生一个上升沿,进入等待应答状态
for(b=1;b>0;b--)//延时50us
else
{dat&=0xfe;}
dat=_cror_(dat,1);
for(b=3;b>0;b--)//延时60us
for(a=8;a>0;a--);
}
return(dat);
}
四、温度准换流程
1、ROM操作命令
SkipROM(“跳过”ROM)[CCh]
在单点总线系统中此命令通过允许总线主机不提供64位ROM编码而访问存储器操作节省时间。(在多于一个的从属器件责不可以使用该命令。)
for(a=25;a>0;a--);
while(p23==1);
while(p23==0);//检测到应答脉冲
}
二、写
Ds18b20的数据读写是通过时间间隙处理和命令来确认信息交换
1、步骤:
1)主机把数据从逻辑高电平拉到低电平,写时间间隙开始(写时间间隙必须最少持续60us,包括两个写周期至少1us的恢复时间。)
SBUF=tab[c/10%10];
while(TI==0);
TI=0;
SBUF=tab[c/100%10];
while(TI==0);
TI=0;
}
main()
{
uint b;
while(1)
{
b=teml();
display(b);
}
}
_nop_();
}
三、读
1、步骤:
1)主机把数据线从高电平拉至低电平时,产生读时间片
2)数据线必须保持低电平至少1us,读1820输出的数据在读时间片后的15us内有效(在读之前必须停止送低电平(也就是送高电平)——低电平1us后直接拉高等待读数据)
3)读时间片的最短持续时间为60us,各个读时间片之间要有最短为1us的恢复时间
//总共拉低至少60us
//或for(b=15;b>0;b--)//60us
//for(a=2;a>0;a--);
DQ=1;//拉高恢复(至少1us)
_nop_();
}
写1:
write1()//写1
{
DQ=0;//拉低(至少1us)
_nop_();
DQ=1;//15us之内送入高电平(其实不用非得15us之内)
for(a=22;a>0;a--);
while(DQ==1);
while(DQ==0);//检测到应答脉冲
_nop_();
_nop_();
}
write0()//写0
{
uchar a,b;
DQ=0;//拉低
for(a=6;a>0;a--);//拉低15us
for(a=21;a>0;a--);//送入0至少45us,DS1820采样,(其实15us就行)
wr18b20(0xcc);//写入跳过序列号命令字Skip Rom
wr18b20(0x44);//写入温度转换命令字Convert T
init_1820();
wr18b20(0xcc);//写入跳过序列号命令字Skip Rom
wr18b20(0xbe);//写入读取数据令字Read Scratchpad
写指令0xbe
a=读数据
b=读数据
b<<=8
t=b|a
t=t*0.0625
显示t
五、源程序
/***********************************************
DS18B20温度显示
温度传感器DQ接p1.1
数码管(用164串口)
************************************************/
2)写1:数据线必须被拉至逻辑低电平(至少1us,不用考虑)然后在从开始的15us内(也就是14us内)拉至到电平,
3、程序
写0:
write0()//写0
{
uchar a,b;
DQ=0;//拉低
for(a=6;a>0;a--);//拉低15us
for(a=21;a>0;a--);//送入0至少45us,DS1820采样,(其实15us就行)
DS18B20
一、初始化
1、步骤:
1)、有总线控制器发出复位脉冲
2)、从机发出存在脉冲。(存在脉冲让总线知道DS15B20在总线上已准备好操作、一旦总线控制器探测到一个存在脉冲,就可以发出ROM命令)
2、初始化过程“复位”和“存在”脉冲
3、过程:
送1复位——送0拉低(800us)——送1产生一个上升沿(50us)——检测低电平——检测高电平
write0();
else
write1();
k=_cror_(k,1);
_nop_();
_nop_();
}
}
uchar ds1820rd()//读数据
{
uchar a,b,i,dat = 0,dat1 = 0;
for (i=8;i>0;i--)
{
DQ = 0; //给脉冲信号0
_nop_();
DQ = 1; //给脉冲信号1
#include<REG52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P1^1;
uchar tab[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};
2)I/O线电平拉低后,DS18B20在一个15us到60us的时候对I/O线采样。如果线上为高电平,就是写1,如果线上是低电平,就是写0
2、写时序图:
1)写0:先把数据线拉低15us,然后在至少保持15us的低电平,进行写0(数据线必须被拉至逻辑低电平且至少保持30us),然后必须拉高恢复(至少1us,不用考虑)。
//总共拉低至少60us
DQ=1;//拉高恢复(至少1us)
_nop_();
}
write1()//写1
{
DQ=0;
_nop_();
DQ=1;
_nop_();
}
wr18b20(uchar k)//写指令
{
uchar i,b;
for(i=0;i<8;i++)
{
b=k&0x01;//取出最低位进行写
if(b==0)
3、程序
uchar ds1820rd()//读数据
{
uchar a,b,i,dat = 0,dat1 = 0;
for (i=8;i>0;i--)
{
DQ = 0; //给脉冲信号延时1us
_nop_();
DQ = 1; //给脉冲信号准备读数据
if(DQ)//读判为1为0
{dat|=0x01;}
if(DQ)//读判为1为0
{dat|=0x01;}
else
{dat&=0xfe;}
dat=_cror_(dat,1);
for(b=3;b>0;b--)//60us
for(a=8;a>0;a--);
}
return(dat);
}
teml()//温度转换子程序
{ uint b,t,a;
init_1820();//初始化
init_1820()//1820初始化
{
unsigned char a,b,c;
DQ=1;//复位
DQ=0;//拉低800us
for(c=1;c>0;c--)//延时800us
for(b=2;b>0;b--)
for(a=197;a>0;a--);
DQ=1;//产生一个上升沿,进入等待应答状态
for(b=1;b>0;b--)//延时50us
a=ds1820rd();//读低8位
b=ds1820rd();//读高8位
t=b;
t<<=8;//高八位左移
t=t|a;//高低八位组合
t=t*0.0625;//转换温度值
return(t);
}
display(uint c)//显示子程序
{
SBUF=tab[c%10];
while(TI==0);
TI=0;
2、存储器操作命令
ConvertT[44h]启动温度变换
这条命令启动一次温度转换而无需其他数据。温度转换命令被执行后DS1820白痴等待转换状态。
ReadScratchpad[BEh]读暂存存储器
这个命令读取暂存器的内容。读取从字0开始,一直进行下去,直到第9(字节8,CRC)字节读完
四、流程
初始化
1
0
800us
1
50us
检测0
检测1
nop
nop
写指令
a=数&0x01
a==0
写0
0
60us
1
nop
a==1
写1
0
nop
1
nop
左移数
循环8次
nop
nop
读数据
0
nop
1
nop
读为1 a|=0x01
为0 a&=0xfe
左移a
60us
循环8次
主函数
初始化
写指令0xcc
写指令0x44
初始化
写指令0xcc
4、程序:
init_1820()//1820初始化
{
unsigned char a,b,c;
p23=1;//复位
p23=0;//拉低800us
for(b=2;b>0;b--)
for来自百度文库a=200;a>0;a--);
p23=1;//产生一个上升沿,进入等待应答状态
for(b=1;b>0;b--)//延时50us
else
{dat&=0xfe;}
dat=_cror_(dat,1);
for(b=3;b>0;b--)//延时60us
for(a=8;a>0;a--);
}
return(dat);
}
四、温度准换流程
1、ROM操作命令
SkipROM(“跳过”ROM)[CCh]
在单点总线系统中此命令通过允许总线主机不提供64位ROM编码而访问存储器操作节省时间。(在多于一个的从属器件责不可以使用该命令。)
for(a=25;a>0;a--);
while(p23==1);
while(p23==0);//检测到应答脉冲
}
二、写
Ds18b20的数据读写是通过时间间隙处理和命令来确认信息交换
1、步骤:
1)主机把数据从逻辑高电平拉到低电平,写时间间隙开始(写时间间隙必须最少持续60us,包括两个写周期至少1us的恢复时间。)
SBUF=tab[c/10%10];
while(TI==0);
TI=0;
SBUF=tab[c/100%10];
while(TI==0);
TI=0;
}
main()
{
uint b;
while(1)
{
b=teml();
display(b);
}
}
_nop_();
}
三、读
1、步骤:
1)主机把数据线从高电平拉至低电平时,产生读时间片
2)数据线必须保持低电平至少1us,读1820输出的数据在读时间片后的15us内有效(在读之前必须停止送低电平(也就是送高电平)——低电平1us后直接拉高等待读数据)
3)读时间片的最短持续时间为60us,各个读时间片之间要有最短为1us的恢复时间
//总共拉低至少60us
//或for(b=15;b>0;b--)//60us
//for(a=2;a>0;a--);
DQ=1;//拉高恢复(至少1us)
_nop_();
}
写1:
write1()//写1
{
DQ=0;//拉低(至少1us)
_nop_();
DQ=1;//15us之内送入高电平(其实不用非得15us之内)
for(a=22;a>0;a--);
while(DQ==1);
while(DQ==0);//检测到应答脉冲
_nop_();
_nop_();
}
write0()//写0
{
uchar a,b;
DQ=0;//拉低
for(a=6;a>0;a--);//拉低15us
for(a=21;a>0;a--);//送入0至少45us,DS1820采样,(其实15us就行)
wr18b20(0xcc);//写入跳过序列号命令字Skip Rom
wr18b20(0x44);//写入温度转换命令字Convert T
init_1820();
wr18b20(0xcc);//写入跳过序列号命令字Skip Rom
wr18b20(0xbe);//写入读取数据令字Read Scratchpad
写指令0xbe
a=读数据
b=读数据
b<<=8
t=b|a
t=t*0.0625
显示t
五、源程序
/***********************************************
DS18B20温度显示
温度传感器DQ接p1.1
数码管(用164串口)
************************************************/
2)写1:数据线必须被拉至逻辑低电平(至少1us,不用考虑)然后在从开始的15us内(也就是14us内)拉至到电平,
3、程序
写0:
write0()//写0
{
uchar a,b;
DQ=0;//拉低
for(a=6;a>0;a--);//拉低15us
for(a=21;a>0;a--);//送入0至少45us,DS1820采样,(其实15us就行)
DS18B20
一、初始化
1、步骤:
1)、有总线控制器发出复位脉冲
2)、从机发出存在脉冲。(存在脉冲让总线知道DS15B20在总线上已准备好操作、一旦总线控制器探测到一个存在脉冲,就可以发出ROM命令)
2、初始化过程“复位”和“存在”脉冲
3、过程:
送1复位——送0拉低(800us)——送1产生一个上升沿(50us)——检测低电平——检测高电平
write0();
else
write1();
k=_cror_(k,1);
_nop_();
_nop_();
}
}
uchar ds1820rd()//读数据
{
uchar a,b,i,dat = 0,dat1 = 0;
for (i=8;i>0;i--)
{
DQ = 0; //给脉冲信号0
_nop_();
DQ = 1; //给脉冲信号1
#include<REG52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P1^1;
uchar tab[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};
2)I/O线电平拉低后,DS18B20在一个15us到60us的时候对I/O线采样。如果线上为高电平,就是写1,如果线上是低电平,就是写0
2、写时序图:
1)写0:先把数据线拉低15us,然后在至少保持15us的低电平,进行写0(数据线必须被拉至逻辑低电平且至少保持30us),然后必须拉高恢复(至少1us,不用考虑)。
//总共拉低至少60us
DQ=1;//拉高恢复(至少1us)
_nop_();
}
write1()//写1
{
DQ=0;
_nop_();
DQ=1;
_nop_();
}
wr18b20(uchar k)//写指令
{
uchar i,b;
for(i=0;i<8;i++)
{
b=k&0x01;//取出最低位进行写
if(b==0)