储罐液位控制系统程序.docx
- 文档编号:25397985
- 上传时间:2023-06-08
- 格式:DOCX
- 页数:20
- 大小:185.12KB
储罐液位控制系统程序.docx
《储罐液位控制系统程序.docx》由会员分享,可在线阅读,更多相关《储罐液位控制系统程序.docx(20页珍藏版)》请在冰豆网上搜索。
储罐液位控制系统程序
.
储罐液位控制系统
——计算机控制技术课程设计
89s52
①核心:
单片机8155口扩展6264,I/O②片外扩展:
8KBRAM存储器DAC0832
,转换器:
ADC0809③74HC1383-8译码器74H377,74HC245和74HC373④锁存器等:
,4个按键,输出部件:
⑤输入/6个LEDOE6264PSENRD89S52的及用与门接在一起后送入的端,使得.
.
6264既可以作为数据存储器,也可以作为程序存储器。
A/D转换后存储。
IN0①液位信号(电压值)从ADC0809的引脚输入,液位给定值由键盘设定,与液位信号比较得出偏差值。
若超限,则②驱动蜂鸣器。
P,同时以P1.0驱动报警器,以P1.1LED4报警,现实③按达林算法计算控制器的输出值。
输出值经D/A转换得到模拟电压值并输出。
④6显示。
⑤液位信号的电压值经标度转换后,变为液位值存储送LEDLED3~LED0HLED5aLED个显示如图所示。
显示或L,LED4为超限指示,.
.
显示液位值,LED1数码管加小数点,显示范围为000.0~999.9。
显示器与键盘设置
LED5LED4LED3LED2LED1LED0
H199.
5
⑥键盘设定液位的高低报警限。
采用4键方式,4个按键的功能如图
显示实时液位,右LEDb所示。
显示与键盘循环扫描,无键按下时,键按下时,进入液位报警限的修改。
先按选择键方可进入修改,先按+LED5闪动,按其他3个键无效。
进入修改状态后,待修改的显示位显示对应的液位值。
按确位LEDL,同时后4键可循环选择或-H或键循环修改-并闪动,按+或认件后调到下一个待修改的显示为LED3个数字修改40~9数字,再按确认键调到下一位置,如此进行,知道秒后退出8完毕后退出修改状态。
在修改状态时,若不按确认键,则0.4修改状态。
从视觉舒适的角度考虑,数字应为每秒闪动一次。
显示器与键盘设计确定选择+-
。
10s①数据采集:
A/D转换,采样周期为5个数平均滤波法。
数字滤波:
采用②③标度转换:
将液位变送器的标准电压信号转换为液位值。
.
.
④动态显示:
动态循环显示。
⑤键盘扫描:
读键值并判断功能。
⑥控制计算:
达林算法。
⑦控制输出:
D/A转换。
⑧报警处理:
超过高、低报警器限时驱动报警灯及蜂鸣器。
.
.
.
.
//实现程序//
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharxdata*p=0x0000;
ucharxdata*p1=0x2000;
uintgetdata;//采样值
uintw=0,jishi8=0;//计数加长计时,时间
uintyh,yl,ye;//液位高低限及期望值
sbitjingdeng=P1^0;
sbitjingsheng=P1^1;
ucharcodetable[]={//段码
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x76,0x73,0x38};//19个字符
uchardispbuf[4]={0,0,0,0};
floate[2]={0,0},u[6]={0,0,0,0,0,0};
floatcon=0;
jingdeng=0;//警灯
jingsheng=0;//,蜂鸣器初始化
viodmain()
{
voidintdingshi();//定时器初始化
//键盘扫描及修改设定值//
voidkeyscan();
//实时液位显示//
voidled();
//达林算法实现,DAC控制输出//
voiddalin();
voidcontrol();//输出控制量
//报警程序//
voidbaojing();
while
(1)
.
.
{
//键盘扫描及修改设定值//
keyscan();
//实时液位显示//
led();
//达林算法实现,DAC控制输出//
dalin();
control();//输出控制量
//报警程序//
baojing();
}
}
vioddelay(uchari)//延时
{
while(i--)
_nop_();
}
//实现每八秒采样一次//
voidintdingshi()//定时器初始化
{
TMOD=0x01;
IT0=1;
TH0=0x3C;
TL0=0xB0;//定时50ms
TR0=1;//启动定时器
EA=1;//开中断
ET0=1;
}
voiddingshi()interrupt1//定时器0中断,实现八秒定时
{
TH0=0x3C;
TL0=0xB0;//定时50ms
w++;
jishi8++;
while(w==200)
{
p=0x8000;//指针ADC地址
*p=0x00;//qidong
EX0=1;//打开外部中断0,采样一次
w=0;
}
.
.
TR0=1;//启动定时器
}
voidwaibu()interrupt0//外部中断0,实现ADC采样5次,取平均值
{
uinti=0,a5=0;
p=0x8000;//指针ADC地址
P0=*p;
getdata=P0;
a5=a5+getdata;
i++;
if(i==5)
{
qy=a5/5;//平均滤波
i=0;
a5=0;
}
}
//实时液位显示//
voidled()
{
dispbuf[3]=qy/100;
dispbuf[2]=(qy_x0010_0)/10;
dispbuf[1]=(qy_x0010_0)_x0010_;
dispbuf[0]=int((qy-dispbuf[3]*100-dispbuf[2]*10-dispbuf[0])*10);
p=0xC000;
*p=0xFE;
p1=0xE000;
*p1=table[dispbuf[0]];
delay(5);
*p=(*p)<<1;
*p1=table[dispbuf[1]];
delay(5);
*p=(*p)<<1;
*p1=table[dispbuf[2]];
delay(5);
*p=(*p)<<1;
*p1=table[dispbuf[3]];
delay(5);
}
//达林算法实现,DAC控制输出//
voiddalin()
{
e[0]=qy-ye;//求出输入误差
u[0]=0.9355*u[1]+0.0645*u[5]+0.8377*e[0]-0.8054*e[1];
.
.
con=u[0],//数字控制量输出
e[1]=e[0];
u[5]=u[4];
u[4]=u[3];
u[3]=u[2];
u[2]=u[1];
u[1]=u[0];
}
voidcontrol()//输出控制量
{
p=0x6000;
*p=con;}
//键盘扫描及修改设定值//
voidkeyscan()
{
uinta=16,b=dispbuf[3],c=dispbuf[2],d=dispbuf[1],e=dispbuf[0];//记录各位设定值
p=0xA000;
P0=*p;
if(P0==0xfe)//说明开始修改,键0
{
voiddispplay(a,b,c,d,e);
voiddispplay(a,b,c,d,e);//延时10ms
p=0xA000;
P0=*p;
if(P0==0xfe)
p1=0xc000;//字位
*p1=0xdf;//led5位选
p1=0xe000;//字段
disp(18);//初始显示L
P0=*p;
while(P0!
=0xf7)//键3
{
voiddispplay(a,b,c,d,e);
voiddispplay(a,b,c,d,e);//延时10ms
p=0xA000;
P0=*p;//读键盘
if(P0==0xfd)//键1
{
a++;
if(a>=18)
a=18;
}
elseif(P0==0xfb)//键2
.
.
{
a--;
if(a<=16)
a=16;}
p1=0xc000;//字位
*p1=0xdf;
p1=0xe000;//字段
disp(a);//初始显示L
if(jishu8>=160)//超时跳出扫描
{jishu8=0;
gotokeyz;}
}
key2:
P0=*p;
while(P0!
=0xf7)
{
voiddispplay(a,b,c,d,e);//延时10ms
voiddispplay(a,b,c,d,e);
p=0xA000;
P0=*p;
if(P0==0xfd)
{b++;
if(b>=9)
b=9;
}
elseif(P0==0xfb)
{
if(b>=1);
b--;
elseb=0;
}
p1=0xc000;//字位
*p1=0xf7;//led3位选
p1=0xe000;//字段
disp(b);//初始显示L
if(jishu8>=160)
{jishu8=0;
gotokeyz;
}
}
key3:
P0=*p;
while(P0!
=0xf7)
{
voiddispplay(a,b,c,d,e);
voiddispplay(a,b,c,d,e);//延时10ms
.
.
p=0xA000;
P0=*p;
if(P0==0xfd)
{c++;
if(c>=9)
c=9;
}
elseif(P0==0xfb)
{
if(c>=1);
c--;
elsec=0;
}
p1=0xc000;//字位
*p1=0xfb;//led2位选
p1=0xe000;//字段
disp(c);//初始显示L
if(jishu8>=160)
{jishu8=0;
gotokeyz;
}
}
key4:
P0=*p;
while(P0!
=0xf7)//键3
{
voiddispplay(a,b,c,d,e);
voiddispplay(a,b,c,d,e);//延时10ms
p=0xA000;
P0=*p;
if(P0==0xfd)//键1
{d++;
if(d>=9)
d=9;
}
elseif(P0==0xfb)//键2
{
if(d>=1);
d--;
elsed=0;
}
p1=0xc000;//字位
*p1=0xfd;//led1位选
p1=0xe000;//字段
disp(d);//初始显示L
.
.
if(jishu8>=160)
{jishu8=0;
gotokeyz;
}
}
key5:
P0=*p;
while(P0!
=0xf7)
{
voiddispplay(a,b,c,d,e);
voiddispplay(a,b,c,d,e);//延时10ms
p=0xA000;
P0=*p;
if(P0==0xfd)
{
e++;
if(e>=9)
e=9;
}
elseif(P0==0xfb)
{
if(e>=1);
e--;
elsee=0;
}
p1=0xc000;//字位
*p1=0xfe;//led0位选
p1=0xe000;//字段
disp(e);//初始显示L
if(jishu8>=160)
{jishu8=0;
gotokeyz;
}
if(a==18)
yl=b*100+c*10p+d+e*0.1;//液位低限sheding
elseif(a==16)
yh=b*100+c*10p+d+e*0.1;//液位高限
elseif(a==17)
ye=b*100+c*10p+d+e*0.1;//液位期望值
}
keyz:
return
}
}
.
.
disp(uintx)
{
*p1=table[x];
}
//扫描时液位显示,充当延时除颤程序//
voiddispplay(uintx0,uintx1,uintx2,uintx3,uintx4,)
{
p=0xC000;
*p=0xFE;
p1=0xE000;
*p1=table[x1];
delay(5);
*p=(*p)<<1;
*p1=table[x2];
delay(5);
*p=(*p)<<1;
*p1=table[x3];
delay(5);
*p=(*p)<<1;
*p1=table[x4];
delay(5);
*p=(*p)<<2;
*p1=table[x0];
}
//报警程序//
voidbaojing()
{
while(qy>=qh||qy<=ql)
{
jingdeng=~jingdeng;
jingsheng=1;
p=0xC000;
*p=0xef;
p1=0xe000;
*p1=table[17];
delay(5000);
}
}
.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 储罐液位 控制系统 程序