微机接口课程设计报告---地铁收费系统.doc_第1页
微机接口课程设计报告---地铁收费系统.doc_第2页
微机接口课程设计报告---地铁收费系统.doc_第3页
微机接口课程设计报告---地铁收费系统.doc_第4页
微机接口课程设计报告---地铁收费系统.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

微机接口技术课程设计报告 设计题:地铁收费系统指导老师: 学生姓名:学号:所在班级: 网络工程一 . 课程设计目的 结合一个实际的接口技术问题在实验台上编程模拟实现。二 . 课程设计要求 由一个主控机监控和若干个下位机组成,主控机负责数据处理,下位机负责访问接口。三 . 课程设计内容及步骤 (1) 题目: 地铁收费系统 (2) 系统功能: a. 乘客进入地铁站刷卡,记录起始站点,出站也要刷卡,记录终点站,根据距离计算车费,并判断乘客是否买足了票,若票款不足,则发出警报。b. 下位机从接口上接收到卡号数据,并将该下位机的编号传到主控机,主控机保存. 当主控机再次收到该卡号的时候,计算该下位机和已经存储的下位机之间的距离计算出车费,用该卡号的金额减去车费,如果大于0则扣除费用,否则报警.(3). 系统接口框图 主控机isa总线 8250收/发时钟 ttl/232电平转换或ttl/485电平转换ttl/232电平转换或ttl/485电平转换收/发时钟 8250下位机isa总线8255a口 b口 c口a b c口分别表示三个站点 ,每个口中1-3口为站点编号, ,4-7口记录卡号,最高位为标志位 (4) . 系统程序 主控机保存,查询,计算余额,临时保存卡号信息等程序。 主控机与下位机通信程序。 下位机与主控机通信程序。下位机访问接口程序。 (5) . 系统流程(设计)说明首先主控机启动程序,开始监听下位机,一旦收到数据就进行处理,首先分割出低3位作为站点编号,中间4为作为卡号.然后主控机查询数据库,得到该卡号的信息,包括是否是第一次进站,卡上的余额等等.接下去主控机返回该卡号的余额给下位机,下位机接受到余额判断是否小于零,如果是则报警(响铃),否则显示余额,下位机不进行判断用户到底是进站还是出站.所有判断都是交给主控机,下位机还需要从接口读取数据,前3位表示站点编号,中间4位表示卡号,最高位为标志位,只有它为1时表示已经插卡并且已经ready可以读数据了.下位机读取数据后通过com通信和主机建立连接,下位机对于接口的监听是主动的,这里我们程序中开了一个线程用于专门监听读取接口上的数据,而且同时设计了标志以防止反复读取,反复将同一数据发送至服务器端(主控机). (6) . 部分关键程序源码 程序包括客户端和服务器端程序 a . com通讯: 1. 连接初始化:m_com1.setcommport(1);m_com1.setinbuffersize(1024);m_com1.setoutbuffersize(512);if(!m_com1.getportopen()m_com1.setportopen(true);m_com1.setinputmode(1);m_com1.setsettings(9600,n,8,1);m_com1.setrthreshold(1);m_com1.setinputlen(0); 2. 发送数据 int ckou1dlg:sendcommessage(cstring msg)cbytearray sendstr;word slength;slength=msg.getlength();sendstr.setsize(slength);for(int i=0;islength;i+)sendstr.setat(i,msg.getat(i);m_com1.setoutput(colevariant(sendstr);return 0;3. 接收数据 void ckou1dlg:ononcommmscomm1() updatedata(true);variant variant_ins;colesafearray safearray_ins;long i=0;int len;char rxdata1000;cstring tmp;switch(m_com1.getcommevent()case 2:variant_ins=m_com1.getinput();safearray_ins=variant_ins;len=safearray_ins.getonedimsize();for (i=0;ienablewindow(false);/*handle hthread1;hthread1=createthread(null,0,ckou1dlg:fun1proc,this,0,null);*/afxbeginthread(fun1proc,this);uint ckou1dlg:fun1proc(lpvoid lpparameter) /开线程int flag0=0;int i=0;openporttalk();/system(music.exe); /播放音乐/设置控制方式/outportb(ctrl_8255,0x82); /0x303 使读a口写b 口while(1)outportb(ctrl_8255,0x82); unsigned char c=inportb(pb_8255); :sleep(200); cstring a0= 刷啊刷; if(c&0x80)=0) flag0=0; continue; if(c=flag0) /判断是否为有效数据 continue; flag0=c; cstring a; a.format(%d,(c&0x78)3); (ckou1dlg *)lpparameter)-setdlgitemtext(idc_edit1,(lpctstr)a);(ckou1dlg *)lpparameter)-updatewindow();cbytearray sendarr; word wlength; /wlength = (cstring)c.getlength(); sendarr.setsize(1); /发送数据到主控机(ckou1dlg *)lpparameter)-m_com1.setoutput(colevariant(sendarr);closeporttalk();c . 下位机数据处理 接受主控机返回的数据(账户余额),如果大于0正常,如果小于0则响铃报警10 void ckou1dlg:ononcommmscomm1() updatedata(true);variant variant_ins;colesafearray safearray_ins;long i=0;int len;char rxdata1000;cstring tmp;switch(m_com1.getcommevent()case 2:variant_ins=m_com1.getinput();safearray_ins=variant_ins;len=safearray_ins.getonedimsize();long j=0;short recvicedate=0;safearray_ins.getelement(&j,&recvicedate);/for (i=0;ilen;i+)/safearray_ins.getelement(&i,&rxdatai);/rxdatai=0;/m_recv+=rxdata;/接收到回馈进行数据处理if(recvicedate&0x80)/余额不足,报警m_recv=余额不足,报警! ;/for(int n=0;n127)res=-128+recvicedate-128;else if(recvicedate0)res=recvicedate;char * ccc=new char10;cstring a(itoa(recvicedate,ccc,10);m_recv=您的余额是:+a;updatedata(false);break;default:break; d . 主控机处理程序 接收下位机传送过来的卡号和站点编号,通过卡号查询数据库得到该卡号的信息(包括余额和状态),如果是出站则计算余额并返回给下位机,同时改变该卡状态为出站.如果是进站,则登记为进站,同时直接返回当前余额给下位机.程序如下: (其中status表示进站还是出站)void ckou1dlg:ononcommmscomm1() m_recv=;updatedata(true);variant variant_ins;colesafearray safearray_ins;long i=0;int len;char rxdata1000;cstring tmp;switch(m_com1.getcommevent()case 2:variant_ins=m_com1.getinput();safearray_ins=variant_ins;len=safearray_ins.getonedimsize();long j=0;short recvicedate=0;safearray_ins.getelement(&j,&recvicedate);/将接收数据显示出来char * c3=new char10;cstring a3(itoa(recvicedate,c3,10);m_recv+=a3+ ;/查询数据库,获取该卡号信息_variant_t raffected,cardnum0,count0,status0;int cardnum=(recvicedate&0x78)3;cstring y2,str0;str0.format(%d,cardnum);y2=select * from card where cardnum=+str0;m_prset-open(_variant_t(lpctstr)y2),m_pconnection.getinterfaceptr(),adopenstatic,adlockoptimistic,adcmdtext);cstring str;while (!m_prset-adoeof)cardnum0=m_prset-getcollect(cardnum);count0=m_prset-getcollect(count);status0=m_prset-getcollect(status);/str=(lpctstr)(_bstr_t)cardnum0;/getdlgitem(idc_editid)-setwindowtext( str );/m_prset-putcollect(_variant_t(cardnum),_variant_t(long)2000);/updatewindow();m_prset-movenext();sleep(100);/(*cardcurrent).cardnum=(short)vid;/(*cardcurrent).count=(short)vpsw;/(*cardcurrent).zhan =(short)vmon;m_prset-close(); short yue=-1;if(short)status0!=-1)int zhan2=recvicedate&0x7;yue=(short)count0-abs(short)zhan2-(short)status0)*10);/重置status为-1status0=(short)-1;elsestatus0 =(short)(recvicedate&0x7);yue=(short)count0;if(yue=0)/先回写数据库,改变statuscstring yue2,status2,sql;yue2.format(%d,yue);status2.format(%d,(short)status0);sql=update card set count=+yue2+,status=+status2+ where cardnum=+str0;m_pconnection-execute(_bstr_t(lpctstr)sql),&raffected,adcmdtext); /发送余额到客户端cbytearray sendarr; sendarr.setsize(1); sendarr.setat(0, yue); ckou1dlg:m_com1.setoutput(colevariant(sendarr);/将发送信息显示出来char * c=new char10;cstring a(itoa(yue,c,10);/char * c2=new char10;/cstring a2(itoa(str0,c2,10);m_edit+=向卡号为:+str0+发送余额:+a+元nr ; updatedata(false);break;default:break;(7) . 部分程序截图主控机接受下位机发送的卡号等数据,同时查询数据库返回该卡余额,主控机在进行充值操作的截图四 . 实验心得 这次接口的课程设计可获收获颇大, 首先是更加清晰地认识了一些接口芯片的使用,比如说8255,8250芯片, 最重要的是学会了两微机com口的通讯,这是本次课程设计的关键!觉得以前接口的实验还是蛮简单,这一次算是系统地又

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论