过控课设报告0_第1页
过控课设报告0_第2页
过控课设报告0_第3页
过控课设报告0_第4页
过控课设报告0_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 东 北 大 学 秦 皇 岛 分 校 课 程 设 计 用 纸 东北大学秦皇岛分校自动化工程系  过程控制系统课程设计设计题目:智能化流量测量仪设计学 生: 陈博 专 业: 测控技术与仪器 班级学号: 3123216 指导教师: 吕江涛、马淑华 设计时间: 2015.7.18  东北大学秦皇岛分校自动化工程系过程控制系统课程设计任务书专业 测控技术与仪器 班级 31232 姓名 陈博 设计题目:智能化流量测量仪设计 一、设计实验条件 过程控制系统实验室实验系统;proteus8.0 软件;keil 4软件二、设计任务 1、流量传感器采用天津市宇畅电子仪表有限公司的L

2、WGY型流量传感器(也可以自行选定),单片机为核心流量控制系统。系统主要由电涡流传感器,单片机控制系统等组成.2、写出流量测量过程,绘制流量测量仪组成框图3、(1)系统硬件电路设计单片机采用89S52;键盘显示电路采用8279方案,矩阵键盘,共阴极数码管,A/D采用ADL7315,测量温度的三极管9013作为温度补偿器件。 (2)编制流量测量程序软件采用模块化程序结构设计,由流量校准程序、流量采集程序与测量程序三部分组成。三、设计内容 1、前言 在石油、化工等生产过程中,对管道内液体和气体的流量进行测量和控制是实现生产过程自动化的重要组成部分。可以说,应用流量仪表测量流量值是提高企业科学管理水

3、平、极大的发挥经济效益和社会效益的有力措施。 实际应用系统中,最为常见的是双流按比例控制的问题,一旦比例失调,就会影响生产,造成产品质量下降,甚至引发事故。在实际应用中,例如啤酒厂要求原液与净水按固定比例混合,造纸厂要求纸浆和水按固定比例混合等。2、主体设计部分2.1 元器件的选择 2.1.1 AT89C52单片机AT89C52是一个低电压,高性能CMOS 8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Fla

4、sh存储单元,AT89C52单片机在电子行业中有着广泛的应用。AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2 个读写口线,AT89C52可以按照常规方法进行编程,也可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的 Flash存储器可有效地降低开发成本。 2.1.2 PCF8591 A/D D/A 转换器 PCF8591是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件。PCF8591具有4个模拟输入、1个模拟输出和1个串行I²C总线接口。PC

5、F8591的3个地址引脚A0, A1和A2可用于硬件地址编程,允许在同个I2C总线上接入8个PCF8591器件,而无需额外的硬件。在PCF8591器件上输入输出的地址、控制和数据信号都是通过双线双向I2C总线以串行的方式进行传输。要把模拟量转化为数字量一般需要经过四个步骤:采样、保持、量化、编码。为了将抽样数据恢复为模拟量,经常采用低通滤波器来实现。量化过程则是将采样保持后的信号幅值转换为最小数量单位的整数倍。 2.1.3 LCD1602液晶显示模块LCD1602是工业字符型液晶,能够同时显示16x02即32个字符,是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X

6、11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用。 2.1.4 电磁流量计电磁流量计的结构主要由磁路系统、测量导管、电极、外壳、衬里和转换器等部分组成。它是根据法拉第电磁感应定律进行流量测量的流量计。电磁流量计的优点是压损极小,可测流量范围大。最大流量与最小流量的比值一般为20:1以上,适用的工业管径范围宽,最大可达3m,输出信号和被测流量成线性,精确度较高,可测量电导率5s/cm的酸、碱、盐溶液、水、污水、腐蚀性液体以及泥浆、矿浆、纸浆等的流体流量。但它不能测量气体、蒸汽以及纯净水的流量。本次采用的型号为HSTL

7、-DCL,其流速测量范围为0.1-15m/s,具有中文、英文两种内置显示方式,使用正常的220V、50Hz的常用电压即可使用。 2.1.5 电动控制阀电动控制阀是一种以电磁阀为向导阀的水力操作式阀门。常用于给排水及工业系统中的自动控制,控制反应准确快速,根据电信号遥控开启和关闭管道路系统,实现远程操作。可取代闸阀和蝶阀用于大型电动操作系统。阀门关闭速度可调,平稳关闭而不产生压力波动。该阀门体积小、重量轻、维修简单、使用方便、安全可靠。电磁阀可选用交流电220V,或直流电24V,可根据各种场合选用常开或常闭型均可。当阀门从进口端给水时,水流流过针阀进入主阀控制室,当电磁导阀打开时,控制室内的水经

