过程控制系统课程设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
绪论
在科技高速发展的信息时代,电子技术、微型计算机技术的应用更是空前广泛,伴随着科学技术和生产不断发展,需要对各种参数进行温度测量。在单片机温度测量系统中最关键的是测量温度、控制温度和保持温度,温度测量是对工业对象中主要的被控参数之一,因此单片机测量是对温度的有效的测量,并能在工业生产中得到广泛应用。
本次课设所研究的课题是“基于单片机的热水锅炉温度控制系统设计,主要介绍了对热水锅炉的温度显示、控制及报警、实现了温度的实时显示及控制。锅炉水温控制部分采用了AT89S52单片机、DS18B20温度传感器以及步进电机来实现,通过温度传感器DS18B20采集环境温度,以单片机为核心控制部件将采集到的温度通过串口通信MAX232输入到电脑中,在电脑中通过C语言编程来控制单片机的工作方式,将程序下载到单片机中,通过设定温度与给定温度的比较来控制电机的正反转来模拟升温和降温使系统工作在设定的温度范围之内,当温度高于设定值时,通过电机正转来模拟开大冷水阀,进而使水温降低;当温度低于设定值时,通过电机反转来模拟关小冷水阀,进而使水温升高;直到在规定的温度范围内进行恒温加热。本次课设通过Labview来绘制人机交互界面设置温度的上下限。并且通过该界面可以实时显示当前的温度值,发出报警信号等,便于操作人员观察。
关键词:AT89S52单片机DS18B20温度传感器串口通讯Labview 步进电机
一设计任务、要求和技术指标
1.1设计任务
①系统构成:
系统主要由温度传感器,单片机控制系统、锅炉温度对象、执行器(查找资料自己选择)等组成。
温度传感器、控制器、执行器可查找资料自行选择,控制器选择单片机为控制器。单片机型号自选
②写出温度测量与控制过程,绘制温度控制系统组成框图。
③(1)系统硬件电路设计自选。
温度测量程序、温度校准程序、温度控制程序等部分组成。
1.2主要技术指标
(1)温度显示误差不超过1℃。
(2)温度显示范围为0℃—99℃。
二、总体设计方案
2.1 设计思路
本设计方案采用AT89S52单片机作为控制器,DS18B20芯片作为温度传感器,步进电机作为执行器构成过程控制系统,来模拟热水锅炉温度控制系统。通过温度传感器DS18B20采集锅炉水温,以单片机为核心控制部件将采集到的温度通过串口输入到电脑中,在电脑中通过labview组态软件来显示实时温度和设置预置温度,并根据实时温度与预置温度的偏差大小控制进水阀门的开关,进而达到调节锅灶水温的目的。当实时温度高于设定值时,通过电机正转来模拟开大冷水阀,进而使水温降低;当温度低于设定值时,通过电机反转来模拟关小冷水阀,进而使水温升高;直到在规定的温度范围内进行恒温加热。本次课设通过Labview来绘制人机交互界面,设置所需温度值。
2.2系统总体框图
2.3系统框图
三、控制器AT89S52
3.1 AT89S52简介
AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可程Flash 存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。片上Flash 允许程序存储器在系统可编程亦适于常规编程器在单芯片上拥有灵巧的8位CPU 和在系统可编程Flash ,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。AT89S52具有以下标准功能:
8k 字节Flash 、256字节RAM 、32 位I/O 口线、看门狗定时器,2 个数据指针、三个16 位 定时器/计数器、一个6向量2级中断结构、全双工串行口,片内晶振及时钟电路。另外AT89S52可降至0Hz 静态逻辑操作,
上位机 MAX232
电平转换 芯片
AT89S52 越限报警
DS18B20 温度芯片数据传输 步进电机 数据显示 ULN2003
支持2种软件可选择节电模式。空闲模式下,CPU 停止工作允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。电路图如下:
四、传感器DS18B20
DS18B20是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9-12位的数字值读数方式。DS18B20的性能特点如下:
•独特的单线接口仅需一个端口引脚进行通讯
•简单的多点分布应用
•无需外部器件
•可通过数据线供电
•零待机功耗
•测温范围-55~+125℃,以0.5℃递增。华氏器件-67~+2570F,以0.90F 递增•温度以9 位数字量读出
•温度数字量转换时间200ms(典型值)
•用户可定义的非易失性温度报警设置
•报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件。
DS18B20的测温原理如图3.3.3所示,图中低温度系数晶振的振荡频率受温度的影响很小用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振随温度变化其震荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入,
图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲后进行计数,进而完成温度测量.计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55 ℃所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在-55 ℃所对应的一个基数值。
减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时温度寄存器的值将加1,减法计数器 1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温图2中的斜率累加器用于补偿和修正测温过程中的非线性其输出用,于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直至温度寄存器值达到被测温度值,这就是DS18B20的测温原理。
另外,由于DS18B20单线通信功能是分时完成的,他有严格的时隙概念,因此读写时序很重要。系统对DS18B20的各种操作必须按协议进行。操作协议为:初始化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据。
图3.3.3 DS18B20测温原理图
五、接口通讯单元
51单片机有一个全双工的串行通讯口,所以单片机和电脑之间可以方便地进行
串口通讯。进行串行通讯时要满足一定的条件,比如电脑的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,因此采用专用芯片MAX232进行转换。
max232资料简介:
该产品是由德州仪器公司(TI)推出的一款兼容RS232标准的芯片。由于电脑串口rs232电平是-10v +10v,而一般的单片机应用系统的信号电压是ttl电平0 +5v,max232就是用来进行电平转换的,该器件包含2驱动器、2接收器和一个电压发生器电路提供TIA/EIA-232-F电平。
该器件符合TIA/EIA-232-F标准,每一个接收器将TIA/EIA-232-F电平转换成5-V TTL/CMOS电平。每一个发送器将TTL/CMOS电平转换成TIA/EIA-232-F 电平。
主要特点:
1、单5V电源工作
2、 LinBiCMOSTM工艺技术
3、两个驱动器及两个接收器
4、±30V输入电平
5、低电源电流:典型值是8mA
6、符合甚至优于ANSI标准 EIA/TIA-232-E及ITU推荐标准V.28
7、ESD保护大于MIL-STD-883(方法3015)标准的2000V
51单片机有一个全双工的串行通讯口,所以单片机和电脑之间可以方便地进行串口通讯。进行串行通讯时要满足一定的条件,比如电脑的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我采用了专用芯片MAX232进行转换,虽然也可以用几个三极管进行模拟转换,但是还是用专用芯片更简单可靠。
三、系统总工作原理
工作原理
本设计方案采用AT89S52单片机作为控制器,DS18B20芯片作为温度传感器,步进电机作为执行器构成过程控制系统,来模拟热水锅炉温度控制系统。通过温度传感器DS18B20采集锅炉水温,以单片机为核心控制部件将采集到的温度通过串口输入到电脑中,在电脑中通过labview组态软件来显示实时温度和设置预置温度,并根据实时温度与预置温度的偏差大小控制进水阀门的开关,进而达到调节锅灶水温的目的。当实时温度高于设定值时,通过电机正转来模拟开大冷水阀,进而使水温降低;当温度低于设定值时,通过电机反转来模拟关小冷水阀,进而使水温升高;直到在规定的温度范围内进行恒温加热。本次课设通过Labview来绘制人机交互界面,设置所需温度值。
系统通过DS18B20检测锅炉的水温,DS18B20作为全数字式的温度传感器,将所测温度以数字量形式传给AT89S52单片机,单片机先不直接处理所测温度,而是将温度传给上位机,计算机通过labview对温度信息进行记录和处理然后又发送到单片机通过单片机控制执行器件。Labview先对温度进行中值滤波以消除随机误差。然后再与设定温度相减以取得偏差,然后再根据偏差方向控制步进电机的正反转以调节冷水阀的开度。进而达到控制锅炉水温的目的
七、参考文献
1、马淑华《单片机原理与接口技术》北京邮电大学出版社
2、任彦硕《自动控制系统》北京邮电大学出版社
3、谭浩强《C语言程序设计》清华大学出版社
八、结束语
通过本次课程设计,将之前所学的专业课《单片机原理》、《过程控制系统》、《虚拟仪器》、《C语言》等课程有机的结合到了一起。将所学的知识付诸于实践是一件很兴奋的事情,这让我明白了自己所学的知识与实际的生产生活有着很大的联系。但通过本次课设我也发现了自己有很多不足之处,对编程缺乏兴趣、对一些本专业的软件不能熟练的掌握等缺点。因此,在即将到来的毕业设计中,我要主动去学习一些软件的用法,不拿不敢兴趣为理由,做出一个漂亮的作业。
附录1 源程序
/***********************主程序***************************/ #include
#include
unsigned char jieshou;
unsigned char flag,tltemp;
unsigned code FFW[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; unsigned code REV[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; void delay1ms()
{
unsigned char i,j;
for(i=0;i<4;i++)
for(j=0;j<33;j++)
; }
void delaynms(unsigned char n)
{
unsigned char i;
for(i=0;i delay1ms(); } /*********************步进电机正转***********************/ void motor_ffw() { unsigned char i; unsigned char j; for (j=0; j<8; j++) //转1*n圈 { if(jieshou==3) {break;} //退出此循环程序 for (i=0; i<8; i++) //一个周期转45度 { P1 = FFW[i]; //取数据 delaynms(4); //调节转速 } } } /******************步进电机反转**************************/ void motor_rev() { unsigned char i; unsigned int j; for (j=0; j<8; j++) //转1×n圈 { if(jieshou==0) {break;} //退出此循环程序 for (i=0; i<8; i++) //一个周期转45度 { P1 = REV[i]; //取数据 delaynms(4); //调节转速 } } } //串口初始化 void UART_Init(void) { SCON = 0x50; //串口工作方式为1 ,串行允许接收 TMOD = 0x20; //定时器1 工作在方式2 //PCON = 0x80; //SMOD = 1; 波特率加倍 TH1 = 0xfd; //波特率9600bps fosc="11".0592MHz TL1 = 0xfd; ES = 1; //开串口中断 TR1 = 1; //允许定时器1工作 EA = 1; //开总中断 } //串口发送一个字节 void Uart_SendChar(short int dat) { SBUF = dat; //待发送的数据写入缓冲区 while(!TI); //等待发送完成 TI = 0; //清零发送标志位 } /*以下是DS18B20的操作程序**/ sbit DQ=P3^3; unsigned char time; //设置全局变量,专门用于严格延时 /*函数功能:将DS18B20传感器初始化,读取应答信号*/ bit Init_DS18B20(void) { bit flag; DQ = 1; //先将数据线拉高 for(time=0;time<2;time++) //略微延时约6微秒 ; DQ = 0; //再将数据线从高拉低,要求保持480~960us for(time=0;time<200;time++) //略微延时约600微秒 ; //以向DS18B20发出一持续480~960us的低电平复位脉冲 DQ = 1; //释放数据线(将数据线拉高) for(time=0;time<10;time++) ; //延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)flag=DQ; //让单片机检测是否输出了存在脉冲(DQ=0表示存在)for(time=0;time<200;time++) //延时足够长时间,等待存在脉冲输出完毕; return (flag); //返回检测成功标志 } /***************************************************** 函数功能:从DS18B20读取一个字节数据 出口参数:dat ***************************************************/ unsigned char ReadOneChar(void) { unsigned char i=0; unsigned char dat; //储存读出的一个字节数据 for (i=0;i<8;i++) { DQ =1; // 先将数据线拉高 _nop_(); //等待一个机器周期 DQ = 0; //单片机从DS18B20读书据时,将数据线从高拉低即启动读时序 _nop_(); //等待一个机器周期 DQ = 1; //将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备 for(time=0;time<2;time++) ; //延时约6us,使主机在15us内采样 dat>>=1; if(DQ==1) dat|=0x80; //如果读到的数据是1,则将1存入dat else dat|=0x00;//如果读到的数据是0,则将0存入dat //将单片机检测到的电平信号DQ存入r[i] for(time=0;time<8;time++) ; //延时3us,两个读时序之间必须有大于1us的恢复期 } return(dat); //返回读出的十六进制数据 } /***************************************************** 函数功能:向DS18B20写入一个字节数据 入口参数:dat ***************************************************/ WriteOneChar(unsigned char dat) { unsigned char i=0; for (i=0; i<8; i++) { DQ =1; // 先将数据线拉高 _nop_(); //等待一个机器周期 DQ=0; //将数据线从高拉低时即启动写时序 DQ=dat&0x01; //利用与运算取出要写的某位二进制数据, //并将其送到数据线上等待DS18B20采样 for(time=0;time<10;time++) ;//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样 DQ=1; //释放数据线 for(time=0;time<1;time++) ;//延时3us,两个写时序间至少需要1us的恢复期 dat>>=1; //将dat中的各二进制位数据右移1位 } for(time=0;time<4;time++) ; //稍作延时,给硬件一点反应时间 } /***************************************************** 函数功能:做好读温度的准备 ***************************************************/ void ReadyReadTemp(void) { Init_DS18B20(); //将DS18B20初始化 WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 delaynms(200); //转换一次需要延时一段时间 Init_DS18B20(); //将DS18B20初始化 WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器,前两个分别是温度的低位和高位 } void main(void) { unsigned char TL; //储存暂存器的温度低位 unsigned char TH; //储存暂存器的温度高位 unsigned char TN; //储存温度的整数部分 unsigned char TD; //储存温度的小数部分 unsigned char N=64; //N 步进电机运转圈数因为我们的步进电机是减速步进电机减速比是1/64 所以这里N=64时步进电机外部的主轴转1圈 UART_Init(); //初始化串口 while(1) //不断检测并显示温度 { ReadyReadTemp(); //读温度准备 TL=ReadOneChar(); //先读的是温度值低位 TH=ReadOneChar(); //接着读的是温度值高位 if((TH&0xf8)!=0x00) //判断高五位得到温度正负标志 { flag=1; TL=~TL; //取反 TH=~TH; //取反 tltemp=TL+1; //低位加1 TL=tltemp; if(tltemp>255) TH++; //如果低8位大于255,向高8位进1 TN=TH*16+TL/16; //实际温度值=(TH*256+TL)/16,即:TH*16+TL/16 //这样得出的是温度的整数部分,小数部分被丢弃了 TD=(TL%16)*10/16; //计算温度的小数部分,将余数乘以10再除以16取整, } TN=TH*16+TL/16; //实际温度值=(TH*256+TL)/16,即:TH*16+TL/16 //这样得出的是温度的整数部分,小数部分被丢弃了 TD=(TL%16)*10/16; //计算温度的小数部分,将余数乘以10再除以16取整, //这样得到的是温度小数部分的第一位数字(保 留1位小数) delaynms(10); Uart_SendChar(TN); Uart_SendChar(TD); P2=0xff; //执行部分 if(jieshou==1) { motor_ffw(); //电机正转 if(jieshou==3) break; //退出此循环程序} else if(jieshou==2) { motor_rev(); //电机反转 if(jieshou==3) break; //退出此循环程序} else P1 = 0xf0; } } //串口接收中断函数 void INT_UartRcv(void) interrupt 4 { unsigned char Rcv = 0,r=0; if(RI) //查询接收标志位(有数据发送过来时置为1) { RI = 0; //接收标志位清零 Rcv = SBUF; //存储缓冲区的数据 jieshou=Rcv; } } 附录2 主程序框图 子程序框图(温度读写) 附录三