DS18B20温度传感器设计要点Word下载.docx

上传人:b****5 文档编号:21707512 上传时间:2023-01-31 格式:DOCX 页数:15 大小:162.80KB
下载 相关 举报
DS18B20温度传感器设计要点Word下载.docx_第1页
第1页 / 共15页
DS18B20温度传感器设计要点Word下载.docx_第2页
第2页 / 共15页
DS18B20温度传感器设计要点Word下载.docx_第3页
第3页 / 共15页
DS18B20温度传感器设计要点Word下载.docx_第4页
第4页 / 共15页
DS18B20温度传感器设计要点Word下载.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

DS18B20温度传感器设计要点Word下载.docx

《DS18B20温度传感器设计要点Word下载.docx》由会员分享,可在线阅读,更多相关《DS18B20温度传感器设计要点Word下载.docx(15页珍藏版)》请在冰豆网上搜索。

DS18B20温度传感器设计要点Word下载.docx

附件:

DS18B20温度计C程序9

一、摘要

本设计的主要内容是应用单片机和温度传感器设计一个数字温度表,DS18B20是一种可组网的高精度数字温度传感器,由于其具有单总线的独特优点,可以使用户轻松地组建起传感器网络,并可使多点温度测量电路变得简单、可靠。

本设计基于数字温度传感器DS18B20,以AT89C51片机为核心设计此测试系统,具有结构简单、测温精度高、稳定可靠的优点。

可实现温度的实时检测和显示,本文给出了系统的硬件电路详细设计和软件设计方法,经过调试和实验验证,实现了预期的全部功能。

二、方案论证

方案一:

由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。

方案设计框图如下:

方案二:

考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。

从以上两种方案,很容易看出,采用方案二,电路比较简单,软件设计也比较简单,故采用了方案二。

三、电路设计

1、设备整机结构及硬件电路框图

根据设计要求与设计思路,设计硬件电路框图如下图所示,4位数码管显示器系统中AT89C51成对DS18B20初始化、温度采集、温度转换、温度数码显示。

本装置详细组成部分如下:

a.主控模块:

AT89C51片机;

b.传感器电路:

DS18B20温度传感器;

c.电路:

四位数码管显示。

按照系统设计功能的要求,确定系统由3个模块组成:

主控制器、测温电路和显示电路。

数字温度计总体电路结构框图所示:

2、单片机的选择

单片机AT89C51有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。

AT89C51的管脚结构图:

3、温度显示电路

四位共阳极数码管,能够显示小数和负温度。

零下时,第一个数码管显示负号。

当温度超过99.9时,四个数码管全部亮。

列扫描用P2.0—P2.3来实现,列驱用NOT。

电路仿真图如下:

4、温度传感器

DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。

电路图如下:

系统总电路图如下:

5、软件设计

主要包括主程序、读出温度子程序、温度转换命令子程序、计算温度子程序和现实数据刷新子程序等。

主程序主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量温度值。

温度测量每1S进行一次。

主流程图如下:

读出温度子程序读出温度子程序的主要功能是读出RAM中的9字节。

在读出时须进行CRC校验,校验有错时不进行温度数据的改写。

流程图如下:

温度转换命令子程序温度转换命令子程序主要是发温度转换开始命令。

当采用12位分辨率时,转换时间约为750ms。

在本程序设计中,采用1s显示程序延时法等待转换的完成。

计算温度子程序计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定。

显示数据刷新子程序显示数据刷新子程序主要是对显示缓冲器中的显示数据进行刷新操作,当最高数据显示位为0时,将符号显示位移入下一位。

DS18B20与单片机之间采用串行通信的方式进行数据读写

硬件调试比较简单,首先检查电感的焊接是否正确,然后可用万用表测试或通电检测。

软件调试可以先编写显示程序并进行硬件的正确性检验,然后分别进行主程序、读出温度子程序、温度转换命令子程序、计算温度子程序和现实数据刷新子程序等的编程及调试

由于DS18B20与单片机采用串行数据传送,因此,对DS18B20进行读/写编程时必须严格地保证读/写时序;

否则将无法读取测量结果。

本程序采用单片机汇编或C语言编写用KeilC51编译器编程调试。

软件调试到能显示温度值,并且在有温度变化时显示温度能改变,就基本完成。

性能测试可用制作的温度机和已有的成品温度计同时进行测量比较。

由于DS18B20的精度很高,所以误差指标可以限制在0.5℃以内。

另外,-55~+125℃的测温范围使得该温度计完全适合一般的应用场合,其低电压供电特性可做成用电池供电的手持温度计。

DS18B20温度计C程序

//使用AT89C2051单片机,用共阳四位数码管

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

#include<

reg51.h>

intrins.h>

//_nop_();

延时函数用

#defineDisdataP0//段码输出口

#definediscanP2//扫描口

#defineucharunsignedchar

#defineuintunsignedint

sbitDQ=P1^4;

//温度输入口

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

ucharcodescan_con[4]={0xfe,0xfd,0xfb,0xf7};

//列扫描控制字

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++)//四位数码管扫描控制

{

Disdata=dis_7[display[k]];

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

discan=scan_con[k];

delay(5);

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)

if(temp_data[0]!

=0x00)

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

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

n=1;

}//负温度求补码

else

{temp_data[1]=(256-temp_data[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

//开机先转换一次

500;

h++)

{scan();

}//开机显示"

8888"

2秒

while

(1)

read_temp();

//读出18B20温度数据

work_temp();

//处理温度数据

for(h=0;

250;

}//显示温度值1秒

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

当前位置:首页 > 初中教育

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

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