当前位置:文档之家› 快热式家用电热水器课程设计

快热式家用电热水器课程设计

快热式家用电热水器课程设计
快热式家用电热水器课程设计

1引言

现在热水器大部分都是快热式热水器,它给我们的生活带来了极大的便利,这使是它走进千家万户成为必然

目前燃气式热水器因为它的安全隐患和越来越高的成本正在逐渐退出热水器市场。而太阳能热水器虽然环保无污染,但它寿诞天气。气候及安装条件的严格限制。很难占据更大的市场份额。目前主流的贮水式电热水器,体积庞大、预热时间长、热水储量有限,已经不适合现代生活的节奏。于是,快热式热水器小巧时尚的外观,安全可靠的性能让它有着广泛的发展和应用前景。

普通电热水器有以下几个缺点:首先,因为电热水器长期通电,保持60度以上的高温,发热管容易结垢,内胆容易漏水,比较容易损坏。我们学校的电热水器经常因为结垢堵塞出水口水流越来越小,给师生的饮水带来不便;其次,管道及水箱本身热量损耗大,等候热水所用时间较长;再次,在热水流出前都必须浪费一定量的冷水,根据管道的长短,这样既不环保,又不经济。

而快热式热水器克服了上述缺点。它安全、干净、环保、即开即热。3—5秒出热水,无需等候,热水使用时间不受限制。

2系统总体方案

功能要求

用2位数码管显示出水温度,能显示设定功率档位。

温度检测显示范围00~99℃,精确度±1℃。

设置3个功率档位指示灯,1~4档一个灯亮,5~8档两个灯亮,9档3个灯全亮。0档无功率输出,档位灯不亮。

设置3个轻触按钮,分别为电源开关键、“+”键和“-”键。加热功率分0~9档,按“+”键依次递增至9档,按“-”键依次递减至0。0-9档功率依次为0、1/9P、2/9P、3/9P、4/9P、5/9P、6/9P、7/9P、8/9P、P。

出水温度超过65℃时停止加热,并蜂鸣报警,温度降到45℃以下时恢复。

内胆温度超过105℃时停止加热,防止干烧。

方案论证

按快热式电热水器的功能要求,决定采用如图2.1所示的模块组成系统,即电源电路、单片机控制器、温度检测电路、按键输入电路、LED数码管及指示灯电路、报警电路和加热控制电路。

图2.1 快热式电热水器系统组成框图

快热式电热水器为了达到“快热”的效果,取消了储水罐,使冷水在在进入加热管后立即被加热,这就要求加热管有较大的功率,家用电热水器一般采用方便可靠的电热丝加热方法。根据热学及流体力学原理结合实际实验室测试,可以得到水温与流量、加热功率之间的关系如表2.1。

表2.1中所列水温值和流量值可以满足大多数家庭用户使用要求,当最大的加热功率为7.5KW时,按220V供电计算电流约为34A,所以要求专线供电。

表2.1 水温与流量、加热功率的关系

对于加热功率的控制,最简单的方法是由若干不同功率的电热丝组合得到几种加热功率,但由于快热式热水器的加热功率较普通的大,且档位设置较多,用电热丝组合的方法需要几组电热丝和继电器,成本增高且工作可靠性降低,所以比较理想的是采用可控硅控制功率,电路简单又控制方便。

温度检测的方法较多,最经典的方法就是用热敏电阻(或热敏传感器)组成电桥来采集信号,再经放大、AD转换后送单片机。目前比较先进的方法是采用专门的集成测温传感器(如DS18B20),直接将温度转换成数字信号传送给单片机。为了简化电路又降低成本,本文采用了温度/频率转换测温法,直接将温度信息转换成频率信号,用单片机测出频率大小,从而间接测出温度值,温度/频率转换电路简单可靠,成本低廉。

3系统硬件电路的设计

快热式热水器控制系统电路如图3.1,由7个部分电路组成:单片机系统及外围电路、电源电路、按键输入电路、LED数码管及指示

灯电路、报警电路、加热控制电路、温度检测电路。

控制器采用成本低廉且工作可靠的89C51或其兼容系列的单片机,采用12M的晶振。89C51对电源要求不甚严格,电源电路采用普通的市电降压整流,然后经集成稳压器(7805)稳压输出+5V电压。按键采用轻触小按钮。显示电路采用两位共阳数码管,由2个三极管9012驱动,3个LED指示灯用于指示加热功率。报警电路采用5V的自鸣式蜂鸣器。

谐振荡器,其中的R24是一个热敏电阻,当温度变化时引起热敏电阻的阻值变

显示扫描子函数

显示子函数完成两位共阳数码管的扫描显示任务,图4.2为显示扫描子函数程序流程图。

