完整word版DS18B20与LCD1602结合显示温度.docx

上传人:b****3 文档编号:6669448 上传时间:2023-05-10 格式:DOCX 页数:18 大小:209.65KB
下载 相关 举报
完整word版DS18B20与LCD1602结合显示温度.docx_第1页
第1页 / 共18页
完整word版DS18B20与LCD1602结合显示温度.docx_第2页
第2页 / 共18页
完整word版DS18B20与LCD1602结合显示温度.docx_第3页
第3页 / 共18页
完整word版DS18B20与LCD1602结合显示温度.docx_第4页
第4页 / 共18页
完整word版DS18B20与LCD1602结合显示温度.docx_第5页
第5页 / 共18页
完整word版DS18B20与LCD1602结合显示温度.docx_第6页
第6页 / 共18页
完整word版DS18B20与LCD1602结合显示温度.docx_第7页
第7页 / 共18页
完整word版DS18B20与LCD1602结合显示温度.docx_第8页
第8页 / 共18页
完整word版DS18B20与LCD1602结合显示温度.docx_第9页
第9页 / 共18页
完整word版DS18B20与LCD1602结合显示温度.docx_第10页
第10页 / 共18页
完整word版DS18B20与LCD1602结合显示温度.docx_第11页
第11页 / 共18页
完整word版DS18B20与LCD1602结合显示温度.docx_第12页
第12页 / 共18页
完整word版DS18B20与LCD1602结合显示温度.docx_第13页
第13页 / 共18页
完整word版DS18B20与LCD1602结合显示温度.docx_第14页
第14页 / 共18页
完整word版DS18B20与LCD1602结合显示温度.docx_第15页
第15页 / 共18页
完整word版DS18B20与LCD1602结合显示温度.docx_第16页
第16页 / 共18页
完整word版DS18B20与LCD1602结合显示温度.docx_第17页
第17页 / 共18页
完整word版DS18B20与LCD1602结合显示温度.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

完整word版DS18B20与LCD1602结合显示温度.docx

《完整word版DS18B20与LCD1602结合显示温度.docx》由会员分享,可在线阅读,更多相关《完整word版DS18B20与LCD1602结合显示温度.docx(18页珍藏版)》请在冰点文库上搜索。

完整word版DS18B20与LCD1602结合显示温度.docx

完整word版DS18B20与LCD1602结合显示温度

DS18B20

一、DS18B20的外形及其与单片机的连接图

(a)(b)

图1

DS18B20是Dallas公司生产的1-Wire接口数字温度传感器,其外形如图1(a)所示,有三个引脚,分别为:

电源地1(GND); 数字信号输入/输出端2(DQ);外接供电电源输入端3(VDD,在寄生电源接线方式时接地)。

它是一种单总线数字温度传感器,所有的数据交换和控制都通过这根数据线来完成。

测试温度范围-55℃—125℃,温度数据位可配置为9、10、11、12位,对应的刻度值分别为0.5℃、0。

25℃、0.125℃、0。

0625℃,对应的最长转换时间分别为93.75ms、187。

5ms、375ms、750ms。

出厂默认配置为12位数据,刻度值为0.0625℃,最长转换时间为750ms。

从以上数据可以看出,DS18B20数据位越低、转换时间越短、反应越快、精度越低。

 单总线没有时钟线,只有一根通信线,其读写数据是靠控制起始时间和采样时间来完成,所以时序要求很严格。

图1(a)为DS18B20与单片机的连接电路图,它的数据线通常要求外接一个4.7K

—10K

的上拉电阻(该电阻画原理图时靠近单片机画故没有显示出来),故其闲置时状态位高电平。

提示:

DS18B20外形酷似三极管,分辨引脚时,面对着扁平的那一面,左负右正,一旦接反就会立刻发热,甚至有可能烧毁.

二、DS18B20存储器结构

DS18B20的内部有64位的ROM单元,和9字节的暂存器单元。

1、64位(激)光刻只读存储器 

每只DS18B20都有一个唯一存储在ROM中的64位编码(跟人的身份证号类似,一人一个身份证号),这是出厂时被光刻好的。

最前面8位是单线系列编码:

28h。

接着的48位是一个唯一的序列号.最后8位是以上56位的CRC编码.64—位的光刻ROM又包括5个ROM的功能命令:

读ROM,匹配ROM,跳跃ROM,查找ROM和报警查找。

ROM的作用是使每个DS18B20各不相同,这样就可以实现一根总线上挂接多个DS18B20以实现多点监测.

2、9字节的暂存器单元

表1

DS18B20的暂存器单元如表1所示,各部分介绍如下。

1)、温度传感器

图2

