温度控制系统论文

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

摘要
随着电子产品向智能化和微型化的不断发展,单片机已成为电子产品研制和开发中首选的控制器。

为了更好地推广单片机在实际生活和生产中的应用,本文介绍一种应用AT89S51单片机设计的温度控制系统。

该环境温度系统采用温度传感器DS18B20通过单总线通信来获得当前温度,并与从3X4矩阵键盘输入的温度值进行验证,系统自动控制升温或降温的操作,将温度稳定在所设定的温度值。

经实际制作表明该环境温度控制系统具有体积小、操作灵活、可靠性高、实用、成本低等特点,适合住宅和各类温室温度的控制,具有一定的实际意义。

关键词:单片机;键盘;稳定温度;显示器;温度控制
目录
摘要 (1)
1 绪论 (1)
1.1课题研究的背景 (1)
1.2 课题研究的目的和意义 (2)
2硬件电路设计 (2)
2.1 功能要求 (2)
2.2 工作原理 (2)
2.3 温度测量方案 (2)
2.4温度控制方框图 (3)
3 系统软件设计 (5)
3.1 程序结构分析 (5)
3.2主程序 (5)
4 测试 (6)
总结 (6)
参考文献 (6)
附录1 原理图 (7)
附录2 源程序 (7)
1 绪论
1.1课题研究的背景
工业控制是计算机的一个重要应用领域,计算机控制系统正是为了适应这一领域的需要而发展起来的一门专业技术,它主要研究如何将计算机技术、通过信息技术和自动控制理论应用于工业生产过程,并设计出所需要的计算机控制系统。

随着微机测量和控制技术的迅速发展与广泛应用,以单片机为核心的温度采集与控制系统的研发与应用在很大程度上提高了生产生活中对温度的控制水平。

本设计就是基于单片机STC89S51温度控制系统的设计,通过本次课程实践,我们更加的明确了单片机的广泛用途和使用方法,以及其工作的原理。

1.2 课题研究的目的和意义
随着社会的发展,温度的测量及控制变得越来越重要。

本文采用单片机STC89S51设计了温度实时测量及控制系统。

单片机STC89S51 能够根据温度传感器DS18B20 所采集的温度在液晶屏上实时显示,通过控制从而把温度控制在设定的范围之内。

所有温度数据均通过液晶显示器LCD显示出来。

系统可以根据时钟存储相关的数据。

通过该课程的学习使我们对计算机控制系统有一个全面的了解、掌握常规控制算法的使用方法、掌握简单微型计算机应用系统软硬的设计方法,进一步锻炼同学们在微型计算机应用方面的实际工作能力。

2硬件电路设计
2.1 功能要求
报警模块选用发光二级管LED和蜂鸣器同时报警,超出上限温度或低于下限温度时,进行报警,有效的及时提醒,从而控制温度。

按键设置时可进行连加连减功能。

2.2 工作原理
温度传感器DS18B20 从设备环境的不同位置采集温度,单片机AT89S51 获取采集的温度值,经处理后得到当前环境中一个比较稳定的温度值,再根据当前设定的温度上下限值,通过加热和降温对当前温度进行调整。

当采集的温度经处理后超过设定温度的上限时,单片机通过三极管驱动继电器开启降温设备(压缩制冷器) ,当采集的温度经处理后低于设定温度的下时, 单片机通过三极管驱动继电器开启升温设备(加热器) 。

当由于环境温度变化太剧烈或由于加热或降温设备出现故障,或者温度传感头出现故障导致在一段时间内不能将环境温度调整到规定的温度限内的时候,单片机通过三极管驱动扬声器发出警笛声。

系统中将通过串口通讯连接PC机存储温度变化时的历史数据,以便观察整个温度的控制过程及监控温度的变化全过程。

2.3 温度测量方案
DS18B20是DALLAS公司生产的一线式数字温度传感器,它具有微型化、低功耗、高性能抗干扰能力、强易配处理器等优点,特别适合用于构成多点温度测控系统,可直接将温度转化成串行数字信号(按9位二进制数字)给单片机处理,且在同一总线上可以挂接多个传感器芯片,它具有三引脚TO-92小体积封装形式,温度测量范围-55~+125℃,可编程为9~12位A/D转换精度,测温分辨率可达0.0625℃,被测温度用符号扩展的16位数字量方式串行输出,其工作电源既可在远端引入,业可采用寄生电源方式产生,多个DS18B20可以并联到三根或者两根线上,CPU只需一根端口线就能与多个DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。

