红外恒温控制器的设计与制作_第1页
红外恒温控制器的设计与制作_第2页
红外恒温控制器的设计与制作_第3页
红外恒温控制器的设计与制作_第4页
红外恒温控制器的设计与制作_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

1、天 津 大 学 网 络 教 育 学 院专科毕业论文题目:红外恒温控制器的设计与制作完成期限:2016年1月8日 至 2016年4月20日学习中心:嘉兴专业名称:电气自动化技术学生姓名:陈连凤学生学号:132092433046指导教师:李娜娜红外恒温控制器的设计与制作温度的测量和控制是日常生活和生产实践中常见的课题,恒温控制器会受到很多因素的影响例如环境因素、经济因素、政策因素、市场因素等等。在这里我们只设计一种低功率、低成本的恒温控制器,这种恒温控制器在一些小型家电中经常用到,它的工作额定电压为AC220V/50HZ,可以由用户自行设定控制温度和控制时间,采用的芯片管脚少,外围电路简单,但可以

2、实现较复杂的功能。不同的状态可以通过蜂鸣器不同的声音提示进行判断,通过数码管显示控制时间和计时,通过按键启动工作和设定时间,通过单片机控制原理控制温度,升温至规定值开始恒温,并有相应LED灯指示。在此之外我们还设置了几个按键,用这些按键进行控制设定的温度值,主要是加减功能键,功能是进行设置温度的升高和降低。当不使用按键功能时,系统为实时显示,可以设定显示间隔时间。当有按键按下时,设定某时刻某个温度值时,将箱内的温度控制在此时温度。但是,当传感器读取箱内温度低于或高于该设定温度时,可以根据实际温度与设定温度之间的偏差输出两组PWM信号分别控制发热和制冷器件,从而达到箱内温度的恒定。第一章 系统的

3、硬件组成与设计1.1 系统的硬件组成系统硬件组成有单片机控制系统、前向通道、后向通道三个主要的功能模块,总体框图如图1所示。 信号放大器单片机控制系统键盘显示A/D转换换电路温度传感器图11.2系统的硬件设计单片机基本系统以AT89C51为核心,主要通过A/D、LED显示和按键完成数据采集、温度显示、温度设定功能,并完成控制信号的输出。系统前向通道是信息采集的通道,主要包括由温度传感器PT100,运算放大器和电阻组成的信号转换与放大电路、ADC组成的信号采集电路和单片机组成的信号处理电路。温度经温度传感器和信号放大电路产生0-5V的模拟电压信号送入A/D转换器的输入端,A/D转换器将模拟量转化

4、为数字量通过系统总线送入单片机进行运算处理。后向通道是控制信号的输出通道,主要由功率放大电路,双向晶闸管,电热装置等组成,单片机输出的控制信号通过按键功能并显示在液晶显示器上,并通过加热控制电路实现温度的控制。第二章 硬件设计部件选择及功能介绍 为了降低成本和避免过于复杂的电路,此系统所用的元器件均为常用的电子器件。主控制器采用单片机AT89C51,温度传感器采用PT100,采用控制端TTL电平,即可实现对继电器的开和关,使用时完全可以使用NPN型三极管结成电压跟随器,这种形式下完成驱动;单片机所用的+5V工作电源是通过220V交流电压通过变压、整流、稳压、滤波得到。实时控制的显示器、键盘通过

5、单片机来完成键盘扫描与输出动态显示。下面对硬件电路做具体设计。2.1 AT89C51单片机2.1.1 AT89C51单片机功能简介AT89C51是一种低功耗,高性能的片内含有4KB快闪可编程/擦除只读存储器(FPEROMFlash Programmable and Erasable Read Only Memory)的8位COMS微控制器,使用高密度,非易失存储技术制造,并且与80C51引脚和指令系统完全兼容。芯片上的FPEROM允许在线编程或采用通用的非易失存储编程器对存储器重复编程。 AT89C51(以下简称89C51)将具有多种功能的8位CPU与FPEROM结合在一个芯片上,为很多嵌入式

6、控制应用提供了非常灵活而又便宜的方案,其性能价格比远高于8751。由于片内带EPROM的87C51价格偏高,而片内带FPEROM的89C51价格低且与INTEL80C51兼容,这就显示出了89C51的优越性。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器。89C51有40个引脚,有32个输入端口(I/O),2个读/写端口,程序存储器可以擦出。422.1.2 AT89C51单片机信号引脚介绍输入输出口线:P0.1-P0.7 P0口8位三态I/O口P1.0-P1.7 P1口8位双向I/O口P2.0-P2.7 P2口8位双向I/O口 P3.0-P3.