暂存器的第0(LSB)字节,第1(MSB)字节为DS18B20的温度传感器,它们负责保存对温度的测量结果,用16位二进制提供,格式如图2所示。

DS18B20读取温度时共读取16位,前5个位(MSB的高5位)为符号位,当前5位为1时,读取的温度为负数;当前5位为0时,读取的温度为正。

温度为正时读取方法为:

将16进制数转换成10进制即可。

温度为负时读取方法为(实际就是取补码):

将16进制取反后加1,再转换成10进制。

例:

0550H=+85度,FC90H=—55度,0191H为25.0625度。

LSB的低四位用于表示测量值中小数点后的数值.

2)、非挥发的温度报警触发器TH和TL

位于第2和第3字节,用于写入温度报警值,实际上就是设定温度的最高和最低界限。

3)、配置寄存器

配置寄存器位于存储器的第4字节,其组织如图3所示。

配置寄存器的0~4位和7位被器件保留,禁止写入;在读回数据时全部为逻辑1。

R1和R0用于设置DS18B20的精度,具体如表2所示。

图3

表2

4)、CRC发生器 

CRC字节作为DS18B2064位ROM的一部分存储在存储器中。

CRC码由ROM的前56位计算得到,被包含在ROM的重要字节当中。

CRC由存储在存储器中的数据计算得到,因此当存储器中的数据发生改变时,CRC的值也随之改变.  

CRC能够在总线控制器读取DS18B20时进行数据校验。

为校验数据是否被正确读取,总线控制器必须用接受到的数据计算出一个CRC值,和存储在DS18B20的64位ROM中的值(读ROM时)或DS18B20内部计算出的8位CRC值(读存储器时)进行比较.如果计算得到的CRC值和读取出来的CRC值相吻合,数据被无错传输。

CRC值的比较以及是否进行下一步操作完全由总线控制器决定.当在DS18B20中存储的或由其计算到CRC值和总线控制器计算的值不相符时,DS18B20内部并没有一个能阻止命令序列进行的电路.  

CRC的计算等式如下:

 

CRC = X8 + X5 + X4 + 1  

单总线CRC可以由一个由移位寄存器和XOR门构成的多项式发生器来产生.这个回路包括一个移位寄存器和几个XOR门,移位寄存器的各位都被初始化为0.从ROM中的最低有效位或暂存器中的位0开始,一次一位移入寄存器。

在传输了56位ROM中的数据或移入了暂存器的位7后,移位寄存器中就存储了CRC值.下一步,CRC的值必须被循环移入.此时,如果计算得到的CRC是正确的,移位寄存器将复0。

其他字节保留用,不需要看.

三、关于单总线系统  

单总线系统包括一个总线控制器和一个或多个从机.DS18B20总是充当从机。

当只有一只从机挂在总线上时,系统被称为“单点”系统;如果由多只从机挂在总线上,系统被称为“多点”。

  所有的数据和指令的传递都是从最低有效位开始通过单总线。

单总线需要一个约5KΩ的外部上拉电阻;单总线的空闲状态是高电平.无论任何理由需要暂停某一执行过程时,如果还想恢复执行的话,总线必须停留在空闲状态。

在恢复期间,如果单总线处于非活动(高电平)状态,位与位间的恢复时间可以无限长。

如果总线停留在低电平超过480us,总线上的所有器件都将被复位。

四、操作流程

1.DS18B20复位.

2。

执行ROM指令.就是访问,搜索,匹配每个DS18B20独有的64位序列号。

实验板上只连有一个DS18B20,故不需识别,也就是不需读出此序列号,写代码时直接写命令0xcc跳过.

3.执行DS18B20功能指令(RAM指令,就是读写暂存器指令)。

DS18B20的功能指令很多,比较常用的有两个:

0x44:

开始转换温度。

转换好的温度会储存到暂存器字节0和1。

0xBE:

读暂存指令。

读暂存指令,会从暂存器0到9,一个一个字节读取,如果要停止

的话,必须写下DS18B20复位。

ROM指令和RAM指令的具体情况见表3.

表3

五、读写DS18B20的时序

1、DS18B20的复位时序:

1)。

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

2)。

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

3)。

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

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

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

复位:

主机t0时刻发送一复位脉冲(最短为480us的低电平信号),接着在t1时刻释放总线(

拉高总线电平)进入接收状态.DS18B20在检测到总线的上升沿之后等待15~60us。

接着DS18B20在t2时刻发出存在脉冲(持续60~240us的低电平)

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

voidDS18B20_Reset()

{

DQ=1;

_nop_();

DQ=0;//拉低总线

delay2us(280);//持续280*2+5=565s

DQ=1;//释放总线

while(DQ);//等待应答(电平拉低)

while(!

DQ);//应答电平大约持续60~240us后重新拉高总线

}

