可控制硅恒温箱报告_第1页
可控制硅恒温箱报告_第2页
可控制硅恒温箱报告_第3页
可控制硅恒温箱报告_第4页
可控制硅恒温箱报告_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于51单片机的恒温箱控制系统设计摘 要:本设计是基于AT89C52单片机的恒温箱控制系统,系统分为硬件和软件两部分,其中硬件包括:电源、温度传感器、显示、控制、晶闸管驱动和报警的设计;软件包括:键盘管理程序设计、显示程序设计、PID控制程序设计和温度报警程序设计。编写程序结合硬件进行调试,能够实现设置和调节初始温度值,进行液晶显示,当加热到设定值后立刻报警。本设计从实际应用出发选取了体积小、精度相对高的数字式温度传感元件DS18B20作为温度采集器,单片机AT89C52为主控芯片,液晶作为显示输出,实现了对温度的实时测量与恒定控制。 关键词:恒温箱、晶闸管、单片机、PID引言:温度控制是工业

2、生产过程中经常遇到的过程控制,特别是在冶金、化工、建材、食品、机械、石油等工业中,具有举足重轻的作用,其温度的控制效果直接影响着产品的质量,因而设计一种较为理想的温度控制系统是非常有价值的。对于不同场所、不同工艺、所需温度高低范围不同、精度不同,则采用的测温元件、测温方法以及对温度的控制方法也将不同;产品工艺不同、控制温度的精度不同、时效不同,则对数据采集的精度和采用的控制算法也不同。因而,对温度的测控方法多种多样。随着电子技术和微型计算机的迅速发展,微机测量和控制技术也得到了迅速的发展和广泛的应用。利用微机对温度进行测控的技术,也便随之而生,并得到日益发展和完善,越来越显示出其优越性。然而现

3、有的温度传感元件大多为模拟器件(热电耦)体积大、应用复杂、而且不容易实现数字化等缺点,阻碍了应用领域的扩展。本设计从实际应用出发选取了体积小、精度相对高的数字式温度传感元件DS18B20作为温度采集器,单片机AT89C51作为主控芯片,数码管作为显示输出,实现了对温度的实时测量与恒定控制。正文:1.自制恒温箱要求 如下图所示,恒温箱采用木箱或纸箱(外形尺寸不大于30cm×30cm×30cm),内置白炽灯泡(功率不大于100W)用于加热。30cm30cm木箱或纸箱白炽灯泡100W 自制恒温箱要求(1)温度采集传感器采用热电阻或热电偶,或一体化数字温度传感器DS18B20。(2

4、)控制灯泡亮度或发热量,采用继电器开关控制或用可控硅平滑控制。(3)采用单片机或PLC作为控制器。(4)采用LED或LCD或PC机的液晶显示器作为显示器,同时显示给定温度和实际温度。(5)采用自制按键或PC机的键盘作为温度给定值输入。(6)恒温箱实际温度达到给定值时(误差要求±1)需声光提示,声音时延5秒后停止。(7)恒温箱最高温度50。2.总体设计思路首先是电源模块,利用变压器把220V的交流电转为正负12V的交流电,再用二极管桥式整流电路,整流出直流电。之后用大电容平波,小电容滤波,之后在用7805稳压芯片稳出5V的直流电,供给各个部分。其次是单片机的外围电路,其中包括有单片机最

5、小系统、LCD显示、按键、晶闸管控制电路以及温度采集电路。总体框图如下:图13.论证 3.1 温度传感器 方案一:采用热敏电阻,可满足4090的测量范围,但热敏电阻精度、重复性、可靠性都比较差,其测量温度范围相对较小,稳定性较差,不能满足本系统温度控制的范围要求。方案二:采用温度传感器铂电阻 Pt1000。铂热电阻的物理化学性能在高温和氧化性介质中很稳定,它能用作工业测温元件,且此元件线性较好。在 0100 摄氏度时,最大非线性偏差小于 0.5 摄氏度。铂热电阻与温度关系是,Rt = R0(1+At+Bt*t) ;其中 Rt 是温度为 t 摄氏度时的电阻;R0 是温度为 0 摄氏度时的电阻;t

6、 为任意温度值,A,B 为温度系数。方案三:采用模拟温度传感器AD590K,AD590K具有较高精度和重复性(重复性优于0.1),其良好的非线性可以保证优于±0.1的测量精度。但其测量的值需要经过运算放大、模数转换再传给单片机,硬件电路较复杂,调试也会相对困难,所以本系统不宜采用此法。方案四:采用数字温度传感器DS18B20,DS18B20提供九位温度读数,测量范围-55125,采用独特1-WIRE 总线协议,只需一根口线即实现与MCU 的双向通讯,具有连接简单,高精度,高可靠性等特点。并且,DS18B20支持一主多从,若想实现多点测温,可方便扩展。综合以上四种方案,本设计采用第四种