7、7 P3口8位双向I/O口主电源引脚(2根)VCC:电源输入,接+5V电源GND:接地线外接晶振引脚(2根)XTAL1:片内晶振电路的输入端XTAL2:片内晶振电路的输出端控制引脚(4根)RST/VPP:复位引脚,引脚上出现2个机器周期的高电平将使单片机复位。ALE/PROG:地址所存允许信号。PSEN:外部存储器读选通讯信号。EA/VPP:程序存储器的内外部选通,接低电平从外部程序存储器读指令,如果接高电平则从内部程序存储器读指令2.1.3 AT89C51单片机时钟和复位电路1、 时钟电路:单片机内部有一个高增益反向放大器,输入端引脚为XTAL1,输出端引脚为XTAL2。而在芯片外部XTAL

8、1和XTAL2之间跨接晶体振荡器和微调电容,从而构成一个稳定的自激振荡器。晶体振荡频率高,则系统的时钟频率也高,单片机运行速度也就快,但反过来运行速度快对存储器的速度要求就高,对印制电路板的要求也高,所以,这里使用振荡频率为6MHZ的石英晶体。振荡电路产生的振荡脉冲并不直接使用,而是经分频后再为系统所用,震荡脉冲经过二分频后才作为系统的时钟信号。在设计电路板时,振荡器和电容应尽量靠近单片机,以避免干扰。需要注意的是:设计电路板时,振荡器和电容应尽量安装得与单片机靠近一些,这样可以减少寄生电容的存在,可以更好的保障振荡器稳定、可靠的工作,电路图如图2所示。图2复位电路:单片机的复位电路分上电复位

9、和按键复位两种方式。(a)上电复位:上电复位是利用电容从电来实现的,即上电瞬间RST/Vpd端的电位与Vcc相同,随着从电电流的减少,RST/Vpd的电位下降,最后被牵制在0V。复位时要保证加在RST引脚上的高电平持续两个机器周期,才能使单片机有效复位。在应用系统中,为了保证复位电路可靠地工作,常在R、C电路先接施密特电路,然后再接入单片机复位端。这样,当系统有多个复位端时,能保证可靠地同步复位,且具有抗干扰作用。(b)按键复位: 按键复位是在调试程序或者程序运行不正常时手动复位使程序重新运行,程序运行出错或操作错误使系统处于死锁状态时,为了摆脱困境,也需按复位键以重新启动。RST引脚是复位信

10、号的输入端,复位信号是高电平有效。按键复位又分按键脉冲复位(图3)和按键电平复位。电平复位将复位端通过电阻与Vcc相连,按键脉冲复位是利用RC分电路产生正脉冲来达到复位的。 图32.2 电源电路:2.3 温度传感器 PT100是一个温度传感器,是一种稳定性和线性都比较好的铂丝热电阻传感器,可以工作在 -200 至 650 的范围.PT100温度感测器是一种以白金(Pt)作成的电阻式温度检测器,属于正电阻系数,其电阻和温度变化的关系式如下:R=Ro(1+T)其中=0.00392,Ro为100(在0的电阻值),T为摄氏温度<br>因此白金作成的电阻式温度检测器,又称为PT100。 1:

11、Vo=2.55mA ×100(1+0.00392T)=0.255+T/1000 。 温度测量转换部分是整个系统的数据来源,直接影响系统的可靠性。本设计用的温度测量方法是:用PT100将测量的温度转换成模拟电信号,再经过A/D转换器把模拟信号转换成数字信号,最后由单片机再对采集的数字信号进行处理。 PT100温度测量电路,温度传感器PT100是一种稳定性和线性都比较好的铂丝热电阻传感器,可以工作在-200至650的范围,本电路选择其工作在0-100范围。 整个电路分为两部分,一是传感器前置放大电路,一是单片机A/D转换和显示,控制,软件非线性校正等部分。前置放大部分原理图如下: 工作原

12、理:传感器的接入非常简单,从系统的+5V供电端仅仅通过一个阻值可变的滑动电阻就连接到PT100了,这种接法通常会引起严重的非线性问题,但是由于有个单片机的软件进行校正,也就简化了传感器的接入方式。 按照PT100的参数我们得出在0到100的区间内,电阻值为100至138.51欧姆,我们按照其串联分压的接法,使用公式:Vcc/(PT100+?)*PT100=输出电压(mv)可以计算出其在整百摄氏度时的输出电压,见下面的表格1:温度PT100阻值欧姆传感两端电压mv0100.00124.381100.39124.850119.40147.79100138.51170.642.4 键盘和显示电路 模