2、读时序:

1)。

在读取的时候单片机拉低电平大约1us;2)。

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

3).这时候DS18B20会拉低电平(0)或拉高电平

(1)。

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

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

读字节:

主机总线t0时刻从高拉至低电平时,总线只须保持低电平l.7us。

之后在t1时刻将总线拉高产生读时间隙,读时间隙在t1时刻后t2时刻前有效。

t2距t0为15us,也就是说t2时刻前主机必须完成读位,并在t0后的60us—120us

内释放总线。

注意读的时候从最低位向最高位读。

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

ucharDS18B20_Read_Byte()

{

uchari,temp=0;

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

{

temp=temp〉〉1;

DQ=0;//主机将总线拉至低电平,只需保持1.7us

_nop_();//保持一个时钟周期,也即1us

DQ=1;

delay2us

(1);//延时7us,一般读数在后半段读

if(DQ)

temp=temp|0x80;

delay2us

(2);//这里延时45us+前面7us+1us=53us,接近60us

returntemp;

}

3、写时序:

1)。

单片机拉低电平大约10~15us;2)。

单片机持续拉低电平(0)或拉高电平

(1)大约20~45us的时间;3).释放总线。

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

写字节:

当主机总线t0时刻从高拉至低电平时就产生写时间隙。

从to时刻开始

15us之内应将所需写的位送到总线上,在随后15—60us间DS18B20对总线采样若

低电平写入的位是0;若高电平写入的位是1,连续写2位间的间隙应大于1us。

注意:

无论读写都是从最低位开始。

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

voidDS18B20_Write_Byte(uchardat)

uchari;

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

{

DQ=0;//直接拉到低电平即可产生写时间隙。

DQ=dat&0x01;//从最低位依次传输

delay2us(25);//在15us之内将需写的位送到总线上。

然后等待总线采样

//此处至少延时60us

DQ=1;//释放总线

_nop_();

dat=dat>〉1;

}

4、读取温度流程

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

读温度:

流程:

复位——写命令(跳过读序列号,单个DS18B20时用)-—启动温度转换

—-等待转换完成(完成总线会跳回高电平)--复位—-写命令(跳过ROM编码命令)—-

读取暂存寄存器字节命令——-读低字节—-—读高字节—-复位——合并高低字节—-判断

正负

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

DS18B20_Read_Temperature()

uchartemp_low,temp_high;

DS18B20_Reset();

DS18B20_Write_Byte(0xcc);

DS18B20_Write_Byte(0x44);

while(!

DQ);//等待转换完成

DS18B20_Reset();

DS18B20_Write_Byte(0xcc);

DS18B20_Write_Byte(0xbe);

temp_low=DS18B20_Read_Byte();

temp_high=DS18B20_Read_Byte();

DS18B20_Reset();

tvalue=temp_high;

tvalue=(tvalue〈<8)|temp_low;

if(tvalue<0x0fff)

tflag=0;

else

