电加热炉温度控制系统设计1
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘要
在现实生活当中,很多场合需要对温度进行智能控制,日常生活中最常见地要算空调和冰箱了,他们都能根据环境实时情况,结合人为地设定,对温度进行智能控制.工业生产中地电加热炉温度监控系统和培养基地温度监控系统都是计算机控制系统地典型应用.通过这次课程设计,我们将自己动手设计一个小型地计算机控制系统,目地在于将理论结合实践以加深我们对课本知识地理解.
本次设计采用单片机89C51及数字式温度传感器、数码管显示温度.数字式温度传感器将采集到地温度数据送入单片机,单片机将采集到地温度数据与设定值进行比较,若大于设定值,则电热炉关断,若小于设定值,则电热炉继续加热.对于设定地温度值地改变采用中断方式,当改变温度设定时,检测输入地信号,改变设定值,并在数码管上显示出设定值,此次设计初始设定值为100摄氏度.
关键字:温度自动控制、单片机、数码管
目录
1设计内容及步骤 (1)
1.1设计要求 (1)
1.2方案设计 (1)
1.3设计思路 (1)
2硬件设计 (2)
2.1主要硬件介绍 (2)
2.1.1单片机 (2)
2.1.2温度传感器 (2)
2.1.3开关器件 (2)
2.2电路设计方法 (3)
2.2.1显示部分电路 (3)
2.2.2温度检测电路 (4)
2.2.3键盘电路 (4)
2.2.4电气开关及工作电路 (5)
2.2.5整体硬件设计及工作说明 (5)
3软件设计 (6)
3.1数码管模块 (6)
3.2按键中断输入模块 (7)
3.3温度检测模块 (8)
3.4主程序流程图 (9)
4调试和分析 (10)
5课程设计心得体会 (12)
参考文献 (13)
附录1整体电路图 (14)
附录2源程序 (15)
1设计内容及步骤
1.1设计要求
设计一个温度控制系统,并用软件仿真.功能要求如下:
(1)能够利用温度传感器检测环境中地实时温度;
(2)能对所要求地温度进行设定;
(3)将传感器检测到得实时温度与设定值相比较,当环境中地温度高于或低于所设定地温度时,系统会自动做出相应地动作来改变这一状况,使系统温度始终保持在设定地温度值.
1.2方案设计
达到技术要求地内容,需要以下几种器件:单片机、温度传感器、数码管、直流电动机等.其中单片机用作主控制器,控制其他器件地工作和处理数据;温度传感器用来检测环境中地实时温度,并将检测值送到单片机中进行数值对比;数码管显示屏用来显示温度;直流电动机用来表示电加热炉地工作情况,转动表示电加热炉通电加热,停止转动表示电加热炉断电停止加热.
1.3设计思路
通过按键设定所需要地温度值,然后利用温度传感器检测电加热炉地实时加热温度,并送至单片机与设定值进行比较.若检测值小于设定值,则继电器得电,开关闭合,电加热炉导通加热;若检测值大于设定值,则继电器断开,开关断开,电加热炉断电停止加热.若炉温低于设定值,单片机又控制继电器闭合,继电器开关闭合,电加热炉开始导通加热.传感器检测到得温度值会在数码管显示屏上显示出来.当设定温度时,设定温度会在数码管上显示出来.
2硬件设计
2.1主要硬件介绍
2.1.1单片机
这里选用AT89C51单片机作为控制系统地处理器.P30—P33作为按键输入端,采用中断方式.P0口作为数码管地段选端,P10—P13作为数码管地位选端.P17作为温度传感器检测温度信号输入端.P37作为控制电热炉地信号输出端.
2.1.2温度传感器
温度传感器选用DS18B20温度传感器.数字温度传感器DS18B20具有单总线接口方式,支持多节点,使分布式温度传感器设计大为简化独特地单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20地双向通讯.测温范围-55℃~+125℃,固有测温误差0.5℃.支持多点组网功能,多个DS18B20可以并联在唯一地三线上,最多只能并联8个,实现多点测温,如果数量过多,会使供电电源电压过低,从而造成信号传输地不稳定.工作电源为3~5V/DC,在使用中不需要任何外围元件,测量结果以9~12位数字量方式串行传送.
2.1.3开关器件
由于单片机与电动机之间需要用开关器件连接,并且前者用弱电控制,后者由强电控制,这就尤其需要注意安全问题,因此采用继电器.继电器是由一个线圈和一个开关组成,当线圈得电,就会使开关闭合,电动机回路工作.当线圈失电,就会使开关断开,电动机不工作.
2.2电路设计方法
2.2.1显示部分电路
显示电路截图如下图2.1所示.
图2.1显示部分电路图
这里选用4位7段数码管作为系统地显示器件,如图2.1所示,P0口作为数码管地段选端,由高到低分别与数码管P07—P00连接P0口需接上拉电阻,位选端分别与P13—P10连接,由于数码管显示数据中,位选线需要较大地电流驱动,而实际上89C51单片机管脚输出拉电流一般为十几到二十mA,不足以驱动数码管,因此在位选线上要接驱动电路,起电流放大作用.数码管显示采用共阳极接法,在显示数据时,采用动态扫描法.
2.2.2温度检测电路
温度传感器与单片机地连接情况如下图2.2所示.
图2.2 温度检测电路图
温度传感器DS18B20主要功能是将环境中地温度进行检测,并经放大及A/D转换为数字量,存入其内部RAM地9个单元中.在读出其内部温度值时,必须要对其发出控制命令.
2.2.3键盘电路
这里键盘设计采用中断方式,“SHEZHI”键是设置预定温度地,调整对象为预定温度.“+”键是向上加温度值,“—”键是向下减温度值,“SURE”键是确定温度调整完毕.在调整温度地过程中,数码管会显示调整地温度值.键盘电路如下图2.3所示.
图2.3键盘电路图
2.2.4电气开关及工作电路
电器开关及工作电路如下图2.4所示.
图2.4 电气开关及工作电路图
如图2.4所示,P37接单片机地P3.7脚,电热炉用电动机来代替.当P3.7为高电平,D2、D3发光,NPN导通,继电器得电,开关吸和,电动机工作;当P3.7为低电平,D2、D3不发光,NPN截止,继电器失电,开关断开,电动机不工作.
2.2.5整体硬件设计及工作说明
系统地工作过程为:
1.温度传感器检测温度与设定值进行比较,若检测温度小于设定值,则P3.7脚保持高电平,发光二极管D3、D2发光,继电器工作,开关吸和,电动机维持导通,相当于电炉继续加热.
2.若检测温度大于设定值,P
3.7脚变为低电平,发光二极管D2、D3不发光,继电器不工作,开关断开,使电动机和D3停止工作,这就相当于电炉断电,停止加热;
3.当过一段时间后,炉温会降低,而温度传感器DS18B20不断地检测炉温,当检测值低于设定值后,单片机又控制P3.7脚恢复高电平,继电器工作,开关吸和,电动机和D3又开始工作,这相当于电炉从新开始加热.
整体硬件电路图如附录1所示.
3软件设计
3.1数码管模块
对于数码管显示模块采用动态扫描,现将要显示温度地小数位送至数码管,小数点位置1,小数点不亮,再选中数码管位选端第4位然后进行延时66微秒,再将数码管熄灭一下,再将个位送至数码管,同时小数点控制位至0,点亮小数点,再选中第3位进行延时66微秒后熄灭,个位与百位显示原理与小数位相同.当这几位快速显示后再关断并且不断循环显示温度地这个过程,数码管就会显示出温度了.流程图如图3.1所示:
Y
图3.1数码管模块流程图
3.2按键中断输入模块
对于按键采用中断方式,输入信号用巡回检测方式处理,首先,若SHEZHI键按下,则会产生中断,进入中断服务程序,此时判断SURE键是否按下,若按下,则中断结束,返回温度检测与显示地主程序,若没按下,显示she里面存储地设定地温度值,然后判断“+”键是否按下,若按下则she中存储温度值加1,若没按下,则判断“-”键是否按下,若按下,则she中温度之减1,设定温度在0~128之间,然后判断SURE是否按下,再显示she中温度值.
流按键中断输入模块程图如图3.2所示:
图3.2按键中断输入模块流程图
3.3温度检测模块
温度检测模块采用数字式温度传感器,首先对DS18B20进行复位,再对它发出跳过ROM命令,再对温度传感器发出读取温度命令,然后读取温度,在读温度过程中,是对9字节地温度值进行读取,每读1字节后判断CRC是否正确,若正确,则温度读取正确,若错误,重新读取该字节温度.读完9字节地温度后,再判断CRC是否正确,若正确,读取温度后将温度移入温度暂存器中,若错误,则直接跳出温度检测模块.温度检测模块地主要功能是将传感器中存储地温度值正确地读到温度暂存器中,供主程序处理温度,并发出控制信号使用.
温度检测模块流程图如图3.3所示:
图3.3温度检测模块流程图
3.4主程序流程图
主程序主要完成数码管示数地显示、控制温度传感器转换温度、温度地读取、及处理温度等功能,在处理温度地过程中,若温度低与设定值,则电热炉继续加热,若温度值高于设定值,则继电器开关断开,电热炉停止加热.主程序过程为首先对数码管初始化,即开机先显示888.8,显示2S左右开始对DS18B20进行初始化,启动DS18B20开始温度转换,然后再读出传感器中温度,将读出温度放入温度暂存器,调出暂存器中温度进行处理,通过与设定温度地储存器she中设定温度相比较,判断继电器开关地通断,从而控制电热炉是否加热,然后开始将检测得到地温度值送入数码管进行显示,显示温度后需要再次启动DS18B20对温度进行转换,转换温度后,系统再次对转换得到地温度值进行读出温度、处理温度、显示温度、转换温度等等一系列处理.
主程序流程图如图3.4所示:
图3.4整体流程图
4调试和分析
在Protues软件中,按下运行按钮,系统开始仿真.系统仿真截图如下图所示.
图4.1温度为98度系统仿真图
图4.2温度为100度系统仿真图
图 4.1是当温度采样值小于设定值,电热炉处于工作状态时地仿真截图.图4.2是当温度采样值等于设定值后,系统自动做出反应,使电热炉断电停止工作
地仿真截图.
当采样温度低于设定值地时候,系统不会对电热炉做出相应动作,电热炉保持加热.一旦采样温度高于设定值,系统就会做出反应,使电加热炉断电停止加热.当温度降下来后,系统又会自动控制电加热炉重新开始加热.系统地反应速度也是十分精确地,会在很短地时间内作出相应动作.
图4.3初始设定温度图4.4设定温度加一度
图 4.3为系统温度地初始设定值,当按下SHEZHI键会显示初始设置温度为100摄氏度,按下“+”键后,设置温度会加1度为101度,数码管显示如图4.4所示,按下SURE键后,系统会进行正常温度检测及显示.设定值加1度后仿真图形如图4.5和图4.6所示.
图4.5设定值为101时100度仿真图图4.6设定值为101时101度仿真图
5课程设计心得体会
本次课程设计,我地题目是《设计电加热炉温度控制系统》.我们也会发现实际中一般地电加热炉是没有温度自动控制地,当温度上升到我们需要地程度时,它仍然继续加热,这不仅会影响到加热效果,还会造成电能地浪费.那么就有必要设计一种能自动调节炉温地系统,把它应用到日常生活中,将会给人们带来极大地方便.
在设计地过程中,我也遇到一些麻烦,比如说怎样来实现电动机回路地自动通断调节、怎样来实现温度地调整等等,这些问题都令我十分棘手.通过去图书馆查阅相关资料和上网搜索各硬件地原理以及应用,我最终都一一解决了这些问题.在设计过程中,我遇到困难地时候也经常与同学相互讨论,相互请教,最终一起解决问题.
总地来说,此次课程设计地过程比较轻松,从拿到问题到彻底解决问题,这是一个令人振奋并享受地过程.经过去图书馆大量地查阅书籍,我也学到了很多在课本上没有地知识,收获颇丰.这段过程让我懂得了一个道理,那就是学生要学地绝对不该仅仅是课本上地东西,有些东西只有走进图书馆,你才可能学习到.也只有这样,我们才能成为一个见多识广、渊博地人.
参考文献
[1]于海生.微型计算机控制技术[M].清华大学出版社,2004
[2]谭浩强.C程序设计(第三版)[M]. 清华大学出版社,2006
[3]戴焯. 传感与检测技术[M]. 武汉理工大学出版社,2006
[4]张毅刚. 单片机原理及应用[M]. 高等教育出版社,2003
[5]柯节成. 简明电子元件器件手册[M]. 高等教育出版社,2005
附录2源程序
#include "reg51.h"
#include "intrins.h" //延时调用子函数
#define Disdata P0 //段码输出口
#define discan P1 //扫描口
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P1^7。
//温度输入口
sbit DIN=P0^7。
//LED小数点控制
sbit OUT=P3^7。
//加热炉控制
uchar data she=100。
//温度设定
uchar data temp。
sbit jia=P3^0。
sbit jian=P3^1。
sbit sure=P3^3。
uint h。
uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0 x08,0x09,0x09}。
//温度小数部分用查表法
uchar code dis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf}。
uchar code scan_con[4]={0xf1,0xf2,0xf4,0xf8}。
//列扫描控制字
uchar data temp_data[2]={0x00,0x00}。
//读出温度暂放
uchar data display[5]={0x00,0x00,0x00,0x00,0x00}。
void delay(uint t) //11毫秒延时函数
{for(。
t>0。
t--)。
}
void scan(void)
{ char k。
for(k=0。
k<4。
k++)
{Disdata=dis_7[display[k]]。
if(k==1){DIN=0。
}
discan=scan_con[k]。
delay(90)。
discan=0x00。
}
}
ow_reset(void)
{char presence=1。
while(presence)
{while(presence)
{DQ=1。
_nop_()。
_nop_()。
DQ=0。
delay(50)。
DQ=1。
delay(6)。
presence=DQ。
}
delay(45)。
presence=~DQ。
}
DQ=1。
}
void write_byte(uchar val)
{uchar i。
for(i=8。
i>0。
i--)
{DQ=1。
_nop_()。
_nop_()。
DQ=0。
_nop_()。
_nop_()。
_nop_()。
_nop_()。
_nop_()。
DQ=val&0x01。
delay(6)。
val=val/2。
}
DQ=1。
delay(1)。
}
uchar read_byte(void)
{ uchar i。
uchar value=0。
for(i=8。
i>0。
i--)
{DQ=1。
_nop_()。
_nop_()。
value>>=1。
DQ=0。
_nop_()。
_nop_()。
_nop_()。
_nop_()。
DQ=1。
_nop_()。
_nop_()。
_nop_()。
_nop_()。
if(DQ) value|=0x80。
delay(6)。
}
DQ=1。
return(value)。
}
void read_temp(void)
{ ow_reset()。
write_byte(0xcc)。
write_byte(0xbe)。
temp_data[0]=read_byte()。
temp_data[1]=read_byte()。
ow_reset()。
write_byte(0xcc)。
write_byte(0x44)。
}
work_temp()
{uchar n=0。
if(temp_data[1]>127)
{temp_data[1]=(256-temp_data[1])。
temp_data[0]=(256-temp_data[0])。
n=1。
}
display[4]=temp_data[0]&0x0f。
display[0]=ditab[display[4]]。
display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4)。
temp=display[4]。
display[3]=display[4]/100。
display[1]=display[4]%100。
display[2]=display[1]/10。
display[1]=display[1]%10。
if(!display[3])
{display[3]=0x0a。
if(!display[2])
{display[2]=0x0a。
}}
if(n){display[3]=0x0b。
}
}
main()
{Disdata=0xff。
discan=0xff。
EA=1。
EX0=1。
IT0=1。
for(h=0。
h<4。
h++)
{display[h]=8。
}
ow_reset()。
write_byte(0xcc)。
write_byte(0x44)。
for(h=0。
h<200。
h++)
{scan()。
}
while(1){
read_temp()。
work_temp()。
if(temp<she)
{ OUT=1。
}
if(temp>=she)
{ OUT=0。
}
for(h=0。
h<200。
h++)
{scan()。
}}
}
void shescan()
{uchar bai。
uchar shi。
uchar ge。
bai=she/100。
shi=she%100。
shi=shi/10。
ge=she%10。
DIN=1。
Disdata=dis_7[ge]。
discan=scan_con[0]。
delay(10)。
discan=0x00。
Disdata=dis_7[shi]。
discan=scan_con[1]。
delay(10)。
discan=0x00。
Disdata=dis_7[bai]。
discan=scan_con[2]。
delay(10)。
discan=0x00。
Disdata=dis_7[10]。
discan=scan_con[3]。
delay(10)。
discan=0x00。
}
void extern0() interrupt 0
{ while(sure)
{
while(~jia)
{she++。
if(she>128)
{she=128。
}
while(~jia) {shescan()。
}
}
while(~jian)
{she--。
if(she<0)
{she=0。
}
while(~jian){shescan()。
}
}
shescan()。
}
}。