1、锅炉水温自动控制系统摘要本设计采用一块单片机(STC89C52)作为涡炉水温闭环控制系统的控制核心,实现人工设定温度,自动控制温度,显示水的实时温度等功能。水温测试方式采用数字温度传感器 DS18B20 感知器皿中水的温度,通过单片机 STC89C52 与数字温度传感器 DS18B20 通讯获得实时温度,并通过程序实现闭环控制。采用键盘扫描方式对目标温度(080或 2060)进行人工设定,并用 LCD1602 显示水的实时温度、给定温度及温度范围。同时系统还通过继电器电路控制加热器件的导通与关闭,达到保持设定温度基本不变的目的,并起到强弱点隔离作用,安全可靠。水温控制算法通过程序对给定温度与实
2、时温度的判断,实现温度调节,其精确度可达 1。并设有一定的保护措施,当实时温度不在设定的安全温度范围时系统将报警。关键词:单片机(STC89C52 ),自动控制,闭环控制目录1.系统设计 .41.1 设计要求 41.1.1 基本要求 .41.1.2 发挥部分 .41.2 系统基本方案 41.2.1 各模块的方案选择和论证 .52.单元电路设计 .92.1 水温测量电路的设计 .92.1.1DS18B20 单线数字温度传感器 .92.1.2 DS18B20 单线数字温度传感器电路 122.2 STC89C52 控制电路 .132.2.1STC89C52 单片机管脚图 .132.2.2 STC89
3、C52 单片机最小系统及外围电路接口图 132.3LCD1602 液晶显示屏电路 142.3.1 LCD1602 液晶显示屏 14152.3.2LCD1602 液晶显示屏显示电路图 .172.4 继电器电路 172.4.1 继电器主要技术参数 .172.4.2HK4100F 继电器驱动电路原理 .182.5 键盘电路 192.5.1 键盘电路图 .192.5.2 按键说明 .192.6 蜂鸣器报警电路 202.6.1 蜂鸣器报警电路图 .203.软件设计 .213.1 软件框图 213.2 各模块主要程序 213.2.1LCD1602 程序 .213.2.2DS18B20 程序 .244.系统
4、整体电路图 .304.1 系统整体电路图 305.结束语 .31参考文献 32附录一 33附录二 361.系统设计1.1 设计要求1.1.1 基本要求(1)要求采用直接数字控制(DDC)对锅炉水温进行控制,使其温度稳定在给定的值上;(2)具有键盘输入温度给定值,能显示当前温度值;(3)温度达到极限时提醒操作人员注意的功能。1.1.2 发挥部分(1)具有设定温度范围的功能,并显示给定值、当前值及温度范围;(2)温度控制精度达到 1;(3)采用软件实现闭环控制,降低成本;(4)通过继电器实现对加热器件的控制,起到隔离保护作用。1.2 系统基本方案根据题目要求,系统可以划分为控制器模块,温度测量模块
5、,水温加热模块,显示模块。最终选定的整体系统框图如图 1.2.1 所示。为了实现各模块的功能,分别做了几种不同的设计方案并进行了论证。图 1.2.11.2.1 各模块的方案选择和论证(1) 控制器模块采用 STC 公司的 STC89C52 作为系统的控制器。单片机算术运算功能强,软件编程灵活,自由度大,可用软件编程实现各种算法,并且具有功耗低,体积小,技术成熟,成本低廉等有点,使其在各个领域应用广泛。(2)水温探测模块水温探测模块用于测量器皿中水的温度。系统需要利用测温传感器检测出水的实时温度,是控制模块做出正确的反应,控制水的温度。采用单总线可编程温度传感器测温度。DS18B20 数字可编程
6、温度传感器可测温范围55125,在-10+85时精度为 0.5。可编程的分辨率为 912 位,对应的可分辨温度分别为 0.5、0.25、0.125和 0.0625,可实现高精度测温。在 9 位分辨率时最多在 93.75ms 内把温度转换为数字,12 位分辨率时最多在750ms 内把温度值转换为数字,速度更快。测量结果直接输出数字温度信号,以“一线总线“串行传送给 CPU,同时可传送 CRC 校验码,具有极强的抗干扰纠错能力。并且其所需辅助电路简单,依靠程序直接读取温度,总费用低。(3)显示模块使用 LCD1602 液晶显示屏显示水温。液晶显示屏(LED)具有轻薄短小,低耗电量,无辐射危险,平面
7、直角显示以及影像稳定不闪烁等优势,可视面积大,画面效果好,分辨率高,抗干扰能力强等特点,且显示更为人性化,电路焊接更为简单。(4)水温控制模块水温控制模块用来控制加热器件的导通与关闭,从而达到控制加热时间,控制水温的目的。采用继电器驱动电路控制。继电器是一种电子控制器件,它具有控制系统(又称输入回路)和被控制系统(又称输出回路) ,通常应用于自动控制电路中,它实际上是用较小的电流去控制较大电流的一种“自动开关” 。故在电路中起着自动调节、安全保护、转换电路等作用。电磁式继电器一般由铁芯、线圈、衔铁、触点簧片等组成的。只要在线圈两端加上一定的电压,线圈中就会流过一定的电流,从而产生电磁效应,衔铁
8、就会在电磁力吸引的作用下克服返回弹簧的拉力吸向铁芯,从而带动衔铁的动触点与静触点(常开触点)吸合。当线圈断电后,电磁的吸力也随之消失,衔铁就会在弹簧的反作用力返回原来的位置,使动触点与原来的静触点(常闭触点)吸合。这样吸合、释放,从而达到了在电路中的导通、切断的目的。对于继电器的“常开、常闭”触点,可以这样来区分:继电器线圈未通电时处于断开状态的静触点,称为“常开触点” ;处于接通状态的静触点称为“常闭触点” 。2.单元电路设计2.1 水温测量电路的设计2.1.1DS18B20 单线数字温度传感器序号名称 引脚功能描述1 GND 地信号2 DQ 数据输入/输出引脚。开漏单总线接口引脚。当被用着
9、在寄生电源下,也可以向器件提供电源。3 VDD 可选择的 VDD 引脚。当工作于寄生电源时,此引脚必须接地。DS18B20 的使用方法由于 DS18B20 采用的是 1Wire 总线协议方式,即在一根数据线实现数据的双向传输,而对 AT89S51 单片机来说,硬件上并不支持单总线协议,因此,我们必须采用软件的方法来模拟单总线的协议时序来完成对 DS18B20 芯片的访问。由于 DS18B20 是在一根 I/O 线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20 有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序
10、都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。(1) DS18B20 的复位时序DS18B20 单线数字温度传感器复位时序图(2)DS18B20 的读时序对于 DS18B20 的读时序分为读 0 时序和读 1 时序两个过程。 对于 DS18B20 的读时隙是从主机把单总线拉低之后,在 15 秒之内就得释放单总线,以让 DS18B20 把数据传输到单总线上。DS18B20 在完成一个读时序过程,至少需要 60us 才能完成。DS18B20 单
11、线数字温度传感器读时序图(3)DS18B20 的写时序对于 DS18B20 的写时序仍然分为写 0 时序和写 1 时序两个过程。对于 DS18B20 写 0 时序和写 1 时序的要求不同,当要写 0 时序时,单总线要被拉低至少 60us,保证 DS18B20 能够在 15us 到 45us之间能够正确地采样 IO 总线上的“0”电平,当要写 1 时序时,单总线被拉低之后,在 15us 之内就得释放单总线。DS18B20 单线数字温度传感器写时序图(4)DS18B20 单线数字温度传感器温度/数据转换关系图表 12.1.2 DS18B20 单线数字温度传感器电路DS18B20 单线数字温度传感器
12、电路2.2 STC89C52 控制电路2.2.1STC89C52 单片机管脚图2.2.2 STC89C52 单片机最小系统及外围电路接口图STC89C52 单片机最小系统及外围电路接口图2.3LCD1602 液晶显示屏电路2.3.1 LCD1602 液晶显示屏(1)LCD1602 液晶显示屏主要技术参数(2) LCD1602 液晶显示屏引脚说明LCD1602 液晶显示屏引脚图1602 采用标准的 14 脚接口,其中: 第 1 脚:VSS 为地电源 第 2 脚:VDD 接 5V 正电源 第 3 脚:V0 为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼
13、影”,使用时可以通过一个 10K 的电位器调整对比度第 4 脚:RS 为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。 第 5 脚:RW 为读写信号线,高电平时进行读操作,低电平时进行写操作。当 RS 和 RW 共同为低电平时可以写入指令或者显示地址,当RS 为低电平 RW 为高电平时可以读忙信号,当 RS 为高电平 RW 为低电平时可以写入数据。 第 6 脚:E 端为使能端,当 E 端由高电平跳变成低电平时,液晶模块执行命令。 第 714 脚:D0D7 为 8 位双向数据线。 另外引脚“A“和“K“为背光引脚,“A“接正,“K“接负便会点亮背光灯。这两个管脚可以不接置空。(3)
14、 LCD1602 液晶显示屏指令说明LCD1602 液晶显示屏指令表它的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1 为高电平、0 为低电平) 指令 1:清显示,指令码 01H,光标复位到地址 00H 位置 指令 2:光标复位,光标返回到地址 00H 指令 3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效 指令 4:显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不
15、闪烁 指令 5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标 指令 6:功能设置命令 DL:高电平时为 4 位总线,低电平时为 8 位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示 5x7 的点阵字符,高电平时显示 5x10 的点阵字符 指令 7:字符发生器 RAM 地址设置 指令 8:DDRAM 地址设置 指令 9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。 指令 10:写数据 指令 11:读数据2.3.2LCD1602 液晶显示屏显示电路图LCD1602 液晶显示屏与 STC89C52 连
16、接显示电路图2.4 继电器电路2.4.1 继电器主要技术参数HK4100F 电磁继电器 主要技术参数:型 号 : HK4100F-DC5V-SH外形尺寸(mm): 10.5*15.5*11.8mm(W*L*H)触点形式:1C(SPDT) 触点负载:3A 220V AC/30V DC阻 抗: 100m 额定电流:3A电气寿命:10 万次 机械寿命:1000 万次阻值(士 10%): 120 线圈功耗:0.2W 额定电压:DC 5V 吸合电压:DC 3.75V 释放电压:DC 0.5V 工作温度:-25+70 绝缘电阻:100M 线圈与触点间耐压:4000VAC/1 分钟 触点与触点间耐压:750
17、VAC/1 分钟 2.4.2HK4100F 继电器驱动电路原理HK4100F 继电器驱动电路原理图如下图所示,三极管 Q1 的基极 B 接到单片机的P3.6,三极管的集电极极 C 接到继电器线圈的一端,线圈的另一端接到5V 电源 VCC 上;继电器线圈两端并接一个二极管 IN4148,用于吸收释放继电器线圈断电时产生的反向电动势,防止反向电势击穿三极管 Q1 及干扰其他电路;R6和发光二极管 LED1 组成一个继电器状态指示电路,当继电器吸合的时候,LED1 点亮,这样就可以直观的看到继电器状态了。HK4100F 继电器驱动电路原理图(1)当 STC89C52 单片机的 P3.6 引脚输出低电
18、平时,三极管 Q1 饱和导通,5V 电源加到继电器线圈两端,继电器吸合,同时状态指示的发光二极管也点亮,继电器的常开触点闭合,相当于开关闭合。(2)当 STC89C52 单片机的 P3.6 引脚输出低电平时,三极管 Q1 截止,继电器线圈两端没有电位差,继电器衔铁释放,同时状态指示的发光二极管也熄灭,继电器的常开触点释放,相当于开关断开。注:在三极管截止的瞬间,由于线圈中的电流不能突变为零,继电器线圈两端会产生一个较高电压的感应电动势,线圈产生的感应电动势则可以通过二极管 IN4148 释放,从而保护了三极管免被击穿,也消除了感应电动势对其他电路的干扰,这就是二极管 D1 的保护作用。2.5
19、键盘电路2.5.1 键盘电路图键盘电路图2.5.2 按键说明S2 调小给定温度值,每按一下给定温度值减一;S3 调大给定温度值,每按一下给定温度值加一;S4 切换温度范围,每按一下切换一次,默认为(080) ,还可切换为(2060) ;S6 闭合则启动温度自动控制,断开则扫描按键。2.6 蜂鸣器报警电路2.6.1 蜂鸣器报警电路图当 STC89C52 的 P3.7 端输出为高电平时,蜂鸣器则报警;当 P3.7 输出为低电平时,则属于正常情况,蜂鸣器不响。3.软件设计3.1 软件框图软件框图3.2 各模块主要程序3.2.1LCD1602 程序#include #include #include
20、“LCM1602.h“#define lcd_rs P2_7#define lcd_rw P2_6#define lcd_e P2_5#define lcd_bus P0 /数据指令的输入/输出端口sbit P2_5=P25;sbit P2_6=P26;sbit P2_7=P27;void del_nop();void del_1ms(uint timecounter) /更好的延时程序 1709uint j;register i;j=timecounter;while(1)for(i=71;i0;i-); j-;if(j=0) break; /*判断忙标志,返回的是一个位 BF*/bit l
21、cd_busy(void)register bflag; /*bflag is the busy flag BF*/lcd_rs=0;lcd_rw=1;_nop_();lcd_e=1;del_nop();bflag=lcd_bus;lcd_e=0;return(bit)(bflag /*return the BF flag bit */*写命令,有两个参数,第一个是要写的命令控制字,第二个是用来控制是否进行忙标志的判断。busyflag=1:判断;为 0:不判断*/void lcd_wrcmd(uchar cmd,bit busyflag)if (busyflag=1)while(lcd_bu
22、sy();lcd_bus=cmd;lcd_rs=0;lcd_rw=0;del_nop();lcd_e=1;del_nop();del_nop();lcd_e=0;lcd_bus=0xff; /*needed ?*/*指定要显示的位置 */void moveto(uchar position)uchar const cmd=0x80;position-=1;if(position32) /*如果大于 32,则光标移回上一行 */position=0;if (position=16) /*如果大于 16,则光标移到下一行*/position+=0x30;/cmd=cmd|position; /*指
23、定初始的位置*/lcd_wrcmd(cmd,1);lcd_wrcmd(position|cmd,1);/*向液晶片写数据 */void lcd_wrdata( uchar lcddata)while(lcd_busy();lcd_bus=lcddata;lcd_rs=1;lcd_rw=0;del_nop();lcd_e=1;del_nop();del_nop();lcd_e=0;lcd_bus=0xff;/*液晶片初始化 */void lcd_init(void)lcd_wrcmd(0x38,0); /*two lines ,5x7,8 bit*/del_1ms(5);lcd_wrcmd(0x
24、38,0); /*two lines ,5x7,8 bit*/del_1ms(5);lcd_wrcmd(0x38,0); /*two lines ,5x7,8 bit*/del_1ms(5);lcd_wrcmd(0x38,1);lcd_wrcmd(0x0c,1);lcd_wrcmd(0x06,1);lcd_wrcmd(0x01,1);/*向液晶片写字符串 */void lcd_wrstr(uchar *str,uchar position)register i,j;j= position;moveto(j);for(i=0;j#include #include “LCM1602.h“#defi
25、ne BUSY1 (DQ1=0) sbit DQ1 = P10; /sbit DOWN_30=P30;/sbit UP_31=P31;sbit ON_OR_OFF_35=P35;/sbit RANGE_34=P34;sbit CONTROL_36=P36;sbit ALARM_37=P37;unsigned char idata TMP=0; void wr_ds18_1(char dat);unsigned char rd_ds18_1();/*延时程序,单位 us,大于 10us*/void time_delay(unsigned char time)time=time-10;time=t
26、ime/6;while(time!=0)time-;/*/* reset ds18b20 */*/void ds_reset_1(void)unsigned char idata count=0; DQ1=0;time_delay(240);time_delay(240);DQ1=1;return;void check_pre_1(void)while(DQ1);while(DQ1);time_delay(30);void read_ROM(void)int n;int ROM8;ds_reset_1();check_pre_1();wr_ds18_1(0x33);for(n=0;n1;if(
27、testb)DQ1=0;_nop_();_nop_();DQ1=1;time_delay(60); elseDQ1=0;time_delay(50);DQ1=1;_nop_();_nop_();int get_temp(void)unsigned char idata a=0,b=0; unsigned char idata i;EA=0; ds_reset_1();check_pre_1();wr_ds18_1(0xcc); wr_ds18_1(0x44); while(BUSY1);ds_reset_1();check_pre_1();wr_ds18_1(0xcc); wr_ds18_1(
28、0xbe); a=rd_ds18_1();b=rd_ds18_1();i=b; /*若 b 为 1 则为负温 */i=(i4);if(i=0)TMP=(a4)|(b8)TMP=TMP+1;else ALARM_37=1;del_1ms(3000);ALARM_37=0;EA=1;return(TMP);附录一主程序:void main(void) /unsigned char show;unsigned int count_temp,count_temp_h,count_temp_l,given,given_h,given_l,range_h=80,range_l=20,bit_i=0,bit
29、_j=0,time_delay; unsigned char code table110=“0123456789“;while(1)P3=0xff;CONTROL_36=0;ALARM_37=0;lcd_init();lcd_wrstr(“RANGE_TEMP:“,1);lcd_wrstr(“COUNT_TEMP:“,17);lcd_wrstr(“/“,30);del_1ms(1000); given=get_temp();del_1ms(1000);given=get_temp();given_h=given/10;given_l=given%10;if(given99) ALARM_37=
30、1;elselcd_wrstr(“0080“,12);moveto(28);lcd_wrdata(table1given_h);lcd_wrdata(table1given_l);moveto(31);lcd_wrdata(table1given_h);lcd_wrdata(table1given_l);while(ON_OR_OFF_35)CONTROL_36=0;ALARM_37=0;switch(P3)case 0x3d : if(givenrange_l) given=given-1;else ALARM_37=1;for(time_delay=0;time_delay60|givenrange_h) P3=0x9f;if(count_tempgiven) P3=0x1f;