ds18b20转十进制数.docx

上传人:b****3 文档编号:4682372 上传时间:2023-05-07 格式:DOCX 页数:14 大小:475.79KB
下载 相关 举报
ds18b20转十进制数.docx_第1页
第1页 / 共14页
ds18b20转十进制数.docx_第2页
第2页 / 共14页
ds18b20转十进制数.docx_第3页
第3页 / 共14页
ds18b20转十进制数.docx_第4页
第4页 / 共14页
ds18b20转十进制数.docx_第5页
第5页 / 共14页
ds18b20转十进制数.docx_第6页
第6页 / 共14页
ds18b20转十进制数.docx_第7页
第7页 / 共14页
ds18b20转十进制数.docx_第8页
第8页 / 共14页
ds18b20转十进制数.docx_第9页
第9页 / 共14页
ds18b20转十进制数.docx_第10页
第10页 / 共14页
ds18b20转十进制数.docx_第11页
第11页 / 共14页
ds18b20转十进制数.docx_第12页
第12页 / 共14页
ds18b20转十进制数.docx_第13页
第13页 / 共14页
ds18b20转十进制数.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

ds18b20转十进制数.docx

《ds18b20转十进制数.docx》由会员分享,可在线阅读,更多相关《ds18b20转十进制数.docx(14页珍藏版)》请在冰点文库上搜索。

ds18b20转十进制数.docx

ds18b20转十进制数

DS18B20温度转换

一、初始化

1、步骤:

1)、有总线控制器发出复位脉冲

2)、从机发出存在脉冲。

(存在脉冲让总线知道DS15B20在总线上已准备好操作、一旦总线控制器探测到一个存在脉冲,就可以发出ROM命令)

2、初始化过程“复位”和“存在”脉冲

3、过程:

送1复位——送0拉低(800us)——送1产生一个上升沿(50us)——检测低电平——检测高电平

4、程序:

init_1820()//1820初始化

{

unsignedchara,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

for(a=25;a>0;a--);

while(p23==1);

while(p23==0);//检测到应答脉冲

}

二、写

Ds18b20的数据读写是通过时间间隙处理和命令来确认信息交换

1、步骤:

1)主机把数据从逻辑高电平拉到低电平,写时间间隙开始(写时间间隙必须最少持续60us,包括两个写周期至少1us的恢复时间。

2)I/O线电平拉低后,DS18B20在一个15us到60us的时候对I/O线采样。

如果线上为高电平,就是写1,如果线上是低电平,就是写0

2、写时序图:

1)写0:

先把数据线拉低15us,然后在至少保持15us的低电平,进行写0(数据线必须被拉至逻辑低电平且至少保持30us),然后必须拉高恢复(至少1us,不用考虑)。

2)写1:

数据线必须被拉至逻辑低电平(至少1us,不用考虑)然后在从开始的15us内(也就是14us内)拉至到电平,

3、程序

写0:

write0()//写0

{

uchara,b;

DQ=0;//拉低

for(a=6;a>0;a--);//拉低15us

for(a=21;a>0;a--);//送入0至少45us,DS1820采样,(其实15us就行)

//总共拉低至少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之内)

_nop_();

}

三、读

1、步骤:

1)主机把数据线从高电平拉至低电平时,产生读时间片

2)数据线必须保持低电平至少1us,读1820输出的数据在读时间片后的15us内有效(在读之前必须停止送低电平(也就是送高电平)——低电平1us后直接拉高等待读数据)

3)读时间片的最短持续时间为60us,各个读时间片之间要有最短为1us的恢复时间

2、读时序

3、程序

uchards1820rd()//读数据

{

uchara,b,i,dat=0,dat1=0;

for(i=8;i>0;i--)

{

DQ=0;//给脉冲信号延时1us

_nop_();

DQ=1;//给脉冲信号准备读数据

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);

}

四、温度准换流程

1、ROM操作命令

SkipROM(“跳过”ROM)[CCh]

在单点总线系统中此命令通过允许总线主机不提供64位ROM编码而访问存储器操作节省时间。

(在多于一个的从属器件责不可以使用该命令。

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

读为1a|=0x01

为0a&=0xfe

左移a

60us

循环8次

主函数

初始化

写指令0xcc

写指令0x44

初始化

写指令0xcc

写指令0xbe

a=读数据

b=读数据

b<<=8

t=b|a

t=t*0.0625

显示t

五、源程序

/***********************************************

DS18B20温度显示

温度传感器DQ接p1.1

数码管(用164串口)

 

************************************************/

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitDQ=P1^1;

uchartab[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};

init_1820()//1820初始化

{

unsignedchara,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

for(a=22;a>0;a--);

while(DQ==1);

while(DQ==0);//检测到应答脉冲

_nop_();

_nop_();

}

write0()//写0

{

uchara,b;

DQ=0;//拉低

for(a=6;a>0;a--);//拉低15us

for(a=21;a>0;a--);//送入0至少45us,DS1820采样,(其实15us就行)

//总共拉低至少60us

DQ=1;//拉高恢复(至少1us)

_nop_();

}

write1()//写1

{

DQ=0;

_nop_();

DQ=1;

_nop_();

}

wr18b20(uchark)//写指令

{

uchari,b;

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

{

b=k&0x01;//取出最低位进行写

if(b==0)

write0();

else

write1();

k=_cror_(k,1);

_nop_();

_nop_();

}

}

uchards1820rd()//读数据

{

uchara,b,i,dat=0,dat1=0;

for(i=8;i>0;i--)

{

DQ=0;//给脉冲信号0

_nop_();

DQ=1;//给脉冲信号1

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()//温度转换子程序

{uintb,t,a;

init_1820();//初始化

wr18b20(0xcc);//写入跳过序列号命令字SkipRom

wr18b20(0x44);//写入温度转换命令字ConvertT

init_1820();

wr18b20(0xcc);//写入跳过序列号命令字SkipRom

wr18b20(0xbe);//写入读取数据令字ReadScratchpad

a=ds1820rd();//读低8位

b=ds1820rd();//读高8位

t=b;

t<<=8;//高八位左移

t=t|a;//高低八位组合

t=t*0.0625;//转换温度值

return(t);

}

display(uintc)//显示子程序

{

SBUF=tab[c%10];

while(TI==0);

TI=0;

SBUF=tab[c/10%10];

while(TI==0);

TI=0;

SBUF=tab[c/100%10];

while(TI==0);

TI=0;

}

main()

{

uintb;

while

(1)

{

b=teml();

display(b);

}

}

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

当前位置:首页 > 工作范文 > 行政公文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2