DS18B20的报告附带程序Word下载.docx

上传人:b****2 文档编号:14755779 上传时间:2022-10-24 格式:DOCX 页数:11 大小:123.28KB
下载 相关 举报
DS18B20的报告附带程序Word下载.docx_第1页
第1页 / 共11页
DS18B20的报告附带程序Word下载.docx_第2页
第2页 / 共11页
DS18B20的报告附带程序Word下载.docx_第3页
第3页 / 共11页
DS18B20的报告附带程序Word下载.docx_第4页
第4页 / 共11页
DS18B20的报告附带程序Word下载.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

DS18B20的报告附带程序Word下载.docx

《DS18B20的报告附带程序Word下载.docx》由会员分享,可在线阅读,更多相关《DS18B20的报告附带程序Word下载.docx(11页珍藏版)》请在冰豆网上搜索。

DS18B20的报告附带程序Word下载.docx

主要包括:

寄生电源,温度传感器,64位ROM和单总线接口,存放中间数据的高速暂存器RAM,用于存储用户设定温度上下限值的TH和TL触发器,存储与控制逻辑,8位循环冗余校验码(CRC)发生器等7部分。

图1.1.3

64位闪速ROM的结构如下:

8bit检验CRC

48bit序列号

8bit工厂代码(10H)

MSBLSBMSBLSBMSBLSB

开始8位是产品类型的编号,接着共有48位是DS18B20唯一的序列号。

最后8位是前面56位的CRC检验码,这也是多个DS18B20可以采用一线进行通信的原因。

高速暂存存储器:

高速暂存存储器由9个字节组成,其分配如图所示。

高速暂存存储器

字节0~1温度寄存器

当DS18B20接收到温度转换命令后,开始启动转换。

转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1,2字节。

单片机可通过单线接口读到该数据,读取时低位在前,高位在后。

温度值格式如下图:

DS18B20的温度操作是使用16位,也就是说分辨率是0.0625。

BIT15~BIT11是符号位,为了就是表示转换的值是正数还是负数。

DS18B20温度传感器主要用于对温度进行测量,数据可用16位符号扩展的二进制补码读数形式提供,并以0.0625℃/LSB形式表示。

表2是部分温度值对应的二进制温度表示数据。

DS18B20温度与表示值对应表

字节2~3:

TH和TL配置

TH与TL就是所谓的温度最高界限,和温度最低界限的配置。

字节4:

配置寄存器

R1与R0位组合了四个不同的转换精度,00为9位转换精度而转换时间是93.75ms,01为10位转换精度而转换时间是187.5ms,10为11位转换精度而转换时间是375ms,11为12位转换精度而转换时间是750ms(默认)。

DS18B20时序图:

DS18B20的复位时序如下:

1.单片机拉低总线480us~950us,然后释放总线(拉高电平)。

2.这时DS18B20会拉低信号,大约60~240us表示应答。

3.DS18B20拉低电平的60~240us之间,单片机读取总线的电平,如果是低电平,那么表示复位成功。

4.DS18B20拉低电平60~240us之后,会释放总线。

DS18B20读写时序:

DS18B20写逻辑0的步骤如下:

1.单片机拉低电平大约10~15us,。

2.单片机持续拉低电平大约20~45us的时间。

3.释放总线

DS18B20写逻辑1的步骤如下:

2.单片机拉高电平大约20~45us的时间。

DS18B20读逻辑0的步骤如下:

1.在读取的时候单片机拉低电平大约1us

2.单片机释放总线,然后读取总线电平。

3.这时候DS18B20会拉低电平。

4.读取电平过后,延迟大约40~45微妙

DS18B20读逻辑1的步骤如下:

3.这时候DS18B20会拉高电平。

DS18B20温度计C程序

//使用AT89s52单片机,12MHZ晶振,用共阳LED数码管

//P0口输出段码,P2口扫描

//#pragmasrc(d:

\aa.asm)

#include"

reg51.h"

intrins.h"

//_nop_();

延时函数用

#defineDisdataP0//段码输出口

#definediscanP2//扫描口

#defineucharunsignedchar

#defineuintunsignedint

sbitDQ=P3^7;

//温度输入口

sbitDIN=P0^7;

//LED小数点控制

uinth;

//

//*******温度小数部分用查表法**********//

ucharcodeditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};

ucharcodedis_7[12]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0xbf};

/*共阳LED段码表"

0"

"

1"

2"

3"

4"

5"

6"

7"

8"

9"

不亮"

-"

*/

ucharcodescan_con[4]={0xef,0xdf,0xbf,0x7f};

//列扫描控制字

uchardatatemp_data[2]={0x00,0x00};

//读出温度暂放

uchardatadisplay[5]={0x00,0x00,0x00,0x00,0x00};

//显示单元数据,共4个数据,一个运算暂存用

/***********11微秒延时函数**********/

voiddelay(uintt)

{

for(;

t>

0;

t--);

}

/***********显示扫描函数**********/

scan()

chark;

for(k=0;

k<

4;

k++)//四位LED扫描控制

{

Disdata=dis_7[display[k]];

if(k==1){DIN=0;

discan=scan_con[k];

delay(90);

discan=0xff;

}

/***********18B20复位函数**********/

ow_reset(void)

charpresence=1;

while(presence)

DQ=1;

_nop_();

DQ=0;

//

delay(50);

//550us

//

delay(6);

//66us

presence=DQ;

//presence=0继续下一步

delay(45);

//延时500us

presence=~DQ;

DQ=1;

}

/**********18B20写命令函数*********/

//向1-WIRE总线上写一个字节

voidwrite_byte(ucharval)

uchari;

for(i=8;

i>

i--)//

DQ=0;

//5us

DQ=val&

0x01;

//最低位移出

delay(6);

//66us

val=val/2;

//右移一位

DQ=1;

delay

(1);

/*********18B20读1个字节函数********/

//从总线上读取一个字节

ucharread_byte(void)

ucharvalue=0;

i>

i--)

value>

>

=1;

//4us

//4us

if(DQ)value|=0x80;

return(value);

/***********读出温度函数**********/

read_temp()

ow_reset();

//总线复位

write_byte(0xCC);

//发SkipROM命令

write_byte(0xBE);

//发读命令

temp_data[0]=read_byte();

//温度低8位

temp_data[1]=read_byte();

//温度高8位

//SkipROM

write_byte(0x44);

//发转换命令

/***********温度数据处理函数**********/

work_temp()

ucharn=0;

if(temp_data[1]>

127)

{temp_data[1]=(256-temp_data[1]);

temp_data[0]=(256-temp_data[0]);

n=1;

}//负温度求补码

display[4]=temp_data[0]&

0x0f;

display[0]=ditab[display[4]];

display[4]=((temp_data[0]&

0xf0)>

4)|((temp_data[1]&

0x0f)<

<

4);

display[3]=display[4]/100;

display[1]=display[4]%100;

display[2]=display[1]/10;

display[1]=display[1]%10;

if(!

display[3]){display[3]=0x0A;

display[2]){display[2]=0x0A;

}}//最高位为0时都不显示

if(n){display[3]=0x0B;

}//负温度时最高位显示"

//

/**************主函数****************/

main()

Disdata=0xff;

//初始化端口

for(h=0;

h<

h++){display[h]=8;

}//开机显示8888

//开机先转换一次

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

当前位置:首页 > 外语学习 > 日语学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1