资源描述
计算机控制系统实践课程设计报告
设计题目:《基于AT89C52RC温度控制系统》
指引教师:
报告人 :
学号 :
报告日期 :
摘要
本报告中所述温度控制系统,是基于AT89C52RC控制器闭环温度控制系统。控制系统通过数字温度传感器DS18B20采集水温传递给控制器。通过控制器对数据分析与解决,实现对继电器控制,从而实现对加热器启动与停止。通过对温度控制系统设计,咱们掌握了对一种简朴闭环系统设计。并实际动手完毕了这一过程,使得自己对知识学习从理论过渡到了实际应用之中。
一、系统设计方案:
图1 系统方案构造图
1.1传感器DS18B20:
DS18B20数字温度计提供9-12位摄氏温度测量并且有一种由高低电平触发可编程不因断电而变化报警功能。DS18B20由一种单线接受或发送信息,因而解决器和DS18B20之间只由一根数据线连接。它测量范畴是-55℃~125℃,并且在-10℃~85℃之间,精度为±5℃。除此之外,DS18B20可以从单数据线上汲取能量,除去了对外部电源需求。
DS18B20惯用封装有SOIC、T0-9以及不锈钢密封封装。因本系统需测量水温,故选取不锈钢密封封装DS18B20。
图2 DS18B20外围电路图
1.2 驱动芯片ULN
因51单片机灌/拉电流比较小(大概在20mA左右),本项目所选用继电器为SRD-05VDC-SL-C其线圈电流大概是72mA。因此在单片机管脚与继电器线圈之间需加入一种驱动芯片。为此,本项目选用集成芯片ULN作为继电器驱动芯片。
ULN是一种单片高电压、高电流达林顿晶体管阵列集成电路。它是由7对NPN达林顿管构成,它高电压输出特性和阴极箝位二极管可以转换感应负载。单个达林顿对集电极电流是500mA。达林顿管并联可以承受更大电流。此电路重要应用于继电器驱动器,字锤驱动器,灯驱动器,显示驱动器(LED气体放电),线路驱动器和逻辑缓冲器。
ULN每对达林顿管均有一种2.7kΩ串联电阻,可以直接和TTL或5V CMOS装置
图3 达林顿管内部电路
在温度控制系统中ULN用来驱动继电器线圈,其外围电路如图4:
图4 ULN与继电器外围电路
1.3 继电器 SRD-05VDC-SL-C
本项目从硬件功能上分,可以分为一次回路和二次回路。一次回路重要设备就是加热器。二次回路即单片机控制回路。
这是一种典型弱点控制强电系统。咱们用单片机发出控制信号作为一次回路开关操作信号。实现这一过渡器件就是继电器。依照单片机参数以及一次回路电流、电压大小,咱们选取了SRD-05VDC-SL-C继电器。该继电器线圈供电电压是直流5v电压,拥有一种单刀双掷开关。咱们将开节点接在火线上,控制加热启动与停止。继电器如图5
图5 SRD-05VDC-SL-C继电器实物图
二、程序设计
2.1程序系统框图设计
图6 程序流程图
系统上电后,进行设备初始化,涉及继电器、批示灯、中断初始化。然后系统进入循环,控制器命令DS18B20不断采集温度信息,并进行解决。最后运用中断进行判断,中断采用16位非自动重装计数,计时间隔3ms。当温度不大于30℃时进行加热,当温度不不大于30℃时停止加热。
总结
通过本次对于温度控制系统设计,使我理解了设计闭环控制系统大体流程。通过对系统所需器件选型、焊接与调试,使自己实际动手能力得到了锻炼。此外,通过对控制系统设计还锻炼了咱们编程能力,以及使用软件绘制电路原理图能力。在制作过程中,咱们也遇到了某些问题,通过查找资料,小组讨论以及小组答疑形式这些问题也都得到理解决。在教师耐心指引下,通过咱们共同努力,最后完毕了这个项目。温度控制系统设计让咱们能有机会把自己学过东西应用于实际之中,解决实际问题,这让咱们受益匪浅。
附录1 温度控制系统电路原理图
附录2 AT89C52RC程序
#include "reg52.h"
#include<intrins.h>
#include <math.H>
#define uchar unsigned char
#define uint unsigned int
sbit relay=P2^0; // 继电器线圈
sbit ds=P2^7; // DS18B20数据线
sbit ledrun=P2^5; // 加热批示灯
int tempValue1;
unsigned int temp;
bit heat_flag=0;
uchar code th0=(65535-3000)/256;
uchar code tl0=(65535-3000)%256;
void delay(unsigned int i)
{
unsigned int j;
while(i--)
{
for(j=0;j<125;j++);
}
}
void dsInit()
{
unsigned int i;
ds = 0;
i = 100;
while(i>0) i--;
ds = 1;
i = 4;
while(i>0) i--;
}
void dsWait()
{
unsigned int i;
while(ds);
while(~ds);
i = 4;
while(i > 0) i--;
}
bit readBit()
{
unsigned int i;
bit b;
ds=0;
i++;
ds=1;
i++;
i++;
b=ds;
i=8;
while(i>0) i--;
return b;
}
unsigned char readByte()
{
unsigned int i;
unsigned char j,dat;
dat = 0;
for(i=0;i<8;i++)
{
j = readBit();
dat = (j << 7) | (dat >> 1);
}
return dat;
}
void writeByte(unsigned char dat)
{
unsigned int i;
unsigned char j;
bit b;
for(j = 0;j < 8;j++)
{
b = dat & 0x01;
dat >>= 1;
if(b)
{
ds = 0;
i++;i++;
ds = 1;
i = 8;
while(i>0) i--;
}
else
ds = 0;
i = 8;while(i>0) i--;
ds = 1;
i++;
i++;
}
}
void sendChangeCmd()
{
dsInit();
dsWait();
delay(1);
writeByte(0xcc);
writeByte(0x44);
}
void sendReadCmd()
{
EA=0;
dsInit();
dsWait();
delay(1);
writeByte(0xcc);
writeByte(0xbe);
EA=1;
}
int getTmpValue()
{
unsigned int tmpvalue;
int value;
float t;
unsigned char low,high;
EA=0;
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);
return value;
EA=1;
}
void Init_timer0()
{
TMOD=0x01;
TH0=th0;
TL0=tl0;
EA=1;
ET0=1;
TR0=1;
}
void timer0() interrupt 1
{
TR0=0;
if(heat_flag==1)
{
relay=1;
Ledrun=1;
}
else
{
relay=0;
Ledrun=0;
}
TH0=th0;
TL0=tl0;
TR0=1;
}
void main()
{
ledrun=0;
relay=0;
Init_timer0();
while(1)
{
sendChangeCmd();
tempValue1 = getTmpValue();
temp = abs(tempValue1);
if(temp<3000)
heat_flag=1;
else
heat_flag=0;
}
}
展开阅读全文