气象测温报告论文.docx

上传人:b****8 文档编号:10069929 上传时间:2023-05-23 格式:DOCX 页数:29 大小:452.75KB
下载 相关 举报
气象测温报告论文.docx_第1页
第1页 / 共29页
气象测温报告论文.docx_第2页
第2页 / 共29页
气象测温报告论文.docx_第3页
第3页 / 共29页
气象测温报告论文.docx_第4页
第4页 / 共29页
气象测温报告论文.docx_第5页
第5页 / 共29页
气象测温报告论文.docx_第6页
第6页 / 共29页
气象测温报告论文.docx_第7页
第7页 / 共29页
气象测温报告论文.docx_第8页
第8页 / 共29页
气象测温报告论文.docx_第9页
第9页 / 共29页
气象测温报告论文.docx_第10页
第10页 / 共29页
气象测温报告论文.docx_第11页
第11页 / 共29页
气象测温报告论文.docx_第12页
第12页 / 共29页
气象测温报告论文.docx_第13页
第13页 / 共29页
气象测温报告论文.docx_第14页
第14页 / 共29页
气象测温报告论文.docx_第15页
第15页 / 共29页
气象测温报告论文.docx_第16页
第16页 / 共29页
气象测温报告论文.docx_第17页
第17页 / 共29页
气象测温报告论文.docx_第18页
第18页 / 共29页
气象测温报告论文.docx_第19页
第19页 / 共29页
气象测温报告论文.docx_第20页
第20页 / 共29页
亲,该文档总共29页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

气象测温报告论文.docx

《气象测温报告论文.docx》由会员分享,可在线阅读,更多相关《气象测温报告论文.docx(29页珍藏版)》请在冰点文库上搜索。

气象测温报告论文.docx

气象测温报告论文

 

气象仪器课程设计

题目:

基于DS18B20的单片机测温系统的设计

学生姓名吉星

学号20091305060

院系电子与信息工程学院

专业电子信息工程

指导教师张艳艳

 

二〇一一年十二月二日

基于DS18B20的单片机测温系统的设计

吉星

南京信息工程大学电子与信息工程学院,南京210044

摘要:

测量温度的关键是温度传感器。

随着技术飞速发展,传感器已进入第三代数字传感器。

本次设计采用的DS18B20就是属于这种传感器。

它可以实现数字化输出和测试,并且有控制功能强、传输距离远、抗干扰能力强、接口方便、微功耗等优点,因而被广泛应用在工业、农业、军事等领域的控制仪器、测控系统中。

关键词:

DS18B20AT89C52单片机

一、DS18B20功能简介

DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。

因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。

DS18B20产品的特点:

1、DS18B20因为采用了单总线技术,可通过串行口线,也可通过其他I/O口线与微机直接接 传感器直接输出被测温度值(二进制数)。

2、在DS18B20中的每个器件上都有独一无二的序列号。

3、实际应用中不需要外部任何元器件即可实现测温。

4、测量温度范围在-55。

C到+125。

C之间。

5、数字温度计的分辨率用户可以从9位到12位选择。

6、内部有温度上、下限告警设置。

7、用户可自设定非易失性的报警上下限值。

8、支持多点组网功能,多个DS18B20可以并联在惟一的三线上,实现多点测温

9、负压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。

二、DS18B20结构引脚图

图1.21

序号

名称

引脚功能描述

1

GND

地信号

2

DQ

数据输入/输出引脚。

开漏单总线接口引脚。

当被用着在寄生电源下,也可以向器件提供电源。

3

VDD

可选择的VDD引脚。

当工作于寄生电源时,此引脚必须接地。

表1.21DB18B20详细引脚功能描述

 

三、DS18B20的内部结构

DS18B20的内部框图如图1.31所示。

图1.31

1、64位ROM存储器件独一无二的序列号,如表1.31

表1.31

2、DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的EERAM.后者用于存储TH,TL值。

第5字节则是用户第3字节的镜像。

第6,7,8字节为计数寄存器,是为了让用户得到更高的温度分辨率而设计的。

第九个字节为前8个的crc效验码。

DS18B20九个寄存器的名称及作用如表1.32

表1.32

表1.33是两个个8位的RAM中,存放二进制的数,高五位是符号位,如果温度大于0OC,这五位数为0,将测到的数值乘以0.0625,即得到实际的温度值;如果温度小于0OC,高五位为1,测到的数值需要取反加1,再乘以0.0625 ,才得到实际的温度值。

高速暂存器RAM共占0、1两个单元:

表1.33

表1.34给出了一些数字输出数据与对应的温度值的例子。

表1.34

3、DS18B20不需额外的供电电源;当总线为高电平时,功率由单总线上的上拉电阻通过DQ引脚提供;高电平总线信号同时也向内部电容CPP充电,CPP在总线低电平时为器件供电。