从而可以看出DS18B20可以非常方便的被用于远距离多点温度检测系统。

综上,在本系统中我采用温度芯片DS18B20测量温度。

该芯片的物理化学性很稳定,它能用做工业测温元件,且此元件线形较好。

在0—100摄氏度时,最大线形偏差小于1摄氏度。

该芯片直接向单片机传输数字信号,便于单片
机处理及控制。

2.4温度控制方框图
单片机温度控制系统采用的装置有单片机、温度传感器和温度调节设备组成起结构如图2.1硬件结构图所示。

图2.1温度控制系统硬件结构图
2.4.1键盘单元
单片机应用系统中除了复位按键有专门的复位电路,以及专一的复位功能外,其它的按键或键盘都是以开关状态来设置控制功能或输入数据。

键开关状态的可靠输入:为了去抖动我采用软件方法,它是在检测到有键按下时,执行一个10ms的延时程序后,再确认该键电平是否仍保持闭合状态电平,如保持闭合状态电平则确认为真正键按下状态,从而消除了抖动影响在这种行列式矩阵键盘非编码键盘的单片机系统中,键盘处理程序首先执行等待按键并确认有无按键按下的程序段。

当确认有按键按下后,下一步就要识别哪一个按键按下。

S1 设置温度上下限 S2 温度值加 S3 温度值减
图2.2 按键电路
2.4.2 温度控制及超温和超温警报单元
当采集的温度经处理后超过规定温度上限时,单片机通过P1.4 输出控制信号驱动三极管D1 ,使继电器K1 开启降温设备( 压缩制冷设备) :当采集的温度经处理后低于设定温度下限时,单片机通过P1.5 输出控制信号驱动三极管D2 ,使继电器K2 开启升温设备( 加热器1) 。

当由于环境温度变化太剧烈或由于加热或降温设备出现故障,或者温度传感头出现故障导致
在一段时间内不能将环境温度调整到规定的温度限内的时候,单片机通过三极管驱动扬声器发出警笛声。

具体电路连接如图 2.3 所示。

图2.3 超温报警电路
2.4.3 数码管显示电路
显示电路采用了数码管扫描电路,节约了单片机的输出端口,便于程序的编写。

图2.4显示电路
3 系统软件设计
3.1 程序结构分析
主程序调用了5个子程序,分别是数码管显示程序、键盘扫描及按键处理程序、温度信号处理程序。

键盘扫描电路及按键处理程序:实现键盘的输入按键的识别及进入相应的程序。

温度信号处理程序:对温度芯片送过来的数据进行处理,进行判断和显示。

数码管显示程序:向数码的显示送数,控制系统的显示部分。

3.2主程序
图3.2 主程序流程图
程序开始的时候先设置初始化,然后就控制数码管显示当前温度。

接着就判断s1、s2按键是否被按下。

按下s1进入温度控制点1的程序、按下s2进入温度控制点2的程序。

程序控制设置温度的两个数码管闪烁的,此时键盘输入有效。

有按键按下的时候进入按键处理程序。

按下“确定”按键后,程序进入判断程序和继电器控制程序。

继电器动作后,程序回到显示当前程序,并开始循环。

4 测试
1、测试环境
环境温度28摄氏度,室内面积20平方米测试仪器:数字万用表,温度计0----100摄氏度2、测试方法
使系统运行,采用温度计同时测量室内度变化情况,得出系统测量的温度。

3、测试结果
设定温度由0摄氏度到40摄氏度
标定温差<=1摄氏度调节时间15s(具体视现场情况)静态误差<=0.5摄氏度最大超调量1摄氏度
4、通过测试分析,对于实际室内的温度控制,可以再提出以下 2 点方法:Ⅰ增加传感器个数,对各个温度传感器采集的数据进行求算术平均,可得到较为准确的温度值。

Ⅱ对实际室内的温度控制,可采用功率较大的电炉,并且通过风扇对箱内温度进行充分搅和,降温设备可采用空气压缩机等制冷设备。

5、通过实验测试和分析,发现虽然传感器的温度采集精度最高可得到0.06 ℃,但测试得到的数据最小间隔为0.03 ℃。

通过分析,当对浮点数求平均处理时,遇到同一时刻两个传感头采集的温度相差不大,使0.06 ℃时求出平均温度变为0.03 ℃为了解该数据是否真实,可采用一个高精度的数字温度计测试,发现读出的值与其基本一致,由此推断如果在同一时间增加采集温度的个数,则可以进一步提高温度的精度。