7、方案,利用数字温度计DS18B20作为温度传感器。 3.2 输出控制 方案一:采用继电器,易于控制,且实行比较简单,但强电和弱电不能很好的隔离,抗干扰能力极差,开关频率不能太高,灯泡会一直闪烁。方案二:采用固态继电器,易于控制,电路简单,但需要PWM波来进行控制,普通51单片机无PWM口,故不采用此法。方案三:采用晶闸管,控制信号与输出信号可以很好的隔离,增强了系统的安全性和抗干扰能力。综合以上三种方案,本设计采用晶闸管控制负载工作。4.硬件设计根据恒温箱控制器的功能要求,并结合对51系列单片机的资源分析,即单片机软件编程自由度大,可用编程实现各种控制算法和逻辑控制。所以采用AT89C51作为

8、电路系统的控制核心。按键将设置好的温度值传给单片机,通过温度显示模块显示出来。初始温度设置好后,单片机开启输出控制模块,使电热器开始加热,同时将从数字温度传感器DS18B20测量到的温度值实时的显示出来,当加热到设定温度值时,单片机控制声光报警模块,发出声光报警。在本系统中,P2.0P2.7用于LCD的数据口,P1.0P1.2用于LCD的控制口。P1.3用于接收DS18B20采集到的数字温度信号,P1.4用于控制蜂蜜器报警,P1.5控制光电开关,决定电加热器是否工作;P0.0P0.1用于按键控制。P3.5用于LED灯报警。 4.1路原理图如下所示: 图2 图3IC4MOC3021VCCFUZA

9、112JPAC220VR627R7330R839Q2C60.01URL图4图5 底层图5顶层 4.2 DS18B20在电路中的连接,见图6。 wire总线支持一主多从式结构,硬件上需外接上拉电阻。当一方完数据通信需要释放总线时,只需将总线置高点平即可;若需要获得总线进行通信时则要监视总线是否空闲,若空闲,则置低电平获得总线控制权。R14.7KVCC3DQ2GND1IC2DS18B20VCCP1.3图6 DS18B20测温电路4.3 出控制电路,见图7。 MOC3021输出端额定电压为400V。 当P1.5口为高电平时,MOC3021不导通,晶闸管则是关断的,当P1.5为低电平时,光耦导通,触发

10、晶闸管导通,从而使负载开始工作。当交流电过零时,晶闸管自动关闭,等到MOC3021导通时才又一次触发其导通。控制光耦的导通就能实现控制晶闸管的导通角控制。继而控制等的亮度,最终达到控制温度的目的。IC4MOC3021VCCP1.512JPAC220VR627R7330R839Q2C60.01URL图7 光耦控制输出4.4 越线报警电路 见图8 报警电路如图8所示,该电路采用一个小功率三极管Q1驱动蜂鸣器BELL,当单片机接收到超额温度信号或危险信号时,输出脚BELL输出高点平,Q1导通,致使蜂鸣器BELL得电工作,发出报警声。同时,电路中的发光二极管指示出电路的工作状态。图8 报警电路4.5液

11、晶显示电路 见图9此液晶显示电路中,P20P27作为液晶的数据端口,P10-P12作为液晶的控制端口,主要用于显示当前温度以及期望温度,显示的精度为0.1摄氏度。 图94.6过零检测 见图10 TLP521-2是一个内部集成两个光耦的芯片,主要用于过零检测,当电源的正弦交流电过零时,在三极管的集电极的会产生一个下降沿和一个上升沿,这样单片机的外部中断口可以识别到,最终用于控制晶闸管的导通角。图105.软件设计本程序的主要功能就是控制晶闸管的导通角,来控制白炽灯的亮度,最终达到控制温度的目的。设置有两个按键,一个按键可以增加期望温度,另一个可以减少期望温度,步进是5摄氏度。有一个LCD显示屏,可

12、以显示当前温度和期望,当实际温度达到期望温度时,蜂鸣器和LED灯报警5s后停止。运用的控制策略是PID算法,PID算法的精华之处就是利用偏差进行控制。P代表的是比例,这个参数可是使调节更快速,I是积分,这个参数可以消除稳态误差,D是微分,可以超前控制。程序流程图如下所示:6.调试记录:期望温度:30°C 初始温度:20°CP100150180200220250300350I1248161279稳定时间/s13512811010055857035波动范围/度53210.80.80.60.6 7.心得体会: 制作恒温箱,对于计算机控制系统有了一次更实际的了解,为什么这么说呢?因

