当前位置:文档之家› 接口课设报告

接口课设报告

接口课设报告
接口课设报告

《微机接口技术课程设计报告》

设计题:大型闸门开关系统

设计时间:2010.9.19至2010.9.25

微机接口技术课程设计

一、设计目的:

模拟大型闸门的开启与关闭,熟悉接口设计的流程。

编程模拟实现产品监测。

二、设计要求:

总体的系统由主控机(上位机)和下位机组成,上位机与下位机利用串行接口进行连接,利用俩个(或者两个以上功能部件)构成一个完整系统。主控机负责数据处理,下位机负责接口控制。

具体的功能要求如下:

1、用实验台上的信号电源模拟闸门位移传感器获得信号电压。

2、用实验台上的LED和扬声器模拟闸门到位报警。

3、用实验台上的步进电机或伺服电机模拟控制闸门的升降。

4、上位机模拟控制中心调节闸门开度的大小。

三、设计内容:

大型闸门开关系统:

系统总体的结构如下所示:

1、

成。主控机和下位机通过串行通信线连接。

2、执行部件:由接口电路等组成,将接收的数据送入到下位机或将下位机输出

的数据送到执行部件。

3、下位机:与主控机通信,控制执行部件。

4、主控机:与所有下位机进行数据交换,必要时需建数据库,进行数据处理等。

5、主控机程序:串行(RS232)通信程序,数据处理程序等。

6、下位机程序:串行(RS232)通信程序,执行部件控制程序。

闸门信号采用实验平台上的信号电源通过ADC0809采样数模转换来得到。通

过8255将采样数据送下位机,下位机通过串口通信将数据传给上位机,上位机来处理数据,并显示出数据的特性。然后通过跟设置的一个阈值比较,来判断闸门是否到位,根据判断结果传送相应的信号控制给下位机,下位机根据信号做出相应的反应,设置相应的芯片。如果闸门未到位,启动步进电机,模拟闸门升降的过程;如果闸门到位,则启动音乐发生器和LED灯,产生声光报警信号。

四、设计过程:

首先,确定所需要的芯片及部件,我们要用到信号电源、ADC0809、8255、步进电机、音乐发生器以及一个报警用的LED灯。利用ADC0809采样信号电源模数转换的得到的数据模拟闸门位移信号,通过8255传给下位机,下位机通过串行通信接口将数据传送给上位机,上位机对数据进行统计处理,然后传递给下位机一个信号位,表示闸门是否到位,下位机根据此信号位启动步进电机或产生声光报警。

简要设计框图:

芯片接口图:

总体的电路图就如上面所示,实验台的接线都画出来了,跟一开始的设计方案可能有一点的不同,这是在测试以后的确定版本。

程序设计如下所示:

分工介绍:

本次接口课设中,我们涉及到电路连线,界面设计,程序编码,程序调试,总体设计等分工和合作。在项目中,我的任务是界面设计和编码部分,具体来说就是设计两个程序运行界面,包括上位机和下位机,界面设计包括响应代码和消息实时控制。要求实现的就是在点击按钮“开始”时发送消息,然后接着编写代码,发送消息,传达给界面的连接状态,显示当前的连接状态。而这个下位机发送的消息要传递给上位机,让上位机显示出闸门的位移和状态等等信息。而且,后面根据老师的要求,要能够动态修改的警界位移,所以还需要增加一个响应功能和函数,用于动态监测到这个警界的变化,并反映到最终提示信息中,显示是否超过警界,同时还要让警报发声。

整个代码中,涉及到串口通信,使用了MSComm控件提供的几个接口来发送数据,接收数据,控制灯的显示,步进电机等等,所以我们小组成员在一起进行了很多的讨论和协商,同时不同功能模块和分工直接进行了相互的协作。最终完满的完成了实验的任务!

五、系统调试

(1)在编码完成之初,由于通信的延迟选择的不同,观察上位机的时候,会明显感到闸门到位前与到位后的采样时间间隔不一致,通过调节各自的睡眠时间,这个问题得到了解决。

