温度传感器 ds18b20Word文件下载.docx

上传人:b****6 文档编号:19185766 上传时间:2023-01-04 格式:DOCX 页数:11 大小:88.24KB
下载 相关 举报
温度传感器 ds18b20Word文件下载.docx_第1页
第1页 / 共11页
温度传感器 ds18b20Word文件下载.docx_第2页
第2页 / 共11页
温度传感器 ds18b20Word文件下载.docx_第3页
第3页 / 共11页
温度传感器 ds18b20Word文件下载.docx_第4页
第4页 / 共11页
温度传感器 ds18b20Word文件下载.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

温度传感器 ds18b20Word文件下载.docx

《温度传感器 ds18b20Word文件下载.docx》由会员分享,可在线阅读,更多相关《温度传感器 ds18b20Word文件下载.docx(11页珍藏版)》请在冰豆网上搜索。

温度传感器 ds18b20Word文件下载.docx

1设计目的:

(1)了解温度检测和控制技术的基本知识以及单片机、传感器等相关技术。

(2)熟练使用相关的EDA软件进行硬件电路的设计与仿真

(3)具体掌握DS18B20温度传感器的使用方法。

2.基本要求

(1)孵化室对温度有一定要求,温度是否合适直接影响孵化效果,为此需要对温度进行严格控制,主要指标如下:

孵化室温控制在36.5±

0.5℃,温度低时启动电热器加热,用红灯报警;

温度高时,启动空调冷却,用绿灯报警。

(2)要求设计相关的硬件电路,选择合适的传感器、控制系统和显示系统。

3详细设计:

3.1系统设计原理框图:

图1DS18B20温度测温系统框图

通过单片机控制温度传感器,读出DS18B20的温度,并用数码管显示,当温度超过37℃时,启动空调冷却,用绿灯报警,当温度低于36℃时,启动电热器加热,用红灯报警。

所以根据设计要求确定了系统的总体方案,整个系统由控制模块、湿度检测模块、显示模块、报警器等构成。

3.2硬件电路设计图

图2硬件电路设计图

3.3程序设计

系统程序主要包括主程序、读取温度子程序、数据转换子程序、显示数据子程序等。

3.3.1主程序设计流程图

图3主程序流程图

3.3.2初始化程序流程图

图4初始化流程图

3.3.3读取温度子程序

读取温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。

主要包括以下三个命令:

(1)写暂存器命令【4EH】

这个命令为由TH寄存器开始向DS18B20暂存器写入数据,4EH命令后的3字节数据将被保存到暂存器的地址2、3、4(TH、TL、CONFIG)三个字节。

所有数据必须在复位脉冲前写完。

即如果只想写一个字节的数据到地址2,可按如下流程:

初始化;

写0CCH,跳过ROM检测;

写4EH;

写1字节数据;

复位,即向DQ输出480~960us低电平

(2)读暂存命令【BEH】

这个命令由字节0读取9个暂存器内容,如果不需要读取所有暂存内容,可随时输出复位脉冲终止读取过程

(3)转换温度命令【44H】

这个命令启动温度转换过程。

转换温度时DS18B20保持空闲状态,此时如果单片机发出读命令,DS18B20将输出0直到转换完成,转换完成后将输出1。

图5读取温度子程序

3.3.4写流程图

写时隙:

写时隙由DQ引脚的下降沿引起。

18B20有写1和写0两种写时隙。

所有写时隙必须持续至少60μs,两个时隙之间至少有1μs的恢复时间。

DS18B20在DQ下降沿后15μs~60μs间采样DQ引脚,若此时DQ为高电平,则写入一位1,若此时DQ为低电平,则写入一位0,如图9所示。

所以,若想写入1,则单片机应先将DQ置低电平,15us后再将DQ置高电平,持续45μs;

若要写入0,则将DQ置低电平,持续60μs。

图6写流程图

3.3.5读流程图

读时隙:

读时隙由DQ下降沿引起,持续至少1μs的低电平后释放总线(DQ置1)DS18B20的输出数据将在下降沿15μs后输出,此时单片机可读取1位数据。

读时隙结束时要将DQ置1。

所有读时隙必须持续至少60μs,两个时隙之间至少有1μs的恢复时间。

图7读流程图