13、块电路如图4.键盘采用行列式和外部中断相结合的方法,各按键的功能定义如下表格2.其中设置键与单片机的INT0脚相连,S0-S9、YES、NO用四行三列接单片机P0口,REST键为硬件复位键,与R、C构成复位电路。表格2 按键功能按键键名功能REST复位键使系统复位SET设置键使系统产生中断,进入设置状态S0-S9数字键设置用户需要的温度YES确认键用户设定目标温度后进行确认NO清除键用户设定温度错误或误按了YES键后使用图4 键盘接口电路2.5 程序设计软件程序设计如下:#include<reg51.h>#include <absacc.h>#include <i

14、ntrins.h>#include<ziranshu.h>void main() C_port=0x03; /8155初始化 time0init(); /定时器0初始化 lcdinit(); /液晶显示初始化 while(1) Key_scan(); dischange(); compare(); display(); void time0init() TMOD=0x11; TH0=-50000/256; TL0=-50000%256; TH1=-50000/256; TL1=-50000%256; EA=1; ET0=1; ET1=1; TR1=0; TR0=1;void

15、lcdinit() wrcommand(0x01); wrcommand(0x38); wrcommand(0x06); wrcommand(0x0c);void wrcommand(uchar dat) delay(200); rs=0; rw=0; en=1; Port_A=dat; en=0;void wrdata(uchar dat) delay(200); rs=1; rw=0; en=1; Port_A=dat; en=0;void delay(uint dat) while(dat-); void mdelay(uchar x) uchar i; for(;x>0;x-)

16、for(i=0;i<125;i+); void dischange() if(play=2) mode=U_Sec/7+1; if(mode=9) mode=8; AD_value=read1543(mode-1); if(play=6) AD_value=read1543(mode-1); void compare() uchar count0; uint value0; count0=mode; value1=(uint)(100.0*AD_value)/1024)*10); value0=(value1+9)/10; switch(count0) case 1:if(value0&

17、gt;temp_updata1|value0<temp_downdata1) play=6;TR1=1; if(value0<=temp_updata1&&value0>=temp_downdata1) if(play=6) play=2; TR1=0; break; case 2:if(value0>temp_updata2|value0<temp_downdata2) play=6;TR1=1; if(value0<=temp_updata2&&value0>=temp_downdata2) if(play=6) p

18、lay=2; TR1=0; break; case 3:if(value0>temp_updata3|value0<temp_downdata3) play=6;TR1=1; if(value0<=temp_updata3&&value0>=temp_downdata3) if(play=6) play=2; TR1=0; break; case 4:if(value0>temp_updata4|value0<temp_downdata4) play=6;TR1=1; if(value0<=temp_updata4&&v

19、alue0>=temp_downdata4) if(play=6) play=2; TR1=0; break; case 5:if(value0>temp_updata5|value0<temp_downdata5) play=6;TR1=1; if(value0<=temp_updata5&&value0>=temp_downdata5) if(play=6) play=2; TR1=0; break; case 6:if(value0>temp_updata6|value0<temp_downdata6) play=6;TR1=1;

20、 if(value0<=temp_updata6&&value0>=temp_downdata6) if(play=6) play=2; TR1=0; break;case7:if(value0>temp_updata7|value0<temp_downdata7) play=6;TR1=1; if(value0<=temp_updata7&&value0>=temp_downdata7) if(play=6) play=2; TR1=0; break; case 8:if(value0>temp_updata8|val

21、ue0<temp_downdata8) play=6;TR1=1; if(value0<=temp_updata8&&value0>=temp_downdata8) if(play=6) play=2; TR1=0; break;/ default:play=2;/ break; void display() if(play=1) /显示姓名和学号 lcd_string(name,1); lcd_string(number,2); if(play=2) /自动显示温度值 change(mode,AD_value); lcd_string(time,1); lc

22、d_string(count,2); /手动显示温度值 if(play=3) uchar mode1; uint AD_value1=1024; mode1=keyvalue; AD_value1=read1543(mode1-1); change(mode1,AD_value1); lcd_string(time,1); lcd_string(count,2); if(play=4) /温度上下限显示 uchar cc=1,dd=20,ee=50; cc=temp_play; if(cc=1) dd=temp_downdata1; ee=temp_updata1; if(cc=2) dd=t

