计算机接口技术实验报告.docx
- 文档编号:14489051
- 上传时间:2023-06-23
- 格式:DOCX
- 页数:24
- 大小:75.83KB
计算机接口技术实验报告.docx
《计算机接口技术实验报告.docx》由会员分享,可在线阅读,更多相关《计算机接口技术实验报告.docx(24页珍藏版)》请在冰点文库上搜索。
计算机接口技术实验报告
计算机接口技术实验报告
数学与计算机学院
《计算机接口技术》
实验报告
专业:
班级:
学号:
姓名:
指导老师:
实验1定时与中断接口程序设计
一实验目的
1了解定时器/计数器8253、并行I/O接口8255A在PC机中的电路连接方法;2.学习使用TURBOC++对8253、8255进行编程操作;
3(熟悉拦截PC机中断向量的TC++编程方法。
二实验内容
1(8253、8255在PC/XT机中的电路连接介绍
1,808882532,D7…D0OUT0D7…D0至8259IRQ0,中断类型=83,RDGATE0+5VIOR
4,WRCLK0IOW
5,A0OUT1A0至8237的DRAM刷新请求
6,A1GATE1A1+5V
7,CLK1
8,地址OUT2IO/M&放大9,译码CSGATE2A9…A2
10,CLK0,1,240H~43H
1.19MHz
地址PB0
译码CSPB1
60H~63H8255
PC机启动后,系统设置的初始状态为:
芯片有关工作方式初值运行情况
通道0#:
方式3(方波计数初值:
OUT输出55ms方波至
0000H发生器)8259的IRQ08253通道2#:
(1KHz)计数初值:
,(1KHz方波)
(1190)
PB0、PB1:
方式0(简控制蜂鸣器发声。
0:
不发8255单输出)声,1:
发声8259IRQ0:
允许中断中断类型号:
8CPU响应8号中断2(程序要求
(1)程序启动时,要求输入定时时间,以秒为单位。
(2)按秒计时,每秒到达时,在屏幕上显示当前为第几秒,同时蜂鸣器发出短促叫声;
(3)当定时时间到,则显示“TimeUp!
”,结束程序。
三.实验步骤
1(建立源文件:
启动TURBOC++3.0,建立Timer.CPP。
保存到D:
\×(学号)\Timer.CPP;
2(设置TC工作目录:
选菜单Options/Directories,第1、2栏保持不变,第3、4栏填写您的文件存放目录,OK。
如此,TC生成的可执行文件等将会存放到此工作目录下。
四,实验代码
#include
#include
#include
#ifdef__cplusplus//定义C++使用的中断函数标识符。
若是×.C程序,则不需要#define__CPPARGS...
#else
#define__CPPARGS
#endif
intnTick=0,sec=0,flag=0;
unsignedcharsys_PB,my_PB;
voidinterruptfar(*sys_int_08)(__CPPARGS);//若是×.C,则函数参数不写voidinterruptfarmy_int_08(__CPPARGS)//若是××.C,则函数参数不写{//8号中断,每55ms中断一次,由8253的0号定时器定时,向8259IRQ0申请中断
++nTick;
if(tinck==1)outportb(0x61,my_PB);//开始鸣叫
elseif(tinck==3)outportb(0x61,sys_PB);//停止鸣叫
elseif(nTick>18)
{//1second/55ms近似等于18
sec++;
}
sys_int_08();//调用系统的中断向量
}
//==========================================voidmain()
{unsignedintTime_up;
printf("PleaseinputUpTime(5--30):
");
scanf("%d",&Time_up);
printf("\n");
if(Time_up<5||Time_up>30)
{printf("InputError!
");
exit
(1);//结束程序
}
outportb(0x63,0x82);//设置8255,PB为输入方式
sys_PB=inportb(0x61);//读取PB口,内容
my_PB=sys_PB|0x03;//将PB口低2位(PB0,PB1)置1
outportb(0x63,0x80);//设置8255,PB为输出方式
//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=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("TimerUp!
\n\n");
outportb(0x61,sys_PB);//恢复系统的PB口状态
setvect(0x08,sys_int_08);//恢复系统的中断向量}
五,实验结果
六实验总结
通过本次实验使我进一步了解了可编程并行接口8253和8255的工作方式及编程原理,可以编写简单的c语言程序控制8255A实现一些基本功能,了解了定时器/计数器8253、并行I/O接口8255A在PC机中的电路连接方法熟悉了拦截PC机中断向量的TC++编程方法但是在实验过程中同样出现了一些问题,经过自己及同组人的共同努力最终解决了问题,也加深了对8255A的了解。
学习了很多知识。
实验3基于DLL与HOOK技术的键盘消息拦截与读音一实验目的
1(了解MFCDLL动态连接库的编程方法;
2(了解HOOK技术和回调函数的运行机制;
3(学习MFC中加载动态连接库的方法。
二实验指导
1(HOOK的基本概念
在Windows下,当硬件或软件产生中断时,系统会发送一个消息给用户程序。
因此,用户程序一般不使用中断,而是采用拦截系统消息的方法。
为了拦截不属于本应用程序
的消息,拦截程序必须得到系统的认可,由系统安装成全局运行。
HOOK即通常所说的钩子。
实际上,HOOK就是上面所说的消息拦截程序段。
通过系统调用,把它挂入系统。
每当HOOK所希望的消息发出,在没有到达目的窗口前,HOOK程序就先捕获该消息,得到控制权。
HOOK程序先处理该消息,再向系统传递该消息。
也可以丢弃该消息。
系统维护着一个HOOK链,最近安装的HOOK总放在链的开始,从而得到优先执行。
2(HOOK函数的形式及其安装方法
HOOK函数在程序中应为全局函数,即:
HOOK函数不应写在一个类中。
HOOK函数是一个消息响应函数,由系统调用,应以回调函数的形式出现,其格式为:
LRESULT_declspec(dllexport)_stdcallCALLBACKKeyboardProc(
intnCode,//若为HC_ACTION,说明后两参数含有击键的消息WPARAMwParam,//虚键码
LPARAMlParam//击键的有关信息,如重复次数等
)
写好HOOK函数后,应进行安装,才能得到系统的回调。
安装HOOK的函数为:
HHOOKSetWindowsHookEx(
intidHook,//钩子的类型,按键为WH_KEYBOARD
HOOKPROClpfn,//钩子函数的地址
HINSTANCEhMod,//包含钩子函数的模块句柄
DWORDdwThreadId//指定监视的线程。
若为NULL,则为全局钩子
);
3(程序要求
(1)编写含有按键HOOK的DLL,要求当按键时,能读出按键名称
(2)编写安装DLL的应用程序。
三实验步骤
1(建立DLL
(1)启动VC++,选File\New
(2)进入MFCAppWizard_step1of1(3)在KeyHook.cpp文件中添加代码:
#include"stdafx.h"installhook()#include"KeyHook.h"{
#include"mmsystem.h"hkb=SetWindowsHookEx(WH_KEYBOARD,(H
#ifdef_DEBUGOOKPROC)KeyboardProc,hInst,0);
#definenewDEBUG_NEWreturnTRUE;#undefTHIS_FILE}
staticcharTHIS_FILE[]=__FILE__;BOOL__declspec(dllexport)UnHook()
#endif{
#pragmadata_seg(".SHARDAT")BOOLunhooked=
UnhookWindowsHookEx(hkb);staticHHOOKhkb=NULL;//定义HOOK
returnunhooked;句柄
#pragmadata_seg()}
LRESULTHINSTANCEhInst;//定义本实例的
__declspec(dllexport)__stdcall句柄
BOOL__declspec(dllexport)__stdcallCALLBACKKeyboardProc(intnCode,
WPARAMwParam,LPARAMlParam)BEGIN_MESSAGE_MAP(CKeyHookApp,{CWinApp)
if(((DWORD)lParam&0x40000000)&&END_MESSAGE_MAP()
(HC_ACTION==nCode))CKeyHookApp:
:
CKeyHookApp(){}
{CKeyHookApptheApp;
if(wParam>='A'&&wParam<='Z'){CKeyHookApp:
:
InitInstance()
char{
KeyName[20],temp[10];AFX_MANAGE_STATE(AfxGetStaticModule
strcpy(KeyName,"sound\\");State());
temp[0]=wParam;temp[1]=0;hInst=AfxGetInstanceHandle();
strcat(KeyName,temp);returnCWinApp:
:
InitInstance();
strcat(KeyName,".wav");}
sndPlaySound(KeyName,SND_ASYNC);intCKeyHookApp:
:
ExitInstance()
}{
}UnHook();
LRESULTRetVal=CallNextHookEx(hkb,returnCWinApp:
:
ExitInstance();nCode,wParam,lParam);}
return(RetVal);}
在keypress.cpp添加如下文件:
#include"stdafx.h"CDialog:
:
DoDataExchange(pDX);#include"KeyPress.h"}
#include"KeyPressDlg.h"BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)#ifdef_DEBUGEND_MESSAGE_MAP()
#definenewDEBUG_NEWCKeyPressDlg:
:
CKeyPressDlg(CWnd*#undefTHIS_FILEpParent/*=NULL*/)
staticcharTHIS_FILE[]=__FILE__;:
CDialog(CKeyPressDlg:
:
IDD,#endifpParent)
classCAboutDlg:
publicCDialog{
{m_hIcon=AfxGetApp()->LoadIcon(IDR_Mpublic:
AINFRAME);
CAboutDlg();}
enum{IDD=IDD_ABOUTBOX};void
protected:
CKeyPressDlg:
:
DoDataExchange(CDataEx
virtualvoidchange*pDX)
DoDataExchange(CDataExchange*pDX);{
protected:
CDialog:
:
DoDataExchange(pDX);
DECLARE_MESSAGE_MAP()}
};BEGIN_MESSAGE_MAP(CKeyPressDlg,CAboutDlg:
:
CAboutDlg():
CDialog)
CDialog(CAboutDlg:
:
IDD){}ON_WM_SYSCOMMAND()
voidON_WM_PAINT()
CAboutDlg:
:
DoDataExchange(CDataExchaON_WM_QUERYDRAGICON()nge*pDX)END_MESSAGE_MAP()
{BOOLCKeyPressDlg:
:
OnInitDialog()
{{
CDialog:
:
OnInitDialog();CAboutDlgdlgAbout;
ASSERT((IDM_ABOUTBOX&0xFFF0)==dlgAbout.DoModal();IDM_ABOUTBOX);}
ASSERT(IDM_ABOUTBOX<0xF000);else
CMenu*pSysMenu={
GetSystemMenu(FALSE);CDialog:
:
OnSysCommand(nID,
if(pSysMenu!
=NULL)lParam);
{}
CStringstrAboutMenu;}
strAboutMenu.LoadString(IDS_ABOUTBOvoidCKeyPressDlg:
:
OnPaint()X);{
if(!
strAboutMenu.IsEmpty())if(IsIconic())
{{
pSysMenu->AppendMenu(MF_SEPARATOR);CPaintDCdc(this);//device
contextforpainting
pSysMenu->AppendMenu(MF_STRING,SendMessage(WM_ICONERASEBKGND,IDM_ABOUTBOX,strAboutMenu);(WPARAM)dc.GetSafeHdc(),0);
}intcxIcon=
}GetSystemMetrics(SM_CXICON);
SetIcon(m_hIcon,TRUE);intcyIcon=
//SetbigiconGetSystemMetrics(SM_CYICON);
SetIcon(m_hIcon,FALSE);//SetCRectrect;
smalliconGetClientRect(&rect);
staticHINSTANCEhinstDLL;intx=(rect.Width()-cxIcon+1)/2;
BOOL(CALLBACK*inshook)();inty=(rect.Height()-cyIcon+1)/2;
if(hinstDLL=LoadLibrary((LPCTSTR)"kdc.DrawIcon(x,y,eyhook.dll"))m_hIcon);
{}
inshook=GetProcAddress(hinstDLL,else
"installhook");{
inshook();CDialog:
:
OnPaint();
}}
returnTRUE;//returnTRUEunless}
yousetthefocustoacontrolHCURSOR
}CKeyPressDlg:
:
OnQueryDragIcon()voidCKeyPressDlg:
:
OnSysCommand(UINT{
nID,LPARAMlParam)return(HCURSOR)m_hIcon;{}
if((nID&0xFFF0)==IDM_ABOUTBOX)
四,实验结果:
五,实验总结:
通过本次实验我了解了MFCDLL动态连接库的编程方法,了解HOOK技术和回调函数的运行机制,同时也学习了一些MFC中加载动态连接库的方法。
了解了DLL的可重用特性。
语言无关特性等等。
自己的实践能力也得到了很大的锻炼。
实验4MFC串行通信程序设计
一实验目的
1(了解使用MFC编写Windows应用程序的一般方法,熟悉WindowsAPI接口函数的使用;
2(熟悉定时器Timer()函数、RS232API接口函数的使用,两者之间的协调工作。
3(程序要求
(1)建立基于对话框的MFC程序框架,实现数据的发送和接收;
(2)调试程序时,本机发送,本机接收;
(3)将程序改为两机之间通信,一机发送,另一机接收。
三实验步骤
1(建立基于对话框的MFC工程:
以下假设工程名为Scom,对话框的类(Class)为
CscomDlg,对应的头文件为ScomDlg.h,源程序文件为ScomDlg.cpp。
#include"stdafx.h"protected:
#include"Scom.h"DECLARE_MESSAGE_MAP()
#include"ScomDlg.h"};
#ifdef_DEBUGCAboutDlg:
:
CAboutDlg():
#definenewDEBUG_NEWCDialog(CAboutDlg:
:
IDD)
#undefTHIS_FILE{
staticcharTHIS_FILE[]=}
__FILE__;void
#endifCAboutDlg:
:
DoDataExchange(CDataEx
classCAboutDlg:
publicchange*pDX)
CDialog{
{CDialog:
:
DoDataExchange(pDX
public:
);
CAboutDlg();}
enum{IDD=IDD_ABOUTBOX};BEGIN_MESSAGE_MAP(CAboutDlg,
}}AFX_DATACDialog)
protected:
END_MESSAGE_MAP()
virtualvoidCScomDlg:
:
CScomDlg(CWnd*
DoDataExchange(CDataExchange*pParent/*=NULL*/)
pDX);//DDX/DDVsupport:
CDialog(CScomDlg:
:
IDD,
}}AFX_VIRTUALpParent)
{{
m_SenTxt=_T("");
m_Receive=_T("");pSysMenu->AppendMenu(MF_SEPARAT
m_hIcon=OR);
AfxGetApp()->LoadIcon(IDR_MAINFRA
ME);pSysMenu->AppendMenu(MF_STRING,
}IDM_ABOUTBOX,strAboutMenu);
void}
CScomDlg:
:
DoDataExchange(CDataExc}
hange*pDX)SetIcon(m_hIcon,TRUE);
{//Setbigicon
CDialog:
:
DoDataExchange(pDXSetIcon(m_hIcon,FALSE););//Setsmallicon
DDX_Text(pDX,IDC_SendTxt,hCom=CreateFile("COM1",m_SenTxt);GENERIC_READ|GENERIC_WRITE,
DDX_Text(pDX,IDC_Receive,0,NULL,m_Receive);OPEN_EXISTING,0,NULL);
}if(hCom==(HANDLE)-1)
BEGIN_MESSAGE_MAP(CScomDlg,{
CDialog)MessageBox("创建串口1接
ON_WM_SYSCOMMAND()口实例失败","未找到COM1口
ON_WM_PAINT()",MB_ICONSTOP|MB_OK);
ON_WM_QUERYDRAGICON()returnTRUE;
ON_BN_CLICKED(IDC_SEND,}
OnSend)DCBdcb;
ON_WM_TIMER()GetCommState(hCom,&dcb);
END_MESSAGE_MAP()
BOOLCScomDlg:
:
OnInitDialog()BuildCommDCB("COM1:
1200,n,8,1",&d
{cb);//用字符串方式填充DCB结构.
CDialog:
:
OnInitDialog();SetCommState(hCom,&dcb);
ASSERT((IDM_ABOUTBOX&ComTimeOut;
0xFFF0)==IDM_ABOUTBOX);ComTimeOut.ReadIntervalTime
ASSERT(IDM_ABOUTBOX 0xF000); CMenu*pSysMenu=ComTimeOut.ReadTotalTimeoutMultipGetSystemMenu(FALSE);lier=0; if(pSysMenu! =NULL)ComTimeOut.ReadTotalTimeout {Constant=0; CStringstrAboutMenu;ComTimeOut.Wri
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 接口 技术 实验 报告