基于单片机和K型热电偶的温度测量仪表设计.docx

上传人:b****7 文档编号:26112839 上传时间:2023-06-17 格式:DOCX 页数:15 大小:737.39KB
下载 相关 举报
基于单片机和K型热电偶的温度测量仪表设计.docx_第1页
第1页 / 共15页
基于单片机和K型热电偶的温度测量仪表设计.docx_第2页
第2页 / 共15页
基于单片机和K型热电偶的温度测量仪表设计.docx_第3页
第3页 / 共15页
基于单片机和K型热电偶的温度测量仪表设计.docx_第4页
第4页 / 共15页
基于单片机和K型热电偶的温度测量仪表设计.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

基于单片机和K型热电偶的温度测量仪表设计.docx

《基于单片机和K型热电偶的温度测量仪表设计.docx》由会员分享,可在线阅读,更多相关《基于单片机和K型热电偶的温度测量仪表设计.docx(15页珍藏版)》请在冰豆网上搜索。

基于单片机和K型热电偶的温度测量仪表设计.docx

基于单片机和K型热电偶的温度测量仪表设计

1.概述

1.1题目名

基于单片机和K型热电偶的温度测量仪表设计

1.2功能和技术指标要求

(1)温度测量范围:

室温~200℃;

(2)温度检测元件:

K型分度号热电偶;

(3)具有热电偶冷端温度自动补偿功能;

(4)温度测量精度:

1℃±FS*2%;

(5)温度显示:

LED或LCD数字显示,显示分辨率0.1℃

(6)具有温度上限、下线设置功能,当温度测量值越限时,进行声光报警;

(7)电源:

电网AC220V,要求在电网电压变化±15%范围内能够正常工作。

1.3国内外相关情况概述

温度的测量的历史:

第一个温度传感器是伽利略做出来的。

而温度测量的里程碑是由法勒海特设计的水银温度计。

1740年瑞典人摄氏提出在标准大气压下,把冰水混合物的温度规定为0度,而水的沸腾度为100度。

温度测量在保证产品的质量,节约能源,安全生产起到至关重要的作用。

技术现状有点到线,线到面温度分布的测温技术;由表面到内部的测温技术。

发展趋势是由于环境的多样化,复杂化,测温对象的多样化,智能检测成为现在温度测试的趋势。

所以要加强新工艺的开发;向着智能化发展。

2.技术方案

2.1温度测量的基本方法与原理

常见的温度测量方法和测温原理有:

接触式,原理是热胀冷缩,这种方法测温方便。

液体式(如毛细管,水银温度计),原理是受热,液体膨胀系数变大,从而液体上升。

这种方法测温比较准确。

2.2总技术方案

温度测量仪表功能结构

先读取环境温度,热电偶测得温度经过ADC转换器变成数字,测得冷端温度,用补偿法再计算出温度值,送到显示器显示。

如果温度超过上限设置,下限设置则蜂鸣器报警,且LED灯变红。

3.硬件设计

3.1热电偶放大器设计

冷端补偿专用芯片MAX6675的温度读取

芯片MAX6675采用标准SPI串行外设总线与MCU接口,MAX6675只能作为从设备。

温度值与数字对应关系为:

温度值=1023.75×转换后的数字量/4095

3.2热电偶冷端温度补偿方法及电路

冷端补偿法:

测冷端温度补偿法再计算出温度值送到显示器

(循环)

LCD显示(循环)ASC码

电路:

3.3ADC电路

由MAX6675完成AD转换。

3.4稳压电源电路

学生电源。

3.5微处理器

STC52单片机,芯片MAX7765;按键;显示系统采用四位共阳极数码管7SEG-MPX4-CA,报警电路由PNP型三极管Q1和蜂鸣器构成。

3.6总体电路原理图

3.7硬件调试

用热电偶采集温度,把采集信号送到MAX7765中,在MAX6675中进行AD转换成数字信号,把数字信号送到STC52单片机进行处理,再送到显示屏显示。

