过控课设报告0汇总.docx
《过控课设报告0汇总.docx》由会员分享,可在线阅读,更多相关《过控课设报告0汇总.docx(40页珍藏版)》请在冰点文库上搜索。
![过控课设报告0汇总.docx](https://file1.bingdoc.com/fileroot1/2023-5/2/8bbe19a1-1543-413e-9aa3-292ebb7063fc/8bbe19a1-1543-413e-9aa3-292ebb7063fc1.gif)
过控课设报告0汇总
东北大学秦皇岛分校自动化工程系
《过程控制系统》课程设计
设计题目:
智能化流量测量仪设计
学生:
陈博
专业:
测控技术与仪器
班级学号:
3123216
指导教师:
吕江涛、马淑华
设计时间:
2015.7.18
东北大学秦皇岛分校自动化工程系
《过程控制系统》课程设计任务书
专业测控技术与仪器班级31232姓名陈博
设计题目:
智能化流量测量仪设计
一、设计实验条件
过程控制系统实验室实验系统;proteus8.0软件;keil4软件
二、设计任务
1、流量传感器采用天津市宇畅电子仪表有限公司的LWGY型流量传感器(也可以自行选定),单片机为核心流量控制系统。
系统主要由电涡流传感器,单片机控制系统等组成.
2、写出流量测量过程,绘制流量测量仪组成框图
3、
(1)系统硬件电路设计
单片机采用89S52;键盘显示电路采用8279方案,矩阵键盘,共阴极数码管,A/D采用ADL7315,测量温度的三极管9013作为温度补偿器件。
(2)编制流量测量程序
软件采用模块化程序结构设计,由流量校准程序、流量采集程序与测量程序三部分组成。
三、设计内容
1、前言
在石油、化工等生产过程中,对管道内液体和气体的流量进行测量和控制是实现生产过程自动化的重要组成部分。
可以说,应用流量仪表测量流量值是提高企业科学管理水平、极大的发挥经济效益和社会效益的有力措施。
实际应用系统中,最为常见的是双流按比例控制的问题,一旦比例失调,就会影响生产,造成产品质量下降,甚至引发事故。
在实际应用中,例如啤酒厂要求原液与净水按固定比例混合,造纸厂要求纸浆和水按固定比例混合等。
2、主体设计部分
2.1元器件的选择
2.1.1AT89C52单片机
AT89C52是一个低电压,高性能CMOS8位单片机,片内含8kbytes的可反复擦写的Flash只读程序存储器和256bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,AT89C52单片机在电子行业中有着广泛的应用。
AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,AT89C52可以按照常规方法进行编程,也可以在线编程。
其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。
2.1.2PCF8591A/DD/A转换器
PCF8591是一个单片集成、单独供电、低功耗、8-bitCMOS数据获取器件。
PCF8591具有4个模拟输入、1个模拟输出和1个串行I²C总线接口。
PCF8591的3个地址引脚A0,A1和A2可用于硬件地址编程,允许在同个I2C总线上接入8个PCF8591器件,而无需额外的硬件。
在PCF8591器件上输入输出的地址、控制和数据信号都是通过双线双向I2C总线以串行的方式进行传输。
要把模拟量转化为数字量一般需要经过四个步骤:
采样、保持、量化、编码。
为了将抽样数据恢复为模拟量,经常采用低通滤波器来实现。
量化过程则是将采样保持后的信号幅值转换为最小数量单位的整数倍。
2.1.3LCD1602液晶显示模块
LCD1602是工业字符型液晶,能够同时显示16x02即32个字符,是一种专门用来显示字母、数字、符号等的点阵型液晶模块。
它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用。
2.1.4电磁流量计
电磁流量计的结构主要由磁路系统、测量导管、电极、外壳、衬里和转换器等部分组成。
它是根据法拉第电磁感应定律进行流量测量的流量计。
电磁流量计的优点是压损极小,可测流量范围大。
最大流量与最小流量的比值一般为20:
1以上,适用的工业管径范围宽,最大可达3m,输出信号和被测流量成线性,精确度较高,可测量电导率≥5μs/cm的酸、碱、盐溶液、水、污水、腐蚀性液体以及泥浆、矿浆、纸浆等的流体流量。
但它不能测量气体、蒸汽以及纯净水的流量。
本次采用的型号为HSTL-DCL,其流速测量范围为0.1-15m/s,具有中文、英文两种内置显示方式,使用正常的220V、50Hz的常用电压即可使用。
2.1.5电动控制阀
电动控制阀是一种以电磁阀为向导阀的水力操作式阀门。
常用于给排水及工业系统中的自动控制,控制反应准确快速,根据电信号遥控开启和关闭管道路系统,实现远程操作。
可取代闸阀和蝶阀用于大型电动操作系统。
阀门关闭速度可调,平稳关闭而不产生压力波动。
该阀门体积小、重量轻、维修简单、使用方便、安全可靠。
电磁阀可选用交流电220V,或直流电24V,可根据各种场合选用常开或常闭型均可。
当阀门从进口端给水时,水流流过针阀进入主阀控制室,当电磁导阀打开时,控制室内的水经电磁导阀、球阀流出。
球阀开度大于针阀开度,主阀控制室内压力很低,主阀处于全开状态。
当电磁导阀关闭时,主阀控制室的水不能流出,控制室升压,推动膜片关闭主阀。
2.2硬件设计部分
2.2.1总体概述
总体设计图如下所示:
2.2.1A/D电路
其目的是将数字量转化为模拟量进行输出。
本次使用的用滑动电阻器来模拟流量计的输入,并对模拟信号进行AD转换再在LCD上显示出来。
2.2.2振荡电路
其目的是为单片机提供振荡,用来做定时和其他跟时间相关的操作。
2.2.3复位电路
其目的是对电路进行复位处理。
本次采用的是高电平复位,在按下开关的瞬间,电容短路,之后迅速充电完成接通,从而实现了迅速的断电和接通。
2.3软件设计部分
2.3.1主程序:
将整体程序流程进行有序的整合,体现了模块化的设计方法。
#include
#include"i2c.h"
#include"delay.h"
#include"1602.h"
#include
#defineAddWr0x90//写数据地址
#defineAddRd0x91//读数据地址
externbitack;
unsignedcharReadADC(unsignedcharChl);
/*------------------------------------------------
主程序
------------------------------------------------*/
main()
{
unsignedcharnum=0,i;
unsignedchartemp[7];//定义显示区域临时存储数组
floatVoltage;//定义浮点变量
LCD_Init();//初始化液晶
DelayMs(20);//延时有助于稳定
LCD_Clear();//清屏
while
(1)//主循环
{
for(i=0;i<5;i++)//连续读5次,取最后一次,以便读取稳定值
num=ReadADC(0);//读取第1路电压值,范围是0-255
Voltage=(float)num*5/256;//根据参考电源VREF算出时间电压,float是强制转换符号,用于将结果转换成浮点型
sprintf(temp,"V0%3.2f",Voltage);//格式输出电压值,%3.2f表示浮点输出,共3位数,小数点后2位
//LCD_Write_String(1,0,"liquidspeed:
");
LCD_Write_String(5,0,temp);
DelayMs(200);
}
}
/*------------------------------------------------
读AD转值程序
输入参数Chl表示需要转换的通道,范围从0-3
返回值范围0-255
------------------------------------------------*/
unsignedcharReadADC(unsignedcharChl)
{
unsignedcharVal;
Start_I2c();//启动总线
SendByte(AddWr);//发送器件地址
if(ack==0)return(0);
SendByte(0x40|Chl);//发送器件子地址
if(ack==0)return(0);
Start_I2c();
SendByte(AddWr+1);
if(ack==0)return(0);
Val=RcvByte();
NoAck_I2c();//发送非应位
Stop_I2c();//结束总线
return(Val);
}
2.3.2延时函数:
使用外部晶振进行一个准确的计时。
#include"delay.h"
/*------------------------------------------------
uS延时函数,含有输入参数unsignedchart,无返回值
unsignedchar是定义无符号字符变量,其值的范围是
0~255这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下T=tx2+5uS
------------------------------------------------*/
voidDelayUs2x(unsignedchart)
{
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数unsignedchart,无返回值
unsignedchar是定义无符号字符变量,其值的范围是
0~255这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
voidDelayMs(unsignedchart)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
2.3.3IIC协议
名称:
IIC协议
内容:
函数是采用软件延时的方法产生SCL脉冲,固对高晶振频率要作一定的修改....(本例是1us机器
周期,即晶振频率要小于12MHZ)
------------------------------------------------*/
#include"i2c.h"
#include"delay.h"
#define_Nop()_nop_()//定义空指令
bitack;//应答标志位
sbitSCL=P1^0;
sbitSDA=P1^1;
/*------------------------------------------------
启动总线
------------------------------------------------*/
voidStart_I2c()
{
SDA=1;//发送起始条件的数据信号
_Nop();
SCL=1;
_Nop();//起始条件建立时间大于4.7us,延时
_Nop();
_Nop();
_Nop();
_Nop();
SDA=0;//发送起始信号
_Nop();//起始条件锁定时间大于4μ
_Nop();
_Nop();
_Nop();
_Nop();
SCL=0;//钳住I2C总线,准备发送或接收数据
_Nop();
_Nop();
}
/*------------------------------------------------
结束总线
------------------------------------------------*/
voidStop_I2c()
{
SDA=0;//发送结束条件的数据信号
_Nop();//发送结束条件的时钟信号
SCL=1;//结束条件建立时间大于4μ
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SDA=1;//发送I2C总线结束信号
_Nop();
_Nop();
_Nop();
_Nop();
}
/*----------------------------------------------------------------
字节数据传送函数
函数原型:
voidSendByte(unsignedcharc);
功能:
将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
此状态位进行操作.(不应答或非应答都使ack=0假)
发送数据正常,ack=1;ack=0表示被控器无应答或损坏。
------------------------------------------------------------------*/
voidSendByte(unsignedcharc)
{
unsignedcharBitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++)//要传送的数据长度为8位
{
if((c<elseSDA=0;
_Nop();
SCL=1;//置时钟线为高,通知被控器开始接收数据位
_Nop();
_Nop();//保证时钟高电平周期大于4μ
_Nop();
_Nop();
_Nop();
SCL=0;
}
_Nop();
_Nop();
SDA=1;//8位发送完后释放数据线,准备接收应答位
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop();
_Nop();
if(SDA==1)ack=0;
elseack=1;//判断是否接收到应答信号
SCL=0;
_Nop();
_Nop();
}
/*----------------------------------------------------------------
字节数据传送函数
函数原型:
unsignedcharRcvByte();
功能:
用来接收从器件传来的数据,并判断总线错误(不发应答信号),
发完后请用应答函数。
------------------------------------------------------------------*/
unsignedcharRcvByte()
{
unsignedcharretc;
unsignedcharBitCnt;
retc=0;
SDA=1;//置数据线为输入方式
for(BitCnt=0;BitCnt<8;BitCnt++)
{
_Nop();
SCL=0;//置时钟线为低,准备接收数据位
_Nop();
_Nop();//时钟低电平周期大于4.7us
_Nop();
_Nop();
_Nop();
SCL=1;//置时钟线为高使数据线上数据有效
_Nop();
_Nop();
retc=retc<<1;
if(SDA==1)retc=retc+1;//读数据位,接收的数据位放入retc中
_Nop();
_Nop();
}
SCL=0;
_Nop();
_Nop();
return(retc);
}
/*----------------------------------------------------------------
应答子函数
原型:
voidAck_I2c(void);
----------------------------------------------------------------*/
/*voidAck_I2c(void)
{
SDA=0;
_Nop();
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop();//时钟低电平周期大于4μ
_Nop();
_Nop();
_Nop();
SCL=0;//清时钟线,钳住I2C总线以便继续接收
_Nop();
_Nop();
}*/
/*----------------------------------------------------------------
非应答子函数
原型:
voidNoAck_I2c(void);
----------------------------------------------------------------*/
voidNoAck_I2c(void)
{
SDA=1;
_Nop();
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop();//时钟低电平周期大于4μ
_Nop();
_Nop();
_Nop();
SCL=0;//清时钟线,钳住I2C总线以便继续接收
_Nop();
_Nop();
}
2.3.4LCD1602,显示采集到的数据
*-----------------------------------------------
名称:
LCD1602
内容:
引脚定义如下:
1-VSS2-VDD3-V04-RS5-R/W6-E7-14DB0-DB715-BLA16-BLK
------------------------------------------------*/
#include"1602.h"
#include"delay.h"
sbitRS=P3^0;//定义端口
sbitRW=P3^1;
sbitEN=P3^2;
#defineRS_CLRRS=0
#defineRS_SETRS=1
#defineRW_CLRRW=0
#defineRW_SETRW=1
#defineEN_CLREN=0
#defineEN_SETEN=1
#defineDataPortP0
/*------------------------------------------------
判忙函数
------------------------------------------------*/
bitLCD_Check_Busy(void)
{
DataPort=0xFF;
RS_CLR;
RW_SET;
EN_CLR;
_nop_();
EN_SET;
return(bit)(DataPort&0x80);
}
/*------------------------------------------------
写入命令函数
------------------------------------------------*/
voidLCD_Write_Com(unsignedcharcom)
{
//while(LCD_Check_Busy());//忙则等待
DelayMs(5);
RS_CLR;
RW_CLR;
EN_SET;
DataPort=com;
_nop_();
EN_CLR;
}
/*------------------------------------------------
写入数据函数
------------------------------------------------*/
voidLCD_Write_Data(unsignedcharData)
{
//while(LCD_Check_Busy());//忙则等待
DelayMs(5);
RS_SET;
RW_CLR;
EN_SET;
DataPort=Data;
_nop_();
EN_CLR;
}
/*------------------------------------------------
清屏函数
------------------------------------------------*/
voidLCD_Clear(void)
{
LCD_Write_Com(0x01);
DelayMs(5);
}
/*------------------------------------------------
写入字符串函数
------------------------------------------------*/
voidLCD_Write_String(unsignedcharx,unsignedchary,unsignedchar*s)
{
if(y==0)
{
LCD_Write_Com(0x80+x);//表示第一行
}
else
{
LCD_Write_Com(0xC0+x);//表示第二行
}
while(*s)
{
LCD_Write_Data(*s);
s++;
}
}
/*------------------------------------------------
写入字符函数
------------------------------------------------*/
/*voidLCD_Write_Char(unsignedcharx,unsignedchary,unsignedcharData)
{
if(y==0)
{
LCD_Write_Com(0x80+x);
}
else
{
LCD_Write_Com(0xC0+x);
}
LCD_Write_Data(Data);
}*/
/*------------------------------------------------
初始化函数
------------------------------------------------*/
voidLCD_Init(