《微机接口技术课程设计报告》
设计题:大型闸门开关系统
设计时间: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); } 八、参考文献 《微型计算机原理及运用》谭浩强清华大学出版社 《现代微机系统与接口技术》高等教育出版社 《微机接口技术应用》电子工业出版社 《微机原理及接口技术》机械工业出版社