您好,欢迎访问三七文档
武汉轻工大学---现代微机原理与接口技术报告学号:110511313姓名:王雪瑞班级:网工一班成绩:2014年5月15日实验1定时与中断接口程序设计实验项目:定时与中断接口程序设计实验日期:4月22日实验场地:东7-409实验环境:硬件环境:PC机一台;软件环境:操作系统不限,TURBOC++3.0。实验目的:1.学习定时器/计数器8253、并行I/O接口8255A在PC机中的电路连接方法;2.学习使用TURBOC++对8253、8255进行编程操作;3.熟悉拦截PC机中断向量的TC++编程方法。实验过程:1.建立源文件启动TURBOC++3.0,建立Timer.CPP。保存到D:/110511313/Timer.CPP;2.设置TC工作目录选菜单Options/Directories,第1、2栏保持不变,第3、4栏填写您的文件存放目录。这样,TC生成的可执行文件就会存放到此工作目录下。3.输入源程序#includestdio.h//支持标准输入输出,如printf()。#includedos.h//支持接口访问、中断向量操作函数#includeSTDLIB.H//支持exit()函数#ifdef__cplusplus//定义C++使用的中断函数标识符。#define__CPPARGS...#else#define__CPPARGS#endifintnTick=0,sec=0,flag=0;unsignedcharsys_PB,my_PB;voidinterruptfar(*sys_int_08)(__CPPARGS);voidinterruptfarmy_int_08(__CPPARGS){//8号中断,每55ms中断一次,由8253的0号定时器定时,并向8259IRQ0申请中断++nTick;if(nTick==1)outportb(0x61,my_PB);//开始鸣叫elseif(nTick==3)outportb(0x61,0x01);//停止鸣叫,PB1=0,PB0保持为1elseif(nTick18){//1second/55ms近似等于18flag=1;nTick=0;sec++;}sys_int_08();//调用系统的中断向量}voidmain(){unsignedintTime_up;printf(PleaseinputUpTime(5--30):);scanf(%d,&Time_up);printf(\n);if(Time_up5||Time_up30){printf(InputError!);exit(1);//结束程序}sys_PB=inportb(0x61);//读取PB口,内容my_PB=sys_PB|0x03;//将PB口低2位(PB0,PB1)置1//8253通道2,产生1KHz方波,送到扬声器,使扬声器发声outportb(0x43,0xb6);//CW=10110110B,通道2,先低字节,再高字节,方式3,二进制outportb(0x42,0xa6);//lowbyte,outportb(0x42,0x04);//highbyte,0x04a6=1190,f=1.19MHz,out=f/1190=1000Hzsys_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(TimerUp!\n\n);outportb(0x61,sys_PB);//恢复系统的PB口状态setvect(0x08,sys_int_08);//恢复系统的中断向量}4.运行程序,并修改一些数据重新运行。实验结果及分析:通过本次实验学习使用TURBOC++对8253、8255进行编程操作,我熟悉了8253、8255的接口逻辑和它们的内部结构、工作原理。了解了8253、8255的工作方式,并熟练掌握了8259的工作原理。实验2MFC串行通信程序设计实验项目:MFC串行通信程序设计实验时间:4月29日实验地点:东7-409实验环境:硬件环境:PC机一台串行通信终接头一个串行通信电缆一根软件环境:Windows7操作系统VC++6.0实验目的:1.了解MFC编写Windows应用程序的一般方法,熟悉WindowsAPI接口函数的使用;2.熟悉定时器Timer()函数、RS232API接口函数的使用,两者之间的协调工作。实验过程:1.建立基于对话框的MFC工程工程名为Scom,对话框的类(Class)为CscomDlg,对应的头文件为ScomDlg.h,源程序文件为ScomDlg.cpp。2.建立串行通信接口(1)在ScomDlg.h文件中定义串行通信接口对象的句柄classCScomDlg:publicCDialog{//Constructionpublic:CScomDlg(CWnd*pParent=NULL);//standardconstructorHANDLEhCom;//自己添加的代码……(2)在ScomDlg.cpp文件中的OnInitDialog()函数中创建串行通信接口BOOLCScomDlg::OnInitDialog(){......//TODO:AddextrainitializationherehCom=CreateFile(COM1,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);//创建接口对象,返回句柄if(hCom==(HANDLE)-1){MessageBox(创建串口1接口实例失败,未找到COM1口,MB_ICONSTOP|MB_OK);returnTRUE;}DCBdcb;//定义DCB(设备控制块)结构,用于设置串口设备的属性和参数GetCommState(hCom,&dcb);//先得到系统默认的DCB属性和参数BuildCommDCB(COM1:1200,n,8,1,&dcb);//再修改DCB的几个参数:1200bps,无奇偶校验,8数据位,1停止位SetCommState(hCom,&dcb);COMMTIMEOUTSComTimeOut;//定义超时结构,用于设置串口读写的等待时间ComTimeOut.ReadIntervalTimeout=MAXWORD;//读间隔超时ComTimeOut.ReadTotalTimeoutMultiplier=0;//读总超时系数ComTimeOut.ReadTotalTimeoutConstant=0;/读总超时常数ComTimeOut.WriteTotalTimeoutMultiplier=0;/写总超时系数ComTimeOut.WriteTotalTimeoutConstant=400;//写总超时常数SetCommTimeouts(hCom,&ComTimeOut);//按超时结构设置串口读写的等待时间SetupComm(hCom,1000,1000);//设置读写缓冲区PurgeComm(hCom,PURGE_TXCLEAR);//清空发送缓冲区PurgeComm(hCom,PURGE_RXCLEAR);//清空接收缓冲区……3.用可视化工具在对话框窗体上添加按钮、编辑框.按下表设置各控件的属性。控件名称VisibleIDMultilineAotoHscrollAotoVscrollWantRturnRead-Only发送按钮√IDC_SEND发送编辑框√IDC_SendTxt√√√√接收编辑框√IDC_Receive√√√√√为上述控件加入变量。选View/ClassWizard,选MemberVariables卡,按下图设置4.建立各控件的消息响应函数(1)为“退出”按钮建立消息响应函数,双击“退出”按钮,弹出对话框,点击确定。于是MFC自动在CscomDlg类中建立了“退出”按钮的响应函数OnCancel();请在该函数中添加代码:voidCScomDlg::OnCancel(){//TODO:AddextracleanuphereCloseHandle(hCom);//最后释放串口资源……(2)为“发送”按钮建立消息响应函数,双击“发送”按钮,弹出对话框,点击确定。于是MFC自动在CscomDlg类中建立了“发送”按钮的响应函数OnSend();请在该函数中添加代码:voidCScomDlg::OnSend(){//TODO:AddyourcontrolnotificationhandlercodehereCOMSTATstate;//定义串口状态结构,用于存放串口通信的状态DWORDBytesWritten;//定义存放实际发送了多少字节的变量intSendBytes;//定义应发送的字节数存放变量LPTSTRTxdBuff;//定义将发送的字符串UpdateData(TRUE);//将当前编辑框中输入的字符更新到m_SenTxt变量中SendBytes=m_SenTxt.GetLength();//得到m_SenTxt变量中存放的字符数TxdBuff=m_SenTxt.GetBuffer(SendBytes);//使发送字符串指针指向m_SenTxtBOOLOK=WriteFile(hCom,TxdBuff,SendBytes,&BytesWritten,NULL);//发送if(!OK){//发送失败ClearCommError(hCom,&BytesWritten,&state);//清除发送错误}}5.为接收数据创建定时器每隔500ms自动检测是否有数据发来。如果有数据发来,则读取、显示传来的数据。(1)先在ScomDlg.cpp文件中的OnInitDialog()函数中创建定时器:BOOLCScomDlg::OnInitDialog(){......//TODO:AddextrainitializationhereSetTimer(1,500,NULL);//创建定时器hCom=CreateFile(COM1,GENERIC_READ|GENERIC_WRITE,......当程序退出时,应删除本定时器:voidCScomDlg::OnCancel(){//TODO:AddextracleanuphereKillTimer(1);//删除定时器CloseHandle(hCom);//最后释放串口资源......(2)再创建“定时时间到”消息响应函数。选菜单项View/ClassWizard,选MessageMap卡,在ObjectIDs列表框中选CScomdlg,在ClassName列表框中选CScomdlg,在Messages列表框中选WM_TIMER,点击“AddFunction”、“EditCode”。于是,在CScomDlg类中添加了OnTimer(UINTnIDEvent)函数,请输入代码:voidCScomDlg::OnTimer(UINTnIDEvent){//TODO:Addyourmessagehandlercodehereand/orcalldefaultDWORDBytesRead,dwErrorFlags;//定义存放实际接收到多少字节的变量BYTERxdBuff[51];//定义存放接收到的字符的数组COMSTATComStat;ClearCommError(hCom,&dwErrorFlags,&ComStat);//读取串行设备的当前状态,获取接收缓冲区中已有的字节数BytesRead=min(50,ComStat.cbInQue);//应该读取的数据长度If(BytesRead){ReadFile(hCom,RxdBuff,BytesRead,&BytesRead,NULL);//试图接收BytesRead个字符if(BytesRead0){//实际收到了Byt
本文标题:接口实验报告
链接地址:https://www.777doc.com/doc-5028857 .html