简单温度控制系统设计报告
计算机控制系统实践课程设计报告计算机控制系统实践课程设计报告 设计题目: 《基于 AT89C52RC 的温度控制系统》 指导老师: 报告人: 学号: 报告日期 : 摘要 本报告中所述温度控制系统,是基于 AT89C52RC 控制器的闭环温度控制系 统。 控制系统通过数字温度传感器 DS18B20 采集水温传递给控制器。 经过控制器 对数据的分析与处理,实现对继电器的控制,从而实现对加热器的启动与停止。 通过对温度控制系统的设计,我们掌握了对一个简单闭环系统的设计。并实际动 手完成了这一过程,使得自己对知识的学习从理论过渡到了实际应用之中。 一、系统设计方案:一、系统设计方案: 220AC LN 电源/复位 控制器 温度传感器 驱 动 电 路 继电器 线圈 加热 指示灯 DS18B20 加 热 器 水池 图 1 系统方案结构图 传感器传感器 DS18B20DS18B20:: DS18B20 数字温度计提供 9-12 位摄氏温度测量而且有一个由高低电平触发 的可编程的不因断电而改变的报警功能。DS18B20 由一个单线接收或发送信息, 因此处理器和 DS18B20 之间只由一根数据线连接。 它的测量范围是-55℃~125℃, 并且在-10℃~85℃之间,精度为±5℃。除此之外,DS18B20 可以从单数据线上 汲取能量,除去了对外部电源的需求。 DS18B20 常用的封装有 SOIC、T0-9 以及不锈钢密封封装。因本系统需测量 水温,故选择不锈钢密封封装的 DS18B20。 图 2 DS18B20 外围电路图 驱动芯片驱动芯片 ULN2003ULN2003 因 51 单片机灌/拉电流比较小(大约在 20mA 左右) , 本项目所选用继电器为 SRD-05VDC-SL-C 其线圈的电流大约是 72mA。所以在单片机管脚与继电器线圈之 间需加入一个驱动芯片。为此, 本项目选用集成芯片 ULN2003 作为继电器的驱动 芯片。 ULN2003 是一个单片高电压、高电流的达林顿晶体管阵列集成电路。它是由 7 对 NPN 达林顿管组成的,它的高电压输出特性和阴极箝位二极管可以转换感应 负载。 单个达林顿对的集电极电流是 500mA。 达林顿管并联可以承受更大的电流。 此电路主要应用于继电器驱动器,字锤驱动器,灯驱动器,显示驱动器(LED 气 体放电) ,线路驱动器和逻辑缓冲器。 ULN2003 的每对达林顿管都有一个?串联电阻,可以直接和 TTL 或 5V CMOS 装置 图 3 达林顿管的内部电路 在温度控制系统中 ULN2003 用来驱动继电器的线圈,其外围电路如图 4: 图 4 ULN2003 与继电器外围电路 继电器继电器 SRD-05VDC-SL-C SRD-05VDC-SL-C 本项目从硬件功能上分, 可以分为一次回路和二次回路。一次回路的主要设 备就是加热器。二次回路即单片机控制回路。 这是一个典型的弱点控制强电系统。 我们用单片机发出的控制信号作为一次 回路开关的操作信号。实现这一过渡的器件就是继电器。根据单片机参数以及一 次回路电流、电压的大小,我们选择了 SRD-05VDC-SL-C 继电器。该继电器线圈 的供电电压是直流 5v 电压,拥有一个单刀双掷开关。我们将开节点接在火线上, 控制加热启动与停止。继电器如图 5 图 5 SRD-05VDC-SL-C 继电器实物图 二、程序设计 程序系统框图的设计程序系统框图的设计 开始 系统初始化 循环体 启动温度转换 读取温度数据 数据处理 中断查询 N 满足加 热条件 Y 加热 图 6 程序流程图 系统上电后,进行设备初始化,包括继电器、指示灯、中断初始化。然后系 统进入循环,控制器命令 DS18B20 不断采集温度信息,并进行处理。最后利用中 断进行判断,中断采用 16 位非自动重装计数,计时间隔 3ms。当温度小于 30℃ 时进行加热,当温度大于 30℃时停止加热。 总结 通过此次对于温度控制系统的设计, 使我了解了设计闭环控制系统的大致流 程。通过对系统所需器件的选型、焊接与调试,使自己的实际动手能力得到了锻 炼。此外,通过对控制系统的设计还锻炼了我们的编程能力,以及使用软件绘制 电路原理图的能力。在制作过程中,我们也遇到了一些问题,通过查找资料,小 组讨论以及小组答疑的形式这些问题也都得到了解决。在老师的耐心指导下,通 过我们的共同努力,最终完成了这个项目。 温度控制系统的设计让我们能有机会 把自己学过的东西应用于实际之中,解决实际问题,这让我们受益匪浅。 附录 1 温度控制系统电路原理图 附录 2 AT89C52RC 程序 #include ““ #include #include #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;j0) i--; ds = 1; i = 4; while(i0) 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(i0) i--; return b; } unsigned char readByte() { unsigned int i; unsigned char j, dat; dat = 0; for(i=0; i 1); } return dat; } void writeByte(unsigned char dat) { unsigned int i; unsigned char j; bit b; for(j = 0; j = 1; if(b) { ds = 0; i++; i++; ds = 1; i = 8; while(i0) i--; } else ds = 0; i = 8; while(i0) i--; ds = 1; i++; i++; } } void sendChange() { dsInit(); dsWait(); delay(1); writeByte(0 xcc); writeByte(0 x44); } void sendRead() { EA=0; dsInit(); dsWait(); delay(1); writeByte(0 xcc); writeByte(0 xbe); EA