数字温度计设计报告Word文档格式.docx
《数字温度计设计报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《数字温度计设计报告Word文档格式.docx(19页珍藏版)》请在冰点文库上搜索。
![数字温度计设计报告Word文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-4/30/eb5d0c28-1b46-41d3-9bfe-e965d8e378a3/eb5d0c28-1b46-41d3-9bfe-e965d8e378a31.gif)
摘要:
温度的检测与控制是工业生产过程中比较典型的应用之一,随着传感器在生活中的更加广泛的应用,利用新型数字温度传感器实现对温度的测试与控制得到更快的开发,本文设计了一种基于AT89C51的温度检测及报警系统。
该系统可以方便的实现温度采集和显示,并可根据需要任意设定上下限报警温度,它使用起来相当方便,具有精度高、量程宽、灵敏度高、体积小、功耗低等优点,适合于我们日常生活和工、农业生产中的温度测量,也可以当作温度处理模块嵌入其它系统中,作为其他主系统的辅助扩展。
该系统设计和布线简单,结构紧凑,抗干扰能力强,在大型仓库、工厂、智能化建筑等领域的温度检测中有广泛的应用前景。
关键词:
单片机;
温度传感器;
AT89C51;
AD590
一、引言
当今社会,温度检测系统被广泛的社会生产、生活的各个领域。
在工业、环境检测、医疗、家庭等多方面都有应用。
同时单片机在电子产品中的应用已经越来越广泛。
随着温度检测理论与技术的不断更新,温度传感器的种类也越来越多,在微机系统中使用的传感器,必须是能够将非电量转换成电量的传感器,目前常用的有热电偶传感器、热电阻传感器和单导体传感器等,每种传感器根据其自身特性,都有它自己的应用领域。
本设计所介绍的数字温度计与传统的温度计相比,具有读数方便、测温范围广、测温准确、其输出温度采用数字显示等优点,主要用于对温度比较准确的场所,或科研实验室使用。
该设计控制器使用单片机AT89C51,温度传感器使用AD590,用4位共阴极LED数码管显示数据,实现温度显示。
二、设计任务及性能指标
本设计主要是介绍了单片机控制下的温度检测系统,详细介绍了其硬件和软件设计,并对其各功能模块做了详细介绍,其主要功能和指标如下:
●利用温度传感器(AD590)测量某一点环境温度
●测量范围为-30℃~+150℃
●用数码管进行实际温度值显示
三、总体设计方案
⒈整体功能说明:
以51单片机为主控制器,以数字式温度传感器AD590为传感元件,以LED数码管作为显示器件实时显示测量温度(十进制数)。
数字式温度计测温范围在-30~150℃。
温度测量间隔时间选择1s。
2.硬件功能模块组成:
温度计的控制器使用单片机AT89C51,温度传感器使用AD590,运算放大器使用OP07,用4位共阴LED数码管以动态扫描法实现温度显示。
主控制器:
单片机AT89C51具有低电压供电和小体积等特点,两个端口刚好满足电路系统的设计需要。
显示电路:
显示电路采用4位共阴LED数码管,从P1口输出段码,列扫描用P3.0~P3.3口来实现。
3.软件功能组成模块:
系统程序主要包括主程序、读出温度子程序、温度转换命令子程序、计算温度子程序和显示数据刷新子程序等。
主程序:
主要功能是负责温度的实时显示、读出并处理AD590的测量温度值。
温度测量每1s进行一次。
4.硬件总体框图:
四、系统硬件电路的设计
1.整体功能说明:
数字式温度计测温范围在-30~150℃,温度测量间隔时间选择1s。
2.硬件功能模块组成:
温度计电路设计原理图如下图所示,温度计的控制器使用单片机AT89C51,温度传感器使用AD590,用4位共阴极LED数码管以动态扫描法实现温度显示。
2.1系统电路原理图和PCB布线图
整个系统设计时,为了简化单个PCB板的布线嗯和系统各部分调试的方便,此设计采用模拟电路部分和数字控制电路部分分开成两个模块,分别画原理图和PCB布线图。
如下图:
模拟电路部分电路原理图
模拟电路部分PCB布线图
数字电路部分电路原理图
数字电路部分PCB布线图
2.2主控制器
单片机AT89C51具有低电压供电和小体积等特点,两个端口刚好满足电路系统的设计需要。
2.3温度测量模块
主要用到的是AD590温度传感器,将采集到的温度模拟量(-30度到150度)转换成数字量,并接上一个上拉电阻后再送给单片机P3.5口。
2.4运算放大电路
TD07(OP07)低噪声高精度运算放大器
1 特点
1)低的输入噪声电压幅度—0.35μVP-P(0.1Hz~10Hz)
2)极低的输入失调电压—10μV
3)极低的输入失调电压温漂—0.2μV/℃
4)具有长期的稳定性—0.2μV/MO
5)低的输入偏置电流—±
1nA
6)高的共模抑制比—126dB
7)宽的共模输入电压范围—±
14V
8)宽的电源电压范围—±
3V~±
22V
2 应用简介
TD07高精度运算放大器具有极低的输入失调电压,极低的失调电压温漂,非常低的输入噪声电压幅度及长期稳定等特点。
可广泛应用于稳定积分、精密绝对值电路、比较器及微弱信号放大。
2.5显示电路
显示电路采用4位共阴极LED数码管,从P1口输出段码,列扫描用P0.0~P0.3口来实现。
2.6温度传感器工作原理
1.AD590的性能特点
集成温度传感器实质上是一种半导体集成电路,它是利用晶体管的b-e结压降的不饱和值VBE与热力学温度T和通过发射极电流I的下述关系实现对温度的检测,集成温度传感器具有线性好、精度适中、灵敏度高、体积小、使用方便等优点,得到广泛应用。
集成温度传感器的输出形式分为电压输出和电流输出两种。
电压输出型的灵敏度一般为10mV/K,温度0℃时输出为0,温度25℃时输出2.982V。
电流输出型的灵敏度一般为1mA/K。
AD590是美国模拟器件公司生产的单片集成两端感温电流源。
它的主要特性如下:
流过器件的电流(mA)等于器件所处环境的热力学温度,AD590的测温范围为-55℃到+150℃。
AD590的电源电压范围为4V-30V。
电源电压可在4V-6V范围变化,电流变化1mA,相当于温度变化1K。
AD590可以承受44V正向电压和20V反向电压,因而器件反接也不会被损坏。
输出电阻为710MW。
精度高共有I、J、K、L、M五档,其中M档精度最高,在-55℃到+150℃范围内,非线性误差为±
0.3℃。
AD590的输出电流I=(273+T)μA(T为摄氏温度),因此测量的电压V为(273+T)μA×
10K=(2.73+T/100)V。
由于一般电源供应较多器件之后,电源是带杂波的,因此我们使用两个电容作为滤波元件,再利用可变电阻分压,其输出电压V1需调整至2.73V接下来我们使用差动放大器其输出Vo为(100K/10K)×
(V2-V1)=T/10,如果现在为摄氏28℃,输出电压为2.8V,输出电压接AD转换器,那么AD转换输出的数字量就和摄氏温度成线形比例关系。
五、系统的软件设计
1.主程序
主程序需要调用4个子程序,分别为数码管显示程序,温度测试及处理子程序,报警子程序,中断设定子程序。
各模块程序功能如下:
●数码管显示程序:
向数码的显示送数,控制系统的显示部分。
●温度测试及处理程序:
对温度芯片送过来的数据进行处理,进行判断和显示。
主程序流程见图:
主程序流程图
六、系统调试
根据方案设计的要求,调试过程共分3大部分:
硬件调试、软件调试和软硬联调。
1.硬件调试
硬件调试比较简单首先检查电路的焊接是否正确,然后可用万用表测试或通电检测。
2.软件调试
除语法和逻辑差错外,当确认程序没问题时,直接下载到单片机仿真调试。
采取自下而上的方法,单独调好每一个模块,最后完成一个完整的系统调试。
3.软硬调试
系统做好后,进行系统的完整调试。
联机仿真必须借助仿真开发装置、示波器、万用表等工具。
这些工具是单片机开发的最基本工具。
七、总结与体会
经过一个月的方案论证、系统的硬件和软件的设计、系统的调试。
查阅了大量的关于传感器、单片机及其接口电路、以及模拟电子技术方面的理论。
通过这次实训,我发现在现实设计中还需要注意很多的细节,包括程序设计和硬件设计都要我们小心仔细,一个地方出错就可能会整个系统失效。
在硬件设计时,由于电路图转印不好使得腐蚀后的电路板出现断线,在调试过程中引来很大的麻烦。
经过了一番特殊的体验后,经历了失败的痛苦,也尝到了成功的喜悦。
第一次靠用所学的专业知识来解决问题。
检查了自己的知识水平,使我对自己有一个全新的认识。
通过这次设计,不仅锻炼自己分析问题、处理问题的能力,还提高了自己的动手能力。
这些培养和锻炼对于我们来说,是很重要的。
这次设计基本的完成了任务书的要求,实现了温度的控制。
通过测试表明系统的设计是正确的,可行的。
但是由于设计者的设计经验和知识水平有限,系统还存在许多不足和缺陷。
谢辞
在本次实训中,我遇到了很多难题,然而这些难题让我不断的学习,在因难中进步,在此我要感谢指导教师给我提供的宝贵的意见,感谢学校给我们这提供实训的机会。
参考文献
[1]华成英主编.模拟电子技术基本教程.清华大学出版社,2006
[2]何道清张禾諶海云编著.传感器与传感器技术(第二版).北京.科学出版社,2008
[3]张毅刚彭喜元著.单片机原理及接口技术.人民邮电出版社,2008
附录I程序清单
#include<
reg52.h>
//定义段码,不带小数点
Unsignedcharcodetab_duan[16]={0x77,0x41,0x3b,0x6b,0x4d,0x6e,0x7e,0x43,0x7f,0x6f};
//定义段码,带小数点
unsignedcharcodetab_duan_r[16]={0xf7,0xc1,0xbb,0xeb,0xcd,0xee,0xfe,0xc3,0xff,0xef};
//定义位码
unsignedcharcodetab_wei[4]={0x7f,0xbf,0xdf,0xef};
//定义符号
unsignedcharSign=0x08;
unsignedlongTin_val;
//保存计数值
unsignedintTem_val;
//保存当前温度
unsignedlongFrequency;
//保存实际频率值
unsignedcharSign;
//保存温度负号标志
voidDelayUs(unsignedintNum);
voidLedDisplay(unsignedintNum,unsignedcharflag);
unsignedintGet_Temperature(unsignedlongFreq);
voidTimer_Init(void);
//主函数
voidmain(void)
{
Timer_Init();
//定时器初始化
Tem_val=0;
Tin_val=0;
for(;
;
)
{
LedDisplay(Tem_val,Sign);
}
}
/********************************************************
函数名称:
DelayUs
功能:
微秒延时
参数:
Num微秒数
返回值:
无
*********************************************************/
voidDelayUs(unsignedintNum)
while(Num--);
函数名字:
LedDisplay
数码管显示函数
Num:
待显示的数,整形,flag:
正负温度显示标准
********************************************************/
voidLedDisplay(unsignedintNum,unsignedcharflag)
unsignedchari;
unsignedchartab[4];
tab[0]=Num/1000;
tab[1]=Num%1000/100;
tab[2]=Num%100/10;
tab[3]=Num%10;
for(i=0;
i<
4;
i++)
if(i==0)
if(flag==0)//判断负温度标志
P1=tab_duan[tab[i]];
else
P1=0x08;
else
if(i==2)
P1=tab_duan_r[tab[i]];
//显示小数点
else
P1=tab_duan[tab[i]];
P0=tab_wei[i];
DelayUs(20);
P1=0x0;
}
/********************************************************************
Get_Temperature
根据频率值计算出实际温度
Freq:
频率值
TemperVal实际温度值
********************************************************************/
unsignedintGet_Temperature(unsignedintFreq)
unsignedintTemperVal;
staticunsignedcharVK=2;
//电压比例系数
staticfloatFreqK=1.33;
//压频转换系数
TemperVal=(unsignedint)(((float)Freq/FreqK)*10/VK);
if(TemperVal<
273*10)//判断当前温度读是否小于273K
Sign=1;
//显示负号
return273*10-TemperVal;
Sign=0;
//显示正号
returnTemperVal-273*10;
}
/**********************************************************
**********************************************************/
Timer_Init
初始化定时器0,工作在定时中断模式,定时1S
初始化定时器1,工作在计数模式
voidTimer_Init(void)
TMOD=0X01;
//定时器0初始化为工作方式1
TH0=(65536-50000)/256;
//初值50000,50ms中断一次
TL0=(65536-50000)%256;
ET0=1;
//允许定时器0中断
TMOD|=0x60;
//定时器1初始化为工作方式2,计数模式
TH1=0;
//初值赋为0
TL1=0;
ET1=1;
//允许定时器1中断
EA=1;
//打开总中断
TR0=1;
//打开定时器0
TR1=1;
//打开计数器1
TIMER1_INTE
频率计数器累加,保存到Tin_val中
*************************************************************/
voidTIMER1_INTE(void)interrupt3
//TH1=0;
//TL1=0;
Tin_val++;
//计数器加加
TIMER0_INTE
读取计数值,并计算出实际温度
voidTIMER0_INTE(void)interrupt1
staticunsignedchartem=0;
//从新赋值
tem++;
if(tem==20)//计数到20,为1S
tem=0;
TR0=0;
//关闭定时器0,避免出现误差
TR1=0;
//关闭计数器1
Frequency=Tin_val*256+TL1;
//得到频率
Tem_val=Get_Temperature(Frequency);
//得到实际温度,并保存到Tem_val变量中
Frequency=0;
//变量从新初始化
Tin_val=0;
TL1=0;
//
TH1=0;
//清除上一次保存的计数值
TR1=1;
//打开计数器
TR0=1;
//打开定时器0
附录II元器件清单