四、DS18B20控制模式

1、DS18B20的命令序列

<1>初始化:

DS18B20所有的数据交换都由一个初始化序列开始。

由主机发出的复位脉冲和跟在其后的由DS18B20发出的应答脉冲构成。

当DS18B20发出响应主机的应答脉冲时,即向主机表明它已处在总线上并且准备工作。

<2>ROM命令:

ROM命令通过每个器件64-bit的ROM码,使主机指定某一特定器件(如果有多个器件挂在总线上)与之进行通信。

DS18B20的ROM如表1.41所示,每个ROM命令都是8bit长。

命令

描述

协议

此命令发出后1-Wire

总线上的活动

SEARCHROM

识别总线上挂着的所有DS18B20的ROM码

F0h

所有DS18B20向主机

传送ROM码

READROM

当只有一个DS18B20挂在总线上时,可用此命令来读取ROM码

33h

DS18B20向主机传送ROM码

MATCHROM

主机用ROM码来指定某一DS18B20,只有匹配的DS18B20才会响应

55h

主机向总线传送一个ROM码

SKIPROM

用于指定总线上所有的器件

CCh

ALARMSEARCH

与SEARCHROM命令类似,但只有温度超出警报线的DS18B20才会响应

ECh

超出警报线的DS18B20

向主机传送ROM码

表1.41

<3>功能命令:

DS18B20的功能命令如表1.42所示。

命令

描述

协议

此命令发出后1-Wire

总线上的活动

温度转换命令

ConvertT

开始温度转换

44h

DS18B20向主机传送转换状态(寄生电源不适用)

存储器命令

ReadScratchpad

读暂存器完整的数据

BEh

DS18B20向主机传送

总共9字节的数据

WriteScratchpad

向暂存器的2、3和4字节写入数据(TH,TL和精度)

4Eh

主机向DS18B20传送

3个字节的数据

CopyScratchpad

将TH,TL和配置寄存器的数据复制到EEPROM

48h

RecallE2

将TH,TL和配置寄存器的数据从EEPROM中调到暂存器中

B8h

DS18B20向主机传送调用状态

ReadPowerSupply

向主机示意电源供电状态

B4h

DS18B20向主机传送供电状态

表1.42

2、DS18B20信号时序

DS18B20采用严格的单总线通信协议,以保证数据的完整性。

该协议定义了几种信号类型:

复位脉冲、应答脉冲、写0、写1、读0和读1。

除了应答脉冲所有这些信号都由主机发出同步信号。

总线上传输的所有数据和命令都是以字节的低位在前。

1、初始化序列:

复位脉冲和应答脉:

在初始化过程中,主机通过拉低单总线至少480µs,以产生复位脉冲(TX)。

然后主机释放总线并进入接收(RX)模式。

当总线被释放后,4.7k上拉电阻将单总线拉高。

DS18B20检测到这个上升沿后,延时15µs~60µs,通过拉低总线60µs~240µs产生应答脉冲。

初始化波形如下图所示

图1.42

2、读和写时序:

在写时序期间,主机向DS18B20写入数据;而在读时序期间,主机读入来自DS18B20的数据。

在每一个时序,总线只能传输一位数据。

读/写时序如图1.43

图1.43

✧写时序:

存在两种写时序:

“写1”和“写0”。

主机在写1时序向DS18B20写入逻辑1,而在写0时序向DS18B20写入逻辑0。

所有写时序至少需要60µs,且在两次写时序之间至少需要1µs的恢复时间。

两种写时序均以主机拉低总线开始。

产生写1时序:

主机拉低总线后,必须在15µs内释放总线,然后由上拉电阻将总线拉至高电平。

产生写0时序:

主机拉低总线后,必须在整个时序期间保持低电平(至少60µs)。

在写时序开始后的15µs~60µs期间,DS18B20采样总线的状态。

如果总线为高电平,则逻辑1被写入DS18B20;如果总线为低电平,则逻辑0被写入DS18B20。

✧读时序:

DS18B20只能在主机发出读时序时才能向主机传送数据。

所以主机在发出读数据命令后,必须马上产生读时序,以便DS18B20能够传送数据。

所有读时序至少60µs,且在两次独立的读时序之间至少需要1µs的恢复时间。

每次读时序由主机发起,拉低总线至少1µs。

在主机发起读时序之后,DS18B20开始在总线上传送1或0。

若DS18B20发送1,则保持总线为高电平;若发送0,则拉低总线。

当传送0时,DS18B20在该时序结束时释放总线,再由上拉电阻将总线拉回空闲高电平状态。

DS18B20发出的数据在读时序下降沿起始后的15µs内有效,因此主机必须在读时序开始后的15µs内释放总线,并且采样总线状态。

