现代计算机接口技术实验.doc_第1页
现代计算机接口技术实验.doc_第2页
现代计算机接口技术实验.doc_第3页
现代计算机接口技术实验.doc_第4页
现代计算机接口技术实验.doc_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

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

文档简介

计算机接口技术实验指导书现代计算机接口技术 及MFC程序实现武汉工业学院计算机与信息工程系目 录实验1 定时与中断接口程序设计1实验2 操作PC机上的8250实现串行通信5实验3 基于DLL与HOOK技术的键盘消息拦截与读音10实验4 MFC串行通信程序设计16实验5 DirectShow接口实现视频显示与帧捕获20实验6 基于Socket接口的网络通信MFC程序设计27实验1 定时与中断接口程序设计一 实验目的1了解定时器/计数器8253、并行I/O接口8255A在PC机中的电路连接方法;2学习使用TURBO C+对8253、8255进行编程操作;3熟悉拦截PC机中断向量的TC+ 编程方法。二 实验内容18253、8255在PC/XT机中的电路连接介绍D7D0IORIOWA0A1IO/MA9A2D7D0 OUT0RD GATE0WR CLK0A0 OUT1A1 GATE1CLK1OUT2CS GATE2CLK0,1,2地址译码40H43H至8259 IRQ0,中断类型=8+5V至8237的DRAM刷新请求+5V80888253&放大PB0CS PB1地址译码60H63H82551.19MHz PC机启动后,系统设置的初始状态为:芯片有关工作方式初值运行情况8253通道0#:方式3(方波发生器)计数初值:0000HOUT输出55ms方波至8259的IRQ0通道2#:?(1KHz)计数初值:?(1190)?(1KHz方波)8255PB0、PB1:方式0(简单输出)控制蜂鸣器发声。0:不发声,1:发声8259IRQ0:允许中断中断类型号:8CPU响应8号中断表中,8253的通道2#的工作方式和计数初值未知,要求自己设置。2程序要求利用TURBO C+开发环境设计程序,实现如下功能: (1)程序启动时,要求输入定时时间,以秒为单位。 (2)按秒计时,每秒到达时,在屏幕上显示当前为第几秒,同时蜂鸣器发出短促叫声; (3)当定时时间到,则显示“Time Up!”,结束程序。三 实验环境硬件环境:PC机一台;软件环境:操作系统不限,TURBO C+3.0。四 实验步骤1建立源文件启动TURBO C+3.0,建立Timer.CPP。保存到D: (学号)Timer.CPP;2设置TC工作目录选菜单Options/Directories,第1、2栏保持不变,第3、4栏填写您的文件存放目录,OK。如此,TC生成的可执行文件等将会存放到此工作目录下。样例如下:3输入源程序以下源程序仅供参考。#include /支持标准输入输出,如printf()。#include /支持接口访问、中断向量操作函数#include /支持exit()函数#ifdef _cplusplus /定义C+使用的中断函数标识符。若是.C程序,则不需要 #define _CPPARGS .#else #define _CPPARGS#endifint nTick=0,sec=0,flag=0;unsigned char sys_PB,my_PB;void interrupt far (*sys_int_08)(_CPPARGS); /若是.C,则函数参数不写void interrupt far my_int_08(_CPPARGS) /若是.C,则函数参数不写/8号中断,每55ms中断一次,由8253的0号定时器定时,并向8259 IRQ0申请中断 +nTick; if(tinck=1) outportb(0x61,my_PB); /开始鸣叫 else if(tinck=3) outportb(0x61,sys_PB); /停止鸣叫 else if(nTick18) / 1second/55ms 近似等于18 flag=1; nTick=0; sec+; sys_int_08(); /调用系统的中断向量/=void main() unsigned int Time_up; printf(Please input Up Time(5-30): ); scanf(%d,&Time_up); printf(n); if(Time_up30) printf(Input Error!); exit(1); /结束程序 outportb(0x63,0x82);/设置8255,PB为输入方式 sys_PB=inportb(0x61); /读取PB口,内容 my_PB=sys_PB|0x03;/将PB口低2位(PB0,PB1)置1outportb(0x63,0x80);/设置8255,PB为输出方式 /8253通道2,产生1KHz方波,送到扬声器,使扬声器发声 outportb(0x43,0xb6); /CW=10110110 B,通道2,先低字节,再高字节,方式3,二进制 outportb(0x42,0xa6); /low byte, outportb(0x42,0x04); /high byte,0x04a6=1190,f = 1.19MHz,out=f/1190=1000Hz sys_int_08=getvect(0x08); /保存系统的中断向量 setvect(0x08,my_int_08); /设置系统向量 while(1) if(flag=1) flag=0; printf(%d ,sec); if(sec=Time_up) break; printf(Timer Up!nn);outportb(0x61,sys_PB);/恢复系统的PB口状态 setvect(0x08,sys_int_08); /恢复系统的中断向量4运行程序,再完成如下内容(1) 8253的通道0在程序中起什么作用?为什么在程序中没有对其进行初始化及赋初值?(2)修改8253通道0#的初值,使计时精度严格为1秒。提示:可采用动态初值,即一秒内的每次中断采用不同的初值,使每次中断得到的时间间隔之和为1000ms。55ms的定时655351/1.19MHz(3)my_int_08()函数什么时候被调用?(4)将main()函数的最后一句注释掉,再执行,会有什么结果?假定是在纯DOS环境下执行这个程序。(5)本程序为什么采用DOS环境编写程序,而不采用Windows环境?六 实验报告 实验报告是科学实验中的重要技术文档,应如实记录实验中发生的现象、处理措施和结果。实验报告的组成一般为:实验项目名称(要求严格与本指导书一致)、实验日期、场地、采用的软硬件环境,实验者;对于为什么采用此环境,必要时可作出说明。例如,本实验为什么要采用TC,而不采用VC?实验目的:具体写要做成什么,期望得出什么结果。不要照抄本指导书。实验过程:具体写操作的过程,对于源程序,不一定全部写出,但应画出模块图、流程图。核心代码可写出。特别要写出实验中碰到的问题及分析、解决办法。实验结果及分析:如实写出结果,对结果进行分析,可进一步提出改进、提高的办法。实验2 操作PC机上的8250实现串行通信一 实验目的1了解8250在PC机中的电路连接方法;2学习使用TURBO C+对8250进行编程操作;3利用8259中断实现RS232串行通信。二 实验指导18250内部基本结构简介为便于理解,以下仅给出8250内部的简化逻辑结构和主要管脚,详情请参阅有关技术资料。3FBH3FDH3F9H3FAH (只读)3FEH3FCH3F9H3F8H3F8H (读)3F8H (写)线路控制寄存器 LCR线路状态寄存器 LSR中断允许寄存器 IER中断标识寄存器 IIR数据缓冲控制逻辑接收缓冲器 RBR发送保持器 THR除数寄存器(H)除数寄存器(L)波特率发生器Modem控制寄存器 MCRModem状态寄存器 MSRModem控制逻辑DTR 数据终端就绪RTS 请求发送CTS 清除发送DSR 数据设备就绪RI 振铃RLSD 接收信号检测RXD 串行数据输入TXD 串行数据输出RESETCSA0A1A2 RDWRINTCLKD7D0注: 各寄存器旁标注的十六进制数是该寄存器在PC中的I/O地址。28250内部寄存器功能简介 线路控制寄存器 LCRDLABSBSPEPSPENSTBWLS1WLS0数据位数00:5;01:610:7;11:8停止位数0:1 1:1.5或201:奇校验11:偶校验0:无校验附加奇偶校验?0:不附加1:附加0:读写RBR、THR1:读写除数寄存器 线路状态寄存器 LSR0TSRETHREBIFEPEOEDR接收缓冲器满?0:未满1:满接收奇偶错?0:无错1:有错接收格式错?0:无错1:有错发送保持空?0:不空1:空发送移位器空?0:不空,正在发1:空,发完接收重叠错?0:无错;1:有错 中断允许寄存器 IER0000I0EI3EI1EI2E1:允许Modem状态改变中断1:允许接收出错中断1:允许发送保持器空中断1:允许接收缓冲器满中断 中断标识寄存器 IIR(只读)00000ID2ID1EIP00:接收出错中断01:接收缓冲器满中断10:发送保持器空中断11:Modem状态改变中断有否未决中断?0:无1:有是何中断? 除数寄存器用于设置波特率。波特率=时钟频率(16除数寄存器的值)。若已知波特率,则: 除数寄存器的值=时钟频率(16波特率)。 Modem控制寄存器 MCR000LOOPOUT2OUT1RTSDTR1:环路检测(自发自收)1:数据终端就绪1:请求发送 Modem状态寄存器 MSRRLSDRIDSRCTSRLSDTERIDSRCTS 读出值为8250芯片的Modem部分4个输入引脚的状态。“”表示比较前次的读出值有改变。38250在PC/XT机中的电路连接介绍 主板上有两片8250,分别对应串口1和串口2。8250(对应COM1)的端口地址为3F8H3FFH,其中断信号传到8259的IRQ4。IRQ4的中断类型码为0CH。 8250(对应COM2)的端口地址为2F8H2FFH,其中断信号传到8259的IRQ3。IRQ3的中断类型码为0BH。本实验仅操作串口1对应的8250(对应COM1),实现串行通信。D7D0IORIOWA0A1A2IO/MINTR A9A3D7D0 RXDRD TXDWR RTSA0 CTSA1 DSRA2 RLSDDTRCS RIINT CLK地址译码3F8H3FFHDB9插座808882501.8432MHzINT IRQ482594程序要求利用TURBO C+开发环境设计程序,实现如下功能: (1)设置8250:波特率=1200,奇校验,8位数据,1停止位; 按LOOP方式工作,自发自收;允许接收中断。 (2)拦截8259 IRQ4中断,在此中断中接收数据,在程序中显示数据。 (3)将程序改为两机之间通信,一机发送,另一机接收。三 实验环境硬件环境:PC机一台;串行通信终接头一个(用于一个串口自发自收);串行通信电缆一根(用于两机之间通信)。软件环境:操作系统不限,TURBO C+3.0。四 实验步骤1输入源程序(LOOP方式),自收自发实验。以下源程序仅供参考。#include #include void init_RS232();/初始化COM1,包括8250和8259void interrupt far my_interupt();/本程序的中断响应函数void interrupt far (*old_int_rs232)();/指向系统原来的中断响应函数unsigned int old_IMR; /保存8259中断屏蔽寄存器IMR的原值,以便程序退出时复原unsigned char input_buf1024; /定义接收缓冲区unsigned char output_buf1024= 0xa1,0xb2,0xc3,0xd4,0xe5,0xf6 ; /定义发送缓冲区及要发送的数据unsigned int input_buf_point; /指向当前存放接收数据的缓冲区位置unsigned int output_buf_point; /指向当前要发送字节的缓冲区位置int send_OK; /收发完成标志。0=收发未完成,1=收发完成int output_bytes=6; /应发送的字节数,设要发送6个字节void main()int i;clrscr( ); /清屏init_RS232( ); /设置8250、8259的初始化值send_OK = 0; /先置为0,表示收发未完成。for( ; ; ) printf(Press any key to send, q to exitnn);if(getch() = q) break;printf(Sending Data: );/先把待发送的数据显示出来for(i=0 ; i output_bytes; i+) printf(%02x , output_bufi);printf(n);output_buf_point = 0; /目前已发送了0个数据input_buf_point = 0; /目前收到0个数据outportb(0x3f8,output_bufoutput_buf_point+); /发送第一个字符,后续字符将在前一个/字符引起的中断响应中发送;while(!send_OK) ; /等待收发完成(收发工作在中断函数中进行)printf(receving Data: ); /收发完成,把收到的数据显示出来for(i=0 ; i output_bytes; i+) printf(%02x , input_bufi);printf(nn);outportb(0x21, old_IMR); /将8259的中断屏蔽寄存器IMR复原setvect(0x0c, old_int_rs232); /将COM1的中断向量复原void init_RS232() /8250、8259初始设置函数int i;disable(); /由于要修改系统的中断方式,故先关中断,保证下面的操作不影响系统工作outportb(0x3fb,0x80); /1000 0000, 写8250控制字,允许改动波特率outportb(0x3f8,0x60); /设置波特率=1200bps. 8250的时钟=1.8432MHz,除数=0060H=92,outportb(0x3f9,0x00); /故波特率=1.8432/(16*92)=0.001252Mbps=1252bps.outportb(0x3fb,0x2b); /0010 1011,再写控制字,锁定波特率,奇校验,8位数据,1停止位outportb(0x3fc,0x13); /0001 0011,写Modem控制字,LOOP=1,RTS=1,DTS=1outportb(0x3f9,0x05); /设置中断允许寄存器IER, 允许接收中断old_int_rs232 = getvect(0x0c); /保存系统原中断向量。COM1的中断类型码=12setvect(0x0c, my_interupt); /将COM1的中断向量改为指向本程序中的中断函数old_IMR = inportb(0x21); /读8259中断屏蔽寄存器IMR, 其I/O地址为21Hi = old_IMR & 0xef; /允许IRQ4中断,其他中断源维持系统的原设置不变outportb(0x21,i);outportb(0x20,0x20); /置位OCW2中的EOI,使中断服务寄存器自动清零,避免中断重复响应enable();void interrupt my_interupt() /COM1中断服务程序unsigned int com_state;unsigned int data;com_state = inportb(0x3fd); /读线路状态寄存器LSRcom_state = com_state & 0x0007;if(com_state=0x0001)/接收器满data = inportb(0x3f8); /读取接收缓冲器input_bufinput_buf_point+ = data; /将读得的数据存放到接收缓冲区if(output_buf_point =A & wParam0) /实际收到了BytesRead个字符RxdBuffBytesRead=0; /在收到的字符串后加结尾标志m_Receive+=_T(RxdBuff); /将收到的字符串连接到接收编辑框变量UpdateData(FALSE); /更新接收编辑框的显示6 运行程序,实验 (1*)COM1发送,COM1接收。先将计算机的COM1口(9针插座)的2脚(发送脚)和3脚(接收脚)用导线接通,再运行程序。(2)本机的COM1和COM2互相收发。先将本程序编译、连接生成Release版的 Scom.exe 文件,改名为Scom1.exe;再将CreateFile()、BuildCommDCB()函数中的COM1改为COM2,编译、连接生成Release版的 Scom.exe 文件,改名为Scom2.exe;将COM1口和COM2口用串行通信电缆接通;使Scom1.exe和Scom2.exe同时运行。(3)一机发送,另一机接收。先将两台计算机的COM1口用串行通信电缆接通,再运行程序。(4)修改波特率和数据位数、读超时时间,再作实验,记录实验结果,分析原因。思考题:(1)按本程序设置的波特率、定时时间以及每次试图接收的字节数,完成1000各字符的接收至少需要多少时间?改变波特率能减少这一时间吗?(2)按照500ms的定时时间间隔,在本程序设置的波特率、数据位数不变的情况下,试图接收的字符数最多不能超过多少?超过了会出现什么问题?(3)修改程序,利用线程进行串口数据侦听与接收。实验5 DirectShow接口实现视频显示与帧捕获一 实验目的1了解运用DirectShow SDK开发视频显示与帧捕获应用程序的方法;2了解COM接口的工作机制与使用二 实验指导1DirectShow SDK概述DirectShow属于DirectX家族中的组件之一

温馨提示

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

最新文档

评论

0/150

提交评论