版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、武漢理工大學(xué)學(xué)士學(xué)位論文摘要2abstract31 問題定義42可行性研究52.1 技術(shù)可行性52.2 時間可行性53 需求分析63.1功能需求63.2 性能需求63.3接口要求73.3擴展74 總體設(shè)計84.1方案選取84.2模塊設(shè)計84.2設(shè)計數(shù)據(jù)庫94.3測試計劃115詳細設(shè)計125.1程序流程圖125.2數(shù)據(jù)結(jié)構(gòu)設(shè)計135.2.1針腳標識135.2.2針腳數(shù)據(jù)結(jié)構(gòu)135.2.3計數(shù)器數(shù)據(jù)結(jié)構(gòu)145.2.4led燈圖片數(shù)據(jù)結(jié)構(gòu)145.3過程設(shè)計145.3.1試圖模塊155.3.2初始化模塊225.3.3示波器模塊225.3.4數(shù)據(jù)庫模塊236系統(tǒng)測試256.1測試用例256.2測試結(jié)果2
2、57結(jié)論35參考文獻37致謝38摘要我們在科研和教學(xué)中經(jīng)常會遇到這樣的情況:(一)所用的儀器或者材料過于貴重;(二)儀器或者材料不充足;(三)需要做多次的實驗最終才能熟悉過程和操作。在這些情況下我們經(jīng)常使用計算機軟件模擬的方法,即虛擬實驗。我此次所研究的題目是“接口8253虛擬實驗的研究”。 mfc在windows程序設(shè)計中具有相當?shù)膬?yōu)勢,因此,采用mfc實現(xiàn)設(shè)計,而數(shù)據(jù)庫方面則采用sql server 2000。實現(xiàn)的功能如下:用戶可以對8253的三個計數(shù)器進行組合和選擇并且進行初始化;然后根據(jù)選擇進行相關(guān)儀器的連線;完成后,可以進行運行,而系統(tǒng)則會根據(jù)用戶的選擇情況對連線進行判斷,主要涉及
3、方面包括:連線組合是否正確,是否有漏掉的線,電源是否打開,如果連線錯誤,則會發(fā)出報警聲,報警燈泡也會亮起,彈出窗口提示用戶哪些線路連接出錯,并且在實驗板上用不同顏色的成對出現(xiàn)的圓圈標出錯誤地方;如果連線正確則燈泡根據(jù)輸出值進行閃動,并且此時,用戶也可以打開示波器觀察波形,在觀察的過程中可以更改波形的振幅,可以暫停波形進行觀察;而在操作的過程中,用戶也可以把自己的實驗信息(連線,計數(shù)器組合和選擇,初始化)進行保存,需要恢復(fù)時,只要打開相應(yīng)文件即可。由于此程序在運行過程中需要和用戶進行交互,所以需要用多線程的技術(shù)來進行處理。在本程序中,用了兩個輔助線程。一個用來處理燈泡的亮和滅,一個用來進行示波器
4、的顯示。關(guān)鍵詞:虛擬實驗,接口8253,mfc,多線程,sql server 2000abstractour research and teaching in such a situation often encountered: (a) equipment or material used is too expensive; (b) equipment or material is not sufficient; (c) the need to do many experiments to be familiar with the process and the operation. in
5、these cases, we often use the computer software simulation method, a virtual experiment. the subject i studied is "interface 8253 study of virtual experiment." mfc programming in the windows has a considerable advantage, therefore, achieve design using mfc, while the database is using sql
6、server 2000. the progaming achieves the following functions: the users can initialize the counters based on the selections of the them,then bind the circuit lines according to the initialization of the those;when completed,it can be run, and the system will check the lines based on the initializatio
7、n, mainly include: is the connection combination correct, whether there are missed lines, is the power turned on,.if errors were found , the system will sound an alarm, and the alarm led will light up, and pop-up window prompts the user for which line connection is error, and marks the wrong place w
8、ith different colors board pairs circle; if the connection is correct the output led bulbs flashing, and at this time, users can open the oscilloscope waveform, they can change the course of the amplitude of the waveform, and they can pause it to observe the waveform; in the course of operation, use
9、rs can save their own information (connection, composition and selection of the counter, initialization). open the appropriate file as long as you can. because the user interaction is required when this program is running , so multi-threading technology is needed. there are two worker threads in thi
10、s procedure. one is used to deal with light bulbs and off,and another is used for oscilloscope display. key words: virtual experiment, interface 8253, mfc , multi-threading, sql server 20001 問題定義 我的設(shè)計題目是:接口8253虛擬實驗的研究。 在教學(xué)和科研的過程中,經(jīng)常用到仿真實驗,也即虛擬實驗。一個好的虛擬實驗平臺,可以讓人通過軟件進行儀器的連接、調(diào)試得到實驗結(jié)果,我遇到過類似的實驗平臺,其中有做的讓
11、我記憶猶新的:功能人性化、界面漂亮、最重要的是模擬效果逼真,但是也有讓人失望的,例如:進入界面后讓人不知從何入手,缺少交互界面,缺少幫助提示,甚至幫助提示具有歧義,在進行實驗的時候不知道各個儀器的作用,如果想知道必須切換頁面才能出來,在進行儀器連接的時候線路粗糙,實驗過程中沒有保存功能,出錯的話必須重做,缺少撤銷或者回退功能,這樣的模擬實驗環(huán)境就失去了它的意義和作用,人們的思維總是被它殘缺的功能所打斷,不能讓人把自己的主要精力放在對實驗原理和過程的理解上。這次我所設(shè)計的是接口方面的模擬實驗,它的主要內(nèi)容如下:采用c+語言研究虛擬實驗中接口8253與cpu引腳之間地址線、數(shù)據(jù)線和控制線連線技術(shù);
12、包括接口8253和cpu引腳連線的儲存表示;連線與否表示;連線正確判斷;連線優(yōu)化。研究虛擬實驗中接口8253初始化設(shè)計、運行和結(jié)果;研究虛擬實驗板表示;實驗板在移動、放大、縮小以后,維持接口8253與cpu引腳連線;研究接口8253與cpu引腳連線儲存和引腳連線恢復(fù)。以前做過接口方面的程序設(shè)計,因為偏向硬件的原因,所以,我認為有如下幾個突出的問題:第一,芯片多,組合多。第二,連線多,線路復(fù)雜,容易出錯。第三,出錯后,不易進行調(diào)試。第四,實驗過程不清晰易懂。所以,對于模擬實驗而講,就要充分發(fā)揮電腦軟件的用作,在完成基本要求的同時,盡量解決上述幾個問題。2可行性研究2.1 技術(shù)可行性從技術(shù)的角度來
13、講,本設(shè)計需要的是windows方面的程序設(shè)計,而且需要數(shù)據(jù)庫方面的知識。通過分析,需要技術(shù)如下:一,加載實驗板圖片,led圖片等需要繪圖方面的知識,并且圖片需要放大,縮小等;二,連線以及示波器的顯示,需要畫線方面的知識,并且還需要一些技巧;三,還要涉及到對話框,控件,菜單,工具欄等方面內(nèi)容;四,數(shù)據(jù)要存儲,所以需要數(shù)據(jù)庫,另外,是針對多個用戶操作的,每個用戶都可以保存和恢復(fù)自己的信息,為了區(qū)別各個用戶,引導(dǎo)數(shù)據(jù)庫,又要設(shè)計到文件方面的操作;五,程序運行過程中用戶可以和程序進行交互,所以又要多線程的技術(shù)。通過以上的分析,本程序所需要的都不是很艱澀和申奧的技術(shù),只是涉及到會與不會,知道與不知道的
14、問題。在這些內(nèi)容中,有些是我已經(jīng)學(xué)過的,而大部分是我不會的,因為以前所進行的程序設(shè)計大部分是dos下的,所以還是需要很多地方從頭開始。有幾個地方需要注意,第一,連線與優(yōu)化,因為在實驗板中,8253相關(guān)的連線并不規(guī)則,所以,連線的時候要進行優(yōu)化,防止出現(xiàn)混線以及連線傳過針腳;第二,在繪圖的過程中,要注意進行資源的釋放,并且注意繪圖的安排,節(jié)省資源??傊瑥募夹g(shù)的角度而言,沒有大的問題。2.2 時間可行性從接到畢業(yè)設(shè)計題目,到畢業(yè)答辯,大概有四個月的時間,除去找工作的時間,應(yīng)該有三個月的時間來進行畢業(yè)設(shè)計,所以時間還是很充分的,半個月的時間,足可以把需要的技術(shù)弄懂,而一個月的時間是可以把程序給做出
15、來的,剩下的時間可以進行系統(tǒng)的測試,修補完善,以及寫論文了。綜合分析,這個設(shè)計可以很好的完成。3 需求分析3.1功能需求第一,系統(tǒng)應(yīng)該是多用戶的,這里的多用戶指的是,每個用戶都可以在試驗的過程中,保存自己的記錄(這些記錄包括計數(shù)器選擇和組合,各個計數(shù)器的計數(shù)值,針腳之間的連線信息等),進而,當下次使用時,直接恢復(fù)。第二,實驗板應(yīng)當可以放大和縮小,可以移動,并且在此過程中,保證長寬比不變。第三,有專門的初始化窗口,用來對計數(shù)器進行選擇和初始化,計數(shù)器的使用方式可以是多種的,不固定,可以任意排列組合,例如:用戶可以選擇0#,1#,2#計數(shù)器,也可以選擇2#,0#,1#計數(shù)器的組合,或者其中的某兩個
16、和某一個。而計數(shù)器的初始化應(yīng)該列出控制字的8個位,可以對每位進行初始化,(因為計數(shù)器的初始化包括讀寫方式,工作方式等,計數(shù)方式等,為了方便設(shè)計,讀寫方式可以固定,先讀低8位,再讀高8位,工作方式固定,按方式3,計數(shù)方式按照十進制),并且還要做到,在初始化之后可以對指定的計數(shù)器進行再次的修改(主要是計數(shù)值)。第四,應(yīng)當根據(jù)計數(shù)器的選擇和組合情況進行儀器和針腳之間的連線,連線要整潔,最好不要出現(xiàn)混線,并且,線路不要穿過針腳,要保存用戶的連線信息,當窗口移動,放大,縮小時連線應(yīng)當根據(jù)窗口進行相應(yīng)改變,保持和針腳的連接,并且已經(jīng)連好的線路可以撤銷。第五,當根據(jù)計數(shù)器初始化結(jié)果連線結(jié)束后,用戶便可以編譯
17、運行程序了,而在此之前,系統(tǒng)應(yīng)當可以檢查一些基本錯誤,例如:電源是否打開,連線是否和計數(shù)器的選擇和組合情況一致等。如果出現(xiàn)錯誤,則應(yīng)當具有報錯功能,例如:發(fā)出報警聲,報警led燈閃亮,彈出窗口顯示哪些線路連接錯誤,哪些應(yīng)該連接在一起,并且最好能在實驗板上,用不同顏色的成對圓圈標出應(yīng)該連在一起的針腳,例如:vcc應(yīng)該和gate1連接起來,那么vcc和gate1應(yīng)該用一樣顏色的圓圈標識起來,并且這中顏色要和其它的顏色不同,便于用戶分別;如果用戶連接正確,那么程序就可以運行,輸出信號。第六,當以上工作完成后,就應(yīng)該顯示結(jié)果了,顯示結(jié)果的最普通的辦法便是燈泡,將輸出波形連接到led燈上,根據(jù)led的亮
18、滅來顯示結(jié)果,另外最重要的是要有示波器,將輸出結(jié)果連接到示波器,這樣的話,就非常直觀的顯示出輸出結(jié)果了,波形的輸出應(yīng)該是動態(tài)的,但是為了方便用戶觀察,應(yīng)該有暫停的功能,來使波形暫停。3.2 性能需求第一,應(yīng)當保證運行的穩(wěn)定性,不能讓用戶實驗進行過程中,出現(xiàn)死機,程序崩潰等類似的錯誤,這樣用戶數(shù)據(jù)有可能就會丟失;第二,本系統(tǒng)不大,所以,運行過程中,不能占用太多資源。3.3接口要求在本系統(tǒng)中,接口主要指的是用戶接口。系統(tǒng)應(yīng)當清晰易懂,盡量和原實驗面板功能貼近,當用戶進入系統(tǒng)后,應(yīng)當知道該做什么,怎么做,一些功能鍵應(yīng)該盡量用通用的符號來表示,使用戶一看即明。3.3擴展系統(tǒng)有些地方需要擴展的。第一,工
19、作方式、讀寫方式、計數(shù)方式我都是采用的默認的方式,而,這些方式應(yīng)當可以進行選擇,并且實現(xiàn)相應(yīng)功能,與此同時,示波器的波形也應(yīng)當根據(jù)工作方式而定;第二,應(yīng)該8個led燈都可以工作,并且,在程序運行過程中,用戶可以把輸出信號進行切換,例如:現(xiàn)在是用led0顯示輸出信號,用戶可以把led0與輸出的連接線撤銷,而把輸出連接到led1上面,當用戶撤銷led0的連線時,led0滅,當連接了led1的連線時,led1亮。第三,撤銷,在系統(tǒng)中,我做了連線的撤銷,但是沒做用戶操作的撤銷(這個撤銷功能應(yīng)該可以撤銷用戶之前的一系列操作,例如,可以撤銷之前的連線信息,也可以在撤消了連線信息后進行恢復(fù)等)。4 總體設(shè)計
20、4.1方案選取從需求分析階段,確定了本系統(tǒng)支持多用戶的功能之后,我初步設(shè)想了兩套方案來實現(xiàn)。方案一:用戶在進入系統(tǒng)的時候都有自己的一個用戶名和用戶密碼(如果沒有可以創(chuàng)建),進入系統(tǒng)首先需要登錄,登錄成功后,如果要保存數(shù)據(jù)信息,則以此用戶名為索引條件,進行保存,若要恢復(fù),則以此用戶名為索引進行查詢,引導(dǎo)出此用戶名相關(guān)的信息,進行恢復(fù)。這種方案的好處是,每個用戶的信息是相互獨立的,用戶的數(shù)據(jù)比較安全。缺點是,比較麻煩,操作不直觀。方案二:用戶直接進入系統(tǒng),不需要用戶名和密碼,進入后用戶便可以直接對系統(tǒng)進行操作,當需要保存信息時,用戶需要創(chuàng)建一個文件,而這個文件內(nèi)部卻不存放任何信息,用戶文件僅僅用來
21、引導(dǎo)數(shù)據(jù)庫,數(shù)據(jù)庫中信息按文件名為索引條件進行保存,需要恢復(fù)時,是要打開自己的用戶文件即可,數(shù)據(jù)庫便會以此文件名為索引來查詢數(shù)據(jù),然后進行恢復(fù)。這個方案的好處是操作方便,適合用戶平時習(xí)慣。缺點是,數(shù)據(jù)相對不安全。綜合分析,我選擇了第二種方案,因為對于本系統(tǒng)而言,信息安全并不是最重要的因素,另外,別人可以破壞用戶數(shù)據(jù)的前提是,必須知道用戶的文件名。另外,也是最重要的因素,使用本系統(tǒng)的大都是教學(xué)工作者,而對這些人而言,習(xí)慣對他們非常重要,用文件引導(dǎo),更適合他們平時進行程序設(shè)計的方案,保存數(shù)據(jù)時,就像將程序保存在文件中,而恢復(fù)時,就像打開一個程序工作空間一樣方便。4.2模塊設(shè)計系統(tǒng)總體模型接口825
22、3虛擬實驗平臺視圖模塊示波器模塊計數(shù)器初始化模塊數(shù)據(jù)庫模塊本系統(tǒng)最重要有四大模塊,視圖模塊、計數(shù)器初始化模塊、示波器模塊、數(shù)據(jù)庫模塊。視圖模塊,主要負責以下功能:加載實驗板圖片,數(shù)據(jù)初始化,連線的繪制、撤銷,連線判斷,報警,燈泡的閃亮,數(shù)據(jù)的保存與恢復(fù)。初始化模塊,最主要就是實進行計數(shù)器的選擇和組合,并且進行計數(shù)值的初始化。示波器模塊,進行示波器的現(xiàn)實,繪制波形。數(shù)據(jù)庫模塊,將數(shù)據(jù)庫的操作進行封裝,提供給系統(tǒng)接口進行調(diào)用。4.2設(shè)計數(shù)據(jù)庫本系統(tǒng)涉及到的數(shù)據(jù)信息主要有:初始化信息(需要連接的針腳在實驗板中的位置),用戶的計數(shù)器初始化信息,用戶的連線信息。初始化信息表主要是要保存針腳以及圖片的坐標
23、,用來進行進行連線和加載圖片的時候使用。考慮到,在程序中使用數(shù)字來進行訪問那些針腳不方便,于是對針腳的id進行了定義,直接用定義的宏來進行調(diào)用。因為數(shù)據(jù)最后總是讀入數(shù)組中,為了訪問方便(不用查詢,直接通過下表來訪問),在數(shù)據(jù)庫總id就用宏名稱所代表的值來表示,因為涉及到調(diào)用針腳名字的地方(糾錯,顯示陣腳名),所以數(shù)據(jù)庫中還需要有針腳名稱這一項。用戶的計數(shù)器初始化信息表主要用來保存用戶對計數(shù)器的選擇和初始化,首先要有文件名,這用來標識用戶,其次要標明選擇的是哪個計數(shù)器,選擇的順序,計數(shù)值,工作方式,讀寫方式等。選擇順序是很重要的一項,它用來標明計數(shù)器的組合情況,這樣在程序中就方便進行計數(shù)器之間線
24、路的連接了。需要注意的是,本數(shù)據(jù)庫只用來保存被用戶選擇的計數(shù)器信息,沒有被選擇的不保存。用戶連線信息表,用來保存用戶的連線信息,連線信息應(yīng)當有以下幾項,當前針腳的id,引腳的名字,所連接到的針腳的id。有了所連接到的針腳的id便可以通過下表快速定位到所要連接到的針腳。便于繪制連線。 初始化信息表tablepinledid用來存放針腳在宏定義中的數(shù)字,用來唯一的標識針腳,x,int型,用來存放針腳的橫坐標;y,int型,用來存放針腳的y坐標;name,字符串,用來存放針腳的名稱。計數(shù)器初始化信息表recordcounter其中,username,字符串型,用來存放文件名,用來唯一標識用戶,是引導(dǎo)
25、用戶數(shù)據(jù)庫的主要項;counter,int型,用來存放被選中的計數(shù)器的標號;counternumber,int型,用來存放此計數(shù)器的計數(shù)值;sequence,int型,用來存放當前計數(shù)器被用戶組合的序列;rwstyle,int型,用來存放當前計數(shù)器的讀寫方式(默認是先讀低8位,再讀高8位);workstyle,int型,用來存放當前計數(shù)器的工作方式(默認是方式三) 用戶連線信息表recordpin 其中,username,char型,用來存放文件名,唯一標識用戶,是引導(dǎo)用戶數(shù)據(jù)庫的主要項;pinid,int型,用來保存針腳的id ;name,字符串型,用來存放針腳的名字,在必要的時候直接飲用名
26、字;bindtoid,int型,用來存放當前針腳所連接到的針腳的id,通過下表快速定位連接對象。4.3測試計劃測試主要圍繞計數(shù)器的選擇進行,針對不同的的組合情況進行測試,測試分別使用三個計數(shù)器,兩個計數(shù)器,單個計數(shù)器情況下,系統(tǒng)運行情況;測試連線是否整潔,是否有混線出現(xiàn),是否穿過針腳;測試糾錯功能是否準確和完善,當連線出錯時,是否會報錯,報錯信息是否和計數(shù)器的組合相一致,不同的針腳對表示圈顏色是否相異;然后需要測試燈泡的閃亮;測試示波器的運行是否正確,測試運行和停止功能鍵的作用等。5詳細設(shè)計加載實驗板圖片初始化基本數(shù)據(jù)5.1程序流程圖選擇并初始化計數(shù)器y繼續(xù)?n 用戶連線 檢錯 y有錯誤? n
27、運行退出系統(tǒng)5.2數(shù)據(jù)結(jié)構(gòu)設(shè)計好的程序,數(shù)據(jù)結(jié)構(gòu)非常重要,數(shù)據(jù)結(jié)構(gòu)設(shè)計的巧妙,那么程序處理起來就會方便,也會凸顯出來好的算法。我想這就是為什么數(shù)據(jù)結(jié)構(gòu)要和算法的課程安排在一起講的原因了吧,二者不分家。5.2.1針腳標識首先,每個針腳應(yīng)該有自己的標識。針腳信息也應(yīng)當在程序運行的早期加載進入數(shù)組中。為了在數(shù)組中定位的方便,那么針腳的標識用數(shù)字表示最為方便,因為這樣直接可以和數(shù)組的下表產(chǎn)生關(guān)系。而數(shù)字有個特點就是在程序中不容易明白它所代表的意義,因此,用宏對各個針腳進行了定義,為了下表計算的方便,對不同類型的針腳進行了分組(也即數(shù)字段)例如:9000-9001用來表示電源開關(guān),9002-9011用來
28、led燈,9022-9035用來表示計數(shù)器的針腳等等,這樣的話,就可以做到成批處理。5.2.2針腳數(shù)據(jù)結(jié)構(gòu)在系統(tǒng)中,針腳的計算最多,并且針腳的存儲也是用戶信息的一個重要組成部分,所以,針腳數(shù)據(jù)結(jié)構(gòu)的設(shè)計非常重要。首先,需要保存此針腳的坐標,所以設(shè)置cpoint變量point用來表示其位置;還要有針腳的標識id(int型);針腳的名字name(cstring型)而大部分針腳連接了之后,不能再進行連接,所以,用bool變量 clicked標識針腳是否被點擊過;因為涉及到重繪,所以不能將已經(jīng)連過線的針腳再次連線,用bool型變量binded來標識此針腳是否已經(jīng)繪制過;應(yīng)當有其連接到的針腳的id;應(yīng)當
29、有指向其連接到的針腳的指針。struct pincpoint point; /坐標int id; /標識bool clicked; /被點擊bool binded; /已經(jīng)和其他針腳連接cstring name; /針腳名字pin * bindto; /指向所連接到的針腳int bindtoid; /所連接到的針腳的id;5.2.3計數(shù)器數(shù)據(jù)結(jié)構(gòu)計數(shù)器的使用要涉及到以下幾個方面:用bool型變量selected來標識計數(shù)器是否被選擇;用int型變量rwstyle來標識本計數(shù)器的讀寫方式,默認是先讀低8位,再讀高8位;用int型變量workstyle來標識計數(shù)器的工作方式,默認是方式三;用int
30、型變量cout來標識計數(shù)器的計數(shù)值;用int型變量sequence來標識此計數(shù)器被選擇的序列。sequence這一項作用很重要,設(shè)計的也很巧妙,這樣可以為以后計線路的鏈接提供方便。struct counterbool selected; /被選中 初始值 false int rwstyle; /讀寫方式 初始值 -1 int workstyle; / 工作方式 初始值 -1int count; / 計數(shù)值 初始值 0int sequence ; /用來記錄計數(shù)器被選擇的次序 初始值 -1 ;5.2.4led燈圖片數(shù)據(jù)結(jié)構(gòu)電源開關(guān)打開后,連線出現(xiàn)錯誤,燈泡顯示輸出結(jié)果情況下需要加載led圖片,而
31、圖片的加載涉及到圖片的加載位置,和圖片大小的問題,而只要知道了圖片的左上角和右下角的坐標,那么圖片的大小自然也就可以計算出來了,于是采用如下的數(shù)據(jù)結(jié)構(gòu),用cpoint型變量lefttop來表示圖片左上角的坐標,用cpoint型變量rightbootom來表示圖片右下角的坐標。struct ledrectcpoint lefttop; /燈泡圖片左上角cpoint rightbottom; /燈泡圖片右下角;5.3過程設(shè)計經(jīng)過分析,我將程序的功能大體分為了四個模塊:試圖模塊,計數(shù)器初始化模塊,示波器模塊,數(shù)據(jù)庫模塊。視圖模塊,主要負責以下功能:加載實驗板圖片,數(shù)據(jù)初始化,連線的繪制、撤銷,連線判
32、斷,報警,燈泡的閃亮,數(shù)據(jù)的保存與恢復(fù)。初始化模塊,最主要就是實進行計數(shù)器的選擇和組合,并且進行計數(shù)值的初始化。示波器模塊,進行示波器的現(xiàn)實,繪制波形。數(shù)據(jù)庫模塊,將數(shù)據(jù)庫的操作進行封裝,提供給系統(tǒng)接口進行調(diào)用。因此,主要設(shè)計了四個類,來實現(xiàn)相關(guān)功能。視圖類:virtualexview,封裝了實驗板相關(guān)的操作,包括:加載圖片,加載初始信息,連線,響應(yīng)工具欄,菜單等;計數(shù)器初始化類:initialdlg,封裝了計數(shù)器初始化相關(guān)的操作,包括:計數(shù)器組合與選擇,計數(shù)值的設(shè)定;示波器顯示類:virtualexdlg,封裝了示波器顯示方面的操作,包括:設(shè)定頻率和振幅,繪制網(wǎng)格,繪制波形,增大和縮小振幅等
33、操作。5.3.1試圖模塊通過分析,本系統(tǒng)采用單文檔界面(sdi)即可實現(xiàn)。因為系統(tǒng)繪圖操作比較多,所以,把程序的核心功能都寫在了視圖模塊里面。視圖類主要成員變量的說明因為將視圖類作為了系統(tǒng)功能實現(xiàn)的全局區(qū)域,所以為了數(shù)據(jù)傳遞的方便,一些接口間經(jīng)常傳遞的數(shù)據(jù)需要以成員變量的形式使用。首先,需要保存針腳在實驗板中的初始坐標,定義一個pin *類型變量m_ppinarray來指向初始坐標數(shù)組。但是,這個坐標是不能參與計算的,因為加載圖片進入客戶區(qū)后,圖片的大小,位置都會產(chǎn)生變化,縮放后,圖片中,每個點相應(yīng)的坐標也產(chǎn)生了偏移。而繪圖或者連線需要知道當前各點坐標,要計算當前坐標,則需要獲得實驗板加載后,
34、圖片左上角的位置(客戶區(qū)左上角為(0,0)和圖像縮放的倍數(shù),這樣可以進行坐標的重定位,不過需要注意的是,必須重新定義一個pin類型的數(shù)組用以存放重定位后的坐標信息,成員變量m_ppinlinkedinfo(pin*類型)指向重定位后的坐標數(shù)組,成員變量m_scaletimes用來存放實驗板圖片的縮放倍數(shù),成員變量m_orgoffset(cpoint型)用來存放圖片左上角在客戶區(qū)的位置。坐標重定位公式如下:m_ppinlinkedinfoi.point.x= m_ppinarrayi.point.x/m_scaletimes+m_orgoffset.x;m_ppinlinkedinfoi.poi
35、nt.y= m_ppinarrayi.point.y/m_scaletimes+m_orgoffset.y;在繪制圖形的過程中,因為會出現(xiàn)閃屏的問題,而兼容dc和兼容位圖可以解決此問題,于是聲明了成員變量m_pdcmemory(cdc *型), m_pbitmap(cbitmap *型);而加載了實驗板圖片后,圖片的當前大小也是一個重要的數(shù)據(jù),所以用成員變量m_mapsize(csize型)來保存圖片當前大小。有三個計數(shù)器,為了程序控制的方便采用數(shù)組的結(jié)構(gòu)來保存三個計數(shù)器的信息,所以定義m_pcounter(counter*型)指向計數(shù)器數(shù)組。與8253相關(guān)的還有以下信息:計數(shù)器是否被初始化(
36、用bool型成員變量m_initialed來表示初始值為false,這個時候示波器是沒有輸出信號的);所連接的時鐘(用此時鐘的針腳id來表示,int型成員變量m_clkid);所連接的時鐘頻率(double型成員變量m_clk);傳遞給示波器的時鐘頻率(double型成員變量m_tempclk,如果計數(shù)器沒有被初始化,那么示波器的應(yīng)當沒有輸出信號的,但是這個時候時鐘頻率是確實存在的。);用戶選擇的計數(shù)器個數(shù)(int型成員變量m_iniedcounter);此外,對于計數(shù)器而言,很重要的一個信息就是計數(shù)器的組合選擇情況,即誰先誰后,這涉及到后面的針腳連線,怎么來進行判斷呢?我在counter數(shù)據(jù)
37、結(jié)構(gòu)中有個sequence成員變量來標明計數(shù)器選擇順序,是為了往數(shù)據(jù)庫中存放數(shù)據(jù)而設(shè)計的,但是如果要在連線的地方使用的話,需要判斷三個計數(shù)器時間的先后順序,這樣編碼會比較復(fù)雜,于是我用一個具有三個元素的序列數(shù)組來存放計數(shù)器的選擇情況,第一個元素存放第一個被選擇的計數(shù)器的下標,以此類推,成員變量m_seque(int*型)指向序列數(shù)組。視圖類主要函數(shù)的設(shè)計bool initialmembervar();進行數(shù)據(jù)的初始化,在構(gòu)造函數(shù)處調(diào)用,主要有針腳數(shù)組,led數(shù)組,計數(shù)器數(shù)組,計數(shù)器序列數(shù)組等。virtual void oninitialupdate();這個函數(shù)在初次調(diào)用ondraw函數(shù)之前調(diào)
38、用,所以,將實驗板圖片加載進入內(nèi)存的處理放在這個函數(shù)內(nèi)部最合適了。virtual void ondraw(cdc* pdc);在需要重繪的地方調(diào)用,此函數(shù)內(nèi)部則調(diào)用實驗板繪制函數(shù),加載燈泡圖片,重繪連線等函數(shù)。void loadbgmap(cdc *pdc);繪制實驗板,因為這個函數(shù)經(jīng)常被調(diào)用,而圖片加載進入內(nèi)存只用一次就行了,所以這個函數(shù)內(nèi)部只用來進行繪圖,圖片的加載則在另外的函數(shù)進行。為了做到縮放窗口的時候不閃爍,在此函數(shù)內(nèi)部采用雙緩沖的技術(shù)。為了使圖片美觀,采用拉伸繪圖的方式,并且保證圖片的高寬比不變,讓實驗板圖片始終處于客戶區(qū)的中間。所以,需要判斷當前客戶區(qū)的高寬比cr和圖片的高寬比b
39、r之間的大小關(guān)系,如果cr>br,那么表明客戶區(qū)比較高,圖片需要根據(jù)客戶區(qū)的寬度進行縮放,這個時候圖片左上角的坐標計算公式為: m_orgoffset.x = 0; m_orgoffset.y = tempclientheight/2 - height/2( m_orgoffset,圖片左上角的坐標,tempclientheight客戶區(qū)的高度,height圖片當前高度);如果cr<br則表明客戶區(qū)比較寬,圖片需要根據(jù)客戶區(qū)的高度進行縮放。于此同時,記錄縮放比例,計算圖片左上角在客戶區(qū)的坐標,這個時候圖片左上角坐標的計算公式為:m_orgoffset.x = tempclientw
40、idth/2 - width/2; m_orgoffset.y=0(其中,tempclientwidth為客戶區(qū)的寬度,width為圖片的當前寬度).然后調(diào)用坐標重定位函數(shù),根據(jù)縮放比例和圖片左上角位置進行坐標重定位。void recalculatepin();坐標重定位,在加載實驗板圖片后調(diào)用此函數(shù),重定位的對象是:針腳坐標,led燈坐標。計算出這些位置的當前坐標。void redrawline();這個函數(shù)用來進行連線重繪,在ondraw函數(shù)中調(diào)用,保證窗口在移動,縮放的過程中連線也進行相應(yīng)的改變。針腳元素都有一個clicked成員變量,如果此變量為ture,則將此針腳和bindto所指向
41、的針腳連線。并且在連線的時候要注意,不要重復(fù)連線,這個可以用binded變量來進行標記。即,在clicked為ture且binded為false的針腳才進行連線,然后將binded置為ture;當所有連線結(jié)束后,將所有針腳的binded項重新置為false為下次重繪做準備。在連線的時候是有兩種情況的,采用的是兩種不同的連線方式,一種是非直接連線,一種是pci總線相關(guān)的連線采用偏移量方式進行連線。當針腳是計數(shù)器相關(guān)針腳時,采用前者;如果是pci總線相關(guān)的針腳時,采用后者。void indirectline(cpoint pointone,cpoint pointtwo);這個函數(shù)用來進行連接計數(shù)
42、器,led燈,電源,時鐘之間的線路。因為這些線路之間沒規(guī)則,并且為了美觀,要用折線,不能出現(xiàn)混線,連線不能穿過針腳,所以要進行一些計算才能進行連接,并且連接的過程中要出現(xiàn)中間點,中間點的個數(shù)也不確定,先和中間點連接在和另外的端點連接,所以函數(shù)的名字叫做,即,“非直接連線”。它的實現(xiàn)如下圖:afcdeb這種連線的過程如下:要連接a點和b點,則,先用a的橫坐標,b的縱坐標得到中間點c,測a,c之間是否有其他針腳,如果沒有,則ac間直接連線然后用這樣的方法連接cb;如果a,c之間有針腳d,則a的縱坐標增加一偏移量,得到中間點e,同理測ae;再采用同樣的方法連接eb,直到從a連接到b。這是一個迭代的過
43、程。void cpubusline(cpoint cpointone,cpoint cpointtwo);這個函數(shù)負責連接pci總線和計數(shù)器之間的連線,因為這些線路很有規(guī)則,所以,連接的過程中只要添加一個偏移量,那么就不會出現(xiàn)混線,且不會穿過其它針腳。連接過程如下圖所示:aa1bcc1db1d1假設(shè)現(xiàn)在連接ab,cd;我設(shè)計采用采用兩個中間點,連接ab時,第一個中間點a1的縱坐標就是a點的縱坐標,而它的橫坐標是個初始值,先連接a和a1,然后用a1的橫坐標和b的縱坐標得到中間點b1連接a1和b1,再連接b1和b就可以得到一個折線了。而連接cd的時候,原理和ab相同,只不過,cd的第一個中間點c1
44、的橫坐標在a1的橫坐標的基礎(chǔ)上增加一個偏移量,這樣連接的線路便不會重合了。bool otherpininline(cpoint pointone,cpoint pointtwo,int h);在indirectline中被調(diào)用,判斷點在同一直線上的兩個點pointone和pointtwo之間是否有其它針腳,h用來標識當前的兩個點是在橫線上還是在縱線上。bool isrightpoint(cpoint currentpoint);此函數(shù)在onlbuttondown函數(shù)中被調(diào)用,用來控制連線的總體流程,判斷當前點擊的位置是否是合法點,對點擊的位置進行分組,根據(jù)位置的不同進行不同的操作,例如:如果是
45、電源打開按鈕,則加載power亮的led圖片,如果是連線點則需要判斷之前是否有等待連線的位置,如果有,則調(diào)用連線函數(shù)進行連線,并對針腳的成員信息進行更新(包括已經(jīng)被連線,連接對象的指針等);如果沒有,則當前點的信息需要進棧,等待下個連接點。bool ptinrectangle(cpoint currentpoint,pin *ppin);此函數(shù)在isrightpoint中被調(diào)用,用來判斷鼠標左鍵所點擊的位置是否在ppin*所指向的針腳的附近,如果在則說明左鍵所點擊的位置為合法點,進行接下來的工作,否則不為合法點,不做以后的響應(yīng)。void loadmybitmap(cpoint pointtop
46、left,cpoint pointbottomright,int id);此函數(shù)功能:將id所標識的圖片加載到左上角為pointtopleft右下角為pointbottomright的位置。在系統(tǒng)中有四個地方需要調(diào)用,第一,電源開關(guān)按鈕的圖片,因為隨著點擊電源開關(guān),開關(guān)按鈕應(yīng)當進行上下的移動,而這個功能是通過加載不同的圖片來實現(xiàn)的,一張圖片開關(guān)按鈕時在上部,另外一張圖片,開關(guān)按鈕在圖片的下部;第二,加載電源led燈,電源開的時候,電源led燈應(yīng)該亮,所以應(yīng)該加載電源led亮的圖片,電源關(guān)的時候應(yīng)該加載電源led滅的圖片而亮和滅是通過顏色的不同來實現(xiàn)的;第三,當出現(xiàn)錯誤時,加載報警圖片;第四,運
47、行后,加載led燈泡圖片。void onrbuttondown(uint nflags, cpoint point);這個函數(shù)用來撤銷連接的線。單擊鼠標右鍵,如果點擊的位置是已經(jīng)連接的針腳的話,就將此針腳的連線撤銷。事實上這里是將這兩個針腳的連接關(guān)系解除,然后調(diào)用redrawline函數(shù)來實現(xiàn)的。void checkline(cstring & strerror);此函數(shù)在運行前被調(diào)用,作用是按照用戶對計數(shù)器的選擇和組合情況,檢查線路連接是否正確。一般情況下,程序檢錯和糾錯功能的處理都是需要一些技巧的,本系統(tǒng)也是。它需要根據(jù)用戶對計數(shù)器的選擇情況而進行檢錯,而用戶的選擇和組合情況不是一
48、成不變的,具有多種組合方式,所以,如果用排列的方式的話,代碼編寫非常不變,于是,我設(shè)計一具有三個元素的整形數(shù)組m_queue來存放計數(shù)器的組合情況,其初始值全為-1,數(shù)組的第一個元素存放第一個被選擇的計數(shù)器的下標,第二個元素存放第二個被選擇的計數(shù)器的下標,第三個元素存放第三個被選擇的計數(shù)器的下標,這樣,如果沒選擇的話元素的值就是-1,再用一個變量m_iniedcounter存放被選擇的計數(shù)器的個數(shù)這樣會更加方便處理,在進行檢錯的時候,只用根據(jù)m_iniedcounter的值從m_queue的第一個元素開始進行檢測即可,m_queue中第一個元素的值作為下標所引用的計數(shù)器數(shù)的clk連接時鐘,ou
49、t連接到m_queue第二個元素的值作為下標所引用的計數(shù)器的clk,以此類推,遇到元素值為-1結(jié)束。此外所有被選擇的計數(shù)器的gate連接vcc,燈泡連接m_queue的最后一個有效元素做為下標所引用的計數(shù)器的out。按照這樣編碼處理就比較容易了,用for循環(huán)即可實現(xiàn)。剩余的檢測項目就比較簡單了,直接羅列即可。當然,遇到了錯誤應(yīng)當具有提示功能,用一個字符串變量來存放當前的出錯信息,到最后一起在彈出窗口中顯示。這樣的話,就需要獲得每個針腳的名字,而針腳所連接到的對象都是以id來保存的,所以,用函數(shù)getname來獲得針腳的名字。而每一對兒需要連載一起的針腳用相同顏色的圓圈來標識,這樣用戶就比較清晰
50、地定位到出錯的地方,糾正也比較容易,這個通過每次改變畫筆顏色來實現(xiàn)。cstring getname(int id);獲得針腳的名字,id是針腳的標識。因為針腳的id和其在數(shù)組中的位置有關(guān)系,所以可以直接通過下標來獲取針腳名字,不用通過查詢。pin * getpt(int id);獲得針腳的指針,id是針腳的標識。針腳的id和其在針腳數(shù)組中的位置有關(guān)系,所以可以直接通過下表來獲取針腳名字,不用通過查詢。void oneditclearout();將所有的連接信息和計數(shù)器初始化信息給清空。void onmenuiteminitial();創(chuàng)建并調(diào)用計數(shù)器初始化窗口,保存計數(shù)器的選擇個數(shù),和計數(shù)器的
51、選擇順序,以及各個計數(shù)器的初始化信息。void onmenuitem32771();創(chuàng)建并調(diào)用示波器窗口,根據(jù)計數(shù)器的選擇情況計算輸出波形的頻率,將輸出波形的頻率和時鐘頻率傳遞給示波器模塊。void oneditrun();判斷用戶連線情況是否有錯,如果有錯,則進行報錯,如果沒有錯誤,則創(chuàng)建并調(diào)用燈泡顯示線程。static uint ledthreadpro(lpvoid pparam);因為在燈泡顯示的過程中用戶會有其他操作,例如:調(diào)用示波器窗口,停止運行等。所以必須創(chuàng)建一個輔助線程來進行燈泡的顯示。輔助線程等待g_eventgo事件的信號產(chǎn)生,在oneditrun函數(shù)中,如果沒有連線錯誤,
52、則會將g_eventgo事件發(fā)送信號,并且創(chuàng)建線程函數(shù)ledthreadpro,來顯示燈泡。當然既然運行就應(yīng)當停止。這個線程函數(shù)也接受停止信號g_eventstop,此信號在oneditstop函數(shù)中發(fā)出,當輔助線程函數(shù)接受到此信號后,就從循環(huán)中跳出,然后線程函數(shù)結(jié)束。void oneditstop();系統(tǒng)停止用戶程序的運行,在此函數(shù)內(nèi)部發(fā)出g_eventstop信號。void onfilesave();此函數(shù)用來將用戶信息(包括計數(shù)器選擇組合信息,初始化信息,連線信息)保存入數(shù)據(jù)庫,并且產(chǎn)生用戶文件。如果此用戶文件已經(jīng)存在,則直接保存入此文件引導(dǎo)的數(shù)據(jù)項中,如果此用戶文件不存在則創(chuàng)建文件,
53、進行保存。保存入數(shù)據(jù)庫的時候,以用戶文件名作為主鍵的一部分來進行保存,方便以后的恢復(fù)。用成員變量m_filename,來存放用戶文件名。void onfilesaveas();另存為,這個函數(shù)的作用是把用戶信息另存存放,重新建立一個新的用戶文件,用此新的用戶名作為主鍵的一部分往數(shù)據(jù)庫中存入用戶數(shù)據(jù)。用成員變量m_filename,來存放用戶文件名。void onfileopen();打開用戶文件,打開文件后,用變量m_filename存放文件名,并且以此文件名為查詢條件去數(shù)據(jù)庫中查詢此用戶相關(guān)信息,進行恢復(fù)。然后按照此信息自動完成計數(shù)器初始化和連線,然后用戶可以再次基礎(chǔ)上進行其他操作。5.3.
54、2初始化模塊初始化模塊在視圖模塊的onmenuiteminitial中被調(diào)用,此模塊用初始化對話框窗口類cinitialdlg進行封裝。主要完成計數(shù)器的初始化情況,包括計數(shù)器的組合選擇,設(shè)置各個計數(shù)器的計數(shù)值等。用m_d0-m_d7來保存控制字信息,m_count保存計數(shù)值信息,然后傳遞給試圖模塊。5.3.3示波器模塊示波器模塊在onmenuitem32771函數(shù)中被調(diào)用,主要完成示波器的顯示和波形的繪制。功能在cvirtualexdlg類中進行了封裝。void loadbgmap(cdc *pdc);加載示波器圖片。void setparameter(double f,double a);設(shè)
55、置輸出波形的幅度和頻率。uint setampitudethredproc(lpvoid pparam);輔助線程函數(shù),用來設(shè)置示波器波形的振幅,當接收到g_eventchleamstart信號時,減小振幅,當接收到g_eventchriamstart信號時,增加振幅。當接收到g_eventpause信號時讓波形暫停,方便用戶的觀察。void onlbuttondown(uint nflags, cpoint point);當點擊鼠標左鍵時如果按鍵的位置在暫停鍵附近,則發(fā)出g_eventpause信號讓波形暫停,否則,發(fā)出g_eventchleamstar信號,讓波形的振幅減小。void onrbuttondown(uint nflags, cpoint point);當點擊鼠標右鍵時,發(fā)出g_eventchriamstart信號,讓波形的振幅增大。void drawsquarewave(double frequency, double amplitude);繪制時鐘信號波形和計數(shù)器輸出信號波形。時鐘信號由成員變量m_clk傳遞過來,m_clk是一個public類型的成員變量,在cvirtualexdlg對象被創(chuàng)建處(onmenuitem32771函數(shù)中)由視圖類對象的成員變量m_clk傳
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 足球場館改造項目預(yù)算
- 生物醫(yī)藥股權(quán)投資居間合同
- 湖北水利水電職業(yè)技術(shù)學(xué)院《中小學(xué)歌曲彈唱與教學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025年拓展訓(xùn)練合同范本大全:戶外拓展訓(xùn)練活動協(xié)議3篇
- 年度運載火箭電源系統(tǒng)市場分析及競爭策略分析報告
- 2025年度金融服務(wù)合同:銀行與金融科技企業(yè)3篇
- 2025年新三板掛牌企業(yè)市值管理服務(wù)合同
- 2025年房產(chǎn)共有權(quán)份額贈與合同3篇
- 2025年新能源產(chǎn)業(yè)商標專利權(quán)全面授權(quán)合同3篇
- 溫州浙江溫州泰順縣泗溪鎮(zhèn)中心衛(wèi)生院招聘編外工作人員駕駛員筆試歷年參考題庫附帶答案詳解
- GB/T 18476-2001流體輸送用聚烯烴管材耐裂紋擴展的測定切口管材裂紋慢速增長的試驗方法(切口試驗)
- GA 1551.5-2019石油石化系統(tǒng)治安反恐防范要求第5部分:運輸企業(yè)
- 拘留所教育課件02
- 沖壓生產(chǎn)的品質(zhì)保障
- 《腎臟的結(jié)構(gòu)和功能》課件
- 2023年湖南聯(lián)通校園招聘筆試題庫及答案解析
- 上海市徐匯區(qū)、金山區(qū)、松江區(qū)2023屆高一上數(shù)學(xué)期末統(tǒng)考試題含解析
- 護士事業(yè)單位工作人員年度考核登記表
- 天津市新版就業(yè)、勞動合同登記名冊
- 產(chǎn)科操作技術(shù)規(guī)范范本
- 人教版八年級上冊地理全冊單元測試卷(含期中期末試卷及答案)
評論
0/150
提交評論