(2)在测试的过程中,发现了步进电机的运转有点问题,通过调试步进电机的运行睡眠时间解决了问题。

系统的运行框图如下:

下位机:

上位机:

六、设计心得和体会

首先,通过课设再次熟悉了接口的相关知识,8255芯片和模数转换的相关知识得到了巩固。通过实际的系统的设计完成,锻炼了我们的实际分析问题,建立模型,再利用实验平台来实现相应功能的能力。在这个过程中,锻炼了我们的团队协作能力,动手能力。而且在实验的过程中,我们小组成员之间进行广泛而深刻的交流,进行了紧密和有效的沟通,互相帮助,进一步加深了我们对于接口课程的理解,提高了动手实践的能力。

本次的编码是通过VC来进行实现的,通过实际的操作,让我了解了VC中的串口通信机制;对于我做的关于界面和编码的工作,我认为感触很深。不仅仅让我对于MFC的运行机制,消息通讯有了更深刻的体会,同时,通过实际编码,控制信号,发送消息,进而实现一些硬件的功能,比如LED灯的发光和扬声器的

发声等等,让我体会到了编码的乐趣,而且利用VC的串口通信技术,以及相应的控件的使用,让我深刻的理解了接口原理,同时,对于MFC 界面编程和消息通讯都有了更加深刻的理解和更熟练的掌握。总之,这次课设让我收获颇为丰富。最后感谢老师的帮助和指导!

七、附录:

下位机通信部分:

void CUpDlg::OnComm()