4.软件设计

4.1软件功能说明

具有热电偶冷端温度自动补偿功能;

具有温度上限、下线设置功能,当温度测量值越限时,进行声光报警;

4.2软件总流程

开始,初始化52,AD初始化启动AD数值滤波(取平均值),调用采集转换子程序,用补偿法计算出温度值,检测是否超量程,超过量程则调用报警程序报警,否的话就继续调用子程序进行循环。

4.3各功能软件

#include"reg52.h"//头文件

#include"intrins.h"//_nop_();延时函数用

#defineucharunsignedchar//用uchar代替unsignedchar,1字节0-255

#defineuintunsignedint//用uint代替nsignedint,2字节0-26653

sbitSO=P1^0;//P1.0口与SO相连

sbitSCK=P1^1;//P1.1口与SCK相连

#include"reg52.h"//头文件

#include"intrins.h"//_nop_();延时函数用

#defineucharunsignedchar//用uchar代替unsignedchar,1字节0-255

#defineuintunsignedint//用uint代替nsignedint,2字节0-26653

sbitSO=P1^0;//P1.0口与SO相连

sbitSCK=P1^1;//P1.1口与SCK相连

sbitCS=P1^2;//P1.2口与CS相连

sbitbuzzer=P1^6;//P13.6s声光报警

uintj,h;

floatwendu;//4字节(6位数字)

uintRe_Convert();//热电偶数据读取,返回温度

voidDisp_temp();//温度显示

ucharqian=0,bai=0,shi=0,ge=0,xiao=0;

uintP_Temp;

uinttemp;