13、为以前学习的知识,都是基于理论,就算是实验课,器材也是学校已经弄好了,我们做实验基本就是连接线路,也根本了解的不深入。但是,这次的课程设计,不但要我们自己买器材,更要我们设计电路、画出电路图、画出PCB、最终焊接成一块板子,然后调试板子,板子调试差不多了就要开始设计程序了。恒温箱顾名思义就是要让温度基本恒定在一个我们期望的值,所以在设计程序时,就要想一个算法来控制单片机,使之能够恒定温度。当然对于这种控制,最好的算法莫过于PID算法,因为此法简单而有效,工业上也有很多的应用,如果需要更精确的控制,可以再PID的基础增加一些算法,比如模糊控制、鲁棒控制等。 通过这次的设计制作,我学习到了如何把理

14、论上的东西运用到实践当中,比如在模电中学习到的电路知识,又或者PCB板的制作和程序的编写等等。8.程序清单如下:#include<include.h>#define uchar unsigned char/将unsigned char定义为uchar,简化输写。提高编程速度#define uint unsigned int/将unsigned char定义为uint,简化输写。提高编程速度 sbit Beep = P14;sbit Led = P35;uchar temp_flag = 0;void delay_s(uint n)uint x,y,z;for(x=1000;x>

15、;1;x-)for(y=200;y>1;y-);for(z=n;z>1;z-);void main()Led = 0;init_lcd();init_timer1();init_wbzd();while(1)keyscan();display_exp();delay(0);display_now();Get_angle(Expect_T,Readtemp(),nP,nI);if(Expect_T - Readtemp()<6 && (Readtemp() - Expect_T)<6)if(temp_flag = 0)temp_flag = 1;Beep

16、= 0;Led = 1;delay_s(5);if(temp_flag >=1) Beep = 1;Led = 0;#include<include.h>#define uchar unsigned char/将unsigned char定义为uchar,简化输写。提高编程速度#define uint unsigned int/将unsigned char定义为uint,简化输写。提高编程速度 uchar i;int temperature = 0;sbit DS=P13; /定义温度DS18B20接口,详情见原理图sbit lcdrs=P12; /数据命令选择控制sbit

17、lcdrw=P11; /读/写选择控制sbit lcden=P10; /使能信号uchar code t0="Tem is C "uchar code t1="Exp is C "uchar code wendu="0123456789" /利用一个温度表解决温度显示乱码void delay(uchar z)uchar x,y;for(x=1000;x>1;x-)for(y=z;y>1;y-);void write_com(uchar com)lcdrs=0;P2=com;delay(5);lcden=1;delay(5)

18、;lcden=0;void write_date(uchar date)lcdrs=1;P2=date;delay(5);lcden=1;delay(5);lcden=0;void init_lcd()lcden=0;lcdrw=0;write_com(0x38);write_com(0x01);write_com(0x0c);write_com(0x06);write_com(0x80);for(i=0;i<16;i+)write_date(t0i);delay(0);write_com(0x80+0x40);for(i=0;i<16;i+)write_date(t1i);del

19、ay(0);/*DS18B20温度读取模块*/void tmpDelay(int num)/延时函数while(num-) ;void Init_DS18B20()/初始化ds1820unsigned char x=0;DS = 1; /DS复位tmpDelay(8); /稍做延时DS = 0; /单片机将DS拉低tmpDelay(80); /精确延时 大于 480usDS = 1; /拉高总线tmpDelay(14);x=DS; /稍做延时后 如果x=0则初始化成功 x=1则初始化失败tmpDelay(20);unsigned char ReadOneChar()/读一个字节unsigned

20、 char i=0;unsigned char dat = 0;for (i=8;i>0;i-)DS = 0; / 给脉冲信号dat>>=1;DS = 1; / 给脉冲信号if(DS)dat|=0x80;tmpDelay(4);return(dat);void WriteOneChar(unsigned char dat)/写一个字节unsigned char i=0;for (i=8; i>0; i-)DS = 0;DS = dat&0x01;tmpDelay(5);DS = 1;dat>>=1;int Readtemp()/读取温度unsigne