图4.1主函数程序流程图图4.2显示扫描子函数程序流程图

按键扫描处理子函数

按键扫描子函数负责逐个扫描档位“+”键、档位“-”键和开关键是否被按下,若有键被按下则作出相应处理。图4.3为按键扫描子函数程序流程图。

图4.3按键扫描子函数程序流程图

加热控制函数

加热控制程序根据用户设定的加热档位和系统当前的状态,来决定是否加热和控制加热的功率并点亮相应的指示灯。如有超温标志还应打开蜂鸣器报警。图4.4为加热控制函数程序流程图。

加热控制程序通过控制继电器的通断来决定是否给电热丝通电加热,而加热的功率大小则由双向可控硅的导通角决定。系统程序利用外中断INT1检测市电的过零点,检测到过零点后,立即根据设定的加热档位给定时器T1赋一个延时参数,并打开定时器T1,允许其中断。当定时器T1计满溢出后触发中断,T1中断程序就会给可控硅发一个触发信号,使其导通。图12.10、12.11分别是过零检测函数程序流程图和可控硅触发信号控制函数程序流程图。

图4.4加热控制函数程序流程图

图4.5过零检测函数程序流程图图4.6可控硅触发信号控制程序流程图

图4.7温度检测函数程序流程图

温度检测函数

温度检测函数的基本原理就是将温度/频率转换电路测得的频率与事先建立好的温度/频率表进行比较,查找出与该频率相应的温度值。事先在实验测试后建立的温度/频率表是0~100℃温度所对应的频率值,它是一个频率对应于温度递减的非线性函数,我们在C语言中用一个一维数组Tab[101] 来表示,下标为温度,数组元素为频率值。计算温度的方法采用高效准确的二分法查表,查表的过程如下:

①先给定查找的温度的最大值Tmax和最小值Tmin,即确定查找的范围,我们根据已有的温度表默认最大值Tmax=100,最小值Tmin=0;

②假定测得温度Temp为最大值和最小值之中间值即Temp=(Tmax+Tmin)/2;

③将实际测得的频率值T0rig与假定温度Temp在表格中对应的频率Tab[temp]相比较,如果相等,那么假定温度就是当前实际温度,即完成查找;

④如果T0rig> Tab[temp],说明实际温度应该在Tmin和Temp之间(因为递减函数特性),所以修改查找范围令Tmax=Temp,同理如果T0rig< Tab[temp],说明实际温度应该在Temp和Tmax之间,则令Tmin=Temp;

⑤检查查找范围,如果Tmax-Tmin<=1,判断T0rig更接近最大值对应的频率Tab[Tmax]还是最小值对应的频率Tab[Tmin],实际温度值取频率更接近的那个值即完成查找,

⑥如果Tmax-Tmin>1,那么重复第②③④⑤步骤直到完成查找。

温度检测程序完成温度计算后便刷新系统当前温度寄存器,并判断有无超温、置位或清除相应的标志位。图4.7为温度检测函数程序流程图。

单片机使用外中断INT0和计时器T0检测输入的频率大小,为了减少测量的系统误差相对值和随机误差对测量精度的影响,程序中取100个方波周期的和作为测量结果。程序中使用静态变量px0count进行外中断的计数,在测量开始时,我们给px0count赋值2是为了让频率测量有准确的起点。另外,为了区分测频的开始和结束,还使用了测频开始标志位T0tst和测频完成标志位Testok。图4.8为频率测试函数程序流程图。

图4.8频率测试函数程序流程图

5系统程序清单

以下是快热式电热水器控制源程序清单,采用C51编写,在Keil uVision2 V2.30(C51.exe V7.0)环境下调试通过,并下载到AT89C51测试运行成功。

/*--------------------------------------

快热式热水器程序

MCU AT89C51 XAL 12MHz

Build by Gavin Hu, 2005.3.18

--------------------------------------*/

#include

#include

#include

void delay(unsigned int); //延时函数

void display(void); //显示函数

unsigned char keyscan(void); //按键扫描处理函数

void heatctrl(void); //加热控制函数

void temptest(void); //测温函数

sbit swkey=P1^0; //开关键

sbit upkey=P1^1; //加热档位“+”键

sbit downkey=P1^2; //加热档位“-”键

sbit buzz=P1^05; //蜂鸣器输出端

sbit triac=P1^6; //可控硅触发信号输出端

sbit relay=P1^7; //继电器控制信号输出端

sbit led1=P2^5; //加热档位指示灯1

sbit led2=P2^6; //加热档位指示灯2

sbit led3=P2^7; //加热档位指示灯3

signed char data ctemp; //当前测得水温寄存器

unsigned char data dispram[2]={0x10,0x10}; //显示区缓存