<3>换位理解DSl8B20传感器对读写时序的要求:

DSl8B20写数据时,主机产生读时间片。

当主机把I/O数据线在7μs时间内从高逻辑电平拉至低逻辑电平时,维持时间最少1μs就产生写时间片。

如写入0,则应维持低电平45~60μs以上,如写入1,应在第8μs后释放数据线,在7μs时间内拉到为逻辑高电压,并维持45~60μs以上。

写时间片必须有最短为60μs的持续期,在各写周期之间必须有最短为1μs的恢复时间。

从DS18B20读数据时,主机产生读时间片。

主机在7μs时间内把数据线从逻辑高电平拉至低电平,产生读时间片。

数据线必须保持在逻辑低电平至少1μs;来自DS18B20的输出数据在读时间片下降沿之后15μs有效。

因此,在产生读时间片8μs后主机必应把I/O数据线释放,由上拉电阻将数据线拉回至逻辑高电平,主机在15μs末期对数据线采样,如果线为高电平,就读为1,如果线为低电平,便读为0。

读时间片的最短持续期限为60μs,各个读时间片之间必须有最短为1μs的恢复时间。

在考虑到线缆对波形的延迟和DS18B20传感器发送数据表现的典型时间,在实际操作中,建议将主机对数据线的采样滞后5~9μs,可提高正确读取DS18B20的可靠性。

3.DS18B20工作原理

DS18B20测温原理如图1.44所示。

图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。

高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。

计数器1和温度寄存器被预置在-55℃所对应的一个基数值。

计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。

图3中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。

AT89C52单片机简介

AT89C52是51系列单片机的一个型号,它是ATMEL公司生产的。

AT89C52是一个低电压,高性能CMOS8位单片机,片内含8kbytes的可反复擦写的Flash只读程序存储器和256bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,功能强大的AT89C52单片机可为您提供许多较复杂系统控制应用场合。

AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,AT89C52可以按照常规方法进行编程,但不可以在线编程(S系列的才支持在线编程)。

其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。

 兼容MCS51指令系统·8k可反复擦写(>1000次)FlashROM

  ·32个双向I/O口·256x8bit内部RAM

  ·3个16位可编程定时/计数器中断·时钟频率0-24MHz

  ·2个串行中断·可编程UART串行通道

  ·2个外部中断源·共6个中断源

  ·2个读写中断口线·3级加密位

  ·低功耗空闲和掉电模式·软件设置睡眠和唤醒功能

AT89C52P为40脚双列直插封装的8位通用微处理器,采用工业标准的C51内核,在内部功能及管脚排布上与通用的8xc52相同,其主要用于会聚调整时的功能控制。

功能包括对会聚主IC内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。

主要管脚有:

XTAL1(19脚)和XTAL2(18脚)为振荡器输入输出端口,外接12MHz晶振。

RST/Vpd(9脚)为复位输入端口,外接电阻电容组成的复位电路。

VCC(40脚)和VSS(20脚)为供电端口,分别接+5V电源的正负端。

P0~P3为可编程通用I/O脚,其功能用途由软件定义,在本设计中,P0端口(32~39脚)被定义为N1功能控制端口,分别与N1的相应功能管脚相连接,13脚定义为IR输入端,10脚和11脚定义为I2C总线控制端口,分别连接N1的SDAS(18脚)和SCLS(19脚)端口,12脚、27脚及28脚定义为握手信号功能端口,连接主板CPU的相应功能端,用于当前制式的检测及会聚调整状态进入的控制功能。

在AT89C52片内存储器中,80H-FFH共128个单元为特殊功能寄存器(SFE),SFR的地址空间映象如表2所示。

并非所有的地址都被定义,从80H—FFH共128个字节只有一部分被定义,还有相当一部分没有定义。

对没有定义的单元读写将是无效的,读出的数值将不确定,而写入的数据也将丢失。

不应将数据“1”写入未定义的单元,由于这些单元在将来的产品中可能赋予新的功能,在这种情况下,复位后这些单元数值总是“0”。

AT89C52除了与AT89C51所有的定时/计数器0和定时/计数器1外,还增加了一个定时/计数器2。

定时/计数器2的控制和状态位位于T2CON(参见表3)T2MOD(参见表4),寄存器对(RCAO2H、RCAP2L)是定时器2在16位捕获方式或16位自动重装载方式下的捕获/自动重装载寄存器。

 

硬件设计

<一>原理图

最小系统

温度传感器

报警显示部分

2、元件清单

元件

个数

AT89S52

1

共阳数码管

1

74HC573

2

DS18B20

1

排阻10K

1

蜂鸣器

1

按键

5

30pF电容

2

4.7K电阻

4

软件设计

