开水房半自动供水接口设计.docx
《开水房半自动供水接口设计.docx》由会员分享,可在线阅读,更多相关《开水房半自动供水接口设计.docx(12页珍藏版)》请在冰豆网上搜索。
![开水房半自动供水接口设计.docx](https://file1.bdocx.com/fileroot1/2022-11/23/82fd96ee-aff3-4caf-b8fb-75649b878598/82fd96ee-aff3-4caf-b8fb-75649b8785981.gif)
开水房半自动供水接口设计
1、本次试验设计的需求分析
1、1需求:
本实验设计一个模拟开水房半自动供水系统,实现开水房供水半自动化。
由于开水房是个环境比较危险(容易发生烫伤事故),不太适合人类亲自工作的场所,所以实现开水房自动供水具有很高的现实意义。
1、2分析:
人机交互设计,温度检测设计,水位检测(锅炉的上界、下界)设计,控动烧水设计,交换锅炉设计。
2、系统介绍
1、1设计平台的基本介绍
以MicrosoftVisualC++6.0作为实验开发平台。
1、2开发系统功能和解决问题
本实验完成了对供水锅炉的实时监控:
锅炉水位的监控,锅炉水温的监控等,其中对水位的监控可以用连通器实现,而锅炉水温则可以通过传感器实现,本系统只做模拟,当系统获取这些监控数据时可以对其作出一定的反应,包括对锅炉水的注入、输出,控制锅炉的加热和取消加热等。
3、原理及设计
3、1硬件设计部分
硬件设计如下图所示:
本实验主要以8255A芯片为主,8255A采用基本I/O方式即0方式,输出锁存,输入有三态缓冲能力,为了驱动虚拟抽水机(步进电机)加入了74LS373驱动,其中PA口控制抽水机(步进电机)向锅炉抽水,PB口控制试验仪上的作为警报的灯,为了实现装置的实时监控,特意安排了三个硬件开关SW1、SW2、SW3,分别作为启动锅炉后,加水的同时可以控制停止加水,加热的同时控制停止加热,输出开水的同时可以停止输出,采用软件延时。
3、2软件设计部分
本次设计基于VC++开发平台运行的主界面如图1-1所示:
图1-1
图中有1号锅炉和2号备用锅炉,由于实验设备有限只演示一号锅炉,其中“启动”按钮主要是用来控制供水装置的通电情况及接口芯片的初始化工作,然后依次完成对锅炉“加水”“加热”“输出开水”等功能的设置,一方面通过底层接口控制模拟抽水机、加热开关、输出开水开关、报警显示灯,另一方面通过MFC界面将计算机已经实现的功能直观的反应到视图界面上,实现开水房供水的实时监控。
具体功能及主要代码演示如下。
单击一号锅炉下的“启动”按钮初始化系统后,提示一号锅炉启动!
会自动的完成8255A的初始化功能,运行界面如图1-2:
图1-2
“启动”按钮实现代码如下:
voidCMyDlg:
:
OnButton1()
{
AfxMessageBox("一号锅炉启动!
");
outportd(Port_io_Base+3,0x81);//初始化8255A命令口
outportd(Port_io_Base+2,0x00);//初始化8255A的PC口
}
若此时再按下“加水”按钮,会在硬件实验仪器上发现LED中第一号灯亮起,表示装置正在往锅炉加水,同时启动步进电机(抽水机),在试验仪上可以看到步进电机在转,如果锅炉的水位低于锅炉容积的%15,则发出警报声,而且灯也会一闪一闪提示锅炉水位低于安全水位;当水位超过锅炉的容积的%95时,一号灯灭,提示水满,同时水满警报响起。
如果期间紧急想停止往锅炉加水,按SW1硬件开关,再点停止加水按钮,“水柱”将停止不动,同时关闭74LS373,即完成停止步进电机(抽水机)的操作。
如图1-3所示:
图1-3
“加水”按钮实现代码如下:
voidCMyDlg:
:
OnButton5()
{
outportd(Port_io_Base+3,0x09);//置PC4=1关闭74LS373
outportd(Port_io_Base+3,0x08);//置PC4=0,打开74LS373
do{
outportd(Port_io_Base,xu[i]);//送相序代码到PA口,步进电机的转动代表抽水机向锅炉注水
i++;
if(i==8)i=0;
Sleep(50);//延时
m_pro1.SetPos(m_pro1.GetPos()+5);//可以设置加速加水,减速加水
if(inportd(Port_io_Base+2)&0x01!
=0)//检查sw1是否按下
{
m_pro1.SetPos(m_pro1.GetPos()+50);//可以设置加速加水,减速加水
sw1=true;
break;
}
Sleep(50);//延时
outportd(Port_io_Base+1,xu1[1]);//二极管xu1[1]灯亮,表示正在加水
if(m_pro1.GetPos()<150)
{
for(j=0;j<=5;j++)//缺水报警
{
outportd(Port_io_Base+3,0x0d);//令PC6=1,发高频音
Sleep
(1);//延时
outportd(Port_io_Base+3,0x0c);//令PC6=0,关闭SPK
Sleep
(1);//延时
outportd(Port_io_Base+1,xu1[1]);//二极管xu1[1]灯一亮一灭,表示缺水(少于锅炉水容量%15)
Sleep
(1);
outportd(Port_io_Base+1,xu1[1]&(0x0FD));//二极管xu1[1]灯一亮一灭,表示缺水(少于锅炉水容量%15)
}
}
}while(m_pro1.GetPos()<950);
outportd(Port_io_Base+3,0x09);//置PC4=1,关闭74LS373
if(sw1)
{}
else
{
outportd(Port_io_Base+1,xu1[1]&(0x0FD));//二极管xu1[1]灯灭,表示水满(多于或等于锅炉水容量%95),停止向锅炉注水
outportd(Port_io_Base+3,0x0c);//关闭SPK
for(j=0;j<=5;j++)//水满报警
{
outportd(Port_io_Base+3,0x0d);//令PC6=1,发高频音
Sleep
(1);//延时
outportd(Port_io_Base+3,0x0c);//令PC6=0,关闭SPK
Sleep
(1);//延时
}
outportd(Port_io_Base+3,0x0c);//关闭SPK
AfxMessageBox("水满已经满了,请停止向锅炉注水!
");
}
}
当点击加热按钮时,锅炉加热启动,试验仪上LED显示第二号灯亮,当加热一定时间后,“温度计”上显示水温超过100摄氏度时,提示水已经烧开,可以用了,同时试验仪上二号灯灭。
当然如果加热的同时不想再继续加热了,则可以按下硬件开关SW2,再点击停止加热就可以了。
如图1-4所示:
图1-4
“加热”按钮实现代码如下:
voidCMyDlg:
:
OnButton7()
{
if(m_pro3.GetPos()>100)
{
outportd(Port_io_Base+1,xu1[0]&(0x0FE));//二极管xu1[0]灯灭表示加热完成
AfxMessageBox("锅炉水已经开了!
");
}
else
{
outportd(Port_io_Base+1,xu1[0]);//二极管xu1[0]灯亮表示正在加热
outportd(Port_io_Base+3,0x0c);//关闭SPK
do{
Sleep(100);//加速加热,减速加热
m_pro3.SetPos(m_pro3.GetPos()+1);
//if(GetKeyState(VK_CONTROL)<0)//control建
if(inportd(Port_io_Base+2)&0x02!
=0)//检查sw2是否按下
{
sw2=true;
break;
}
if(m_pro3.GetPos()>100)
{
for(j=0;j<=5;j++)//水开报警
{
outportd(Port_io_Base+3,0x0d);//令PC6=1,发高频音
Sleep
(1);//延时
outportd(Port_io_Base+3,0x0c);//令PC6=0,关闭SPK
Sleep
(1);//延时
}
break;
}
}while
(1);
if(sw2)
{}
else
{
AfxMessageBox("锅炉水已经开了!
");
outportd(Port_io_Base+1,xu1[0]&(0xFE));//二极管xu1[0]灯灭表示加热完成
outportd(Port_io_Base+3,0x0c);//关闭SPK
}
}
}
若此时点击输出开水按钮,第三号灯亮,以看到锅炉水位下降,表示有人在打开水,开水输出完之后,弹出提示,同时使温度计归零,第三号灯灭,期间,如果需要强制关闭输出,可以按下硬件开关SW3,再按关闭输出按钮。
如图1-5示:
图1-5
“输出开水”按钮实现代码如下:
voidCMyDlg:
:
OnButton9()
{
outportd(Port_io_Base+1,xu1[2]);//二极管xu1[2]灯亮输出开水
outportd(Port_io_Base+3,0x09);//置PC4=1关闭74LS373
outportd(Port_io_Base+3,0x08);//置PC4=0,打开74LS373
do{outportd(Port_io_Base,xu[i]);//送相序代码到PA口,步进电机的转动代表抽水机向锅炉注水
i++;
if(i==8)i=0;
Sleep(50);//延时
m_pro1.SetPos(m_pro1.GetPos()-5);//输出开水
if(GetKeyState(VK_MENU)<0)//control建
if(inportd(Port_io_Base+2)&0x04!
=0)//检查sw3是否按下
{sw3=true;
break;
}
}while(m_pro1.GetPos()>0);
outportd(Port_io_Base+3,0x09);//置PC4=1,关闭74LS373
if(sw3){}{}
else
{
outportd(Port_io_Base+1,xu1[2]&(0x0FB));//二极管xu1[2]灯灭,开水已经输完
outportd(Port_io_Base+3,0x0c);//关闭SPK
//CMyDlg:
:
OnButton8();
for(j=0;j<=5;j++)//水满报警
{
outportd(Port_io_Base+3,0x0d);//令PC6=1,发高频音
Sleep
(1);//延时
outportd(Port_io_Base+3,0x0c);//令PC6=0,关闭SPK
Sleep
(1);//延时
}
outportd(Port_io_Base+3,0x0c);//关闭SPK
AfxMessageBox("开水已经输完!
");
m_pro3.SetPos(0);
}
}
若按下退出按钮,则系统退出。