开水房半自动供水接口设计Word下载.docx
《开水房半自动供水接口设计Word下载.docx》由会员分享,可在线阅读,更多相关《开水房半自动供水接口设计Word下载.docx(12页珍藏版)》请在冰豆网上搜索。
本实验主要以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
“加水”按钮实现代码如下:
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
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);
//置PC4=1,关闭74LS373
if(sw1)
{}
else
//二极管xu1[1]灯灭,表示水满(多于或等于锅炉水容量%95),停止向锅炉注水
outportd(Port_io_Base+3,0x0c);
//关闭SPK
for(j=0;
j++)//水满报警
}
水满已经满了,请停止向锅炉注水!
}
当点击加热按钮时,锅炉加热启动,试验仪上LED显示第二号灯亮,当加热一定时间后,“温度计”上显示水温超过100摄氏度时,提示水已经烧开,可以用了,同时试验仪上二号灯灭。
当然如果加热的同时不想再继续加热了,则可以按下硬件开关SW2,再点击停止加热就可以了。
如图1-4所示:
图1-4
“加热”按钮实现代码如下:
OnButton7()
if(m_pro3.GetPos()>
100)
outportd(Port_io_Base+1,xu1[0]&
(0x0FE));
//二极管xu1[0]灯灭表示加热完成
AfxMessageBox("
锅炉水已经开了!
outportd(Port_io_Base+1,xu1[0]);
//二极管xu1[0]灯亮表示正在加热
outportd(Port_io_Base+3,0x0c);
//关闭SPK
Sleep(100);
//加速加热,减速加热
m_pro3.SetPos(m_pro3.GetPos()+1);
//if(GetKeyState(VK_CONTROL)<
0)//control建
0x02!
=0)//检查sw2是否按下
sw2=true;
j++)//水开报警
break;
}while
(1);
if(sw2)
{}
else
(0xFE));
outportd(Port_io_Base+3,0x0c);
//关闭SPK
}
若此时点击输出开水按钮,第三号灯亮,以看到锅炉水位下降,表示有人在打开水,开水输出完之后,弹出提示,同时使温度计归零,第三号灯灭,期间,如果需要强制关闭输出,可以按下硬件开关SW3,再按关闭输出按钮。
如图1-5示:
图1-5
“输出开水”按钮实现代码如下:
OnButton9()
outportd(Port_io_Base+1,xu1[2]);
//二极管xu1[2]灯亮输出开水
do{outportd(Port_io_Base,xu[i]);
m_pro1.SetPos(m_pro1.GetPos()-5);
//输出开水
if(GetKeyState(VK_MENU)<
0x04!
=0)//检查sw3是否按下
{sw3=true;
}while(m_pro1.GetPos()>
0);
if(sw3){}{}
outportd(Port_io_Base+1,xu1[2]&
(0x0FB));
//二极管xu1[2]灯灭,开水已经输完
//CMyDlg:
OnButton8();
//令PC6=1,发高频音
//令PC6=0,关闭SPK
开水已经输完!
m_pro3.SetPos(0);
若按下退出按钮,则系统退出。