温度控制器课程设计报告随着社会的发展、科技的进步以及温度控制器在各个领域的应用,自动化已是现代温度控制系统发展的主流方向。
特别是近年来,温度控制器已广泛应用于人们生活的各个方面。
温度控制在日常生活及工业领域应用相当广泛,比如温室、水池、发酵缸、电源等场所。
以往的温度控制都是由人工完成,而且大家都不重视温度控制,因而常常发生意外。
所以为了防止意外发生,许多场所都需要对温度实行监控。
本文利用AT89C51单片机、ADC0909模数转换器等芯片设计一个数码管显示的热水器控制器,通过调节开关来上下调节温度。
现在介绍一下关于这个热水器控制器的具体情况,它是用6只共阴极的八段数码管来分别显示工作状态、设定温度和实际温度温度。
用3只按钮来分别作为开机/关机键、温度设定上升键和下降键。
用1只LED发光二极管来表示加热器开关量控制输出,发光二极管要求用三极管放大驱动。
温度设定范围0~99℃,在装置处于开机状态情况下,当实际温度高于等于设定温度时,加热器控制输出“关”;当实际温度低于设定温度5℃时,加热器控制输出“开”。
上电后,自动显示关机状态、设定温度50℃和实际室内温度,这时用户可以设定温度进行设定,但只有在按下ON键后,控制器正式工作;在运行期间,若对温度状态进行设定,则控制器按新设定开始。
若关机后(非断电)重新启动控制器,则自动进入上次关机前的设定状态。
温度传感器采用AT502热敏电阻。
基于以上这些情况,通过protues软件做出温度控制器的电路图,(protues软件是由英国Labcenter Electronics公司开发的EDA工具软件,它集电路设计、制版及仿真等多种功能于一身,不仅能够对电工、电子技术学科涉及的电路进行设计与分析,还能够对微处理器进行设计和仿真。
)并列出以下材料清单其中,LED数码管是数字量输出,工作方式是动态扫描显示,按钮是数字量输入,工作方式是直接电平输入,加热器是开关量输出,工作方式是电平控制输出,温度传感器是模拟量输入,工作方式是电压输入。
此电路图主要芯片是AT89C51,4k字节 Flash 闪速存储器,128字节内部RAM,32 个I/O 口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。
同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。
空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。
掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。
将LED和AT89C51通过ULN2003A、RESPACK-8和RESPACK-7链接起来,够成LED显示电路,即这张图。
因为要通过3个按钮分别作为开机/关机键、温度设定上升键和下降键,通过这3个按钮来实现对此电路的操控。
然后是要对交流电源进行控制输出,通过继电器来实现。
最后还有AD采样对于以上一些元件的参数在此提出提示,(1)ADC0808的数字输出端顺序是反的,(2)ADC0808的CLK端输入500kHz的脉冲,(3)加热器用灯代替,并接入220V的交流电源,为了显示加热的闪动效果,将交流电频率改为1Hz,(4)控制继电器的电压改为5V,内阻为240欧姆,(5)单片机的晶振用6MHz,(6)温度采集电路的可调电阻值为200欧姆。
接着,介绍一下P0和P1的结构通过以上资料各种综合,我做出了完整的温度控制器电路图,程序如下:#include<reg51.h>#define uint unsigned int#define uchar unsigned charsbit Power_out =P1^0;sbit Key1 =P1^5;sbit Key2 =P1^6;sbit Key3 =P1^7;sbit Eoc =P3^3;sbit led1=P2^0;sbit led2=P2^1;sbit led3=P2^2;sbit led4=P2^3;sbit led5=P2^4;sbit led6=P2^5;uint turn;#define ADC0808_ADDR 0XBF00#define ifAdEoc (!Eoc)uchar code ad2TempTable[]={0x63,0x61,0x5d,0x5c,0x5a,0x59,0x58,0x56,0x55,0x54,0x52,0x51,0x4f,0x4e,0x4d,0x4c,0x4b,0x4a,0x49,0x48,0x47,0x46,0x45,0x44,0x43,0x42,0x41,0x41, 0x40,0x3f,0x3e,0x3e,0x3d,0x3c,0x3b,0x3a,0x3a,0x39,0x38,0x38,0x37,0x37,0x36, 0x35,0x34,0x34,0x33,0x33,0x32,0x32,0x31,0x30,0x30,0x2f,0x2e,0x2e,0x2d,0x2d, 0x2c,0x2c,0x2b,0x2b,0x2a,0x2a,0x29,0x29,0x28,0x28,0x27,0x27,0x26,0x26,0x25, 0x25,0x24,0x24,0x23,0x23,0x22,0x22,0x21,0x21,0x20,0x20,0x1f,0x1f,0x1e,0x1e, 0x17,0x17,0x16,0x16,0x15,0x15,0x15,0x15,0x13,0x13,0x12,0x12,0x12,0x12,0x11, 0x11,0x10,0x10,0x0f,0x0f,0x0e,0x0e,0x0d,0x0d,0x0c,0x0c,0x0c,0x0c,0x0b,0x0b, 0x0a,0x0a,0x0a,0x09,0x09,0x08,0x08,0x08,0x07,0x07,0x06,0x06,0x05,0x05,0x04, 0x04,0x04,0x03,0x03,0x02,0x02,0x01,0x01,0x00,0x00};uchar code Led_seg[10] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};uchar idata temp_now;uchar idata temp_set;uchar idata time_cnt;bit sample_flag;void delay(uint k){uint x,y;for(x=k;x>0;x--){for(y=125;y>0;y--){;}}}void Get_temp(void)//ad处理得到温度{uchar ad;uchar xdata *ptr;ptr=ADC0808_ADDR;*ptr =0;delay(1);while(!ifAdEoc);delay(1);ad = *ptr;if(ad>=24)ad-=24;elsead = 0;temp_now=ad2TempTable[ad];}void main_Init(void) //开中断{ TMOD = 0x01;TR0=1;ET0=1;IT0=1;EX0=1;EA=1;Power_out=0;temp_now=20;temp_set=50;time_cnt=10;sample_flag=1;}void outside0() interrupt 0 {EX0=0; //执行外部中断1程序时,屏蔽外部中断1的响应if(Key1==0) //是否有key1按键按下{ delay(10); //有,延迟,消抖if(Key1==0) //确认是否有key1按键按下{ if( turn==0 ) //ON/OFF选择turn=1; //turn为0,按下key1,turn为1表开机else //turn=0 ; //turn为1,按下key1,turn为0表关机}}if(Key2==0) //是否有key2按键按下{ delay(10); //有,延迟,消抖if(Key2==0) //确认是否有key2按键按下{//开机时if(temp_set<=99) //settep设定温度小于等于98时,可以继续加{temp_set++;}}}if(Key3==0) //是否有key3按键按下{ delay(10); //有,延时,消抖if(Key3==0) //确认是否有key3按键按下{//开机时if(temp_set>=1) //settep设定温度大于等于1时,可以继续减{temp_set --;}}}EX0=1; //允许外部中断1中断,继续等待按键}void display(uchar turn,uchar temp_set,uchar temp_now) //显示子函数turn表示开关,settep表示{uchar setshi,setge,realshi,realge; //setshi,setge对设定温度的settep的十位和个setshi=temp_set/10; //settep的十位放在setshisetge=temp_set%10; //settep的个位放在setgerealshi=temp_now/10; //realtep的十位放在realshirealge=temp_now%10; //realtep的个位放在realgeP0=0xff; //清除P0口led1=1; //选通数码管1 P0= Led_seg[turn]; //P0口送数delay(1); //点亮,延迟5ms led1=0; //关闭数码管1 P0=0xff; //清除P0口led2=1; //选通数码管2P0= Led_seg[turn]; //P0口送数delay(1); //点亮,延迟5ms led2=0; //关闭数码管2 P0=0xff; //清除P0口led3=1; //选通数码管3P0= Led_seg[setshi]; //P0口送数delay(1); //点亮,延迟5ms led3=0; //关闭数码管3 P0=0xff; //清除P0口led4=1; //选通数码管4P0= Led_seg[setge]; //P0口送数delay(1); //点亮,延迟5ms led4=0; //关闭数码管4 P0=0xff; //清除P0口led5=1; //选通数码管5P0= Led_seg[realshi]; //P0口送数delay(1); //点亮,延迟5msled5=0; //关闭数码管5P0=0xff; //清除P0口led6=1; //选通数码管6P0= Led_seg[realge]; //P0口送数delay(1); //点亮,延迟5msled6=0;//关闭数码管6}void heat(){ if( turn==1) //开机时,才能进行加热{if(temp_set<=temp_now) //当实际温度大于等于设定温度,停止加热{Power_out=1; //加热关}if((temp_set-4)==temp_now) //当实际温度小于设定温度5度以下,开始加热{Power_out=1; //加热开}if((temp_set-3)==temp_now) //当实际温度小于设定温度5度以下,开始加热{Power_out=1; //加热开}if((temp_set-2)==temp_now) //当实际温度小于设定温度5度以下,开始加热{Power_out=1; //加热开}if((temp_set-1)==temp_now) //当实际温度小于设定温度5度以下,开始加热{Power_out=1; //加热开}if((temp_set-5)>temp_now) //当实际温度小于设定温度5度以下,开始加热{Power_out=0; //加热开}}else if ( turn==0)Power_out=1;}void timer0 (void) interrupt 1 //定时器中断子程序{TH0 = (65535-10000)/256;TL0 = (65535-10000)%256;if(time_cnt>0)time_cnt--;else{time_cnt=10;sample_flag=1;}}void main(void)//主函数{main_Init();while(1){if(sample_flag==1){ sample_flag=0;Get_temp();}display(turn,temp_set,temp_now);heat() ;PCON=0x01;}}本文介绍了关于温度控制器的电路图和连接方式,此温度控制器可进行上下调节温度,实用性强。