1、程序设计流程图

主程序

2、程序代码

#include

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

ucharwarning;//报警温度值

uchartempL=0,tempH=0;

ucharnum;

uinttemperature,negtemperature;

uintshi,ge,xiaoshu;

intflag;

sbitdula=P2^7;

sbitwela=P2^6;

sbitDQ=P2^3;

sbitkey2=P3^4;

sbitkey3=P3^5;

sbitkey4=P3^6;

sbitbeep=P2^2;

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

共阳数码管编码

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

ucharcodetable[]=

{0xc0,0xf9,0xa4,0xb0,

0x99,0x92,0x82,0xf8,

0x80,0x90,0x88,0x83,

0xc6,0xa1,0x86,0x8e};//共阳数码管编码不带点

unsignedcharcodetable1[]=

{0x40,0x79,0x24,0x30,

0x19,0x12,0x02,0x78,

0x00,0x10,0x08,0x03,

0x46,0x21,0x06,0x0e};//共阳数码管编码带点

 

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

精确延时

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

voiddelay(uinti)

{

while(i--);

}

 

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

键盘扫描

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

voidkeyscan()

{

P3=0xff;

if(key2==0)

{

delay(20);

if(key2==0)

{

num=1;

warning++;

}

while(!

key2);//消抖

delay(20);

while(!

key2);

}

if(key3==0)

{

delay(20);

if(key3==0)

{

num=2;

warning--;

}

while(!

key3);

delay(20);

while(!

key3);

}

if(key4==0)

{

delay(20);

if(key4==0)

{

num=3;

}

while(!

key4);

delay(20);

while(!

key4);

}

}

 

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

显示报警温度子程序

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

voidDisplayWarning()

{

inta,b;

a=warning/10;

b=warning%10;

wela=1;

P0=0xf8;

wela=0;

dula=1;

P0=table[a];

dula=0;

delay(500);

wela=1;

P0=0xf4;

wela=0;

dula=1;

P0=table1[b];

dula=0;

delay(500);

wela=1;

P0=0xf2;

wela=0;

dula=1;

P0=table[0];

dula=0;

delay(500);

wela=1;

P0=0xf1;

wela=0;

dula=1;

P0=table[12];

dula=0;

delay(500);

}

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

初始化18b20复位

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

voidInit_18b20()

{

ucharx=0;

DQ=1;

delay(8);

DQ=0;

delay(80);//延时480——960us之间这里大概780us

DQ=1;

delay(14);//等待15——60us

x=DQ;//判断初始化有没有成功

delay(20);//ds18b20存在的话x=0

}

 

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

从18b20里面读一个字节

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

ReadOneByte_18b20(void)

{

uchari=0;//主机先把数据线从高电平拉到低电平,持续1us以上

uchardat=0;//再把数据线拉高,从而产生读信号

for(i=8;i>0;i--)//每个读周期最短的持续时间为60us,各个读周期之间必须有1us以上的高电平恢复期

{

DQ=1;

delay

(1);

DQ=0;

dat=dat>>1;//从低位开始读

DQ=1;

if(DQ)//如果DQ数据为1则写进dat

{

dat=dat|0x80;

}

delay(4);

}

return(dat);

}

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

往18b20里面写一个字节

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

voidWriteOneByte_18b20(uchardat)

{

uchari=0;

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

{

DQ=0;

DQ=dat&0x01;

delay(5);//从低位开始写

DQ=1;

dat=dat>>1;

}

delay(4);

}

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

读取温度值

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

ucharReadTemperature(void)

{

floattt;

Init_18b20();//初始化

WriteOneByte_18b20(0xcc);//跳过rom检测即跳过读序列号的操作

WriteOneByte_18b20(0x44);//开始温度转换

delay(125);

Init_18b20();//初始化

WriteOneByte_18b20(0xcc);//跳过rom检测

WriteOneByte_18b20(0xbe);//读取寄存器值从低字节开始读顺序为:

温度低字节、

//温度高字节、TH值、TL值(一共9个字节)

tempL=ReadOneByte_18b20();//温度值低字节LSB

tempH=ReadOneByte_18b20();//温度值高字节MSB

temperature=tempH*256+tempL;

tt=temperature*0.0625;//得到真实十进制温度值

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

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

temperature=tt*10+0.5;//放大十倍0.5是四舍五入

return(temperature);

}

 

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

显示正温度子程序

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

voidDisplayTemperature()

{

shi=temperature/100;//百位实际是温度的十位因为温度扩大了十倍

ge=temperature%100/10;//十位

xiaoshu=temperature%10;//个位

wela=1;

P0=0xf8;

wela=0;

dula=1;

P0=table[shi];

dula=0;

delay(200);

wela=1;

P0=0xf

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

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

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

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