气象测温报告论文.docx
- 文档编号:24007997
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:29
- 大小:452.75KB
气象测温报告论文.docx
《气象测温报告论文.docx》由会员分享,可在线阅读,更多相关《气象测温报告论文.docx(29页珍藏版)》请在冰豆网上搜索。
气象测温报告论文
气象仪器课程设计
题目:
基于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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 气象 测温 报告 论文