温控检测.docx
《温控检测.docx》由会员分享,可在线阅读,更多相关《温控检测.docx(21页珍藏版)》请在冰点文库上搜索。
温控检测
天津农学院
结课论文
题目:
基于数字温度传感器DS18B20的
振动箱体温度检测仪的设计
学生姓名XX
系别机电工程系
专业班级XXXX
任课教师XXXXX
成绩评定
2011年11月
目录
1引言1
2.DS18B20、热敏电阻的测温原理2
2.1热敏电阻2
2.2数字温度传感器DS18B202
2.2.1DS18B20简介2
2.2.2DS18B20工作原理3
3电路硬件部分5
3.1DS18B20接口电路5
3.2显示电路设计6
3.2.1LCD1602显示原理6
3.2.2LCD1602C显示电路6
3.3.硬件抗干扰措施7
4温度检测系统软件设计及调试9
4.1程序流程图9
4.2系统调试10
所用到的调试工具为:
万用表10
5.结论10
参考文献11
附录1:
系统电路原理图11
附录2:
电路源程序12
1引言
伴随着科学技术的进步和经济的不断发展,温度控制已经成为人类生产生活中不可或缺的一部分。
传统温控箱,操作麻烦,故障率高,价格昂贵,不适应发展的需要。
诸如自动化工业,环境监测与保护,生产安全监控,都里不来温度测量这个最为重要的环境基础性参数。
而如何实现测量的精确性,稳定性,可操作性,低投入并且高效,是新一代温度测量仪的必然要求。
本文该温度测量系统,实现对温度的实时测量与显示等。
系统包括硬件设计和软件设计两部分。
硬件设计部分包括单片机控制芯片,温度测量电路,温度显示电路,软件设计部分包括相应信号采集与处理程序及单片机接口子程序等,实现实时测温、显示功能。
2.针对DS18B20、热敏电阻的测温原理及使用环境选择器件
2.1热敏电阻:
了解热敏电阻原理,是应用好热敏电阻的前提。
热敏电阻是对温度敏感的半导体元件主要特征是随着外界环境温度的变化,其阻值会相应发生较大改变。
电阻值对温度的依赖关系成为阻温特性。
热敏电阻根据温度系数分为两类:
正温度系数热敏电阻和负温度系数热敏电阻。
由于特性上的区别,应用场合互不相同。
缺点:
①阻值与温度的关系非线性严重;
②元件的一致性差,互换性差;
③元件易老化,稳定性较差;
④除特殊高温热敏电阻外,绝大多数热敏电阻仅适合0~150℃范围,使用时必须注意
2.2数字温度传感器DS18B20
2.2.1DS18B20简介
DS18B20是DALLAS公司生产的一线式数字温度传感器,具有3引脚TO-92小体积封装形式;温度测量范围为-55℃~+125℃,可编程为9位~12位A/D转换精度,测温分辨率可达0.0625℃,被测温度用符号扩展的16位数字量方式串行输出,其工作电源既可在远端引入,也可采用寄生电源方式产生;多个DS18B20可以并联到3根或2根线上,CPU只需一根端口线就能与诸多DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。
同DS1820一样,DS18B20也支持“一线总线”接口,测量温度范围为-55℃~+125℃,在-10℃~+85℃范围内,精度为0.5℃。
DS18B20的精度较差为±0.2℃。
现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。
适合于恶劣环境的现场温度测量。
如:
环境控制、设备或过程控制、测温类消费电子产品等。
与前一代产品不同,新的产品支持3V~5.5V的电压范围,使系统设计更灵活、方便。
而且新一代产品更便宜,体积更小。
该产品适用于冷冻库,粮仓,储罐,电讯机房,电力机房,电缆线槽等测温和控制领域;轴瓦,缸体,纺机,空调,等狭小空间工业设备测温和控制;汽车空调、冰箱、冷柜、以及中低温干燥箱等;供热/制冷管道热量计量,中央空调分户热能计量和工业领域测温和控制
2.2.2DS18B20工作原理
DS18B20的测温原理如图1所示,图中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振随温度变化其震荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入,图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生时钟脉冲后进行计数,进而完成温度测量。
计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时温度寄存器的值将加1,
图1DS18B20与处理器连接图
减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。
斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直至温度寄存器值达到被测温度值,这就是DS18B20的测温原理。
另外,由于DS18B20单线通信功能是分时完成的,他有严格的时隙概念,因此读写时序很重要。
系统对DS18B20的各种操作必须按协议进行。
操作协议为:
初始化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据。
各种操作的时序图与DS1820相同。
2.2.3元件的选择
传统的温度检测系统以热敏电阻为温度敏感元件,热敏电阻成本低,但需要后续信号处理电路,而且热敏电阻的可靠性较差,测量温度的准确度低,检测系统的精度差。
如果采用模拟温度传感器,模拟信号在传输过程中遇到的干扰问题往往不能得到彻底解决,当传感器与数据采集器距离较远,信号线周围存在电磁干扰源时,该问题显得尤为突出。
从温度传感器信号传输方式考虑,多点检测时多线制用线量大,施工困难,成本高,系统的整休可靠性差;总线制由于不能采用寄生供电,传感器数量较多时,也会使整个系统结构变得复杂起来。
单总线数字温度传感器克服了上述不足。
用单总线温度传感器设计冷库温度检测系统具有如下特点:
较高的性能价格比;监测对象越多越能显示其优越性;硬件施工工作量少;系统维修方便;抗千扰性能好;有CRC校验,可靠性高;系统简明直观。
研究了以上温度传感器的特性以及信号传输方式,应该选择单总线数字温度传感器DS18B20比较合适。
3电路硬件部分
温度控制系统采用AT89S51八位机作为微处理单元进行控制。
温度传感器把采集的信号与单片机里的数据相比较来控制温度控制器。
本系统的一个优点就是硬件资源少,因而出故障的的可能性就小,各种干扰和噪声效应就小。
两个DS18B20分别安装在箱体金属外壳上和箱体内,箱体振动对系统的影响不大。
系统框图如图2。
1602C显示系统
单
片
机
AT89C52
温度传感器DS18B20
图2基于单片机的温度检测系统框图
3.1DS18B20接口电路
在硬件上,DS18B20与单片机的连接有两种方法,一种是VCC接外部电源,GND接地,I/O与单片机的I/O线相连;另一种是用寄生电源供电,此时UDD、GND接地,I/O接单片机I/O。
无论是内部寄生电源还是外部供电,I/O口线要接5KΩ左右的上拉电阻。
我们采用连接方法,如图3所示
图3温度传感电路图
3.2显示电路设计
液晶显示器是一种将液晶显示器件,连接器件,集成电路,PCB线路板,背光源,结构器件装配在一起的组件。
根据显示内容和方式的不同可以分为,数显LCD,点阵字符LCD,点阵图形LCD在此设计中我们采用点阵字符LCD,这里采用常用的2行16个字的1602液晶模块。
3.2.1LCD1602显示原理
DDRAM就是显示数据RAM,用来寄存待显示的字符代码。
共80个字节,其地址和屏幕的对应关系如下表:
表1显示地址
显示位置
1
2
3
4
5
6
7
……
40
DDRAM
地址
第一行
00H
01H
02H
03H
04H
05H
06H
……
27H
第二行
40H
41H
42H
43H
44H
45H
46H
……
67H
也就是说想要在LCD1602屏幕的第一行第一列显示一个"A"字,就要向DDRAM的00H地址写入“A”字的代码就行了。
但具体的写入是要按LCD模块的指令格式来进行的。
那么一行有40个地址,但在1602中我们就用前16个就行了。
第二行也一样用前16个地址。
对应如下:
DDRAM地址与显示位置的对应关系
3.2.2LCD1602C显示电路
温度检测系统中,AT89S51单片机的并口P0与LCD1602的8位双向数据线相连接,通过并口输入或输出数据或指令,从而实现温度显示功能,基本操作时序如下
LCD1602与单片机的连接如图4所示。
图4液晶显示电路图
读状态输入:
RS=L,RW=H,E=H输出:
DB0~DB7=状态字
写指令输入:
RS=L,RW=L,E=下降沿脉冲,DB0~DB7=指令码输出:
无
读数据输入:
RS=H,RW=H,E=H输出:
DB0~DB7=数据
写数据输入:
RS=H,RW=L,E=下降沿脉冲,DB0~DB7=数据输出:
无
把8根数据线和P1口连接,把3根控制线和P3.5、P3.6、P3.7连接。
给VCC端加上+5V的电压,GND端接地。
VEE端的驱动电压不要过大,要调节滑动变阻器使VEE在0.7伏以下显示器才能工作。
3.3.硬件抗干扰措施
硬件抗干扰是应用系统最基本和最主要的抗干扰手段,一般从防和抗两方面入手来抑制干扰。
其总的原则是:
抑制或消除干扰源,切断干扰对系统的藕合通道,降低系统对干扰信号的敏感性。
对于本系统,硬件抗干扰设计具体措施有:
隔离、接地、滤波等常用方法。
(l)隔离主要用于过程通道的隔离。
光电耦合器能有效地抑制尖峰脉冲及各种噪声干扰,提高信噪比。
在输入、输出通道采用光电藕合器将控制系统与外围接口隔离。
(2)接地接地应遵循的基本原则是:
数字地、模拟地、屏蔽地应该合理接地,不能混用。
要尽可能地使接地电路各自形成回路,减少电路与地线之间的电流祸合。
合理布置地线使电流局限在尽可能小的范围内,并根据地电流的大小和频率设计相应宽度的印刷电路和接地方式。
模拟电源和数字电源各自并接0.lμF的陶瓷电容(去藕电容)。
(3)滤波电源系统干扰源主要是高次谐波。
无源滤波器是一个简单的、有效的低通滤波器,它只让电网中基波通过,而对高次谐波有急剧的衰减作用,对串模干扰和共模干扰信号具有很强的双向抑制作用。
4温度检测系统软件设计及调试
4.1程序流程图
主程序是系统的监控程序,在程序运行的过程中必须先经过初始化,包括中断程序,以及各个控制端口的初始化工作。
系统在初始化完成后就进入温度测量程序,实时的测量当前的温度,让后测量并计算出平均温度,信息通过LCD显示出来。
根据硬件设计完成对温度的显示。
系统软件设计的总体流程图如图6。
图6系统软件流程图
4.2系统调试
所用到的调试工具为:
万用表
当焊接好电路板后,可以进入硬件电路的调试阶段。
根据硬件逻辑电路图,使用万用表的欧姆档检查每个点的链接情况,如果有漏焊、虚焊和错焊的节点的则重新焊接好。
电路全部连接好后则上电调试,在上电调试过程中先给电路通上前面部分的5V信号电源。
在通电过程中时刻观察电路元器件是否有异常情况,如果某些芯片有发烫等异常情况就马上断开电源。
把电路重新检查,是否还有错焊或芯片某些管脚所给的电压或电流信号没有按照芯片的典型数值。
把有错误的地方则重新焊接,接着继续接上电源。
上述情况都正常后就可以进入硬件的联机调试。
需要注意的是,在加电状态下,不能拔插任何集成电路芯片,以免损坏芯片。
在实际的调试过程中,遇到了如下一些问题:
(1)CPU芯片发热。
用万用表检查的结果是单片机出现了短路,去掉短路线后,单片机能正常工作。
(2)在按下复位按钮以后,没有任何作用。
所以可以判断是复位按钮坏了或者是连接错误,经过检查复位按钮连错了。
最后,通过硬件调试使得硬件电路的各部分正常工作,达到了调试的目的。
5.结论
本文介绍了基于DS18B20温度检测系统,温度采集为数字量输出,稳定、可靠、精度高。
并采用了软件看门狗技术,使得在恶劣的环境之下,系统可以自复位,测量能够稳定进行。
采用1602液晶屏显示温度,美观而无需动态扫描,使得显示清晰,稳定。
当然,本系统也有一些不足之处,没有无线通讯技术,这样就无法在办公室里了解振动箱体的情况。
附录1:
系统电路原理图
附录2:
电路源程序
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitlcdrs=P1^0;
sbitlcdrw=P1^1;
sbitlcden=P1^2;
sbitDQ=P1^3;
ucharcodetable[]="ZDXWENDU:
";
ucharcodeshuzhi[]="0123456789-.";
ucharxianshi[10],c=0,TMPL,TMPH,fuhao;
ucharcodeserial_number[2][8]={0x28,0x2e,0xe0,0xce,0x01,0x00,0x00,0xe6,//一号18b20ROM号
0x28,0x13,0x2d,0x6c,0x01,0x00,0x00,0x21};//二号
floatwendu[2]=0,t=0.0;
voiddelay(uintz)//延时函数
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidwrite_com1(ucharcom1)//写指令
{
lcdrs=0;
lcdrw=0;
P0=com1;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidwrite_data(uchardate)//写数据
{
lcdrs=1;
lcdrw=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidinit()//初始化
{
lcden=0;
write_com1(0x38);//显示模式设置
write_com1(0x0e);//开显示,显示光标,不闪烁
write_com1(0x06);//当读或写一个字符后地址指针加一,且光标加一
write_com1(0x01);//清屏
}
/***********************************************************************/
voiddelayus(uintN)
{
inti;
for(i=0;i;
}
/********************************************************************
*名称:
Reset()
*功能:
复位DS18B20
*输入:
无
*输出:
无
***********************************************************************/
ucharReset(void)
{
uchardeceive_ready;
DQ=0;
delayus(29);
DQ=1;
delayus(3);
deceive_ready=DQ;
delayus(25);
return(deceive_ready);
}
/********************************************************************
*名称:
read_bit()
*功能:
从DS18B20读一个位值
*输入:
无
*输出:
从DS18B20读出的一个位值
***********************************************************************/
ucharread_bit(void)
{
uchari;
DQ=0;
DQ=1;
for(i=0;i<3;i++);
return(DQ);
}
/********************************************************************
*名称:
write_bit()
*功能:
向DS18B20写一位
*输入:
bitval(要对DS18B20写入的位值)
*输出:
无
***********************************************************************/
voidwrite_bit(ucharbitval)
{
DQ=0;if(bitval==1)
DQ=1;
delayus(5);
DQ=1;
}
/********************************************************************
*名称:
read_byte()
*功能:
从DS18B20读一个字节
*输入:
无
*输出:
从DS18B20读到的值
***********************************************************************/
ucharread_byte(void)
{
uchari,m,receive_data;
m=1;
receive_data=0;
for(i=0;i<8;i++)
{
if(read_bit())
{
receive_data=receive_data+(m<
}
delayus(6);
}
return(receive_data);
}
/********************************************************************
*名称:
write_byte()
*功能:
向DS18B20写一个字节
*输入:
val(要对DS18B20写入的命令值)
*输出:
无
***********************************************************************/
voidwrite_byte(ucharval)
{
uchari,temp;
for(i=0;i<8;i++)
{
temp=val>>i;
temp=temp&0x01;
write_bit(temp);
delayus(5);
}
}
/********************************************************************
*名称:
主函数
*功能:
主函数
*输出:
无
***********************************************************************/
voidmain()
{
uchari,j;
longT=0,temp=0;
init();
while
(1)
{
Reset();
write_byte(0xcc);
write_byte(0x44);
delay
(2);
for(j=0;j<2;j++)//读取转换后的2个温度
{
Reset();//返回1则继续复位,直到检测到低电平的应答脉冲则向下执行
write_byte(0x55);//ROM匹配
for(i=0;i<8;i++)
write_byte(serial_number[j][i]);//ROM匹配注意:
发送序列号后,只有匹配的18B20才会对接下来的命令响应
write_byte(0xbe);//readscratchpad命
TMPL=read_byte();
TMPH=read_byte();
temp=TMPH*16+TMPL;
fuhao=1;
if(temp>0xf000)//为负温度
{
temp=~temp+1;
fuhao=-1;
}
wendu[j]=temp/16.0+temp%16/16.0;//将温度高低字节变成float
}
t=(wendu[0]+wendu[1])/2;
T=t*10;
c=0;
if(fuhao==-1)
{xianshi[c]=shuzhi[10];c++;}
if(T>1000){xianshi[c]=shuzhi[1];c++;}
if(T>100){xianshi[c]=shuzhi[T%1000/100];c++;}
xianshi[c]=shuzhi[T%100/10];c++;
xianshi[c]=shuzhi[11];c++;
xianshi[c]=shuzhi[T%10];c++;
write_com1(0x80);//设置显示位置
for(i=0;i<9;i++)//显示
{
write_data(table[i]);
delay(20);
}
write_com1(0x80+0x40);//设置显示位置
for(i=0;i{
write_data(xianshi[i]);
delay(20);
}
}
}