8、电磁导阀、球阀流出。球阀开度大于针阀开度,主阀控制室内压力很低,主阀处于全开状态。当电磁导阀关闭时,主阀控制室的水不能流出,控制室升压,推动膜片关闭主阀。 2.2 硬件设计部分 2.2.1 总体概述 总体设计图如下所示: 2.2.1 A/D电路 其目的是将数字量转化为模拟量进行输出。 本次使用的用滑动电阻器来模拟流量计的输入,并对模拟信号进行AD转换再在LCD上显示出来。 2.2.2振荡电路 其目的是为单片机提供振荡,用来做定时和其他跟时间相关的操作。 2.2.3 复位电路 其目的是对电路进行复位处理。本次采用的是高电平复位,在按下开关的瞬间,电容短路,之后迅速充电完成接通,从而实现了迅速的断

9、电和接通。 2.3 软件设计部分2.3.1主程序:将整体程序流程进行有序的整合,体现了模块化的设计方法。#include <reg52.h> #include "i2c.h"#include "delay.h"#include "1602.h"#include <stdio.h>#define AddWr 0x90 /写数据地址 #define AddRd 0x91 /读数据地址extern bit ack;unsigned char ReadADC(unsigned char Chl);/*- 主程序-*/m

10、ain() unsigned char num=0,i; unsigned char temp7;/定义显示区域临时存储数组 float Voltage; /定义浮点变量 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是强制转换符号,用于将结果转换成浮点型

11、 sprintf(temp,"V0 %3.2f ",Voltage);/格式输出电压值,%3.2f 表示浮点输出,共3位数,小数点后2位/ LCD_Write_String(1,0,"liquid speed:");LCD_Write_String(5,0,temp); DelayMs(200); /*- 读AD转值程序输入参数 Chl 表示需要转换的通道,范围从0-3返回值范围0-255-*/unsigned char ReadADC(unsigned char Chl) unsigned char Val; Start_I2c(); /启动总线 Se

12、ndByte(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延时函数,含有输入参数 unsigned char t,无返

13、回值 unsigned char 是定义无符号字符变量,其值的范围是 0255 这里使用晶振12M,精确延时请使用汇编,大致延时 长度如下 T=tx2+5 uS -*/void DelayUs2x(unsigned char t) while(-t);/*- mS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0255 这里使用晶振12M,精确延时请使用汇编-*/void DelayMs(unsigned char t) while(t-) /大致延时1mS DelayUs2x(245); DelayUs2x(2

14、45); 2.3.3 IIC协议名称:IIC协议 内容:函数是采用软件延时的方法产生SCL脉冲,固对高晶振频率要作 一定的修改.(本例是1us机器周期,即晶振频率要小于12MHZ)-*/ #include "i2c.h"#include "delay.h"#define _Nop() _nop_() /定义空指令 bit ack; /应答标志位sbit SCL=P10;sbit SDA=P11;/*- 启动总线-*/void Start_I2c() SDA=1; /发送起始条件的数据信号 _Nop(); SCL=1; _Nop(); /起始条件建立时间大

15、于4.7us,延时 _Nop(); _Nop(); _Nop(); _Nop(); SDA=0; /发送起始信号 _Nop(); /起始条件锁定时间大于4 _Nop(); _Nop(); _Nop(); _Nop(); SCL=0; /钳住I2C总线,准备发送或接收数据 _Nop(); _Nop();/*- 结束总线-*/void Stop_I2c() SDA=0; /发送结束条件的数据信号 _Nop(); /发送结束条件的时钟信号 SCL=1; /结束条件建立时间大于4 _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); SDA=1; /发送I2C总线结束信号 _

16、Nop(); _Nop(); _Nop(); _Nop();/*- 字节数据传送函数 函数原型: void SendByte(unsigned char c);功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对 此状态位进行操作.(不应答或非应答都使ack=0 假) 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。-*/void SendByte(unsigned char c) unsigned char BitCnt; for(BitCnt=0;BitCnt<8;BitCnt+) /要传送的数据长度为8位 if(c<<BitCnt)&a