23、emp_downdata2; ee=temp_updata2; if(cc=3) dd=temp_downdata3; ee=temp_updata3; if(cc=4) dd=temp_downdata4; ee=temp_updata4; if(cc=5) dd=temp_downdata5; ee=temp_updata5; if(cc=6) dd=temp_downdata6; ee=temp_updata6; if(cc=7) dd=temp_downdata7; ee=temp_updata7; if(cc=8) dd=temp_downdata8; ee=temp_updata8

24、; temp_change(cc,dd,ee); lcd_string(temp_name,1); lcd_string(count,2); if(play=5) /时间设定显示 time_change(); lcd_string(time_name,1); lcd_string(count,2); if(play=6) uchar aaaaa,bbbbb,ccccc; uint ddddd;/ alarm_mode=mode;/ alarm_value=value0; ccccc=mode; ddddd=value1; if(ccccc=1) aaaaa=temp_downdata1; bb

25、bbb=temp_updata1; if(ccccc=2) aaaaa=temp_downdata2; bbbbb=temp_updata2; if(ccccc=3) aaaaa=temp_downdata3; bbbbb=temp_updata3; if(ccccc=4) aaaaa=temp_downdata4; bbbbb=temp_updata4; if(ccccc=5) aaaaa=temp_downdata5; bbbbb=temp_updata5; if(ccccc=6) aaaaa=temp_downdata6; bbbbb=temp_updata6; if(ccccc=7)

26、aaaaa=temp_downdata7; bbbbb=temp_updata7; if(ccccc=8) aaaaa=temp_downdata8; bbbbb=temp_updata8; alarm_change(aaaaa,bbbbb,ccccc,ddddd); lcd_string(time,1); lcd_string(count,2); void change(uchar num,uint value) uint addata; addata=(100.0*value)/1024)*10; count0='m' count1='o' count2=&

27、#39;d' count3='e' count4=' ' count5=num+0x30; count6=' ' count7=' ' count8=' ' count9=0x30; count10=(addata%1000)/100+0x30; count11=(addata%100)/10+0x30; count12='.' count13=addata%10+0x30; count14=0xdf; count15='C' if(play=2) time0='z&

28、#39; time1='i' time2='d' time3='o' time4='n' time5='g' time6=' ' time7=' ' if(play=3) time0='s' time1='h' time2='o' time3='u' time4='d' time5='o' time6='n' time7='g' time8=U_Hour/1

29、0+0x30; time9=U_Hour%10+0x30; time10=':' time11=U_Min/10+0x30; time12=U_Min%10+0x30; time13=':' time14=U_Sec/10+0x30; time15=U_Sec%10+0x30;void temp_change(uchar ccc,uchar ddd,uchar eee) if(flash=1) count0='m' count1='o' count2='d' count3='e' count4=&#

30、39; ' count5=ccc+0x30; count6=' ' count7=ddd/100+0x30; count8=ddd/10%10+0x30; count9=ddd%10+0x30; count10='-' count11=eee/100+0x30; count12=eee/10%10+0x30; count13=eee%10+0x30; count14=0xdf; count15='C' if(flash=0) if(temp_flash=1) count5=' ' if(temp_flash=2) coun

31、t7=' ' if(temp_flash=3) count8=' ' if(temp_flash=4) count9=' ' if(temp_flash=5) count11=' ' if(temp_flash=6) count12=' ' if(temp_flash=7) count13=' ' void time_change() if(flash=1) count0=U_Hour/10+0x30; count1=U_Hour%10+0x30; count2=':' count3

32、=U_Min/10+0x30; count4=U_Min%10+0x30; count5=':' count6=U_Sec/10+0x30; count7=U_Sec%10+0x30; count8=' ' count9=' ' count10=' ' count11=' ' count12=' ' count13=' ' count14=' ' count15=' ' if(flash=0) if(time_flash=1) count0='

33、 ' if(time_flash=2) count1=' ' if(time_flash=3) count3=' ' if(time_flash=4) count4=' ' if(time_flash=5) count6=' ' if(time_flash=6) count7=' ' void alarm_change(uchar aaaa,uchar bbbb,uchar cccc,uint dddd) time0='M' time1='i' time2='n

34、9; time3='g' time4='D' time5='i' time6='!' time7=aaaa/100+0x30; time8=aaaa/10%10+0x30; time9=aaaa%10+0x30; time10='-' time11=bbbb/100+0x30; time12=bbbb/10%10+0x30; time13=bbbb%10+0x30; time14=0xdf; time15='C' if(flash=1) count0='m' count1='