{

// TODO: Add your control notification handler code here

BYTE signal;

int pc4,pc6,i;

int xu[8]={0x05,0x15,0x14,0x54,0x50,0x51,0x41,0x45};

VARIANT variant_inp;

COleSafeArray safearray_inp;

LONG len,k;

BYTE rxdata[2048];

CString strtemp,m_strEditRXData;

OpenPortTalk();

m_strEditRXData.Empty();//清空发送框

if(m_ctrlComm.GetCommEvent()==2) //// comEvReceive读取数据

{

variant_inp=m_ctrlComm.GetInput();

safearray_inp=variant_inp;

len=safearray_inp.GetOneDimSize();

for(k=0;k

safearray_inp.GetElement(&k,rxdata+k);

for(k=0;k

{

BYTE bt=*(char *)(rxdata+k);

strtemp.Format("%c",bt);

m_strEditRXData+=strtemp;

}

}

if(!m_https://www.doczj.com/doc/7116555921.html,pare("10")){

m_RV="连接失败";

UpdateData(FALSE);

return;

}

else if(!m_https://www.doczj.com/doc/7116555921.html,pare("0")){

m_RV="连接成功";

UpdateData(FALSE);

for(i=0;i<5;i++){

Sleep(50);

outportb(CTRL_8255,0x07);

Sleep(50);

outportb(CTRL_8255,0x0F);

}

}

else{

m_RV="连接成功";

UpdateData(FALSE);

outportb(CTRL_8255,0x06);

int temp=atoi(m_strEditRXData);

if(temp > gFormerAngle)

{

for(int i = gFormerAngle; i < temp; ++i)

{

for (int j = 0; j < 8; ++j)

{

outportb(0x301,xu[j]);

Sleep(50);

}

}

}

else

{

for(int i = gFormerAngle; i > temp; --i)

{

for (int j = 7; j >= 0; --j)

{

outportb(0x301,xu[j]);

Sleep(50);

}

}

}

gFormerAngle=temp;

}

UpdateData(FALSE);

//选择通道

outportb(CTRL_8255,0x88);

outportb(0x300,0);

outportb(CTRL_8255,0x03); /*PC1 ALE置1*/

/*发送采样信号*/

outportb(CTRL_8255,0x98);/*重写8255方式字,A口输入,C口低四位输出,C口高四位

输入*/

outportb(CTRL_8255,0x01); /*使PC0 START置高发启动信号*/

outportb(CTRL_8255,0x02); /*pc1 ALE置0*/

outportb(CTRL_8255,0x00); /*使PC0 START置低*/

do

{

pc4=inportb(0x302)&0x10;

}while(pc4==0); /*查询PC4 EOC的状态,直至为高电位,即,转换完成*/

outportb(CTRL_8255,0x05); /*pc2=1 OE,允许读转换结果*/

signal=inportb(PA_8255);

strtemp.Format("%d",signal);

Sleep(100);

m_ctrlComm.SetOutput(COleVariant(strtemp));

//pc6=0x40 & inportb(PC_8255);

ClosePortTalk();

//if(pc6==0)

// exit(0);

}

上位机通信部分:

void CUpDlg::OnComm()

{

// TODO: Add your control notification handler code here

VARIANT variant_inp;

COleSafeArray safearray_inp;

int range;

LONG len,k;

int state=-1;

BYTE rxdata[2048];

CString strtemp;

//static int flag=0;

range=0;

if(flag==0){

state=0;

m_Log = "判断下位机是否匹配.";

UpdateData(FALSE);

}

else

m_Log = "收到数据,处理中.";

if(m_ctrlComm.GetCommEvent()==2)

{

variant_inp=m_ctrlComm.GetInput();

safearray_inp=variant_inp;

len=safearray_inp.GetOneDimSize();

for(k=0;k

safearray_inp.GetElement(&k,rxdata+k);

m_strEditRXData.Empty();

for(k=0;k

{

BYTE bt=*(char *)(rxdata+k);

strtemp.Format("%c",bt);

m_strEditRXData+=strtemp;

}

if(flag==0){

if(!m_https://www.doczj.com/doc/7116555921.html,pare("160")){

m_strEditRXData="3";

m_Log = "下位机编号为"+m_strEditRXData;

m_ctrlComm.SetOutput(COleVariant("9"));

m_strEditRXData.Empty();

}

else if(!m_https://www.doczj.com/doc/7116555921.html,pare("0")){

m_strEditRXData="0";

m_Log = "下位机编号为"+m_strEditRXData;

m_ctrlComm.SetOutput(COleVariant("9"));

m_strEditRXData.Empty();

}

else if(!m_https://www.doczj.com/doc/7116555921.html,pare("32")){

m_strEditRXData="1";

m_Log = "下位机编号为"+m_strEditRXData;

m_ctrlComm.SetOutput(COleVariant("9"));

m_strEditRXData.Empty();

}

else if(!m_https://www.doczj.com/doc/7116555921.html,pare("128")){

m_strEditRXData="2";

m_Log = "下位机编号为"+m_strEditRXData;

m_ctrlComm.SetOutput(COleVariant("9"));

m_strEditRXData.Empty();

}

else{

m_Log = "下位机连接失败";

m_ctrlComm.SetOutput(COleVariant("10"));

}

flag++;

UpdateData(FALSE);

return;

}

range = GetRange(m_strEditRXData);

m_strEditRXData="闸门位移为"+m_strEditRXData;

if(range==1){

m_range="闸门高度等级为1级对应步进电机相位为45度";

}

else if(range==2){

m_range="闸门高度等级为2级对应步进电机相位为90度";

}

else if(range==3){

m_range="闸门高度等级为3级对应步进电机相位为135度";

}

else if(range==4){

m_range="闸门高度等级为4级对应步进电机相位为180度";

}

else if(range==5){

m_range="闸门高度等级为5级对应步进电机相位为225度";

}

else if(range==6){

m_range="闸门高度等级为6级对应步进电机相位为270度";

}

else if(range==7){

m_range="闸门高度等级为7级对应步进电机相位为315度";

}

else if(range==8){

m_range="闸门高度等级为8级对应步进电机相位为360度";

}

else if(range==0){

m_range="闸门过高,报警";

}

}

strtemp.Format("%d",range);

m_ctrlComm.SetOutput(COleVariant(strtemp));

m_Log = "数据处理完成,闸门高度数据已发送.";

UpdateData(FALSE);

}

八、参考文献

《微型计算机原理及运用》谭浩强清华大学出版社

《现代微机系统与接口技术》高等教育出版社

《微机接口技术应用》电子工业出版社

《微机原理及接口技术》机械工业出版社

相关主题
文本预览
相关文档 最新文档