温度计设计Word文档格式.docx
《温度计设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《温度计设计Word文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
(4)可通过数据线供电,电压范围为3˜5.5V
(5)不需要备份电源;
(6)测量范围为-55℃~+125℃,在-10~+85℃时精度为±
0.5℃;
(7)数字温度计的分辨率用户可以从9位到12位选择,可配置实现9到12位的温度读书;
(8)用户定义的、非易失性的温度告警设置,用户可自行设定告警的上下限温度。
1.2.2DS18B20的内部结构
图2所示为DS18B20的内部框图,它主要包括寄生电源、温度传感器、64位激光ROM单线接口、存放中间数据的高速暂存器(内含便笺式RAM),用于存储用户设定的温度上下限值的TH和TL解发器存储与控制逻辑、8位循环冗余校验码(CRC)发生器等七部分。
图2DS18B20的内部框图
1.2.3DS18B20工作原理
DS18B20的读写时序和测温原理与DS1820相同,只是得到的温度值的位数因分辨率不同而不同,且温度转换时的延时时间由2s减为750ms。
DS18B20测温原理如图3所示。
图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。
高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。
计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。
图3中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。
图3DS18B20测温原理
1.3单线(1-wire)技术
目前常用的微机和外设之间数据输出的串行总线有I2C总线,SPI总线等,其中,I2C总线采用同步串行两线(一根时钟线,一根数据线)方式,而SPI总线采用同步串行三线(一根时钟线,一根输入线,一根数据输出线)方式。
这两种总线需要至少两根或两根以上的信号线。
美国达拉斯半导体公司推出了一项特有的单线(1-wire)技术,该技术与上述总线不同,它采用单根信号线,即可传输时钟,又能传输数据,而且数据传输是双向的,因而这种单线技术具有线路简单、硬件开销小、成本低、便于扩展的优点。
单线技术适用于单主机系统,单主机能控制一个或多个从机设备。
主机可以是微控制器,从机可以是单线器件,它们之间的数据交换、控制都由这根线完成。
主机或从机通过一个漏极开路或三态端口连至该数据线,以允许设备在不发送数据时能够释放该线,而让其他设备使用。
单线通常要求外接一个约5K的上拉电阻,这样,当该线闲置时,其状态为高电平。
二、硬件电路设计
本课程设计的核心器件是单片机和单线数字温度传感器,单线器件和单片机的接口只需要一根信号线,所以本设计的的硬件电路十分简单。
芯片引脚如图4
图4芯片DS18B20引脚
引脚功能说明:
NC(1、2、6、7、8脚):
空引脚,悬空不使用;
VDD(3脚):
可选电源脚,电源电压范围3~5.5V。
当工作于寄生电源时,此引脚必须接地。
DQ(4脚):
数据输入/输出脚。
漏极开路,常态下高电平。
DS18B20内部有4个主要部件:
64位激光ROM、温度传感器、非易失性温度告警触发器(TH和TL)和配置寄存器。
2.264位激光ROM
每个DS18B20都有一个唯一的64位ROM编码,它存放在64位激光ROM中。
代码的前8位是单线产品系列编码,接着的48位是唯一的产品序列号,最后8位是前面56位编码的CRC校验值,如表1所示。
表164位激光ROM
内容
8位CRC校验码
48位产品序列号
8位产品系列编码
MSBLSBMSBLSBMSBLSB
CRC的等效多项式函数为:
CRC=X8+X5+X4+1
64位激光ROM中的8位CRC值即由此多项式函数产生。
主机可以通过“读ROM命令”读取64位ROM的前56位,然后也按此多项式计算出CRC值,并把它与读出的存放在DS18B20激光ROM内的CRC值进行比较,从而决定ROM的数据是否已被主机正确接受。
CRC值得比较和是否继续操作都由主机决定。
图5DS18B20存储器结构图
存储器由一个中间结果暂存RAM和一个非易失性电可擦除(E²
)RAM组成,后者存储高、低温触发器TH、TL和配置存储器。
暂存存储器有助于在单线通信时确保数据的完整性,数据首先写入暂存存储器,在那里,他可以被读出校验,校验之后再将数据传送到非易失性E²
RAM中。
这一过程确保了修改存储器时数据的完整性
2.3温度测量原理
DS1820测量温度时使用特有的温度测量技术。
DS1820内部的低温度系数振荡器能产生稳定的频率信号f0,高温度系数振荡器则将被测温度转换成频率信号f。
当计数门打开时,DS1820对f0计数,计数门开通时间由高温度系数振荡器决定。
芯片内部还有斜率累加器,可对频率的非线性予以被偿。
测量结果存入温度寄存器中。
表2给出了温度和数字量的关系。
温度℃
输出的二进制码
输出的十六进制码
+125
0000000011111010
07D0H
+25
0000000000110010
0191H
+1/2
0000000000000001
0008H
0000000000000000
0000H
-1/2
111111*********1
FFF8H
-25
1111111111001110
FF6FH
-55
111111*********0
FC90H
表2温度和数字量的关系
2.4电路原理图及说明
附录一中,U1为单片机AT89S52,它的P0和P2口的数码管电路连接,以控制温度的数字显示。
S2、S3、S4、S5接在P1口上分别作为开始键、清零键、读出最高、低温度值键。
P3.0和DS18B20的引脚DQ连接。
作为单一数据线。
单片机的时钟频率为12Mhz.
J1为DS18B20,R3为上拉电阻。
DS18B20有2种供电方式:
寄生电源和外部电源。
寄生电源简单的说起来就是器件从单线数据线中“窃取”电源,在信号线为高电平的时间周期内,把能量储存在内部的电容器中,在单信号线为低电平的时间期内断开此电源,直到信号线变为高平,重新接上寄生电源为止。
寄生电源的两个优点:
可实现远程温度检测而无须本地电源;
没有正常电源情况下也可读ROM。
但是为了使DS18B20能完成准确的温度变换,当温度变换发生时,DQ线上必须提供足够的功率。
因为DS18B20的工作电流高达1.5mA,4.7KΏ的上拉电阻将使得DQ线上没有足够的驱动能力。
如果有多个DS18B20挂接,而且同时变换时,这一问题将更为突出。
并且,当使用寄生电源方式时,VDD引脚必须接到地。
因此本设计采用外部电源,为了使DS18B20能完成准确的温度变换,当温度变换发生时,DQ线上不要求强的上拉。
总线上的主机在温度变换期间不需要一直使DQ线保持高电平,这就允许在变换时间内其他数据在单线上传送。
而且,在单线上可以放置多个DS18B20。
2.5时钟电路
MCS-51的时钟可以上两种方式产生,一种是内部方式,利用芯片内部的振荡电路,另一种方式为外部方式。
本次设计采用的是内部方式。
MCS-51内部有一个用于构成振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是此放大器的输入端和输出端。
这个放大器与作为反馈元件的片外晶体或陶瓷谐振器构成一个自激振荡器。
图7时钟电路
该时钟电路由两个333pF的电容和一个晶体振荡器组成,晶体振荡器采用的是11.0592MHZ的晶振,它与内部的一个高增益反相放大器形成一个稳定的自激振荡器。
两个电容的作用是晶体振荡器的微调电容。
一般取30pF。
因为晶体振荡器的频率高,稳定度也高。
所以我们采用晶体振荡器而不采用陶瓷体振荡器。
2.6复位电路
MCS-51复位输入引脚RESET为MCS-51提供了初始化的手段,单片机的初始化,其主要功能是把PC初始化为0000H,使单片机从0000H单元开始执行程序。
除了进入系统的正常初始化之外,还可以在程序运行出错或操作错误使系统处于死锁状态时,按键复位可以摆脱困境。
在MCS-51的时钟电路工作后,只要在的RESET引脚上出现10ms以上的高电平,单片机内部则初始化复位。
只要RESET保持高电平,则MCS-51循环复位。
只有当RESET由高电平变成低电平以后,MCS-51才从0000H地址开始执行程序。
本电路采用的是按键电平复位方式,它由按键开关、两个电阻、电容组成。
具体电路如图8所示
图8复位电路
三、软件设计
软件设计是课程设计的难点跟重点,关键在于对DS18B20的使用。
DS18B20是1-wire单线器件,它在一根数据线上实现数据的双向传输,这就需要一定的协议来对读写数据提出严格的时序要求,而AT89C52单片机并不支持单线传输。
因此,必须采用软件的方法来模拟单线的协议时序。
3.1DS18B20的单线协议和命令
DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。
主机操作单线器件DS18B20必须遵循下面的顺序。
(1)初始化
单线总线上的所有操作均从初始化开始。
初始化过程如下:
主机通过拉低单线480μs以上,产生复位脉冲,然后释放该线,进入Rx接受模式。
主机释放总线时,会产生一个上升沿。
单线器件DS18B20检测到该上升沿后,延时15˜60μs,通过拉低总线60˜240μs来产生应答脉冲。
主机接收到从机的应答脉冲后,说明有单线器件在线。
(2)ROM操作命令
一旦总线主机检测到应答脉冲,便可以发起ROM操作命令。
共有5位ROM操作命令,如表3所示。
表3:
ROM操作命令
(3)内存操作命令
在成功执行了ROM操作命令之后,才可以使用内存操作命令。
主机可以提供6种内存操作命令,如表4所示。
表4:
内存操作命令
(4)数据处理
DS18B20要求有严格的时序来保证数据的完整性。
在单线DQ上,存在复位脉冲、应答脉冲、写“0”写“1”读“0”和读“1”几种信号类型。
其中除了应答脉冲之外,均由主机产生。
而数据位的读和写则是通过使用读,写时隙实现的。
写时隙。
当主机将数据线从高电平拉至低电平撕,产生写时隙。
有2种类型的写时隙:
写“1”和写“0”。
所有写时隙必须在60μs以上,各个写时隙之间必须保证最短1μs的恢复时间。
读时隙。
当主机从DS18B20读数据时,把数据线从高电平拉至低电平,产生读时隙。
数据线DQ必须保持低电平至少1μs,来自DS18B20的输出数据在读时隙下降沿之后15μs内有效。
因此,在次15μs内,主机必须停止将DQ引脚置低。
在读时隙结束时,DQ引脚将通过外部上拉电阻拉回至高电平。
单线总线上的所有操作均从初始化开始,然后总线主机检测到应答脉冲,发起ROM操作命令,成功后,继续使用内存操作命令,最后完成数据的采集与显示。
系统程序主要包括主程序,DS18B20循环程序等。
主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,其程序流程见图所示9
图9主程序框图
DS18B20循环程序,读取1,2节温度数据。
通过skipROM命令和ConvertT命令实现温度转换,其流程图如下:
图10DS18B20流程图
四设计总结
通过自己的努力,最终完成了整个硬件电路的绘制。
这是一个比较繁杂的过程,需要调用元件,芯片,完成各种特定的功能。
还有报警电路,复位电路的设定。
数据采集和处理是51单片机的常用领域,除了电信号以为,单片机还可以利用传感器实现对非电信号的采集。
通过仿真测试,我们可以确定:
基于DS18B20数字温度控制系统具有精度高、抗干扰能力、电路简单等优点。
想比之下,传统的温度检测系统采用热敏电阻等温度敏感元件,热敏电阻虽然成本低,但是需要后续的信号调整、AD转换处理电路才能将温度信号转换成数字信号,不但电路复杂,而且热敏电阻的抗干扰能力略差,测量的精度也相对较差,难保证热敏电阻的一致性和线性,在应用中有许多不足需要弥补和注意。
因此,在小范围温度测量的情况下,采用DS18B20是一个不错的选择。
另外,此电路是一种直接数字输出式的温度传感器DS18B20实现了单片机控制的数字温度计控制系统。
经过几周的设计,大家在这个过程中对硬件和软件设计都有了更深的体会。
同时得到了学校和系里的老师帮助。
在此表示感谢!
最后祝湖南工学院蒸蒸日上。
原理图
程序及说明
#include<
reg52.h>
#defineuintunsignedint
#defineucharunsignedchar
ucharcodetable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,
0x82,0xF8,0x80,0x90,0x7f,0xff};
//数字段码0--9,小数点,不显示
ucharcodetable1[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
//位控制
uchartable3[]={0,0,0,0,0,0,0,0};
//缓存区
sbitDQ=P3^0;
floatmax=0,min=0;
//测量时间内最大值与最小值
ucharmid=0;
ucharq=0;
uintyu=0,h=0;
floatx=0;
/*****************延时********************/
voiddelayfor(intm)
{
uchari,j;
for(i=0;
i<
m;
i++)
for(j=0;
j<
120;
j++);
}
voiddelay1(uinti)
while(i--);
/************18B20复位*************/
voidreset(void)
ucharpp=0;
DQ=1;
delay1(8);
DQ=0;
//拉底总线
delay1(100);
//保持480us
//释放总线
delay1(14);
//等待回复
pp=DQ;
//读取信号
delay1(20);
//等待信号结束
/**********从1-wire总线上读取一个字节*********/
ucharread_byte(void)
uchari;
ucharvalue=0;
for(i=8;
i>
0;
i--)
{
DQ=0;
value>
>
=1;
//构成读时隙
if(DQ)
value|=0x80;
delay1(4);
}
return(value);
/***********向1-wire总线上写一个字节************/
voidwrite_byte(charval)
i--)//一次写一位
DQ=val&
0x01;
delay1(5);
//为下一位写做准备
val=val/2;
//移位
/*********************显示函数**************************/
voiddisp(void)
{uchari;
8;
P0=table[table3[i]];
P2=table1[i];
delayfor
(1);
if(i==2)
P2=table1[i];
P0=table[table3[2]]&
0x7f;
//在温度个位上显示小数点
}
/***************温度值处理函数****************/
voidchuli()
yu=x;
//取整
h=x*10000;
table3[0]=yu/100;
//温度百位
if(table3[0]==0)table3[0]=11;
//判断百位是否为0
table3[1]=yu%100/10;
//温度十位
if(table3[1]==5)
s=0;
table3[2]=yu%100%10;
//温度个位
table3[3]=h%10000/1000;
//处理小数点后几位
table3[4]=h%10000%1000/100;
table3[5]=h%10000%1000%100/10;
table3[6]=h%10000%1000%100%10;
/*****读取温度值*显示程序******/
voiddisplay()
uchart[2];
P0=table[11];
delay1
(1);
reset();
write_byte(0xcc);
//SkipROM
write_byte(0x44);
//转换温度
write_byte(0xbe);
//读取寄存器
t[1]=read_byte();
//读出温度低八位
t[0]=read_byte();
//读出温度高八位
yu=t[0];
yu<
<
=8;
yu=yu|t[1];
x=yu*0.0625;
//12位分辨率
q++;
//定义将第一次读取到的温度,
if(q>
1)q=2;
//赋给最大与最小值供后面的温度进行比较
if(q==1){min=max=x;
if(x>
max)max=x;
if(x<
min)min=x;
chuli();
disp();
/**********************************************************
*函数原型:
keychuli();
*功能:
处理与键盘相连的P1口的内容,作为键值。
**********************************************************/
ucharkeychuli()
uchark;
k=P1;
//P1口内容送K
k=~k;
//取反
k=(k&
0xff);
return(k);
//返回键值
函数原型:
key();
功能:
键盘扫描函数,函数返回值即键值。
ucharkey()
ucharkeyzhi,keyzhii;
keyzhi=keychuli();
//调P1口处理函数
if(keyzhi!
=0)//有键动作延时去抖动,否则函数返回
{
delay1(10);
keyzhi=keychuli();
//再次调P1口处理函数
if(keyzhi!
=0)//真正有键按下,取键值并暂存
keyzhii=keyzhi;
while(keyzhi!
=0)//判按键是否释放,没有释放延时去抖动等待释放
delay1(10);
delay1(10);
keyzhi=keyzhii;
//按键释放后恢复按键键值
}
}
return(keyzhi);
//返回按键键值
/*主程序*/
voidmain()
{uchart=0;
while(mid!
=1)//开始进入全部显示0
mid=key();
while
(1)
//读取温度和显示
display();
switch(mid)
{
case2:
//键2清零
q=0;
min=0;
max=0;
for(t=0;
t<
t++)