《储罐液位系统设计.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驱动报警器,以P1.1驱动蜂鸣器。按达林算法计算控制器的输出值。输出值经D
2、/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个键无效。进入修改状态后,待修改的显示位LED5闪动,按+或-键可循环选择H或L
3、,同时后4位LED显示对应的液位值。按确认件后调到下一个待修改的显示为LED3并闪动,按+或-键循环修改09数字,再按确认键调到下一位置,如此进行,知道4个数字修改完毕后退出修改状态。在修改状态时,若不按确认键,则8秒后退出修改状态。从视觉舒适的角度考虑,数字应为每0.4秒闪动一次。显示器与键盘设计 选择+-确定数据采集:A/D转换,采样周期为10s。数字滤波:采用5个数平均滤波法。标度转换:将液位变送器的标准电压信号转换为液位值。动态显示:动态循环显示。键盘扫描:读键值并判断功能。控制计算:达林算法。控制输出:D/A转换。报警处理:超过高、低报警器限时驱动报警灯及蜂鸣器。#include r
4、eg51.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();result=ADRESULT;return result;/返回转换结果void A_D(void)unsigned cha
5、r ADV;/变量 while(1)ADV=AD0809();Delay();/设置断点 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+)sum+=get_ad();delay();return(char)(sum/N);头文件:height.h#include#include#define g 10flo
6、at 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;sbit 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 x7
7、f,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&A2=1&A3=1)P0=0 x7f;else if(A1=1&A2=1&A3=0)P0=tableaa;display_delay();CLK=0;while(CLK=1)if(A1=1&A2=1&A3=1)P0=0 xbf;else if(A1=1&A2=1&A3=0)P0=table
8、aa;display_delay();CLK=0;while(CLK=1)if(A1=1&A2=1&A3=1)P0=0 x20;else if(A1=1&A2=1&A3=0)P0=tableaa;display_delay();CLK=0;while(CLK=1)if(A1=1&A2=1&A3=1)P0=0 x10;else if(A1=1&A2=1&A3=0)P0=tableaa;display_delay();CLK=0;while(CLK=1)if(A1=1&A2=1&A3=1)P0=0 x04;else if(A1=1&A2=1&A3=0)P0=tableaa;display_dela
9、y();CLK=0;while(CLK=1)if(A1=1&A2=1&A3=1)P0=0 x02;else if(A1=1&A2=1&A3=0)P0=tableaa;#include#include#define uint unsigned int#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;j
10、0;j-)for(k=248;k0;k-);/*键盘扫描程序设计*/uchar kscan(void)uchar x1,x2;KEY_IO=255;x1=KEY_IO;if(x1!=255)delay(100);/*延时以消除抖动*/x2=KEY_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(x
11、1=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=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
12、(k=0)return 0;elsereturn(0.9355*u(k-1)+0.0645*u(k-6)+0.8377*ek-0.8054*ek-1);#includesbit wr=P36;sbit A1=P25;sbit 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仿真图