接口课设实验报告.doc

上传人:jian****018 文档编号:9044376 上传时间:2020-04-02 格式:DOC 页数:33 大小:153.50KB
返回 下载 相关 举报
接口课设实验报告.doc_第1页
第1页 / 共33页
接口课设实验报告.doc_第2页
第2页 / 共33页
接口课设实验报告.doc_第3页
第3页 / 共33页
点击查看更多>>
资源描述
接口课设实验报告 计算机0206班 熊兰君(012002013804)一绪论 本实验是一个利用接口硬件平台开发的微机模拟系统,它不仅考查了我们的对接口硬件的掌握和理解程度,同样了锻炼了我们的编程能力。在组长的带领下我们顺利完成了这次实验课设,并收获了很多的相关知识,而且锻炼了我们的团队精神,受益匪浅。二实验目的 掌握接口硬件开发平台的使用方法,利用现有的实验平台和PC机,组成一个微机模拟应用系统; 掌握基本接口电路的综合应用掌握接口电路的驱动程序和界面软件的设计与编制,学会调试与测试接口软件的一般方法微机接口技术及接口芯片的综合应用(重点)三 实验题目及要求 选课系统学生通过下位机进行选课,上位机对选课信息进行统计。进入系统需要密码,密码错误或者操作错误时报警。 系统由一个主控机监控和若干个下位机组成,主控机负责数据处理,下位机负责访问接口。四 实验内容 这次我们所做的选课系统功能还比较强大,它主要由主控机,下位机,执行部件构成。1.机实现管理员的功能,界面如下:主界面主要是方便管理员管理学生基本信息,课程基本信息,选课基本信息。它的功能有:1.增加基本信息;2.删除基本信息;3.查询基本信息。注意,所有的数据信息都存放在Sql server 数据库上,程序先分析管理员的指令,然后通过ODBC(Open DataBase Connecttion)接口操作数据库。另外,主控机程序实现的另一个功能,也就是本程序的核心功能,就是接受下位机的选课信息。当操作员按下“接受选课”按钮后,主控机程序开始接受远程选课信息,接收后会将该信息存入Sql server 数据库中。2.下位机是给选课学生的信息窗口,它同时也起到了主控机和执行部件信息传送的作用,而实现这个功能是通过接口实验台上的可编程串行接口芯片8251。但是选课还是通过执行部件,而不是通过下位机,这一点是十分重要的。以下就下位机的界面:下位机程序的功能是接受用户选课信息,然后将该信息发送给上位机。需要选课的学生,可以先点击“开始选课”的按钮,然后用拨码开关输入想要选择的功能。功能1代表选课,功能2代表查询所有课程,功能3表示结束选课。选功能2后,程序会通过文本框输出所有可供选择的课程的相关信息。选功能1后,程序会一步一步提示用户来操作。这里有两个问题,第一是如果学生输入的密码错误,上位机会发送回代表错误的信息,下位机根据该信息驱动LED显示灯报警;第二,如果学生所选的课程不存在,上位机亦会发送回相应错误代号,下位机根据该代号启动报警程序。 3执行部件由接口实验台上的芯片:可编程的并行I/O接口芯片8255,可编程计数器8253,LED显示灯,手动开关和一个按钮开关组成。它主要做为学生选课的输入和警报提示。学生通过手动开关拨出用户名密码,还有想选的课程号,按下按钮表示确定。还可以选择查看课程号和课程名。以上就是本系统的大致功能,当然这只是一个模拟的系统,它实现的功能都很简单。真正要达到实用的阶段,还有很多细节需要完善。但基本的框架,在本系统中已经得到了体现。 五.实施计划及分工分工如下:首先夏永同学负责整个系统框架的设计,odbc数据源的配置以及界面的设计。吴莎同学和武孟梦同学负责上位机各个功能的实现以及与下位机的通信。我和贾玉芳同学负责下位机各个功能的实现以及硬件连接。同时我们所有人都参与了系统的测试工作。 首先是硬件的连接,按照我们的大概的设计,下位机有一个很重要的的功能,就是反馈执行部件的选择信息,而这项功能除了软件的设计外,最重要的就是硬件连接。对于执行部件与下位机的通信重要是靠可编程并口8255实现的,对于8255我们用到了它的A口进行输出,B口进行输入,C口作为控制口。PA0PA7依次连接的是实验台上的八个灯,其作用是当用户名和密码不符合主控机中已存的相应的用户名和密码时,这八个灯就会轮回闪烁产生报警的效果。PB0PB7依次与实验台上八个拨码开关连接,当用户要输入数字信息时,通过这八个开关进行输入(注意这里的数字是用二进制输入而不是八位十进制数字),开始的时候我们将高低位接反了,直接导致整个系统混乱,因为功能项输入错误。PC0口作为SW1的输入口,当SW1按下时,会给PC0一个电平,程序轮询查看,若发现PC0口变为“1”时,就将拨码开关的数字传送给下位机进行处理,所以这里PC0作为控制作用,这里还要注意在连接SW1时,还要经过一个74SL373芯片,这个芯片的OE#口必须和8255的PC4口连接,用PC4口来控制74SL373,当PC4等于“1”时,74SL373关闭,这时SW1就没有任何作用了。还有就是负责双机通信的8251芯片,这里我们用一根连接线将主控机和下位机到26芯插座连接起来进行近距离通信,这个在实验平台已经完成好了,所以不再赘述。控制8251时钟的是8253芯片,它的OUT2端与 8251的 TxC和RxC相连进行控制,而8253的时钟脉冲端CLK2与1MHZ脉冲信号进行连接,至于它的GATE2与8255的PC6口连接进行脉冲源的控制,以上就是下位机与执行部件的硬件连接。 接下来就是程序的设计了,我们开始用的C语言进行编写,后来因为要进一步完善系统功能,要用到ODBC连接数据库,还有界面的编写就将持续移植到VC上使用C+语言。程序主要实现的功能有:1.将用户名和密码输入并传给主控机进行正确性的判断;2. 当用户选择“1”号功能时,用户可以进行选课,下位机将选课信息(学生号和课程号)传给主控机并存储起来;3. 当用户选择“2”号功能时,用户可以查看选课信息(课程号和课程名); 4.当用户选择“3”功能时,退出选课系统。 这个程序按照功能来划分两大部分,一个是与传送信息有关程序,二者是与界面有关的程序。由于界面相关程序由夏永同学负责,所以这里就不多说了,我们主要负责的是传送信息有关的程序,大概如下:#define PORTTALK_TYPE 40001#define IOCTL_READ_PORT_UCHAR CTL_CODE(PORTTALK_TYPE, 0x904, METHOD_BUFFERED, FILE_ANY_ACCESS)#define IOCTL_WRITE_PORT_UCHAR CTL_CODE(PORTTALK_TYPE, 0x905, METHOD_BUFFERED, FILE_ANY_ACCESS)#define IOCTL_GETINTCODE_PORT_UCHAR CTL_CODE(PORTTALK_TYPE, 0x906, METHOD_BUFFERED, FILE_ANY_ACCESS)unsigned char OpenPortTalk(void);void ClosePortTalk(void);void outportb(unsigned short PortAddress, unsigned char byte);unsigned char inportb(unsigned short PortAddress);portb(unsigned short PortAddress); /myport.cpp#include stdafx.h#include conio.h#include windows.h#include #include myport.hHANDLE PortTalk_Handle = NULL; /*界面相关*/unsigned char OpenPortTalk()PortTalk_Handle = CreateFile(.MPNP1, GENERIC_READ | GENERIC_WRITE, 0, NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);if(PortTalk_Handle = INVALID_HANDLE_VALUE)return -1;return 0;void ClosePortTalk()CloseHandle(PortTalk_Handle);void outportb(unsigned short PortAddress, unsigned char byte) /*写字符传到对应地 /*址的端口DWORD dwError = 0;unsigned int error;DWORD BytesReturned; unsigned char Buffer3; /*BUFFER和pBUFFER是传送过程中的unsigned char * pBuffer; /*中间缓冲区pBuffer = (unsigned char *)&Buffer0;*pBuffer = (unsigned char)PortAddress&0x0f;Buffer2 = byte;error = DeviceIoControl(PortTalk_Handle,IOCTL_WRITE_PORT_UCHAR,&Buffer,3,NULL,0,&BytesReturned,NULL);unsigned char inportb(unsigned short PortAddress) /*读对应地址的端口的信息unsigned int error;DWORD BytesReturned;unsigned char Buffer3; /*BUFFER和pBUFFER是传送过程中的unsigned short * pBuffer; /*中间缓冲区pBuffer = (unsigned short *)&Buffer0;*pBuffer = (unsigned char)PortAddress&0x0f;error = DeviceIoControl(PortTalk_Handle,IOCTL_READ_PORT_UCHAR,&Buffer,2,&Buffer,1,&BytesReturned,NULL);return(Buffer0);/ class CClientDlg : public CDialogpublic:CClientDlg(CWnd* pParent = NULL);void Init8251(int state,int work); /*初始化8251芯片void Trans(int tran); /*通过8251芯片传送数值tranint Recei(); /*接收发送到8251芯片的数值,便返回该值void set_bps(int bps); /*设置8253计数器的计数初值void sTrans(char * s); /*传送字符串svoid sRecei(char * s); /*接受一个字符串,并存入s中void AddSC(int sid,int cid); /*添加一个选课记录void sw(); /*检测开关sw1有没有按下,如没有按下,则等待void Warning(int level); /*当用户名和密码不对时进行报警enum IDD = IDD_SERVER_DIALOG ;CEditm_Output; /*系统信息CStringm_sid; /*学生信息中的学号信息CStringm_sname; /*学生信息中的学生姓名信息CStringm_password; /*密码信息CStringm_cid; /*课程信息中的课程号信息CStringm_cname; /*课程信息中的课程名信息CStringm_ssid; /*选课信息中的学生号信息CStringm_ccid; /*选课信息中的课程号信息/AFX_DATA/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CServerDlg)public:virtual LRESULT DisplayMessage(WPARAM wParam, LPARAM lParam) ;protected:virtual void DoDataExchange(CDataExchange* pDX);/ DDX/DDV support/AFX_VIRTUALprotected:/ Generated message map functions/AFX_MSG(CServerDlg)virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnDestroy();afx_msg void OnButton1();/查询所有课程afx_msg void OnButton2();/选课afx_msg void OnButton3();/确定/AFX_MSGDECLARE_MESSAGE_MAP();/ CClientDlg.cpp #include StdAfx.h#include Server.h#include ServerDlg.h#include ServerDlg.h#include #define factor 16 /*波特率因子16unsigned long int clk = 1193182; /*8251输入时钟频率(十六进制表示)CClientDlg: CClientDlg (CWnd* pParent ): CDialog(CClientDlg:IDD, pParent)/AFX_DATA_INIT(CServerDlg)m_sid = _T();m_password = _T();m_cid = _T();/AFX_DATA_INIT/以上是程序面板上文本框对应的变量的定义void CClientDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CServerDlg)DDX_Control(pDX, IDC_EDIT1, m_Output);DDX_Text(pDX, IDC_EDIT2, m_sid);DDX_Text(pDX, IDC_EDIT4, m_password);DDX_Text(pDX, IDC_EDIT5, m_cid);/AFX_DATA_MAP/以上是变量与资源的对应关系BEGIN_MESSAGE_MAP(CServerDlg, CDialog)/AFX_MSG_MAP(CServerDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_WM_DESTROY()ON_BN_CLICKED(IDC_BUTTON3, OnButton3)ON_BN_CLICKED(IDC_BUTTON1, OnButton1)ON_BN_CLICKED(IDC_BUTTON2, OnButton2)/AFX_MSG_MAPEND_MESSAGE_MAP()/以上是消息与按钮对应关系的说明void CClientDlg:Init8251(int state,int work) /*8251的初始化*/outportb(IO_BASE+9, 0x0) ; /* 空操作*/outportb(IO_BASE+9, 0x40) ; /* 内部复位(使D6=1)*/outportb(IO_BASE+9, 0x4e) ; /* 方式命令字,,查课本p180*/outportb(IO_BASE+9, 0x27) ; /*工作命令字,例子p183*/void CClientDlg:set_bps(int bps) /*计数器设置int i,sendhigh,sendlow; i=clk/bps;i=i/factor;/计算计数初值sendhigh = (i8)&0x00ff;sendlow = i & 0x00ff;outportb(IO_BASE+7,0xb6);outportb(IO_BASE+6,sendlow);/装计数初值低字节outportb(IO_BASE+6,sendhigh);/装计数初值高字节void CClientDlg:Trans(int tran)/发送字符int state;dostate=inportb(IO_BASE+9);while(!(state=state&0x01);outportb(IO_BASE+8,tran);/*发送字符*/int CClientDlg:Recei()/接收字符 int r,state; do state=inportb(IO_BASE+9); while(!(state=state&0x02); r=inportb(IO_BASE+8);/*接收字符*/ return r;void CClientDlg:sTrans(char * s)/传送字符串 int length=strlen(s); Trans(length); int i=0; for(;ilength;i+) Trans(si);void CClientDlg:Warning(int level) /*用户名和密码不匹配Init8255(1);printf(Password error or User not exist!n);if(level=1) int i=0;for(;i50;i+) outportb(IO_BASE +0,i); delay(100); void CClientDlg:sw(void) /*SW的按键控制*/int temp1,temp2,recv;temp1=inportb(IO_BASE +3); /*读8255的PC0口outportb(IO_BASE +3,0x81);outportb(IO_BASE +3,0x09);/置PC4=1关闭74LS373dorecv = inportb(IO_BASE +3);while(0x01&recv)!=0);/查SW1按下outportb(IO_BASE +3,0x02);outportb(IO_BASE +3,0x08);/outportb(IO_BASE +3,temp1);void CServerDlg:sRecei(char * s)/接收字符串 int length=Recei(); int i=0; for(;ilength;i+) si=Recei();void CClientDlg:OnButton3() /选课按钮 int cid,Rflag,iflag=1,sid,password,i,choose,exit=1,x,fflag=1,recv,cflag;char ch,*cx;while(exit) MessageBox(”请通过拨码开关输入你想执行功能的代号!拨好后按sw1按钮输入。”); sw(); Init8255(1);choose=inportb(0x301); if(choose=1) MessageBox(”请通过拨码开关输入你的学号!拨好后按sw1按钮输入。”); sw();Init8255(1);sid=inportb(IO_BASE +1);MessageBox(”请通过拨码开关输入你的密码!拨好后按sw1按钮输入。”); sw ();Init8255(1);password=inportb(IO_BASE +1);MessageBox(”请通过拨码开关输入你想选择的课程代号!拨好后按sw1按钮输入。”); sw();Init8255(1); cid=inportb(IO_BASE +1);m_sid=sid;m_password=password;m_cid=cid;UpdateData(false);/在面板上输出学生通过拨码开关输入的信息/开始传送用户输入的信息至上位机set_bps(1200);Init8251(1,1);outportb(IO_BASE +3,0x80);outportb(IO_BASE +3,0x0d);/置PC6=1,打开8253-5的GATE2,开始输出方波Trans(choose);Trans(sid);Trans(password);Rflag=Recei();if(Rflag)m_Output.ReplaceSel (User login!n);else Warning(1);continue;Trans(cid);cflag=Recei();if(cflag)/为1说明课程存在 m_Output.ReplaceSel (Select successfully!n);else m_Output.ReplaceSel (Course is not exists!);/ifelse if(choose=2) set_bps(1200);Init8251(1,1);outportb(IO_BASE +3,0x80);/置PC6=1,打开8253-5的GATE2,开始输出方波outportb(IO_BASE +3,0x0d);Trans(choose);int length,cid,i=0;char cnameLENGTH;m_Output.ReplaceSel (The course information :rn);m_Output.ReplaceSel (course-id course-namern);length=Recei();for(;ilength;+i)cid=Recei();sRecei(cname);m_Output.ReplaceSel (%d ,cid);m_Output.ReplaceSel (%sn,cname); else if(choose=3)set_bps(1200);Init8251(1,1);outportb(IO_BASE + 3,0x80);/置PC6=1,打开8253-5的GATE2,开始输出方波outportb(IO_BASE + 3,0x0d);Trans(choose);exit=0;。 五 流程图开 始Exit=1查询SW1是否按下8251初始化CHOOSE=1读8251A口赋给CHOOSE看SW1是否按下8251初始化读8251A口赋给SID看SW1是否按下8251初始化CHOOSE=28251初始化传给主控机选择相应功能主控机返回相关课程信息CHOOSE=38251初始化传给主控机选择相应信息EXIT=0 读8251A口赋给PASSWORD看SW1是否按下8251初始化读8251A口赋给CID进入主控机的相应功能进行选课传给主控机主控机传来的RFLAG=1?主控机传来的CFLAG=1?结 束 发出警报开 始课程错误 七实验体会 如同原来的大型课设一样,这次课设的成功也费了一番周折。开始我以为一组有那么多人,一定可以马上就能完成,再看看题目也没觉得有多么难。结果真正深入后才发现并不是我想的那么简单,在刚接触接口时我们做的实验都很容易,而且都用的是汇编语言。但是如果我们这个选课系统还用汇编是行不通的,因为有很多判断功能用汇编是很难的,所以大家商量了以后就用了我们比较熟悉的C语言。因为实验机支持C语言所以开始动手并不算困难,而且有很多函数就已经写好了,比如:OUTPORTB,INPUTB等。我们在布置任务的第二天就已经写好开概程序,后来经过调试也没多大问题。当我们以为一切都搞好了之后实验老师忽然说不能用台子上的排线要自己连,想想也是,就编了个小程序就说完成了接口设是不可能的。于是我们开始动手连起来了,最开始我们试着进行开关与下位机的通信,发现传的数字是错误的,才发现了原来高低位接反了。这还是个小问题,大问题是我们的SW1的确认信号怎么也传不到下位机,老是自动有确认信号,原来开始我们都以为SW1的控制信号是通过PC1传过去的,但仔细看看才发现是PC0口。程序是我们编的,发生这种事实在不应该,还有SW1要连接的74SL373要通过8255D 的PC4口连接,我们开始也没注意。这些都是硬件问题还好解决,程序的问题更让人头疼,因为我们并没有编写界面,所以第一次检查的时候老师并没有让我们通过,说作为一个系统界面是很重要的。于是我们又开始编写界面,因为C语言不支持界面,所以我们只好把整个C语言程序移植到VC+中去,真的很麻烦有一些函数跟本不能使用,有一些函数在使用时与原来不同,就好像OUTPORTB等,我们的组长C+基础很好,所以他带着我们编,花了一天时间也就好了。而我负责的通信部分也没有那么难移植,只用改一些细节就可以了。弄好一切后,我们的系统就好了,也通过了老师的检查,但是还是有很多不足,比如功能上的欠缺,有很多功能本可以完成但实在很困难,所以没有继续下去,老师曾提示我们主控机针对多个下位机的情况要经过轮询,这才跟现实功能都比较接近,我们也还只是一个实验系统,十分脆弱,还不能运用到实际中去,我们以后会把这个作为今后的发展目标。原来做实验最多只有两个人一起,但是这个实验是由我们五个人一起完成的,开始还有怀疑五个人的想法不同不好干事,但我们的组长十分有想法,他和我们商量好大概的构想之后就分配好每个人的任务,大家在十分友好协作的氛围中完成了课设。让我感觉每个工程背后都是一个团队的辛苦汗水换来的。同时也更好的理解了原来学过的接口原理,也让我明白课设是温习所学知识的最好方法,努力去做一定回有收获。八源码选课系统源代码如下 说明:系统程序代码采用VC的MFC编制,很多代码是系统自动生成的。以下仅列出我们自己编写的代码部分。 程序中用到了ODBC数据源select,该数据源在控制面板中建立,用来访问数据库SelectCourse,该数据库中存放有3张表,分别是St,Co,Sc,代表学生,课程,和选课记录。以下是建立数据库时的sql语句:create database SelectCourse;create table St(sid int not null primary key,sname char(10),password int);create table Co(cid int not null primary key,cname char(10);create table Sc(sid int,cid int,primary key (sid,cid);insert into St values(1,张浩,88);insert into St values(2,刘树伟,88);insert into Co values(1,数学);insert into Co values(2,语文);数据源建好后,程序便可良好运行了。主控机程序代码:/myport.h#define PORTTALK_TYPE 40001#define IOCTL_READ_PORT_UCHAR CTL_CODE(PORTTALK_TYPE, 0x904, METHOD_BUFFERED, FILE_ANY_ACCESS)#define IOCTL_WRITE_PORT_UCHAR CTL_CODE(PORTTALK_TYPE, 0x905, METHOD_BUFFERED, FILE_ANY_ACCESS)#define IOCTL_GETINTCODE_PORT_UCHAR CTL_CODE(PORTTALK_TYPE, 0x906, METHOD_BUFFERED, FILE_ANY_ACCESS)unsigned char OpenPortTalk(void);void ClosePortTalk(void);void outportb(unsigned short PortAddress, unsigned char byte);unsigned char inportb(unsigned short PortAddress);portb(unsigned short PortAddress); /myport.cpp#include stdafx.h#include conio.h#include windows.h#include #include myport.hHANDLE PortTalk_Handle = NULL; /* Handle for PortTalk Driver */unsigned char OpenPortTalk()PortTalk_Handle = CreateFile(.MPNP1, GENERIC_READ | GENERIC_WRITE, 0, NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);if(PortTalk_Handle = INVALID_HANDLE_VALUE)return -1;return 0;void ClosePortTalk()CloseHandle(PortTalk_Handle);void outportb(unsigned short PortAddress, unsigned char byte)DWORD dwError = 0;unsigned int error;DWORD BytesReturned; unsigned char Buffer3;unsigned char * pBuffer;pBuffer = (unsigned char *)&Buffer0;*pBuffer = (unsigned char)PortAddress&0x0f;Buffer2 = byte;error = DeviceIoControl(PortTalk_Handle,IOCTL_WRITE_PORT_UCHAR,&Buffer,3,NULL,0,&BytesReturned,NULL);unsigned char inportb(unsigned short PortAddress)unsigned int error;DWORD BytesReturned;unsigned char Buffer3;unsigned short * pBuffer;pBuffer = (unsigned short *)&Buffer0;*pBuffer = (unsigned char)PortAddress&0x0f;error = DeviceIoControl(PortTalk_Handle,IOCTL_READ_PORT_UCHAR,&Buffer,2,&Buffer,1,&BytesReturned,NULL);return(Buffer0);/ServerDlg.h : class CServerDlg : public CDialogpublic:CServerDlg(CWnd* pParent = NULL);void Init8251(int state,int work);/初始化8251芯片void Trans(int tran);/通过8251芯片传送数值tranint Recei();/接收发送到8251芯片的数值,便返回该值void set_bps(int bps);/设置8253计数器的计数初值int getPassword(int ssid);/返回学号为ssid的同学的密码int checkCid(int ccid);/检查课号为ccid的课程是否存在void sTrans(char * s);/传送字符串svoid sRecei(char * s);/接受一个字符串,并存入s中void AddSC(int sid,int cid);/添加一个选课记录enum IDD = IDD_SERVER_DIALOG ;CEditm_Output;CStringm_sid;CStringm_sname;CStringm_password;CStringm_cid;CStringm_cname;CStringm_ssid;CStringm_ccid;/AFX_DATA/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CServerDlg)public:virtual LRESULT DisplayMessage(WPARAM wParam, LPARAM lParam) ;protected:virtual void DoDataExchange(CDataExchange* pDX);/ DDX/DDV support/AFX_VIRTUALprotected:/ Generated message map functions/AFX_MSG(CServerDlg)virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnDestroy();afx_msg void OnButton3();afx_msg void OnButton1();afx_msg void OnButton2();afx_msg void OnButton5();afx_msg void OnButton4();afx_msg void OnButton6();afx_msg void OnButton7();afx_msg void OnButton11();afx_msg void OnButton12();/AFX_MSGDECLARE_MESSAGE_MAP();/ ServerDlg.cpp #include StdAfx.h#include Server.h#include ServerDlg.h#include ServerDlg.h#include #define factor 16 /波特率因子16unsigned long int clk = 1193182;/8251输入时钟频率(十六进制表示)CServerDlg:CServerDlg(CWnd* pParent ): CDialog(CServerDlg:IDD, pParent)/AFX_DATA_INIT(CServerDlg)m_sid = _T();m_sname = _T();m_password = _T();m_cid = _T();m_cname = _T();m_ssid = _T();m_ccid = _T();/AFX_DATA_INIT/以上是程序面板上文本框对应的变量的定义void CServerDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CServerDlg)DDX_Control(pDX, IDC_EDIT1, m_Output);DDX_Text(pDX, IDC_EDIT2, m_sid);DDX_Text(pDX, IDC_EDIT3, m_sname);DDX_Text(pDX, IDC_EDIT4, m_password);DDX_Text(pDX, IDC_EDIT5, m_cid);DDX_Text(pDX, IDC_EDIT6, m_cname);DDX_Text(pDX, IDC_EDIT7, m_ssid);DDX_Text(pDX, IDC_EDIT8, m_ccid);/AFX_DATA_MAP/以上是变量与资源的对应关系BEGIN_MESSAGE_MAP(CServerDlg, CDialog)/AFX_MSG_MAP(CServerDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_WM_DESTROY()ON_BN_CLICKED(IDC_BUTTON3, OnButton3)ON_BN_CLICKED(IDC_BUTTON1, OnButton1)ON_BN_CLICKED(IDC_BUTTON2, OnButton2)ON_BN_CLICKED(IDC_BUTTON5, OnButton5)ON_BN_CLICKED(IDC_BUTTON4, OnButton4)ON_BN_CLICKED(IDC_BUTTON6, OnButton6)ON_BN_CLICKED(IDC_BUTTON7, OnButton7)ON_BN_CLICKED(IDC_BUTTON11, OnButton11)ON_BN_CLICKED(IDC_BUTTON12, OnButton12)/AFX_MSG_MAPEND_MESSAGE_MAP()/以上是消息与按钮对应关系的说明void CServerDlg:Init8251(int state,int work) outportb(IO_BASE+9, 0x0) ;outportb(IO_BASE+9, 0x40) ;outportb(IO_BASE+9, 0x4e) ;outportb(IO_BASE+9, 0x27) ;void CServerDlg:set_bps(int bps)int i,sendhigh,sendlow;i=clk/bps;i=i/factor;/计算计数初值sendhigh = (i8)&0x00ff;sendlow = i & 0x00ff;outportb(IO_BASE+7,0xb6);outportb(IO_BASE+6,sendlow);/装计数初值低字节outportb(IO_BASE+6,sendhigh);/装计数初值高字节void CServerDlg:Trans(int tran)/发送字符int state;dostate=inportb(IO_BASE+9);while(!(state=state&0x01);outportb(IO_BASE+8,tran);/*发送字符*/int CServerDlg:Recei()/接收字符 int r,state; do state=inportb(IO_BASE+9); while(!(state=state&0x02); r=inportb(IO_BASE+8);/*接收字符*/ return r;int CServerDlg:getPassword(int ssid)/根据学号ssid查询数据库中该记录的psswordCDatabase database;database.Open(_T(select);/数据源名称CString temp= ;int pass;CRecordset recset;recset.m_pDatabase=&database; CString str=;CDBVariant var;str.Format(%d,ssid);CString Req=SELECT * FROM St where sid=+str+;str=;recset.Open(CRecordset:forwardOnly, Req, CRecordset:readOnly);if(recset.IsEOF() m_Output.ReplaceSel(用户不存在!);return 0;else m_Output.ReplaceSel(该用户存在 !rn); recset.GetFieldValue(password, var ); pass=var.m_iVal;recset.Close(); return pass;int CServerDlg:checkCid(int ccid)/检查课程号为ccid的课程是否存在CDatabase database;database.Open(_T(select);/数据源名称CString temp= ;CRecordset recset;recset.m_pDatabase=&database; CString str=;CDBVariant var;str.Format(%d,ccid);CString Req=SELECT * FROM Co where cid=+str+;str=;recset.Open(CRecordse
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 工作总结


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!