17、mp;0x80)SDA=1; /判断发送位 else SDA=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; else ack=1; /判断是否接收到应答信号 SCL=0; _Nop(); _Nop();/*- 字节数据传送函数 函数

18、原型: unsigned char RcvByte();功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号), 发完后请用应答函数。 -*/unsigned char RcvByte() unsigned char retc; unsigned char BitCnt; retc=0; SDA=1; /置数据线为输入方式 for(BitCnt=0;BitCnt<8;BitCnt+) _Nop(); SCL=0; /置时钟线为低,准备接收数据位 _Nop(); _Nop(); /时钟低电平周期大于4.7us _Nop(); _Nop(); _Nop(); SCL=1; /置时钟

19、线为高使数据线上数据有效 _Nop(); _Nop(); retc=retc<<1; if(SDA=1)retc=retc+1; /读数据位,接收的数据位放入retc中 _Nop(); _Nop(); SCL=0; _Nop(); _Nop(); return(retc);/*- 应答子函数原型: void Ack_I2c(void); -*/*void Ack_I2c(void) SDA=0; _Nop(); _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); /时钟低电平周期大于4 _Nop(); _Nop(); _Nop(); SCL=0; /清时钟

20、线,钳住I2C总线以便继续接收 _Nop(); _Nop(); */*- 非应答子函数原型: void NoAck_I2c(void); -*/void NoAck_I2c(void) SDA=1; _Nop(); _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); /时钟低电平周期大于4 _Nop(); _Nop(); _Nop(); SCL=0; /清时钟线,钳住I2C总线以便继续接收 _Nop(); _Nop(); 2.3.4 LCD1602,显示采集到的数据*- 名称:LCD1602 内容: 引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W

21、 6-E 7-14 DB0-DB7 15-BLA 16-BLK-*/#include "1602.h"#include "delay.h"sbit RS = P30; /定义端口 sbit RW = P31;sbit EN = P32;#define RS_CLR RS=0 #define RS_SET RS=1#define RW_CLR RW=0 #define RW_SET RW=1 #define EN_CLR EN=0#define EN_SET EN=1#define DataPort P0/*- 判忙函数-*/ bit LCD_Check_

22、Busy(void) DataPort= 0xFF; RS_CLR; RW_SET; EN_CLR; _nop_(); EN_SET; return (bit)(DataPort & 0x80); /*- 写入命令函数-*/ void LCD_Write_Com(unsigned char com) / while(LCD_Check_Busy(); /忙则等待 DelayMs(5); RS_CLR; RW_CLR; EN_SET; DataPort= com; _nop_(); EN_CLR; /*- 写入数据函数-*/ void LCD_Write_Data(unsigned ch

23、ar Data) /while(LCD_Check_Busy(); /忙则等待 DelayMs(5); RS_SET; RW_CLR; EN_SET; DataPort= Data; _nop_(); EN_CLR; /*- 清屏函数-*/ void LCD_Clear(void) LCD_Write_Com(0x01); DelayMs(5); /*- 写入字符串函数-*/ void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) if (y = 0) LCD_Write_Com(0x80 + x); /表

24、示第一行 else LCD_Write_Com(0xC0 + x); /表示第二行 while (*s) LCD_Write_Data( *s); s +; /*- 写入字符函数-*/* void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) if (y = 0) LCD_Write_Com(0x80 + x); else LCD_Write_Com(0xC0 + x); LCD_Write_Data( Data); */*- 初始化函数-*/ void LCD_Init(void) LCD_Write_C

25、om(0x38); /*显示模式设置*/ DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); LCD_Write_Com(0x08); /*显示关闭*/ LCD_Write_Com(0x01); /*显示清屏*/ LCD_Write_Com(0x06); /*显示光标移动设置*/ DelayMs(5); LCD_Write_Com(0x0C); /*显示开及光标设置*/ 2.3.1 简易上位机的设计 其目的通过串口的连接,将单片机采集的数据传输到上位

26、机,并进行显示。 2.3.2 系统程序框图 如下所示: 显示流量值流量控制字程序采样中断设定值输入开 始系统初始化等待中断 2.3.3 实验子程序 见附录 2.3.4 硬件软件联合仿真结果 3、参考文献 【1】单片机接口与接口技术 马淑华,王凤文,张美金 北京邮电大学出版社【2】微型计算机原理与接口技术 清华大学出版社【3】数字电子技术基础 阎石 高等教育出版社【4】控制仪表及装置 吴勤勤 化学工业出版社【5】AT89S52中文资料 4、结束语 本次的课程设计中,由于我们的团队人数是四人,所以我们的分工显得比较重要,我拿到的任务就是编写单片机程序。在接受了任务之后,我首先是确定此次设计所需要实

