《储罐液位系统设计.ppt》由会员分享,可在线阅读,更多相关《储罐液位系统设计.ppt(17页珍藏版)》请在课桌文档上搜索。
1、储罐液位系统设计,硬件系统设计,核心:单片机 89s52片外扩展:8KB RAM存储器6264,I/O口扩展8155转换器:ADC0809,DAC0832锁存器等:74HC373,74H377,74HC245和3-8译码器74HC138输入/输出部件:6个LED,4个按键89S52的RD及PSEN用与门接在一起后送入6264的OE端,使得 6264既可以作为数据存储器,也可以作为程序存储器。,各芯片片选地址分配如下,工作过程,液位信号(电压值)从ADC0809的IN0引脚输入,A/D转换后存储。液位给定值由键盘设定,与液位信号比较得出偏差值。若超限,则报警,LED4现实P,同时以P1.0驱动报
2、警器,以P1.1驱动蜂鸣器。按达林算法计算控制器的输出值。输出值经D/A转换得到模拟电压值并输出。,液位信号的电压值经标度转换后,变为液位值存储,送LED显示。6个LED显示如图a所示。LED5显示H或L,LED4为超限指示,LED3LED0显示液位值,LED1数码管加小数点,显示范围为000.0999.9。显示器与键盘设置LED5 LED4 LED3 LED2 LED1 LED0 H 1 9 9.5,键盘设定液位的高低报警限。采用4键方式,4个按键的功能如图b所示。显示与键盘循环扫描,无键按下时,LED显示实时液位,右键按下时,进入液位报警限的修改。先按选择键方可进入修改,先按其他3个键无效
3、。进入修改状态后,待修改的显示位LED5闪动,按+或-键可循环选择H或L,同时后4位LED显示对应的液位值。按确认件后调到下一个待修改的显示为LED3并闪动,按+或-键循环修改09数字,再按确认键调到下一位置,如此进行,知道4个数字修改完毕后退出修改状态。在修改状态时,若不按确认键,则8秒后退出修改状态。从视觉舒适的角度考虑,数字应为每0.4秒闪动一次。显示器与键盘设计 选择+-确定,软件系统设计,数据采集:A/D转换,采样周期为10s。数字滤波:采用5个数平均滤波法。标度转换:将液位变送器的标准电压信号转换为液位值。动态显示:动态循环显示。键盘扫描:读键值并判断功能。控制计算:达林算法。控制
4、输出:D/A转换。报警处理:超过高、低报警器限时驱动报警灯及蜂鸣器。,A/D转换,采样周期为10秒,#include reg51.h#include Absacc.h#define STARTAD XBYTE0 x7F00#define ADRESULT XBYTE0 x7F08sbit ADBUSY=P33;void Delay()unsigned char i;for(i=0;i100;i+);unsigned char AD0809(void)unsigned char result;STARTAD=0;/启动 AD while(ADBUSY=1);/等待转换结束 Delay();res
5、ult=ADRESULT;return result;/返回转换结果void A_D(void)unsigned char ADV;/变量 while(1)ADV=AD0809();Delay();/设置断点,对于采样周期为10秒,我们采用了中断,TH0=0 x3c;TL0=0 xb0;EA=1;ET0=1;TR0=1;Void timer0()TH0=0 x3c;THL0=0 xb0;num+;if(num=200)num=0;A_D();,平均值滤波法,#define N 5char filter()char count;int sum=0;for(count=0;countN;count
6、+)sum+=get_ad();delay();return(char)(sum/N);,标度转换,头文件:height.h#include#include#define g 10float q,a,h,p,s,r;float ADC(float q,a,s,r);void main()floatADC();printf(%d,h);float ADC(float q,r,a,s,r)h=(q*r)/(r*a*s+1);return(h);,动态循环显示,#include reg52.h#define uchar unsigned char sbit CLK=P36;sbit A1=P25;s
7、bit A2=P26;sbit A3=P27;uchar aa;uchar code table=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f,0 x77,0 x7c,0 x39,0 x5e,0 x79,0 x71,0;void display_delay()uchar a;uchar b;for(a=100;a0;a-)for(b=100;b0;b-);void display()CLK=0;while(CLK=1)if(A1=1,键盘扫描,#include#include#define uint unsigned i
8、nt#define uchar unsigned charsbit S1=P00;sbit S2=P01;sbit S3=P02;sbit S4=P03;sbit HSET=P04;sbit LSET=P05;/*延时程序设计*/void delay10ms(void)unsigned char i,j,k;for(i=5;i0;i-)for(j=4;j0;j-)for(k=248;k0;k-);/*键盘扫描程序设计*/uchar kscan(void)uchar x1,x2;KEY_IO=255;x1=KEY_IO;if(x1!=255)delay(100);/*延时以消除抖动*/x2=KE
9、Y_IO;if(x1!=x2)return 255;while(x2!=255)x2=KEY_IO;if(x1=0 xfe)P2=0 xfb;DISPLAY(H);/*默认首先显示高位值*/if(x1=0 xbf)DISPLAY(L);while(x1=0 xf7)P2=0 xf7;DISPLAY();if(x1=0 xfd)AA+;else if(x1=0 xfb)AA-;P2=0 xfb;while(x1=0 xf7)DISPLAY();if(x1=0 xfd)AA+;else if(x1=0 xfb)AA-;P2=0 xfd;while(x2=0 xf7)DISPLAY();if(x1=
10、0 xfd)AA+;else if(x1=0 xfb)AA-;if(P2=0 xfe)DISPLAY();if(x1=0 xfd)AA+;else if(x1=0 xfb)AA-;else if(x1=0 xf7)A/D();return 255;,达林算法,#include float e=0,1,2,3,4,5,6,7,8,9;float u(int k)if(k=0)return 0;elsereturn(0.9355*u(k-1)+0.0645*u(k-6)+0.8377*ek-0.8054*ek-1);,D/A转换,#includesbit wr=P36;sbit A1=P25;sb
11、it A2=P26;sbit A3=P27;void D_A()A1=1;A2=1;A3=0;wr=0;,报警处理,#include#define uchar unsigned char#define uint unsigned intsbit SPK=P10;sbit LED=P11;sbit K1=P12;void Alarm(uchar t)uchar i,j;for(i=0;i200;i+)SPK=SPK;for(j=0;jt;j+);/由参数t 行成不同的频率void DelayMS(uint x)uchar i;while(x-)for(i=1;i120;i+);void alarm()SPK=0;while(1)if(K1=1)Alarm(60);Alarm(120);LED=LED;DelayMS(150);,另附PROTEUS仿真图,