{

tvalue=~tvalue+1;//因为最高位的前五位是1,所以寄存器存的是温度的补码(补码要取反加一得到二进制数)

tflag=1;

tvalue=tvalue*(0。

625);//温度值扩大10倍,精确到1位小数

return(tvalue);

例子:

DS18B20+1602

#include〈reg52。

h〉

#include〈INTRINS.H〉

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitDQ=P2^3;//ds18b20与单片机连接口

sbitRS=P2^6;

sbitRW=P2^7;

sbitE=P2^5;

unsignedcharcodestr1[]={"temperature:

”};

unsignedcharcodestr2[]={”"};

uchardatadisdata[5];

uinttvalue;//温度值

uchartflag;//温度正负标志

/*************************lcd1602程序**************************/

//声明调用函数

voidLcd_W_Cmd(ucharcom);

voidLcd_W_Dat(uchardat);

ucharLcd_R_Busy();

voidLcd_Init();

voiddelay(uchart);

voiddelay_4_nop();

/**************************延时*******************************/

#definedelay_4_nop(){_nop_();_nop_();_nop_();_nop_();}

voiddelay(uchart)

{

uchari,j;

for(i=0;i〈t;i++)

for(j=0;j<50;j++);

voidLcd_Init()

{

uchari;

Lcd_W_Cmd(0x3c);

Lcd_W_Cmd(0x0e);

Lcd_W_Cmd(0x01);

Lcd_W_Cmd(0x06);

Lcd_W_Cmd(0x80);

for(i=0;i

{

Lcd_W_Dat(str1[i]);

Lcd_W_Cmd(0xC0);

for(i=0;i〈strlen(str2);i++)

Lcd_W_Dat(str2[i]);

}

ucharLcd_R_Busy()

{

uchars;

RW=1;

delay_4_nop();

RS=0;

delay_4_nop();

E=1;

delay_4_nop();

s=P0;

delay_4_nop();

E=0;

return(s);

}

voidLcd_W_Cmd(ucharcom)

uchari;

do

i=Lcd_R_Busy();

i=i&0x80;

delay

(2);

}while(i!

=0);

RW=0;

delay_4_nop();

RS=0;

delay_4_nop();

E=1;

delay_4_nop();

P0=com;

delay_4_nop();

E=0;

voidLcd_W_Dat(uchardat)

uchari;

do

{

i=Lcd_R_Busy();

i=i&0x80;

delay

(2);

}while(i!

=0);

RW=0;

delay_4_nop();

RS=1;

delay_4_nop();

E=1;

delay_4_nop();

P0=dat;

delay_4_nop();

E=0;

}

/******************************ds1820程序***************************************/

voiddelay2us(unsignedinti)//延时1微秒

while(-—i);

}

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

牛人实测,本人没有做过试验。

针对的是12Mhz的晶振

delay(0):

延时518us误差:

518-2*256=6

delay

(1):

延时7us(原帖写”5us"是错的)

delay(10):

延时25us误差:

25-20=5

delay(20):

延时45us误差:

45—40=5

delay(100):

延时205us误差:

205—200=5

delay(200):

延时405us误差:

405—400=5

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

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

复位:

主机t0时刻发送一复位脉冲(最短为480us的低电平信号),接着在t1时刻释放总线(

拉高总线电平)进入接收状态.DS18B20在检测到总线的上升沿之后等待15~60us.接着DS18B20

在t2时刻发出存在脉冲(持续60~240us的低电平)

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

voidDS18B20_Reset()

{

DQ=1;

_nop_();

DQ=0;//拉低总线

delay2us(280);//持续280*2+5=565s

DQ=1;//释放总线

while(DQ);//等待应答(电平拉低)

while(!

DQ);//应答电平大约持续60~240us后重新拉高总线

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

读字节:

主机总线t0时刻从高拉至低电平时,总线只须保持低电平l.7us。

之后在t1时刻将总线拉高产生读时间隙,读时间隙在t1时刻后t2时刻前有效。

t2距t0为15us,也就是说t2时刻前主机必须完成读位,并在t0后的60us—120us

内释放总线.注意读的时候从最低位向最高位读。

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

ucharDS18B20_Read_Byte()

uchari,temp=0;

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

temp=temp>>1;

DQ=0;//主机将总线拉至低电平,只需保持1.7us

_nop_();//保持一个时钟周期,也即1us

DQ=1;

delay2us

(1);//延时7us,一般读数在后半段读

if(DQ)

temp=temp|0x80;

delay2us

(2);//这里延时45us+前面7us+1us=53us,接近60us

returntemp;

}

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

写字节:

当主机总线t0时刻从高拉至低电平时就产生写时间隙。

从to时刻开始

15us之内应将所需写的位送到总线上,在随后15—60us间DS18B20对总线采样若

低电平写入的位是0;若高电平写入的位是1,连续写2位间的间隙应大于1us.

注意:

无论读写都是从最低位开始。

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

voidDS18B20_Write_Byte(uchardat)

{

uchari;

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

{

DQ=0;//直接拉到低电平即可产生写时间隙。

DQ=dat&0x01;//从最低位依次传输

delay2us(25);//在15us之内将需写的位送到总线上。

然后等待总线采样

//此处至少延时60us

DQ=1;//释放总线

_nop_();

dat=dat〉〉1;

}

}

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

读温度:

流程:

复位-—写命令(跳过读序列号,单个DS18B20时用)——启动温度转换

--等待转换完成(完成总线会跳回高电平)--复位——写命令(跳过ROM编码命令)—-

读取暂存寄存器字节命令—-—读低字节-—-读高字节—-复位——合并高低字节--判断

正负

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

DS18B20_Read_Temperature()

uchartemp_low,temp_high;

DS18B20_Reset();

DS18B20_Write_Byte(0xcc);

DS18B20_Write_Byte(0x44);

while(!

DQ);//等待转换完成

DS18B20_Reset();

DS18B20_Write_Byte(0xcc);

DS18B20_Write_Byte(0xbe);

temp_low=DS18B20_Read_Byte();

temp_high=DS18B20_Read_Byte();

DS18B20_Reset();

tvalue=temp_high;

tvalue=(tvalue<〈8)|temp_low;

if(tvalue〈0x0fff)

tflag=0;

else

tvalue=~tvalue+1;

tflag=1;

}

tvalue=tvalue*(0。

625);//温度值扩大10倍,精确到1位小数

return(tvalue);

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

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

当前位置:首页 > 农林牧渔 > 林学

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

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