接口課設(shè)實(shí)驗(yàn)報(bào)告.doc
《接口課設(shè)實(shí)驗(yàn)報(bào)告.doc》由會(huì)員分享,可在線閱讀,更多相關(guān)《接口課設(shè)實(shí)驗(yàn)報(bào)告.doc(33頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
接口課設(shè)實(shí)驗(yàn)報(bào)告 計(jì)算機(jī)0206班 熊蘭君(012002013804)一緒論 本實(shí)驗(yàn)是一個(gè)利用接口硬件平臺(tái)開(kāi)發(fā)的微機(jī)模擬系統(tǒng),它不僅考查了我們的對(duì)接口硬件的掌握和理解程度,同樣了鍛煉了我們的編程能力。在組長(zhǎng)的帶領(lǐng)下我們順利完成了這次實(shí)驗(yàn)課設(shè),并收獲了很多的相關(guān)知識(shí),而且鍛煉了我們的團(tuán)隊(duì)精神,受益匪淺。二實(shí)驗(yàn)?zāi)康?掌握接口硬件開(kāi)發(fā)平臺(tái)的使用方法,利用現(xiàn)有的實(shí)驗(yàn)平臺(tái)和PC機(jī),組成一個(gè)微機(jī)模擬應(yīng)用系統(tǒng); 掌握基本接口電路的綜合應(yīng)用掌握接口電路的驅(qū)動(dòng)程序和界面軟件的設(shè)計(jì)與編制,學(xué)會(huì)調(diào)試與測(cè)試接口軟件的一般方法微機(jī)接口技術(shù)及接口芯片的綜合應(yīng)用(重點(diǎn))三 實(shí)驗(yàn)題目及要求 選課系統(tǒng)學(xué)生通過(guò)下位機(jī)進(jìn)行選課,上位機(jī)對(duì)選課信息進(jìn)行統(tǒng)計(jì)。進(jìn)入系統(tǒng)需要密碼,密碼錯(cuò)誤或者操作錯(cuò)誤時(shí)報(bào)警。 系統(tǒng)由一個(gè)主控機(jī)監(jiān)控和若干個(gè)下位機(jī)組成,主控機(jī)負(fù)責(zé)數(shù)據(jù)處理,下位機(jī)負(fù)責(zé)訪問(wèn)接口。四 實(shí)驗(yàn)內(nèi)容 這次我們所做的選課系統(tǒng)功能還比較強(qiáng)大,它主要由主控機(jī),下位機(jī),執(zhí)行部件構(gòu)成。1.機(jī)實(shí)現(xiàn)管理員的功能,界面如下:主界面主要是方便管理員管理學(xué)生基本信息,課程基本信息,選課基本信息。它的功能有:1.增加基本信息;2.刪除基本信息;3.查詢基本信息。注意,所有的數(shù)據(jù)信息都存放在Sql server 數(shù)據(jù)庫(kù)上,程序先分析管理員的指令,然后通過(guò)ODBC(Open DataBase Connecttion)接口操作數(shù)據(jù)庫(kù)。另外,主控機(jī)程序?qū)崿F(xiàn)的另一個(gè)功能,也就是本程序的核心功能,就是接受下位機(jī)的選課信息。當(dāng)操作員按下“接受選課”按鈕后,主控機(jī)程序開(kāi)始接受遠(yuǎn)程選課信息,接收后會(huì)將該信息存入Sql server 數(shù)據(jù)庫(kù)中。2.下位機(jī)是給選課學(xué)生的信息窗口,它同時(shí)也起到了主控機(jī)和執(zhí)行部件信息傳送的作用,而實(shí)現(xiàn)這個(gè)功能是通過(guò)接口實(shí)驗(yàn)臺(tái)上的可編程串行接口芯片8251。但是選課還是通過(guò)執(zhí)行部件,而不是通過(guò)下位機(jī),這一點(diǎn)是十分重要的。以下就下位機(jī)的界面:下位機(jī)程序的功能是接受用戶選課信息,然后將該信息發(fā)送給上位機(jī)。需要選課的學(xué)生,可以先點(diǎn)擊“開(kāi)始選課”的按鈕,然后用撥碼開(kāi)關(guān)輸入想要選擇的功能。功能1代表選課,功能2代表查詢所有課程,功能3表示結(jié)束選課。選功能2后,程序會(huì)通過(guò)文本框輸出所有可供選擇的課程的相關(guān)信息。選功能1后,程序會(huì)一步一步提示用戶來(lái)操作。這里有兩個(gè)問(wèn)題,第一是如果學(xué)生輸入的密碼錯(cuò)誤,上位機(jī)會(huì)發(fā)送回代表錯(cuò)誤的信息,下位機(jī)根據(jù)該信息驅(qū)動(dòng)LED顯示燈報(bào)警;第二,如果學(xué)生所選的課程不存在,上位機(jī)亦會(huì)發(fā)送回相應(yīng)錯(cuò)誤代號(hào),下位機(jī)根據(jù)該代號(hào)啟動(dòng)報(bào)警程序。 3執(zhí)行部件由接口實(shí)驗(yàn)臺(tái)上的芯片:可編程的并行I/O接口芯片8255,可編程計(jì)數(shù)器8253,LED顯示燈,手動(dòng)開(kāi)關(guān)和一個(gè)按鈕開(kāi)關(guān)組成。它主要做為學(xué)生選課的輸入和警報(bào)提示。學(xué)生通過(guò)手動(dòng)開(kāi)關(guān)撥出用戶名密碼,還有想選的課程號(hào),按下按鈕表示確定。還可以選擇查看課程號(hào)和課程名。以上就是本系統(tǒng)的大致功能,當(dāng)然這只是一個(gè)模擬的系統(tǒng),它實(shí)現(xiàn)的功能都很簡(jiǎn)單。真正要達(dá)到實(shí)用的階段,還有很多細(xì)節(jié)需要完善。但基本的框架,在本系統(tǒng)中已經(jīng)得到了體現(xiàn)。 五.實(shí)施計(jì)劃及分工分工如下:首先夏永同學(xué)負(fù)責(zé)整個(gè)系統(tǒng)框架的設(shè)計(jì),odbc數(shù)據(jù)源的配置以及界面的設(shè)計(jì)。吳莎同學(xué)和武孟夢(mèng)同學(xué)負(fù)責(zé)上位機(jī)各個(gè)功能的實(shí)現(xiàn)以及與下位機(jī)的通信。我和賈玉芳同學(xué)負(fù)責(zé)下位機(jī)各個(gè)功能的實(shí)現(xiàn)以及硬件連接。同時(shí)我們所有人都參與了系統(tǒng)的測(cè)試工作。 首先是硬件的連接,按照我們的大概的設(shè)計(jì),下位機(jī)有一個(gè)很重要的的功能,就是反饋執(zhí)行部件的選擇信息,而這項(xiàng)功能除了軟件的設(shè)計(jì)外,最重要的就是硬件連接。對(duì)于執(zhí)行部件與下位機(jī)的通信重要是靠可編程并口8255實(shí)現(xiàn)的,對(duì)于8255我們用到了它的A口進(jìn)行輸出,B口進(jìn)行輸入,C口作為控制口。PA0PA7依次連接的是實(shí)驗(yàn)臺(tái)上的八個(gè)燈,其作用是當(dāng)用戶名和密碼不符合主控機(jī)中已存的相應(yīng)的用戶名和密碼時(shí),這八個(gè)燈就會(huì)輪回閃爍產(chǎn)生報(bào)警的效果。PB0PB7依次與實(shí)驗(yàn)臺(tái)上八個(gè)撥碼開(kāi)關(guān)連接,當(dāng)用戶要輸入數(shù)字信息時(shí),通過(guò)這八個(gè)開(kāi)關(guān)進(jìn)行輸入(注意這里的數(shù)字是用二進(jìn)制輸入而不是八位十進(jìn)制數(shù)字),開(kāi)始的時(shí)候我們將高低位接反了,直接導(dǎo)致整個(gè)系統(tǒng)混亂,因?yàn)楣δ茼?xiàng)輸入錯(cuò)誤。PC0口作為SW1的輸入口,當(dāng)SW1按下時(shí),會(huì)給PC0一個(gè)電平,程序輪詢查看,若發(fā)現(xiàn)PC0口變?yōu)椤?”時(shí),就將撥碼開(kāi)關(guān)的數(shù)字傳送給下位機(jī)進(jìn)行處理,所以這里PC0作為控制作用,這里還要注意在連接SW1時(shí),還要經(jīng)過(guò)一個(gè)74SL373芯片,這個(gè)芯片的OE#口必須和8255的PC4口連接,用PC4口來(lái)控制74SL373,當(dāng)PC4等于“1”時(shí),74SL373關(guān)閉,這時(shí)SW1就沒(méi)有任何作用了。還有就是負(fù)責(zé)雙機(jī)通信的8251芯片,這里我們用一根連接線將主控機(jī)和下位機(jī)到26芯插座連接起來(lái)進(jìn)行近距離通信,這個(gè)在實(shí)驗(yàn)平臺(tái)已經(jīng)完成好了,所以不再贅述??刂?251時(shí)鐘的是8253芯片,它的OUT2端與 8251的 TxC和RxC相連進(jìn)行控制,而8253的時(shí)鐘脈沖端CLK2與1MHZ脈沖信號(hào)進(jìn)行連接,至于它的GATE2與8255的PC6口連接進(jìn)行脈沖源的控制,以上就是下位機(jī)與執(zhí)行部件的硬件連接。 接下來(lái)就是程序的設(shè)計(jì)了,我們開(kāi)始用的C語(yǔ)言進(jìn)行編寫,后來(lái)因?yàn)橐M(jìn)一步完善系統(tǒng)功能,要用到ODBC連接數(shù)據(jù)庫(kù),還有界面的編寫就將持續(xù)移植到VC上使用C+語(yǔ)言。程序主要實(shí)現(xiàn)的功能有:1.將用戶名和密碼輸入并傳給主控機(jī)進(jìn)行正確性的判斷;2. 當(dāng)用戶選擇“1”號(hào)功能時(shí),用戶可以進(jìn)行選課,下位機(jī)將選課信息(學(xué)生號(hào)和課程號(hào))傳給主控機(jī)并存儲(chǔ)起來(lái);3. 當(dāng)用戶選擇“2”號(hào)功能時(shí),用戶可以查看選課信息(課程號(hào)和課程名); 4.當(dāng)用戶選擇“3”功能時(shí),退出選課系統(tǒng)。 這個(gè)程序按照功能來(lái)劃分兩大部分,一個(gè)是與傳送信息有關(guān)程序,二者是與界面有關(guān)的程序。由于界面相關(guān)程序由夏永同學(xué)負(fù)責(zé),所以這里就不多說(shuō)了,我們主要負(fù)責(zé)的是傳送信息有關(guān)的程序,大概如下:#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; /*界面相關(guān)*/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) /*寫字符傳到對(duì)應(yīng)地 /*址的端口DWORD dwError = 0;unsigned int error;DWORD BytesReturned; unsigned char Buffer3; /*BUFFER和pBUFFER是傳送過(guò)程中的unsigned char * pBuffer; /*中間緩沖區(qū)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) /*讀對(duì)應(yīng)地址的端口的信息unsigned int error;DWORD BytesReturned;unsigned char Buffer3; /*BUFFER和pBUFFER是傳送過(guò)程中的unsigned short * pBuffer; /*中間緩沖區(qū)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); /*通過(guò)8251芯片傳送數(shù)值tranint Recei(); /*接收發(fā)送到8251芯片的數(shù)值,便返回該值void set_bps(int bps); /*設(shè)置8253計(jì)數(shù)器的計(jì)數(shù)初值void sTrans(char * s); /*傳送字符串svoid sRecei(char * s); /*接受一個(gè)字符串,并存入s中void AddSC(int sid,int cid); /*添加一個(gè)選課記錄void sw(); /*檢測(cè)開(kāi)關(guān)sw1有沒(méi)有按下,如沒(méi)有按下,則等待void Warning(int level); /*當(dāng)用戶名和密碼不對(duì)時(shí)進(jìn)行報(bào)警enum IDD = IDD_SERVER_DIALOG ;CEditm_Output; /*系統(tǒng)信息CStringm_sid; /*學(xué)生信息中的學(xué)號(hào)信息CStringm_sname; /*學(xué)生信息中的學(xué)生姓名信息CStringm_password; /*密碼信息CStringm_cid; /*課程信息中的課程號(hào)信息CStringm_cname; /*課程信息中的課程名信息CStringm_ssid; /*選課信息中的學(xué)生號(hào)信息CStringm_ccid; /*選課信息中的課程號(hào)信息/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輸入時(shí)鐘頻率(十六進(jìn)制表示)CClientDlg: CClientDlg (CWnd* pParent ): CDialog(CClientDlg:IDD, pParent)/AFX_DATA_INIT(CServerDlg)m_sid = _T();m_password = _T();m_cid = _T();/AFX_DATA_INIT/以上是程序面板上文本框?qū)?yīng)的變量的定義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/以上是變量與資源的對(duì)應(yīng)關(guān)系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()/以上是消息與按鈕對(duì)應(yīng)關(guān)系的說(shuō)明void CClientDlg:Init8251(int state,int work) /*8251的初始化*/outportb(IO_BASE+9, 0x0) ; /* 空操作*/outportb(IO_BASE+9, 0x40) ; /* 內(nèi)部復(fù)位(使D6=1)*/outportb(IO_BASE+9, 0x4e) ; /* 方式命令字,,查課本p180*/outportb(IO_BASE+9, 0x27) ; /*工作命令字,例子p183*/void CClientDlg:set_bps(int bps) /*計(jì)數(shù)器設(shè)置int i,sendhigh,sendlow; i=clk/bps;i=i/factor;/計(jì)算計(jì)數(shù)初值sendhigh = (i8)&0x00ff;sendlow = i & 0x00ff;outportb(IO_BASE+7,0xb6);outportb(IO_BASE+6,sendlow);/裝計(jì)數(shù)初值低字節(jié)outportb(IO_BASE+6,sendhigh);/裝計(jì)數(shù)初值高字節(jié)void CClientDlg:Trans(int tran)/發(fā)送字符int state;dostate=inportb(IO_BASE+9);while(!(state=state&0x01);outportb(IO_BASE+8,tran);/*發(fā)送字符*/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關(guān)閉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(”請(qǐng)通過(guò)撥碼開(kāi)關(guān)輸入你想執(zhí)行功能的代號(hào)!撥好后按sw1按鈕輸入。”); sw(); Init8255(1);choose=inportb(0x301); if(choose=1) MessageBox(”請(qǐng)通過(guò)撥碼開(kāi)關(guān)輸入你的學(xué)號(hào)!撥好后按sw1按鈕輸入?!保? sw();Init8255(1);sid=inportb(IO_BASE +1);MessageBox(”請(qǐng)通過(guò)撥碼開(kāi)關(guān)輸入你的密碼!撥好后按sw1按鈕輸入?!保? sw ();Init8255(1);password=inportb(IO_BASE +1);MessageBox(”請(qǐng)通過(guò)撥碼開(kāi)關(guān)輸入你想選擇的課程代號(hào)!撥好后按sw1按鈕輸入?!保? sw();Init8255(1); cid=inportb(IO_BASE +1);m_sid=sid;m_password=password;m_cid=cid;UpdateData(false);/在面板上輸出學(xué)生通過(guò)撥碼開(kāi)關(guān)輸入的信息/開(kāi)始傳送用戶輸入的信息至上位機(jī)set_bps(1200);Init8251(1,1);outportb(IO_BASE +3,0x80);outportb(IO_BASE +3,0x0d);/置PC6=1,打開(kāi)8253-5的GATE2,開(kāi)始輸出方波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說(shuō)明課程存在 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,打開(kāi)8253-5的GATE2,開(kāi)始輸出方波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,打開(kāi)8253-5的GATE2,開(kāi)始輸出方波outportb(IO_BASE + 3,0x0d);Trans(choose);exit=0;。 五 流程圖開(kāi) 始Exit=1查詢SW1是否按下8251初始化CHOOSE=1讀8251A口賦給CHOOSE看SW1是否按下8251初始化讀8251A口賦給SID看SW1是否按下8251初始化CHOOSE=28251初始化傳給主控機(jī)選擇相應(yīng)功能主控機(jī)返回相關(guān)課程信息CHOOSE=38251初始化傳給主控機(jī)選擇相應(yīng)信息EXIT=0 讀8251A口賦給PASSWORD看SW1是否按下8251初始化讀8251A口賦給CID進(jìn)入主控機(jī)的相應(yīng)功能進(jìn)行選課傳給主控機(jī)主控機(jī)傳來(lái)的RFLAG=1?主控機(jī)傳來(lái)的CFLAG=1?結(jié) 束 發(fā)出警報(bào)開(kāi) 始課程錯(cuò)誤 七實(shí)驗(yàn)體會(huì) 如同原來(lái)的大型課設(shè)一樣,這次課設(shè)的成功也費(fèi)了一番周折。開(kāi)始我以為一組有那么多人,一定可以馬上就能完成,再看看題目也沒(méi)覺(jué)得有多么難。結(jié)果真正深入后才發(fā)現(xiàn)并不是我想的那么簡(jiǎn)單,在剛接觸接口時(shí)我們做的實(shí)驗(yàn)都很容易,而且都用的是匯編語(yǔ)言。但是如果我們這個(gè)選課系統(tǒng)還用匯編是行不通的,因?yàn)橛泻芏嗯袛喙δ苡脜R編是很難的,所以大家商量了以后就用了我們比較熟悉的C語(yǔ)言。因?yàn)閷?shí)驗(yàn)機(jī)支持C語(yǔ)言所以開(kāi)始動(dòng)手并不算困難,而且有很多函數(shù)就已經(jīng)寫好了,比如:OUTPORTB,INPUTB等。我們?cè)诓贾萌蝿?wù)的第二天就已經(jīng)寫好開(kāi)概程序,后來(lái)經(jīng)過(guò)調(diào)試也沒(méi)多大問(wèn)題。當(dāng)我們以為一切都搞好了之后實(shí)驗(yàn)老師忽然說(shuō)不能用臺(tái)子上的排線要自己連,想想也是,就編了個(gè)小程序就說(shuō)完成了接口設(shè)是不可能的。于是我們開(kāi)始動(dòng)手連起來(lái)了,最開(kāi)始我們?cè)囍M(jìn)行開(kāi)關(guān)與下位機(jī)的通信,發(fā)現(xiàn)傳的數(shù)字是錯(cuò)誤的,才發(fā)現(xiàn)了原來(lái)高低位接反了。這還是個(gè)小問(wèn)題,大問(wèn)題是我們的SW1的確認(rèn)信號(hào)怎么也傳不到下位機(jī),老是自動(dòng)有確認(rèn)信號(hào),原來(lái)開(kāi)始我們都以為SW1的控制信號(hào)是通過(guò)PC1傳過(guò)去的,但仔細(xì)看看才發(fā)現(xiàn)是PC0口。程序是我們編的,發(fā)生這種事實(shí)在不應(yīng)該,還有SW1要連接的74SL373要通過(guò)8255D 的PC4口連接,我們開(kāi)始也沒(méi)注意。這些都是硬件問(wèn)題還好解決,程序的問(wèn)題更讓人頭疼,因?yàn)槲覀儾](méi)有編寫界面,所以第一次檢查的時(shí)候老師并沒(méi)有讓我們通過(guò),說(shuō)作為一個(gè)系統(tǒng)界面是很重要的。于是我們又開(kāi)始編寫界面,因?yàn)镃語(yǔ)言不支持界面,所以我們只好把整個(gè)C語(yǔ)言程序移植到VC+中去,真的很麻煩有一些函數(shù)跟本不能使用,有一些函數(shù)在使用時(shí)與原來(lái)不同,就好像OUTPORTB等,我們的組長(zhǎng)C+基礎(chǔ)很好,所以他帶著我們編,花了一天時(shí)間也就好了。而我負(fù)責(zé)的通信部分也沒(méi)有那么難移植,只用改一些細(xì)節(jié)就可以了。弄好一切后,我們的系統(tǒng)就好了,也通過(guò)了老師的檢查,但是還是有很多不足,比如功能上的欠缺,有很多功能本可以完成但實(shí)在很困難,所以沒(méi)有繼續(xù)下去,老師曾提示我們主控機(jī)針對(duì)多個(gè)下位機(jī)的情況要經(jīng)過(guò)輪詢,這才跟現(xiàn)實(shí)功能都比較接近,我們也還只是一個(gè)實(shí)驗(yàn)系統(tǒng),十分脆弱,還不能運(yùn)用到實(shí)際中去,我們以后會(huì)把這個(gè)作為今后的發(fā)展目標(biāo)。原來(lái)做實(shí)驗(yàn)最多只有兩個(gè)人一起,但是這個(gè)實(shí)驗(yàn)是由我們五個(gè)人一起完成的,開(kāi)始還有懷疑五個(gè)人的想法不同不好干事,但我們的組長(zhǎng)十分有想法,他和我們商量好大概的構(gòu)想之后就分配好每個(gè)人的任務(wù),大家在十分友好協(xié)作的氛圍中完成了課設(shè)。讓我感覺(jué)每個(gè)工程背后都是一個(gè)團(tuán)隊(duì)的辛苦汗水換來(lái)的。同時(shí)也更好的理解了原來(lái)學(xué)過(guò)的接口原理,也讓我明白課設(shè)是溫習(xí)所學(xué)知識(shí)的最好方法,努力去做一定回有收獲。八源碼選課系統(tǒng)源代碼如下 說(shuō)明:系統(tǒng)程序代碼采用VC的MFC編制,很多代碼是系統(tǒng)自動(dòng)生成的。以下僅列出我們自己編寫的代碼部分。 程序中用到了ODBC數(shù)據(jù)源select,該數(shù)據(jù)源在控制面板中建立,用來(lái)訪問(wèn)數(shù)據(jù)庫(kù)SelectCourse,該數(shù)據(jù)庫(kù)中存放有3張表,分別是St,Co,Sc,代表學(xué)生,課程,和選課記錄。以下是建立數(shù)據(jù)庫(kù)時(shí)的sql語(yǔ)句: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,劉樹(shù)偉,88);insert into Co values(1,數(shù)學(xué));insert into Co values(2,語(yǔ)文);數(shù)據(jù)源建好后,程序便可良好運(yùn)行了。主控機(jī)程序代碼:/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);/通過(guò)8251芯片傳送數(shù)值tranint Recei();/接收發(fā)送到8251芯片的數(shù)值,便返回該值void set_bps(int bps);/設(shè)置8253計(jì)數(shù)器的計(jì)數(shù)初值int getPassword(int ssid);/返回學(xué)號(hào)為ssid的同學(xué)的密碼int checkCid(int ccid);/檢查課號(hào)為ccid的課程是否存在void sTrans(char * s);/傳送字符串svoid sRecei(char * s);/接受一個(gè)字符串,并存入s中void AddSC(int sid,int cid);/添加一個(gè)選課記錄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輸入時(shí)鐘頻率(十六進(jìn)制表示)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/以上是程序面板上文本框?qū)?yīng)的變量的定義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/以上是變量與資源的對(duì)應(yīng)關(guān)系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()/以上是消息與按鈕對(duì)應(yīng)關(guān)系的說(shuō)明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;/計(jì)算計(jì)數(shù)初值sendhigh = (i8)&0x00ff;sendlow = i & 0x00ff;outportb(IO_BASE+7,0xb6);outportb(IO_BASE+6,sendlow);/裝計(jì)數(shù)初值低字節(jié)outportb(IO_BASE+6,sendhigh);/裝計(jì)數(shù)初值高字節(jié)void CServerDlg:Trans(int tran)/發(fā)送字符int state;dostate=inportb(IO_BASE+9);while(!(state=state&0x01);outportb(IO_BASE+8,tran);/*發(fā)送字符*/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)/根據(jù)學(xué)號(hào)ssid查詢數(shù)據(jù)庫(kù)中該記錄的psswordCDatabase database;database.Open(_T(select);/數(shù)據(jù)源名稱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)/檢查課程號(hào)為ccid的課程是否存在CDatabase database;database.Open(_T(select);/數(shù)據(jù)源名稱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- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來(lái)的問(wèn)題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
9.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁(yè)顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開(kāi)word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 接口 實(shí)驗(yàn) 報(bào)告
鏈接地址:http://m.italysoccerbets.com/p-9044376.html