unsigned char data heatpower,px0count; //加热档位寄存器、外中断0计数器bit tempov,t0tst,testok; //超温标志、测温开始标志、测温完成标志

/*----------------------------------------------

主函数void main(void)

无参数,无返回值

循环调用显示、键扫描、温度检测、加热控制函数

----------------------------------------------*/

void main(void)

{

unsigned char i,j;

ctemp=15; //初始化水温寄存器

heatpower=5; //初始化加热档位为5档

tempov=0; //清除超温标志

swkey=0; //默认开关键被按下,进入待机状态TMOD=0x11; //设定T0和T1工作方式为16位定时器TCON=0x05; //设置外中断0和1为下降沿触发

IP=0x01; //设置外中断0优先

IE=0x80; //打开总中断

while (1)

{

i=1;

do{

for (j=0;j<100;j++) //循环100次约0.5s

{

if (keyscan()) i=6; //如果有键按下,显示当前档位3s

display(); //调用显示函数一次约4ms

heatctrl(); //调用加热控制函数

}//end for (b=0;b<100;b++)

temptest(); //每0.5s进行一次测温

} while (--i); //通过改变循环次数i的大小决定是否刷新显示j=abs(ctemp); //取温度绝对值

dispram[1]=j%10; //取个位数送显示

j/=10; //取十位数

dispram[0]=j?j:0x11; //送显示(带灭零)

}//end while (1)

}

/*--------------------------------------

延时函数void delay(unsigned int dt)

参数:dt,无返回值

延时时间=dt*500机器周期

--------------------------------------*/

void delay(unsigned int dt)

{

register unsigned char bt; //定义寄存器变量

for (; dt; dt--)

for (bt=250; --bt; ); //此句编译时以“DJNZ”实现,250*2=500机器周期

}

/*--------------------------------------

显示函数void display(void)

无参数,无返回值

两位共阳数码管扫描显示

--------------------------------------*/

void display(void)

{

unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,\

0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0xff}; unsigned char i,a;

a=0xfe; //位选赋初值

for (i=0; i<2; i++) //循环扫描两位数码管

{

P2|=0x1f; //清除位选

P0=table[dispram[i]]; //送显示段码

P2&=a; //选通一位

delay(4); //延时2ms

a=_crol_(a,1); //改变位选字

P0=0xff; //消影

}

}

/*----------------------------------------------------------

按键扫描处理函数unsigned char keyscan(void)

无参数,返回值:无符号字符型,无键按下为0,有键按下为其它影响全局变量:heatpower

----------------------------------------------------------*/

unsigned char keyscan(void)

{

unsigned char i,ch;

if (upkey==0) //“+”键

{

buzz=0; //打开蜂鸣器(发出按键音)for (i=0;i<5;i++) display(); //延时消抖

buzz=1; //关闭蜂鸣器

if (heatpower<9) heatpower++; //档位加一

dispram[0]=0;

dispram[1]=heatpower; //显示当前档位

while (upkey==0) display(); //等待键释放

return (1); //返回有键按下

}

else if (downkey==0) //“-”键

{

buzz=0; //打开蜂鸣器(发出按键音)for (i=0;i<5;i++) display(); //延时消抖

buzz=1; //关闭蜂鸣器

if (heatpower>0) heatpower--; //档位减一

dispram[0]=0;

dispram[1]=heatpower; //显示当前档位

while (downkey==0) display(); //等待键释放

return (2); //返回有键按下

}

else if (swkey==0) //开关键

{

buzz=0; //打开蜂鸣器(发出按键音)for (i=0;i<30;i++) display(); //延时消抖

buzz=1; //关闭蜂鸣器

swkey=1; //置位开关键

while (swkey==0) display(); //等待键释放

ch=IE; //暂存中断控制字IE

IE=0x00; //禁止中断

P0=0xff;

P1=0xff;

P2=0xff; //清除端口输出

dispram[0]=0x10;

dispram[1]=0x10; //显示“--”

display();

while (1)

{

while (swkey) display(); //等待开关键按下

buzz=0; //打开蜂鸣器(发出按键音)for (i=0;i<10;i++) display();//延时消抖

buzz=1; //关闭蜂鸣器

if (swkey==0) break; //确认开关键被按下

}

while (swkey==0) display(); //等待键释放

IE=ch; //还原中断控制字IE

return (0); //返回无键按下

}

else return (0); //无任何键按下时由此返回

}

/*--------------------------------------

加热控制函数void heatctrl(void)

无参数,无返回值

判断是否加热、加热功率及档位指示灯处理

--------------------------------------*/

void heatctrl(void)

{

相关主题
文本预览
相关文档 最新文档