ucharcodetab_1[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

//共阳LED段码表

ucharcodetab_2[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};

//含小数点共阳段码

//"0""1""2""3""4""5""6""7""8""9"

ucharcodetab_3[4]={0x01,0x02,0x04,0x08};//位码

uintRe_Convert()//热电偶数据读取,返回温度

{uchari;

unsignedlongTemp_2;

Temp_2=0;

CS=1;

SCK=0;

_nop_();_nop_();

//这个_nop_()等效与汇编里面的NOP指令,也就是空一个机器周期,

//在51单片机中_nop_()等于空12个时钟周期【即一个机器周期】

CS=0;

for(i=0;i<16;i++)//16位数据读取

{Temp_2<<=1;//向右移一位

_nop_();

SCK=1;//上升

if(SO==1){Temp_2=Temp_2|0x01;}

elseTemp_2=Temp_2|0x00;

_nop_();

SCK=0;

_nop_();

}

Temp_2=Temp_2<<1;//向左移一位,取0-14位

Temp_2=Temp_2>>4;//向右移4位,取3-14位

Temp_2=Temp_2*1024/4096;//变换为温度值Temp_2=Temp_2-23;

Temp_2=Temp_2;

if(Temp_2>200)

{

for(j=300;j>0;j--);

buzzer=0;

}

else

buzzer=1;

return(Temp_2);

}

 

voidDisp_temp()//温度显示

{

uinttemp=wendu;

temp=temp*10;

if(wendu<=200)//最高读取温度设定为200摄氏度

{

xiao=(temp&0x0f)*10/16;//取小数位数字

temp=temp/10;

ge=temp%10;//取个位数字

temp=temp/10;

shi=temp%10;//取十位数字

bai=temp/10;//去百位数字

//动态扫描显示各位数字,P3.1-P3.4口输出位码

P3=0x00;

P0=tab_1[bai];

P3=tab_3[0];

for(j=300;j>0;j--);

P3=0x00;

P0=tab_1[shi];

P3=tab_3[1];

for(j=300;j>0;j--);

P3=0x00;

P0=tab_2[ge];

P3=tab_3[2];

for(j=300;j>0;j--);

P3=0x00;

P0=tab_1[xiao];

P3=tab_3[3];

for(j=300;j>0;j--);

}

}

voidmain()//主程序

{

for(j=300;j>0;j--);

while

(1)

{

wendu=Re_Convert();//热电偶数据读取,返回温度

Disp_temp();//温度显示

}

}sbitCS=P1^2;//P1.2口与CS相连

sbitbuzzer=P1^6;//P13.6s声光报警

uintj,h;

floatwendu;//4字节(6位数字)

uintRe_Convert();//热电偶数据读取,返回温度

voidDisp_temp();//温度显示

ucharqian=0,bai=0,shi=0,ge=0,xiao=0;

uintP_Temp;

uinttemp;

ucharcodetab_1[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

//共阳LED段码表

ucharcodetab_2[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};

//含小数点共阳段码

//"0""1""2""3""4""5""6""7""8""9"

ucharcodetab_3[4]={0x01,0x02,0x04,0x08};//位码

uintRe_Convert()//热电偶数据读取,返回温度

{uchari;

unsignedlongTemp_2;

Temp_2=0;

CS=1;

SCK=0;

_nop_();_nop_();

//这个_nop_()等效与汇编里面的NOP指令,也就是空一个机器周期,

//在51单片机中_nop_()等于空12个时钟周期【即一个机器周期】

CS=0;

for(i=0;i<16;i++)//16位数据读取

{Temp_2<<=1;//向右移一位

_nop_();

SCK=1;//上升

if(SO==1){Temp_2=Temp_2|0x01;}

elseTemp_2=Temp_2|0x00;

_nop_();

SCK=0;

_nop_();

}

Temp_2=Temp_2<<1;//向左移一位,取0-14位

Temp_2=Temp_2>>4;//向右移4位,取3-14位

Temp_2=Temp_2*1024/4096;//变换为温度值Temp_2=Temp_2-23;

Temp_2=Temp_2;

if(Temp_2>200)

{

for(j=300;j>0;j--);

buzzer=0;

}

else

buzzer=1;

return(Temp_2);

}

 

voidDisp_temp()//温度显示

{

uinttemp=wendu;

temp=temp*10;

if(wendu<=200)//最高读取温度设定为200摄氏度

{

xiao=(temp&0x0f)*10/16;//取小数位数字

temp=temp/10;

ge=temp%10;//取个位数字

temp=temp/10;

shi=temp%10;//取十位数字

bai=temp/10;//去百位数字

//动态扫描显示各位数字,P3.1-P3.4口输出位码

P3=0x00;

P0=tab_1[bai];

P3=tab_3[0];

for(j=300;j>0;j--);

P3=0x00;

P0=tab_1[shi];

P3=tab_3[1];

for(j=300;j>0;j--);

P3=0x00;

P0=tab_2[ge];

P3=tab_3[2];

for(j=300;j>0;j--);

P3=0x00;

P0=tab_1[xiao];

P3=tab_3[3];

for(j=300;j>0;j--);

}

}

voidmain()//主程序

{

for(j=300;j>0;j--);

while

(1)

{

wendu=Re_Convert();//热电偶数据读取,返回温度

Disp_temp();//温度显示

}

}

4.4软件测试

软件能运行成功,数码管有温度变化显示。

5.温度测量仪器测试与校准

5.1温度测量仪器测试方法

用热水器烧开的热水进行测试;用手温来测试。

5.2相应记录

热水器烧开的热水

手心温度

88℃

35℃

5.3对实验数据进行分析

误差变动大稍低于实验要求,由于温度不能进行连续变化,要按复位键,所以功能不能满足要求。

误差的原因有放大倍数与其误差的稳定性;热电偶;本身电路;转换电路(基准电源);程序没有完善好。

由于我负责硬件方面,所以改进设想是尽量减少本身电路产生的误差,而且由于跳线较多使得焊电路的时候变得麻烦,以后一定要注意。

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

当前位置:首页 > 党团工作 > 思想汇报心得体会

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1