3.3.6程序

#include<

reg52.h>

intrins.h>

#defineucharunsignedchar

#defineuintunsignedint

sbitDQ=P1^3;

//数据口defineinterface

uinttemp;

//温度值variableoftemperature

//不带小数点

unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

//带小数点

unsignedcharcodetable1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};

/*************精确延时函数*****************/

voiddelay(unsignedchari)

{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

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

/*****************DS18B20******************/

voidInit_Ds18b20(void)//DS18B20初始化sendresetandinitializationcommand

{

DQ=1;

//DQ复位,不要也可行。

delay

(1);

//稍做延时

DQ=0;

//单片机拉低总线

delay(250);

//精确延时,维持至少480us

//释放总线,即拉高了总线

delay(100);

//此处延时有足够,确保能让DS18B20发出存在脉冲。

}

ucharRead_One_Byte()//读取一个字节的数据readabytedate

//读数据时,数据以字节的最低有效位先从总线移出

uchari=0;

uchardat=0;

for(i=8;

i>

0;

i--)

DQ=0;

//将总线拉低,要在1us之后释放总线

//单片机要在此下降沿后的15us内读数据才会有效。

_nop_();

//至少维持了1us,表示读时序开始

dat>

>

=1;

//让从总线上读到的位数据,依次从高位移动到低位。

DQ=1;

//释放总线,此后DS18B20会控制总线,把数据传输到总线上

delay

(1);

//延时7us,此处参照推荐的读时序图,尽量把控制器采样时间放到读时序后的15us内的最后部分

if(DQ)//控制器进行采样

{

dat|=0x80;

//若总线为1,即DQ为1,那就把dat的最高位置1;

若为0,则不进行处理,保持为0

}

delay(10);

//此延时不能少,确保读时序的长度60us。

return(dat);

voidWrite_One_Byte(uchardat)

//拉低总线

//至少维持了1us,表示写时序(包括写0时序或写1时序)开始

DQ=dat&

0x01;

//从字节的最低位开始传输

//指令dat的最低位赋予给总线,必须在拉低总线后的15us内,

//因为15us后DS18B20会对总线采样。

//必须让写时序持续至少60us

//写完后,必须释放总线,

uintGet_Tmp()//获取温度getthetemperature

floattt;

uchara,b;

Init_Ds18b20();

//初始化

Write_One_Byte(0xcc);

//忽略ROM指令

Write_One_Byte(0x44);

//温度转换指令

Write_One_Byte(0xbe);

//读暂存器指令

a=Read_One_Byte();

//读取到的第一个字节为温度LSB

b=Read_One_Byte();

//读取到的第一个字节为温度MSB

temp=b;

//先把高八位有效数据赋于temp

temp<

<

=8;

//把以上8位数据从temp低八位移到高八位

temp=temp|a;

//两字节合成一个整型变量

tt=temp*0.0625;

//得到真实十进制温度值

//因为DS18B20可以精确到0.0625度

//所以读回数据的最低位代表的是0.0625度

temp=tt*10+0.5;

//放大十倍

//这样做的目的将小数点后第一位也转换为可显示数字

//同时进行一个四舍五入操作。

returntemp;

/****************数码码动态显示函数**************/

voidDisplay(uinttemp)//显示程序

ucharA1,A2,A3;

A1=temp/100;

//十位

A2=temp%100/10;

//个位

A3=temp%10;

//小数位

P0=table[A1];

//显示十位

P2=0;

delay(0);

P0=table1[A2];

//显示个位,使用的是有小数点的数组(因为temp值扩大了10倍,虽然是十位,实际为个位)

P2=1;

P0=table[A3];

//显示小数

P2=2;

voidmain()

while

(1)

Display(Get_Tmp());

3.4结果验证与仿真

仿真如图:

图8仿真图

4总结

从这次的设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,这就是我在这次课程设计中的最大收获。

随着电子技术的不断发展,按着此思路设计的温度传感器的性能也一定会越来越好。

5

参考文献

[1]《传感器原理及接口技术》梅丽凤,王艳秋,清华大学出版社,2006年。

[2]《传感器与检测技术》徐科军,电子工业出版社,2011年。

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

当前位置:首页 > 工程科技 > 材料科学

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

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