21、d char a=0;unsigned char b=0;int t = 0;float tt=0;Init_DS18B20();WriteOneChar(0xCC); / 跳过读序号列号的操作WriteOneChar(0x44); / 启动温度转换Init_DS18B20();WriteOneChar(0xCC); /跳过读序号列号的操作WriteOneChar(0xBE); /读取温度寄存器a=ReadOneChar(); /连续读两个字节数据 /读低8位 b=ReadOneChar(); /读高8位t=b;t<<=8;t=t|a; /两字节合成一个整型变量。tt=t*0.06

22、25; /得到真实十进制温度值,因为DS18B20可以精确到0.0625度,所以读回数据的最低位代表的是0.0625度temperature = tt*10+0.5; /放大十倍,这样做的目的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作。return(temperature);void display_now()uint num; /定义的时候用uchar宏定义就会出错uint shi,ge,xiaoshu; /这里的num,shi,ge,xiaoshu 必须用uint无符号整数来表示,用uchar字符型则显示错误num=Readtemp();shi=num/100;ge=nu

23、m/10%10;xiaoshu=num%10;write_com(0x80+7);write_date(wendushi);write_com(0x80+8);write_date(wenduge);write_com(0x80+9);write_date(0x2e);write_com(0x80+10);write_date(wenduxiaoshu);write_com(0x80+11);write_date(0xdf);void display_exp()uint num; uint shi,ge,xiaoshu; /这里的num,shi,ge,xiaoshu 必须用uint无符号整数来

24、表示,用uchar字符型则显示错误num = Expect_T;shi=num/100;ge=num/10%10;xiaoshu=num%10;write_com(0x80+0x40+7);write_date(wendushi);write_com(0x80+0x40+8);write_date(wenduge);write_com(0x80+0x40+9);write_date(0x2e);write_com(0x80+0x40+10);write_date(wenduxiaoshu);write_com(0x80+0x40+11);write_date(0xdf); #include&q

25、uot;include.h"#define uchar unsigned char/将unsigned char定义为uchar,简化输写。提高编程速度#define uint unsigned int/将unsigned char定义为uint,简化输写。提高编程速度sbit UP = P03;sbit DOWN = P02;int Expect_T = 200;void delay_1ms(uchar z)uchar x,y;for(x=100;x>1;x-)for(y=z;y>1;y-);void keyscan()if(UP = 0) delay_1ms(1);i

26、f(UP = 0)temp_flag = 0;Expect_T += 50;Expect_T = (Expect_T <=500 ) ? Expect_T : 500; if(DOWN = 0) delay_1ms(1);if(DOWN = 0)temp_flag = 0;Expect_T -= 50;Expect_T = (Expect_T >= 100 ) ? Expect_T : 100; #include"include.h"#define uchar unsigned char#define uint unsigned intsbit SCR = P1

27、5;/*定时器初始化程序*/void init_timer1()TMOD |= 0x10; /使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响 TH1=(65535-angle)/256; /给定初值,这里使用定时器最大值从0开始计数一直到65535溢出。 TL1=(65535-angle)%256; EA=1; /总中断打开 ET1=1; /定时器T1允许中断 TR1=1; /定时器T1开始工作void init_wbzd()SCR = 1;EA=1;/首先开启总中断EX0=1; /开启外部中断 0IT0=1; /设置成下降沿触发,0为低电平触发lo

28、ng int angle = 3000;long int DeltaValue = 0;long int Sum = 0;int nP = 350;int nI = 8;void Get_angle(int Expect,int Feedback,int Kp,int Ki) long int temp_angle;int Temp_DeltaValue;if(SCR = 0)delay(1);SCR = 1; DeltaValue = Expect - Feedback; Temp_DeltaValue = DeltaValue >> 1;if(DeltaValue <=

29、0)EA = 0;Sum = 0;angle = 7000; elseEA = 1;Sum += Temp_DeltaValue; temp_angle = Kp*DeltaValue + Ki*Sum;if(temp_angle <= 2000) temp_angle = 2000;if(temp_angle >= 8500) temp_angle = 8500; angle = 10000 - temp_angle;if(angle <= 1500) angle = 1500;if(angle >= 8000) angle = 8000;void key_scan(

30、) interrupt 0 /外部中断 0 0的优先级最高,AT89C52有6个中断 SCR = 1; TR1 = 1; /关键字"interrupt" , 这是C语言的中断函数表示法void Timer1() interrupt 3 using 1TR1 = 0;TH1=(65535-angle)/256; /给定初值,这里使用定时器最大值从0开始计数一直到65535溢出。 TL1=(65535-angle)%256;/TR1 = 0;SCR = 0; /指示灯反相,可以看到闪烁。" "按位取反运算符。具体参考C语言书运算符 #ifndef _LCD_H_#define _LCD_H_#define uchar unsigned char/将unsigned ch

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论