35、o' count2='d' count3='e' count4=' ' count5=cccc+0x30; count6=' ' count7=' ' count8=dddd/1000+0x30; count9=dddd/100%10+0x30; count10=dddd/10%10+0x30; count11='.' count12=dddd%10+0x30; count13=0xdf; count14='C' count15=' ' if(flash=0)

36、 count0=' ' count1=' ' count2=' ' count3=' ' count4=' ' count5=' ' count6=' ' count7=' ' count8=' ' count9=' ' count10=' ' count11=' ' count12=' ' count13=' ' count14=' ' count15=&

37、#39; ' void lcd_string(uchar *p,uchar flag) uchar addr; if(flag=1) addr=0x80; while(*p!='0') wrcommand(addr); wrdata(*p); addr+; p+; if(flag=2) addr=0xc0; while(*p!='0') wrcommand(addr); wrdata(*p); addr+; p+; void T0_serve() interrupt 1 TH0=-50000/256; TL0=-50000%256; U_ms=U_ms+

38、1; if(U_ms=20) U_ms=0; U_Sec+; if(U_Sec=60) U_Sec=0; U_Min+; if(U_Min=60) U_Min=0; U_Hour+; if(U_Hour=24) U_Hour=0; void T1_serve() interrupt 3 TH1=-50000/256; TL1=-50000%256; U_count+; if(U_count=10) flash=0; if(U_count=20) U_count=0; flash=1; uint read1543(uchar addr) uchar i; uchar ah,al; uint ad

39、; clk=0; cs=0; addr<<=4; for(i=0;i<4;i+) D_Addr=(bit)(addr&0x80); clk=1; clk=0; addr<<=1; D_Addr=0; for(i=0;i<6;i+) clk=1; clk=0; cs=1; delay(25); cs=0; _nop_(); _nop_(); _nop_(); for(i=0;i<2;i+) D_out=1; clk=1; ah<<=1; if(D_out) ah=ah+0x01; clk=0; for(i=0;i<8;i+) D

40、_out=1; clk=1; al<<=1; if(D_out) al=al+0x01; clk=0; cs=1; ad=(uint)ah; ad<<=8; ad=ad+(uint)al; return(ad);void Key_scan() /a 0000 0000/c00 0000 uchar KeyValue; uchar aa; Port_A=0xfe; /第一列按键扫描 KeyValue=Port_C|0xe0; if(KeyValue!=0xff) mdelay(35); KeyValue=Port_C|0xe0; if(KeyValue!=0xff) aa

41、=KeyValue; while(aa=KeyValue) /判断键弹起 KeyValue=Port_C|0xe0; if(aa=0xf7) /*键按下,调整显示模式 1为姓名和时间,2为温度自动显示,3为温度手动显示 play+; if(play=4) TR1=1; keyvalue=1; if(play=5) TR0=0;TR1=1; temp_flash=1; if(play>5) TR0=1;TR1=0; play=1;time_flash=1; if(play=3)/手动温度显示通道1,4,7选择键 switch(aa) case 0xfe: keyvalue=1; break

42、; case 0xfd: keyvalue=4; break; case 0xfb: keyvalue=7; break; default : break; /温度值上下限调整键值1,4,7 if(play=4) if(temp_flash=1) switch(aa) case 0xfe: temp_play=1; break; case 0xfd: temp_play=4; break; case 0xfb: temp_play=7; break; default : break; if(temp_flash!=1) switch(aa) case 0xfe: if(temp_play=1)

43、 if(temp_flash=2) temp_downdata1=temp_downdata1%100+100; if(temp_flash=3) temp_downdata1=(temp_downdata1/100)*100+temp_downdata1%10+10; if(temp_flash=4) temp_downdata1=(temp_downdata1/10)*10+1; if(temp_flash=5) temp_updata1=temp_updata1%100+100; if(temp_flash=6) temp_updata1=(temp_updata1/100)*100+t

44、emp_updata1%10+10; if(temp_flash=7) temp_updata1=(temp_updata1/10)*10+1; if(temp_play=2) if(temp_flash=2) temp_downdata2=temp_downdata2%100+100; if(temp_flash=3) temp_downdata2=(temp_downdata2/100)*100+temp_downdata2%10+10; if(temp_flash=4) temp_downdata2=(temp_downdata2/10)*10+1; if(temp_flash=5) temp_updata2=temp_updata2%100+100; if(temp_flash=6) temp_updata2=(temp_updata2/100)*100+temp_updata2%10+10; if(temp_flash=7) temp_updata2=(temp_updata2/10)*10+1; if(temp_play=3) if(temp_flash=2) te

温馨提示

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

评论

0/150

提交评论