27、现的功能以制定相应模块,并从网上找一些可以借鉴的材料,开始编写各个模块的程序,在编写过程中我遇到了许多困难,比如P0口做通信口时电压过低,驱动其他元器件时需要接上拉电阻,比如在编写LCD显示程序时发现始终无法显示,后来发现问题出自引脚的置位等等。在参考网上的知识完成课设软件后,我的单片机程序能力得到了一定的提升。在课程设计过程中自己独立完成了这些工作让我受益匪浅,也对自己有了更多的自信。同时我也感受到了团队协作的重要性,我们的通力合作是的这一次的课程设计能在比较短的时间内完成规定的任务。在此之后,我更加坚定了自己对于硬件单片机的热情,对我以后的工作和毕设一定会有很好的指导作用,也可以一直进步。

28、 四、设计时间与设计时间安排1、设计时间:2周2、设计时间安排: 熟悉实验设备、实验、收集资料: 4天 设计计算、绘制技术图纸: 4天编写课程设计说明书: 5 天答辩: 1天 附录实验程序清单如下:#include <reg52.h> #include "i2c.h"#include "delay.h"#include "1602.h"#include <stdio.h>#define AddWr 0x90 /写数据地址 #define AddRd 0x91 /读数据地址extern bit ack;unsig

29、ned char ReadADC(unsigned char Chl);/*- 主程序-*/main() unsigned char num=0,i; unsigned char temp7;/定义显示区域临时存储数组 float Voltage; /定义浮点变量 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/

30、256; /根据参考电源VREF算出时间电压,float是强制转换符号,用于将结果转换成浮点型 sprintf(temp,"V0 %3.2f ",Voltage);/格式输出电压值,%3.2f 表示浮点输出,共3位数,小数点后2位/ LCD_Write_String(1,0,"liquid speed:");LCD_Write_String(5,0,temp);/LCD_Write_String(5,1,temp); DelayMs(200); /*- 读AD转值程序输入参数 Chl 表示需要转换的通道,范围从0-3返回值范围0-255-*/unsign

31、ed char ReadADC(unsigned char Chl) unsigned char Val; 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); #include "

32、delay.h"/*- uS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0255 这里使用晶振12M,精确延时请使用汇编,大致延时 长度如下 T=tx2+5 uS -*/void DelayUs2x(unsigned char t) while(-t);/*- mS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0255 这里使用晶振12M,精确延时请使用汇编-*/void DelayMs(unsigned char

33、t) while(t-) /大致延时1mS DelayUs2x(245); DelayUs2x(245); */-名称:IIC协议 内容:函数是采用软件延时的方法产生SCL脉冲,固对高晶振频率要作 一定的修改.(本例是1us机器周期,即晶振频率要小于12MHZ)-*/ #include "i2c.h"#include "delay.h"#define _Nop() _nop_() /定义空指令 bit ack; /应答标志位sbit SCL=P10;sbit SDA=P11; */- 启动总线-*/void Start_I2c() SDA=1; /发送起

34、始条件的数据信号 _Nop(); SCL=1; _Nop(); /起始条件建立时间大于4.7us,延时 _Nop(); _Nop(); _Nop(); _Nop(); SDA=0; /发送起始信号 _Nop(); /起始条件锁定时间大于4 _Nop(); _Nop(); _Nop(); _Nop(); SCL=0; /钳住I2C总线,准备发送或接收数据 _Nop(); _Nop();/*- 结束总线-*/void Stop_I2c() SDA=0; /发送结束条件的数据信号 _Nop(); /发送结束条件的时钟信号 SCL=1; /结束条件建立时间大于4 _Nop(); _Nop(); _No

35、p(); _Nop(); _Nop(); SDA=1; /发送I2C总线结束信号 _Nop(); _Nop(); _Nop(); _Nop(); */- 字节数据传送函数 函数原型: void SendByte(unsigned char c);功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对 此状态位进行操作.(不应答或非应答都使ack=0 假) 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。-*/void SendByte(unsigned char c) unsigned char BitCnt; for(BitCnt=0;BitCnt<8;

36、BitCnt+) /要传送的数据长度为8位 if(c<<BitCnt)&0x80)SDA=1; /判断发送位 else SDA=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; else ack=1; /判断是否接收到应答信号 SCL=0; _Nop(); _Nop();/*- 字节数据传送函数 函数原型: unsigned char RcvByte();功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号), 发完后请用应答函数。 -*/unsigned char RcvByte() unsigned char retc; unsigned char BitCnt; retc=0; SDA=1; /置数据线为输入方式 for(BitCnt=0;BitCnt<8;BitCnt+) _Nop();

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论