总结
参考文献
1曹巧媛主编. 单片机原理及应用(第二版). 北京:电子工业出版社,2002
2全国大学生电子设计竞赛组委会编.第五届全国大学生电子设计竞赛获奖作品选编(2001), 北京:北京理工大学出版社,2003
3何力民编. 单片机高级教程. 北京:北京航空大学出版社,2000 4金发庆等编. 传感器技术与应用.北京机械工业出版社,2002
5王锦标,方崇智.过程计算机控制.北京:清华大学出版社,1997;36~40 6邵惠鹤.工业过程高级控制.上海:上海交通大学出版社,1997;58—62,78—101
7胡寿松.自动控制原理.北京:国防工业出版社,2000;103—124
8刘伯春.智能PID调节器的设计及应用.电子自动化,1995;(3):20~25 9 Katsuhiko Ogata.Moden Control Engineering.Publishing hou se of electronics industry,2000:1 96—202
10 周润景,张丽娜.基于PROTEUS 的电路及单片机系统设计与仿真[M].北京:航空航天
大学出版社,2006.P321~P326
11王忠飞,胥芳.MCS-51 单片机原理及嵌入式系统应用[M].西安:西安电子科技大学出
版社,2007.P268-273
12 刘国钧,陈绍业,王凤翥.图书馆目录.第1版.北京:高等教育出版社,1957
13 傅承义,陈运泰,祁贵中.地球物理学基础.北京:科学出版社,1985,447
14 华罗庚,王元.论一致分布与近似分析.中国科学,1973(4):339~357
15 张筑生.微分半动力系统的不变集研究:[学位论文],北京:数学系统学研究所,1983
16 Microchip 24C01B/02B 8 位PIC®单片机产品手册[ED/OL],/publish/data/2007/2/data_14_27926.html.
17赵娜,赵刚,于珍珠等.基于51 单片机的温度测量系统[J]. 微计算机信息,2007,1-2:146-148。

