1、中北大学计算机控制技术课程设计说明书目录1 引言12 设计要求13 意义24 总体方案25 硬件电路设计35.1 加热控制电路55.2 温度检测电路66 软件设计流程76.1 主函数76.2 显示扫描子函数76.3 按键扫描处理子函数86.4 加热控制函数96.5 温度检测函数106.6 源程序代码131 引言当前,热水器已成为日常生活中不可缺少的家用电器,设计制造更实用、更方便、更安全、更节能的热水器是产品设计师和生产商家不断追求的目标。快热式电热水器与普通电热水器最大的区别在于它取消了储水罐,热水随开随用,不需预热,减少了电能浪费,另外还具有体积小、使用安全、安装方便等优点。2 设计要求(
2、1)用2位数码管显示出水温度,能显示设定功率档位。温度检测显示范围00-99,精确度1。(2)设置3个功率档位指示灯,1-4档一个灯亮,5-8档两个灯亮,9档3个灯全亮。0档位灯不亮,无率输出。(3)设置3个轻触按钮,分别为电源开关键、“+”键和“-”键。加热功率分0-9档,按“+”键依次递增至9档,按“-”键依次递减至0。(4)出水温度超过65时停止加热,并蜂鸣报警,温度降到45以下时恢复。(5)内胆温度超过105时停止加热,防止干烧。3 意义本设计包括确定控制任务、系统总体方案设计、硬件系统设计、软件程序的设计等,使我们进一步学习与理解计算机控制系统的构成原理、接口电路与应用程序,巩固与综
3、合专业基础知识和相关专业课程知识,提高我们运用理论知识解决实际问题的实践技能。4 总体方案按快热式电热水器的功能要求,决定采用如图4.1所示的模块组成系统,即电源电路、单片机控制器、温度检测电路、按键输入电路、LED数码管及指示灯电路、报警电路和加热控制电路。图4.1快热式电热水器系统组成框图快热式电热水器为了达到“快热”的效果,取消了储水罐,使冷水在在进入加热管后立即被加热,这就要求加热管有较大的功率,家用电热水器一般采用方便可靠的电热丝加热方法。根据热学及流体力学原理结合实际实验室测试,可以得到水温与流量、加热功率之间的关系如表4.1。表4.1中所列水温值和流量值可以满足大多数家庭用户使用
4、要求,当最大的加热功率为7.5KW时,按220V供电计算电流约为34A,所以要求专线供电。表4.1水温与流量、加热功率的关系2升/分钟2.5升/分钟3升/分钟3.5升/分钟4升/分钟4.5KW47423634325.5KW54484138356.5KW62544642387.5KW7060514641注:进水温度15,输入电压AC220V对于加热功率的控制,最简单的方法是由若干不同功率的电热丝组合得到几种加热功率,但由于快热式热水器的加热功率较普通的大,且档位设置较多,用电热丝组合的方法需要几组电热丝和继电器,成本增高且工作可靠性降低,所以比较理想的是采用可控硅控制功率,电路简单又控制方便。温
5、度检测的方法较多,最经典的方法就是用热敏电阻(或热敏传感器)组成电桥来采集信号,再经放大、AD转换后送单片机。目前比较先进的方法是采用专门的集成测温传感器(如DS18B20),直接将温度转换成数字信号传送给单片机。为了简化电路又降低成本,本文采用了温度/频率转换测温法,直接将温度信息转换成频率信号,用单片机测出频率大小,从而间接测出温度值,温度/频率转换电路简单可靠,成本低廉。5 硬件电路设计快热式热水器控制系统电路如图5.1,由7个部分电路组成:单片机系统及外围电路、电源电路、按键输入电路、LED数码管及指示灯电路、报警电路、加热控制电路、温度检测电路。控制器采用成本低廉且工作可靠的89C5
6、1或其兼容系列的单片机,采用12M的晶振。89C51对电源要求不甚严格,电源电路采用普通的市电降压整流,然后经集成稳压器(7805)稳压输出+5V电压。按键采用轻触小按钮。显示电路采用两位共阳数码管,由2个三极管9012驱动,3个LED指示灯用于指示加热功率。报警电路采用5V的自鸣式蜂鸣器。图5.1快热式家用电热水器控制电路图5.1 加热控制电路图5.2为加热控制电路原理图,电热丝的加热功率由双向可控硅来控制,单片机通过光耦给可控硅触发信号,控制可控硅的导通角,从而控制电热丝的有效加热功率。为了在关机和超温保护的状态下能可靠地关断加热电源,电路中设计了继电器来控制加热电源。其中串联在继电器线圈
7、回路的熔丝为105的热保险丝,当温度超过105时,热保险丝会熔断,防止加热管干烧。与电热丝并联的LED发光管用来指示电热丝的工作状态。可控硅触发信号中需要对市电进行过零检测,以实现触发脉冲的相位延时。本电路中是利用三极管8050和一个非门实现过零检测的,电路如图5.3。图5.2加热控制电路图图5.3过零检测电路图5.2 温度检测电路温度检测电路组成如图5.4所示,温度/频率变换电路是利用反相器组成的RC多谐振荡器,其中的R24是一个热敏电阻,当温度变化时引起热敏电阻的阻值变化,从而改变了振荡器输出的方波频率。该频率的估算可用如下公式:图5.4温度检测电路图6 软件设计流程按快热式热水器的功能,
8、系统程序必需实现以下任务:显示扫描;按键扫描处理;加热控制;温度检测(包括超温报警)。51系列单片机实现多任务运行的方法就是分时复用,在程序设计的时候要相应地分配好各任务的CPU占用时间。对于以上几个任务稍加分析可以看出,显示扫描、按键扫描和加热控制任务相对而言有实时要求,而温度检测任务则可用定时(0.51s)实现。6.1 主函数系统在上电复位后,先对温度寄存器、档位寄存器赋默认值,并进行清除超温标志,设置定时器及中断系统的工作方式等初始化工作。由于51系列单片机没有停机指令,我们可以利用主程序设置死循环反复运行各个任务。我们把有实时要求的子程序(显示扫描、按键扫描、加热控制)放在最内层的循环
9、中,计算其运行一次占用的CPU时间,然后根据温度检测定时的间隔时间,计算出该循环的循环次数。本例中每运行一次有实时要求的子程序(即显示扫描、按键扫描、加热控制)约占用5ms CPU时间,运行测温子程序的时间间隔为0.5s,那么循环次数应为100次。图6.1为主函数程序流程图。6.2 显示扫描子函数显示子函数完成两位共阳数码管的扫描显示任务,图6.2为显示扫描子函数程序流程图。 图6.1主函数程序流程图 图6.2显示扫描子函数程序流程图6.3 按键扫描处理子函数按键扫描子函数负责逐个扫描档位“+”键、档位“-”键和开关键是否被按下,若有键被按下则作出相应处理。图6.3为按键扫描子函数程序流程图。
10、图6.3按键扫描子函数程序流程图6.4 加热控制函数加热控制程序根据用户设定的加热档位和系统当前的状态,来决定是否加热和控制加热的功率并点亮相应的指示灯。如有超温标志还应打开蜂鸣器报警。图6.4为加热控制函数程序流程图。加热控制程序通过控制继电器的通断来决定是否给电热丝通电加热,而加热的功率大小则由双向可控硅的导通角决定。系统程序利用外中断INT1检测市电的过零点,检测到过零点后,立即根据设定的加热档位给定时器T1赋一个延时参数,并打开定时器T1,允许其中断。当定时器T1计满溢出后触发中断,T1中断程序就会给可控硅发一个触发信号,使其导通。图6.5、6.6分别是过零检测函数程序流程图和可控硅触
11、发信号控制函数程序流程图。图6.4加热控制函数程序流程图 图6.5过零检测函数程序流程图 图6.6可控硅触发信号控制程序流程图6.5 温度检测函数温度检测函数的基本原理就是将温度/频率转换电路测得的频率与事先建立好的温度/频率表进行比较,查找出与该频率相应的温度值。事先在实验测试后建立的温度/频率表是0100温度所对应的频率值,它是一个频率对应于温度递减的非线性函数,我们在C语言中用一个一维数组Tab101 来表示,下标为温度,数组元素为频率值。计算温度的方法采用高效准确的二分法查表,查表的过程如下: 先给定查找的温度的最大值Tmax和最小值Tmin,即确定查找的范围,我们根据已有的温度表默认
12、最大值Tmax=100,最小值Tmin=0; 假定测得温度Temp为最大值和最小值之中间值即Temp=(Tmax+Tmin)/2; 将实际测得的频率值T0rig与假定温度Temp在表格中对应的频率Tabtemp相比较,如果相等,那么假定温度就是当前实际温度,即完成查找; 如果T0rig Tabtemp,说明实际温度应该在Tmin和Temp之间(因为递减函数特性),所以修改查找范围令Tmax=Temp,同理如果T0rig Tabtemp,说明实际温度应该在Temp和Tmax之间,则令Tmin=Temp; 检查查找范围,如果Tmax-Tmin1,那么重复第步骤直到完成查找。温度检测程序完成温度计算
13、后便刷新系统当前温度寄存器,并判断有无超温、置位或清除相应的标志位。图6.7为温度检测函数程序流程图。单片机使用外中断INT0和计时器T0检测输入的频率大小,为了减少测量的系统误差相对值和随机误差对测量精度的影响,程序中取100个方波周期的和作为测量结果。程序中使用静态变量px0count进行外中断的计数,在测量开始时,我们给px0count赋值2是为了让频率测量有准确的起点。另外,为了区分测频的开始和结束,还使用了测频开始标志位T0tst和测频完成标志位Testok。图6.8为频率测试函数程序流程图。图6.7温度检测函数程序流程图图6.8频率测试函数程序流程图6.6 源程序代码#includ
14、e #include #include void delay(unsigned int); /延时函数void display(void); /显示函数unsigned char keyscan(void); /按键扫描处理函数void heatctrl(void); /加热控制函数void temptest(void); /测温函数sbit swkey=P10; /开关键sbit upkey=P11; /加热档位“+”键sbit downkey=P12; /加热档位“-”键sbit buzz=P105; /蜂鸣器输出端sbit triac=P16; /可控硅触发信号输出端sbit relay
15、=P17; /继电器控制信号输出端sbit led1=P25; /加热档位指示灯1sbit led2=P26; /加热档位指示灯2sbit led3=P27; /加热档位指示灯3signed char data ctemp; /当前测得水温寄存器unsigned char data dispram2=0x10,0x10; /显示区缓存unsigned char data heatpower,px0count; /加热档位寄存器、外中断0计数器bit tempov,t0tst,testok; /超温标志、测温开始标志、测温完成标志/*- 主函数 void main(void) 无参数,无返回值
16、循环调用显示、键扫描、温度检测、加热控制函数-*/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;j100;j+) /循环100次约0.5s if (keyscan() i=6;
17、 /如果有键按下,显示当前档位3s display(); /调用显示函数一次约4ms heatctrl(); /调用加热控制函数 /end for (b=0;b100;b+) temptest(); /每0.5s进行一次测温 while (-i); /通过改变循环次数i的大小决定是否刷新显示 j=abs(ctemp); /取温度绝对值 dispram1=j%10; /取个位数送显示 j/=10; /取十位数 dispram0=j?j:0x11; /送显示(带灭零) /end while (1) /*- 延时函数 void delay(unsigned int dt) 参数:dt,无返回值 延时
18、时间=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,0
19、xc6,0xa1,0x86,0x8e,0xbf,0xff;unsigned char i,a;a=0xfe; /位选赋初值for (i=0; i2; i+) /循环扫描两位数码管 P2|=0x1f; /清除位选 P0=tabledisprami; /送显示段码 P2&=a; /选通一位 delay(4); /延时2ms a=_crol_(a,1); /改变位选字 P0=0xff; /消影 /*- 按键扫描处理函数 unsigned char keyscan(void) 无参数,返回值:无符号字符型,无键按下为0,有键按下为其它 影响全局变量:heatpower-*/unsigned char
20、keyscan(void)unsigned char i,ch;if (upkey=0) /“+”键 buzz=0; /打开蜂鸣器(发出按键音) for (i=0;i5;i+) display(); /延时消抖 buzz=1; /关闭蜂鸣器 if (heatpower9) heatpower+; /档位加一 dispram0=0; dispram1=heatpower; /显示当前档位 while (upkey=0) display(); /等待键释放 return (1); /返回有键按下 else if (downkey=0) /“-”键 buzz=0; /打开蜂鸣器(发出按键音) for
21、 (i=0;i0) heatpower-; /档位减一 dispram0=0; dispram1=heatpower; /显示当前档位 while (downkey=0) display(); /等待键释放 return (2); /返回有键按下 else if (swkey=0) /开关键 buzz=0; /打开蜂鸣器(发出按键音) for (i=0;i30;i+) display(); /延时消抖 buzz=1; /关闭蜂鸣器 swkey=1; /置位开关键 while (swkey=0) display(); /等待键释放 ch=IE; /暂存中断控制字IE IE=0x00; /禁止中断
22、 P0=0xff; P1=0xff; P2=0xff; /清除端口输出 dispram0=0x10; dispram1=0x10; /显示“-” display(); while (1) while (swkey) display(); /等待开关键按下 buzz=0; /打开蜂鸣器(发出按键音) for (i=0;i10;i+) display();/延时消抖 buzz=1; /关闭蜂鸣器 if (swkey=0) break; /确认开关键被按下 while (swkey=0) display(); /等待键释放 IE=ch; /还原中断控制字IE return (0); /返回无键按下
23、else return (0); /无任何键按下时由此返回/*- 加热控制函数 void heatctrl(void) 无参数,无返回值 判断是否加热、加热功率及档位指示灯处理-*/void heatctrl(void)if (!tempov) /当没有超温标志时 relay=0; /接通继电器 buzz=1; /关闭蜂鸣器 switch (heatpower) /判断加热档位 case 0: EX1=0;ET1=0;triac=1;led1=1;led2=1;led3=1;break;/0档不加热,指示灯不亮 case 1: case 2: case 3: case 4: led1=0;le
24、d2=1;led3=1;EX1=1;break; /14档1号指示等亮 case 5: case 6: case 7: case 8: led1=0;led2=0;led3=1;EX1=1;break; /58档1号、2号指示灯亮 case 9: EX1=0;ET1=0;led1=0;led2=0;led3=0;triac=0;break; /9档全功率,指示灯全亮 else /当有超温标志时 relay=1; /断开继电器 EX1=0; ET1=0; triac=1; /关闭可控硅 buzz=0; /蜂鸣报警 /*- 测温函数 void temptest(void) 无参数,无返回值, 影响
25、全局变量:ctemp,tempov 测量并查表计算温度,判断是否超温-*/void temptest(void)signed char temp,tempmin,tempmax;unsigned int t0rig;unsigned int code temptab=0x6262,0x61eb,0x6171,0x60f7,0x6047,0x5ff7,0x5f6e,0x5eef,0x5e53,0x5dbe,0x5d4b,0x5ca5,0x5c17, 0x5b6b,0x5ada,0x5a5c,0x599b,0x58ff,0x5869,0x57b0,0x570d,0x5663,0x55c6,0x55
26、0e,0x5444,0x5396, 0x52dd,0x5240,0x5189,0x50b0,0x5005,0x4f20,0x4e69,0x4db1,0x4cef,0x4c42,0x4b64,0x4aaa,0x49e1, 0x48fc,0x4847,0x476c,0x46b1,0x4604,0x4503,0x4449,0x4356,0x4299,0x41c0,0x40ce,0x3ff0,0x3f2b, 0x3e33,0x3d86,0x3ca6,0x3bd2,0x3b26,0x3a39,0x3973,0x38a6,0x37ef,0x373f,0x3687,0x35c3,0x3507, 0x3487
27、,0x33bc,0x32ed,0x324f,0x319e,0x3106,0x3053,0x2fa6,0x2f2a,0x2e88,0x2e00,0x2d63,0x2cd6, 0x2c65,0x2bae,0x2b28,0x2a97,0x2a07,0x298e,0x2914,0x287a,0x280d,0x278a,0x2703,0x2687,0x2626, 0x25e5,0x256d,0x24ee,0x2489,0x2414,0x23bc,0x2356,0x22d9,0x2278,0x2203; /温度频率表px0count=2; /测频中断函数参数t0tst=1; /置测频程序开始标志EX0=1
28、; /打开测频外中断testok=0; /清除测频程序完成标志while (!testok) display(); /等待测试完成t0rig=(unsigned int)TH0temptabtemp) tempmax=temp;/若实际值大于假定值,减小查找范围的最大值 else tempmin=temp; /若实际值小于假定值,增大查找范围的最小值 if (tempmax-tempmin2*t0rig) temp=tempmax;/接近最大值取最大值 else temp=tempmin; /接近最小值取最小值 break; /结束查找 ctemp=temp; /刷新当前温度寄存器if (te
29、mp65) tempov=1; /如果温度超过65度置位超温标志 else if (temp45) tempov=0; /当温度回落到45度以下时清除超温标志/*- 测温频率测试函数 void tempfrequency(void) 使用外部X0中断,寄存器组1 测出温度频率转换电路的频率-*/void tempfrequency(void) interrupt 0 using 1if (-px0count) return; /找齐起点或计数if (t0tst) /如果是起点 t0tst=0; /清除测频开始标志 px0count=100; /取100个方波为一次测频 TH0=0; TL0=0
30、; /清除计时器T0 TR0=1; /开始计时 else /如果是终点 TR0=0; /停止计时 EX0=0; /停止测频外中断 testok=1; /置位测频完成标志 /*- 加热控制过检测函数 void pass0(void) 使用外部X1中断,寄存器组2 检测过点,给定时器T1赋初值-*/void pass0(void) interrupt 2 using 2unsigned char code powertab=0xd8,0xf0,0xe2,0x63,0xe5,0x25,0xe8,0x3e,0xeb,0x16,0xed,0xda,0xf0,0xb2,0xf3,0xcb,0xf7,0x8
31、d,0xf7,0x8d;/10个功率档位的可控硅导通角延时参数表TH1=powertab2*heatpower-1;TL1=powertab2*heatpower+1; /市电过零后,根据当前设置的档位给定时器T1赋延时参数ET1=1; /允许定时器T1中断TR1=1; /打开定时器T1/*- 可控硅触发信号控制函数 void triacctrl(void) 使用定时器T1中断,寄存器组3 向可控硅送出触发信号-*/void triacctrl(void) interrupt 3 using 3register unsigned char i;triac=0; /输出可控硅导通信号ET1=0;
32、 /关闭定时器T1中断TR1=0; /终止定时器运行for (i=0;i2;i+); /延时,保证导通信号有足够的宽度triac=1; /完成可控硅导通信号心得体会通过这次对快热式家用电热水器的毕业设计,我学到了很多东西而且也使自己的身心得到磨练,摆脱了单纯的理论知识学习状态,和实际设计的结合锻炼了我的综合运用所学的专业基础知识,解决实际工程问题的能力,同时也提高我查阅文献资料、设计手册、设计规范以及电脑制图等其他专业能力水平,而且通过对整体的掌控,对局部的取舍,以及对细节的斟酌处理,都使我的能力得到了锻炼,经验得到了丰富,并且意志品质力,抗压能力及耐力也都得到了不同程度的提升。提高是有限的但提高也是全面的,正是这一次设计让我又积累了一定的实际经验,使我的头脑更好的被知识武装了起来,也必然会让我在未来的工作学习中表现出更高的应变能力,更强的沟通力和理解力。 参 考 文 献1 顾德英.计算机控制技术(第二版).北京邮电大学出版社,20052 李顺增,吴国东.微机原理及接口技术.机械工业出版社,20043 李朝青.单片机原理及接口技术.北京航空航天大学出版社,2005第 26 页 共 26 页