简单温度控制系统设计报告材料Word下载.docx
《简单温度控制系统设计报告材料Word下载.docx》由会员分享,可在线阅读,更多相关《简单温度控制系统设计报告材料Word下载.docx(10页珍藏版)》请在冰豆网上搜索。
![简单温度控制系统设计报告材料Word下载.docx](https://file1.bdocx.com/fileroot1/2023-1/27/581aac2c-3ca6-41d5-9275-b0d07ff30639/581aac2c-3ca6-41d5-9275-b0d07ff306391.gif)
它的测量围是-55℃~125℃,并且在-10℃~85℃之间,精度为±
5℃。
除此之外,DS18B20可以从单数据线上汲取能量,除去了对外部电源的需求。
DS18B20常用的封装有SOIC、T0-9以及不锈钢密封封装。
因本系统需测量水温,故选择不锈钢密封封装的DS18B20。
图2DS18B20外围电路图
1.2驱动芯片ULN2003
因51单片机灌/拉电流比较小(大约在20mA左右),本项目所选用继电器为SRD-05VDC-SL-C其线圈的电流大约是72mA。
所以在单片机管脚与继电器线圈之间需加入一个驱动芯片。
为此,本项目选用集成芯片ULN2003作为继电器的驱动芯片。
ULN2003是一个单片高电压、高电流的达林顿晶体管阵列集成电路。
它是由7对NPN达林顿管组成的,它的高电压输出特性和阴极箝位二极管可以转换感应负载。
单个达林顿对的集电极电流是500mA。
达林顿管并联可以承受更大的电流。
此电路主要应用于继电器驱动器,字锤驱动器,灯驱动器,显示驱动器(LED气体放电),线路驱动器和逻辑缓冲器。
ULN2003的每对达林顿管都有一个2.7kΩ串联电阻,可以直接和TTL或5VCMOS装置
图3达林顿管的部电路
在温度控制系统中ULN2003用来驱动继电器的线圈,其外围电路如图4:
图4ULN2003与继电器外围电路
1.3继电器SRD-05VDC-SL-C
本项目从硬件功能上分,可以分为一次回路和二次回路。
一次回路的主要设备就是加热器。
二次回路即单片机控制回路。
这是一个典型的弱点控制强电系统。
我们用单片机发出的控制信号作为一次回路开关的操作信号。
实现这一过渡的器件就是继电器。
根据单片机参数以及一次回路电流、电压的大小,我们选择了SRD-05VDC-SL-C继电器。
该继电器线圈的供电电压是直流5v电压,拥有一个单刀双掷开关。
我们将开节点接在火线上,控制加热启动与停止。
继电器如图5
图5SRD-05VDC-SL-C继电器实物图
二、程序设计
2.1程序系统框图的设计
图6程序流程图
系统上电后,进行设备初始化,包括继电器、指示灯、中断初始化。
然后系统进入循环,控制器命令DS18B20不断采集温度信息,并进行处理。
最后利用中断进行判断,中断采用16位非自动重装计数,计时间隔3ms。
当温度小于30℃时进行加热,当温度大于30℃时停止加热。
总结
通过此次对于温度控制系统的设计,使我了解了设计闭环控制系统的大致流程。
通过对系统所需器件的选型、焊接与调试,使自己的实际动手能力得到了锻炼。
此外,通过对控制系统的设计还锻炼了我们的编程能力,以及使用软件绘制电路原理图的能力。
在制作过程中,我们也遇到了一些问题,通过查找资料,小组讨论以及小组答疑的形式这些问题也都得到了解决。
在老师的耐心指导下,通过我们的共同努力,最终完成了这个项目。
温度控制系统的设计让我们能有机会把自己学过的东西应用于实际之中,解决实际问题,这让我们受益匪浅。
附录1温度控制系统电路原理图
附录2AT89C52RC程序
#include"
reg52.h"
#include<
intrins.h>
#include<
math.H>
#defineucharunsignedchar
#defineuintunsignedint
sbitrelay=P2^0;
//继电器线圈
sbitds=P2^7;
//DS18B20数据线
sbitledrun=P2^5;
//加热指示灯
inttempValue1;
unsignedinttemp;
bitheat_flag=0;
ucharcodeth0=(65535-3000)/256;
ucharcodetl0=(65535-3000)%256;
voiddelay(unsignedinti)
{
unsignedintj;
while(i--)
{
for(j=0;
j<
125;
j++);
}
}
voiddsInit()
unsignedinti;
ds=0;
i=100;
while(i>
0)i--;
ds=1;
i=4;
voiddsWait()
while(ds);
while(~ds);
while(i>
0)i--;
bitreadBit()
bitb;
ds=0;
i++;
ds=1;
b=ds;
i=8;
returnb;
unsignedcharreadByte()
unsignedcharj,dat;
dat=0;
for(i=0;
i<
8;
i++)
j=readBit();
dat=(j<
<
7)|(dat>
>
1);
returndat;
voidwriteByte(unsignedchardat)
unsignedcharj;
for(j=0;
j<
8;
j++)
b=dat&
0x01;
dat>
=1;
if(b)
ds=0;
i=8;
while(i>
else
i++;
voidsendChangeCmd()
dsInit();
dsWait();
delay
(1);
writeByte(0xcc);
writeByte(0x44);
voidsendReadCmd()
{
EA=0;
writeByte(0xbe);
EA=1;
intgetTmpValue()
unsignedinttmpvalue;
intvalue;
floatt;
unsignedcharlow,high;
sendReadCmd();
low=readByte();
high=readByte();
tmpvalue=high;
tmpvalue<
=8;
tmpvalue|=low;
value=tmpvalue;
t=value*0.0625;
value=t*100+(value>
0?
0.5:
-0.5);
returnvalue;
EA=1;
voidInit_timer0()
TMOD=0x01;
TH0=th0;
TL0=tl0;
ET0=1;
TR0=1;
voidtimer0()interrupt1
TR0=0;
if(heat_flag==1)
relay=1;
Ledrun=1;
else
relay=0;
Ledrun=0;
voidmain()
ledrun=0;
Init_timer0();
while
(1)
{
sendChangeCmd();
tempValue1=getTmpValue();
temp=abs(tempValue1);
if(temp<
3000)
heat_flag=1;
else
heat_flag=0;