18 Borko HBernier C L.Indexing concepts and methods .New Yo rk:Academic
附录1 原理图
附录2 源程序
#include<reg52.h>
#include"eeprom.h"
#define uchar unsigned char
#define uint unsigned int
sbit wei1 = P2^1; //数码管位选
sbit wei2 = P2^2;
sbit wei3 = P2^3;
sbit wei4 = P2^4;
sbit DQ = P1^0; //温度
sbit k1=P3^1; //功能按键
sbit k2=P3^2; // 增加键
sbit k3=P3^3; //减少建
uchar TL,TH,TN,TD;
sbit beep=P2^0;
uchar count,num,m,s1num=0; //温度值
uchar htemp=33,ltemp=15; //温度上下线初始化
float f_temp;
int key_delay=0;
const int key_count=200;
bit yyp=1,halarm=0,lalarm=0;
uchar code TAB[]={0xc0,0xcf,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchar code TAB1[]={0xbf,0x89,0xc7,0xa7}; //三个依次是 - H L 后面两个是温度符号
/****毫秒级延时函数*****/
void delay(uint x)
{
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void delay1(uchar i)
{
uchar j=100;
for(i;i>0;i--)
for(j;j>0;j--)
{;}
}
void di()
{
beep=0;
delay(100);
beep=1;
}
/***********ds18b20延迟子函数(晶振12MHz )*******/
///////////////////////////////////////////////////
void delay_18B20(unsigned int i)
{
while(i--);
}
///////////////////////////////////////////////////
/**********ds18b20初始化函数**********************/
////////////////////////////////////////////////////
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
delay_18B20(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay_18B20(80); //精确延时大于 480us
DQ = 1; //拉高总线
delay_18B20(14);
x=DQ; //稍做延时后如果x=0则初始化成功 x=1则初始化失败
delay_18B20(20);
}
////////////////////////////////////////////
/***********ds18b20读一个字节**************/
///////////////////////////////////////////
unsigned char ReadOneChar(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(4);
}
return(dat);
}
//////////////////////////////////////////////////
/*************ds18b20写一个字节****************/
//////////////////////////////////////////////////
void WriteOneChar(uchar dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay_18B20(5);
DQ = 1;
dat>>=1;
}
}
/**************读取ds18b20当前温度************/
//////////////////////////////////////////////
void ReadTemp()
{
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
delay(1);
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度
TL=ReadOneChar(); //先读的是温度值低位
TH=ReadOneChar(); //接着读的是温度值高位
TN=TH*16+TL/16; //实际温度值=(TH*256+TL)/16,即:TH*16+TL/16
//这样得出的是温度的整数部分,小数部分被丢弃了
TD=(TL%16)*10/16; //计算温度的小数部分,将余数乘以10再除以16取整,
//这样得到的是温度小数部分的第一位数字(保留1位小数)
}
////////////////////////////////////////////////
void get_wendu(uchar m)
{
uchar ws,wg;
ws=m/10;
wg=m%10;
wei2=0; //读取温度的十位和个位
P0=TAB[ws];
delay(5);
wei2=1;
P0=0xff;
wei3=0;
P0=TAB[wg]& 0x7f;
delay(5);
wei3=1;
P0=0xff;
}
void get_wendu2(uchar m)
{
wei4=0;
P0=TAB[m];
delay(5);
wei4=1;
P0=0xff;
}
/////////调最高温度调用的函数//////
void hdisplay(uchar dat)
{
uchar fs,fg;
wei1=0; //读取最高温度符号“H-”
P0=TAB1[1];
delay(5);
wei1=1;
P0=0xff;
wei2=0;
P0=TAB1[0];
delay(5);
wei2=1;
P0=0xff;
fs=dat/10;
fg=dat%10;
wei3=0;
P0=TAB[fs];
delay(5);
wei3=1;
P0=0xff;
wei4=0;
P0=TAB[fg];
delay(5);
wei4=1;
P0=0xff;
}
/////////调最低温度调用的函数//////
void ldisplay(uchar dat)
{
uchar fs,fg;
wei1=0; //读取最低温度符号“L=”
P0=TAB1[2];
delay(2);
wei1=1;
P0=0xff;
wei2=0;
P0=TAB1[0];
delay(2);
wei2=1;
P0=0xff;
fs=dat/10;
fg=dat%10;
wei3=0;
P0=TAB[fs];
delay(2);
wei3=1;
P0=0xff;
wei4=0;
P0=TAB[fg];
delay(2);
wei4=1;
P0=0xff;
}
/****按键扫描******/
void keyscan()
{
if(k1==0)
{
delay(10);
if(k1==0)
{
yyp=0;
s1num++;
while(!k1); //等待按键释放
di();
htemp=byte_read(0x2200);
ltemp=byte_read(0x2000);
switch(s1num)
{
case 1:break;
case 2:break;
case 3:if(s1num==3)s1num=0;yyp=1;
break;
}
}
}
if(s1num!=0)
{
if(k2==0)
{
delay(10);
if(k2==0)
{
do
{
delay1(10);
}
while((!k2)&(key_delay++<key_count)); ///等待按键释放
di();
switch(s1num)
{
case 1: htemp++;
if(htemp==99)htemp=0;
hdisplay(htemp);
SectorErase(0x2200);//擦除扇区
byte_write(0x2200,htemp);//重新写入数据
break;
case 2: ltemp++;
if(ltemp==99)ltemp=0;
ldisplay(ltemp);
SectorErase(0x2000);//擦除扇区
byte_write(0x2000,ltemp);//重新写入数据
break;
}
}
}
if(k3==0)
{
delay(10);
if(k3==0)
{
do
{
delay1(10);
}
while((!k3)&(key_delay++<key_count)); //等待按键释放
di();
switch(s1num)
{
case 1: htemp--;
if(htemp==0)htemp=99;
hdisplay(htemp);
SectorErase(0x2200);//擦除扇区
byte_write(0x2200,htemp);//重新写入数据
break;
case 2: ltemp--;
if(ltemp==0)ltemp=99;
ldisplay(ltemp);
SectorErase(0x2000);//擦除扇区
byte_write(0x2000,ltemp);//重新写入数据
break;
}
}
}
}
}
///////////////////////////////////////////////////////////
void baojing()
{
if((TN>=htemp)||(TN<=ltemp)) //温度高于设置最大温度
{
unsigned char i=0;
for (i=8; i>0; i--)
{
beep=~beep;
get_wendu(TN);
get_wendu2(TD);
get_wendu(TN);
get_wendu2(TD);
}
}
else
{
beep=1;
}
}
void main()
{
htemp=byte_read(0x2200);
ltemp=byte_read(0x2000);
while(1)
{
keyscan();
if(s1num==1)hdisplay(htemp);
if(s1num==2)ldisplay(ltemp);
if(yyp)
{
ReadTemp();keyscan();
get_wendu(TN);
get_wendu2(TD);
baojing();
}
}
}。

相关文档
最新文档