




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
數(shù)據(jù)處理采集波形計算波形測量數(shù)據(jù)顯示采集數(shù)據(jù)處理采集波形計算波形測量數(shù)據(jù)顯示采集波形顯示控制測量線測量系統(tǒng)設(shè)置采集存儲設(shè)置系統(tǒng)使用設(shè)置嵌入式數(shù)字存儲示波器軟件系統(tǒng)設(shè)計衰減控制觸發(fā)控制采集控制時基控制數(shù)據(jù)采集采集鍵盤設(shè)置采集設(shè)制軟硬件參數(shù).2數(shù)據(jù)采集數(shù)據(jù)采集包括采集控制、時基及衰減控制、觸發(fā)控制四部分。數(shù)據(jù)采集主要涉及到硬件方面,在本論文中不作詳細介紹。.3數(shù)據(jù)處理數(shù)據(jù)處理功能包括波形計算、波形測量兩部分。波形測量是一臺示波器的主要功能,包括:頻率、周期、峰峰值、最大、最小、平均值、高、低、幅值、脈沖寬度、周期平均值、周期均方根、延遲、下降時間、均方根、正占空比、正向超調(diào)、正寬度、上升時間、負占空比、負向超調(diào)、負脈沖寬度、相位等。(1)接口設(shè)計1)用戶接口用戶可以通過按測量按鈕調(diào)出波形測量的菜單,通過菜單可以選擇波形測量的測量類型。系統(tǒng)會根據(jù)用戶的測量類型對波形數(shù)據(jù)進行相應(yīng)的運算,并在波形顯示區(qū)域?qū)y量結(jié)果顯示出來。2)內(nèi)部接口波形測量是系統(tǒng)進行數(shù)據(jù)處理時的一個中間過程,其它模塊可以通過調(diào)用PrepareForMeasurementsMeasure函數(shù)完成此功能。(2)數(shù)據(jù)結(jié)構(gòu)設(shè)計為了實現(xiàn)波形的測量顯示,定義了結(jié)構(gòu)ShowMeasureInfo,此具體定義為:typedefstruct{BOOLShowMeasureFlag; //有無測量信息(1有測量0無測量) BYTEShowMeasureWave; //測量波行(CH1/CH2/Math/REF1-4)BYTEShowMeasureSelect; //測量選擇 COLORREFShowMeasureColor; //顏色doubleShowMeasureDate; //測量數(shù)據(jù)CStringShowMeasureStr; //測量數(shù)據(jù)字符串CStringShowMeasureOnScreenStr; //最終顯示在屏幕上的字符串}ShowMeasureInfo;(3)尚未解決的問題由于時間有限,沒有實現(xiàn)波形的數(shù)學(xué)計算功能。.4數(shù)據(jù)顯示數(shù)據(jù)顯示功能包括波形顯示、測量線測量兩部分。1.波形顯示控制功能設(shè)計此模塊包括顯示類型、對比度設(shè)置、余輝顯示、顯示格式和反向功能五部分。此模塊的數(shù)據(jù)處理流程如圖5.3所示。(1)接口設(shè)計1)用戶接口按示波器右邊的DISPLAY按鈕會在屏幕上顯示此菜單,可以在此處對波形的顯示控制進行設(shè)置。2)內(nèi)部接口圖波形顯示模塊數(shù)據(jù)處理流程圖畫線顯示是圖波形顯示模塊數(shù)據(jù)處理流程圖畫線顯示是否打點顯示進入顯示模塊余輝處理反向處理調(diào)色板選擇是否常規(guī)顯示屏幕顯示退出用來向波形顯示模塊傳遞設(shè)置信息的函數(shù)為://畫通道數(shù)據(jù)時應(yīng)該畫線還是打點voidSetDrawLineOrDrawPixel(BYTELineOrPixel);//根據(jù)背景方格的設(shè)置重新顯示波形顯示背景圖voidResetCtrlSize(BYTEStyle);//設(shè)置測量線類型voidSetCursorType(BYTECursorType);//設(shè)置菜單右邊第三個按鈕的動態(tài)文本voidSetWaveForm(BYTEWaveForm);(2)數(shù)據(jù)結(jié)構(gòu)設(shè)計 typedefstruct { BYTEDots; //光點顯示 BYTEGraticule; //網(wǎng)格 BYTECursorType; //測量線類型 BYTEColorPalette; //調(diào)色板類型BYTEYuHui; //余輝 WORDTimeSelect; //余輝時間 BYTEBeiGuang; //背光強度 }DisplayInfoStruct;(3)預(yù)采用的解決方案預(yù)采用的解決方案如表5-1所示。表5-1預(yù)采用的解決方案功能方案顯示類型設(shè)計對于矢量顯示直接將相鄰兩點連線,點顯示直接在采樣點位置打點。余輝顯示設(shè)計在每次畫當(dāng)前采集到的波形數(shù)據(jù)時,首先將當(dāng)前內(nèi)存中存儲的顏色值衰減,然后將新的波形信息畫上去。調(diào)色板選擇調(diào)色板可提供彩色顯示和黑白顯示,以滿足不同的需求。反向功能設(shè)計當(dāng)反向功能打開時,將采集到的波形數(shù)據(jù)正負取反。2.測量線測量顯示功能設(shè)計包括獨立和跟蹤兩種測量線。測量線測量模塊流程如圖5.4所示。得到測量線的位置計算測量值在顯示模塊中顯示測量結(jié)果得到測量線的位置計算測量值在顯示模塊中顯示測量結(jié)果(1)接口設(shè)計1)用戶接口按示波器右邊的CURSOR按鈕在屏幕上會顯示此菜單。用戶可以通過旋轉(zhuǎn)通用按鈕來調(diào)節(jié)縱向或者橫向測量線的位置。2)內(nèi)部接口在系統(tǒng)內(nèi)部,測量線的設(shè)置信息是通過一些函數(shù)傳遞給波形顯示模塊的。對應(yīng)兩種測量線的類型,分別提供了兩組函數(shù):對應(yīng)YT顯示格式的函數(shù)://設(shè)置測量線類型voidSetBarStyle(BYTEBarStyle);//設(shè)置垂直方向上的單位voidSetVUnits(BYTEVUnits);//設(shè)置水平方向上的單位//是否顯示測量線voidSetWaveForm(BYTEWaveForm);(2)數(shù)據(jù)結(jié)構(gòu)設(shè)計對應(yīng)兩種測量線的類型,設(shè)計了兩個結(jié)構(gòu)體。對應(yīng)YT顯示格式的結(jié)構(gòu)體: typedefstruct { BYTEBarStyle; //測量線的類型 BYTEMode; //模式 BYTEVUnits; //縱向單元 BYTEHUnits; //橫向單元CStringcString[6]; //記錄6項計算字符串 }CursorYTInfoStruct;對應(yīng)XY顯示格式的結(jié)構(gòu)體: typedefstruct { BYTEWaveForm; //是否顯示測量線 BYTEMode; //模式 }CursorXYInfoStruct;(3)預(yù)采用的解決方案預(yù)采用的解決方案如表5-2所示。表5-2預(yù)采用的解決方案功能方案獨立測量線當(dāng)通過旋轉(zhuǎn)按鈕時只移動選定的測量線。跟蹤測量線當(dāng)通過旋轉(zhuǎn)按鈕時同時移動兩測量線的位置。.5系統(tǒng)設(shè)置系統(tǒng)設(shè)置功能包括存儲設(shè)置、系統(tǒng)使用設(shè)置兩部分。1.存儲設(shè)置功能設(shè)計包括設(shè)置信息存儲、波形數(shù)據(jù)信息存儲兩部分。(1)接口設(shè)計1)用戶接口:可以通過按示波器右邊的SAVERECALL按鈕調(diào)出此功能菜單。2)內(nèi)部接口:對于設(shè)置信息存儲://將當(dāng)前系統(tǒng)的設(shè)置存儲到文件中voidSaveSetingShared(BYTEWitchFolder);//將保存的設(shè)置信息調(diào)用出來voidRecallSetingShared(BYTEWitchFolder);對于波形數(shù)據(jù)信息存儲://將波形數(shù)據(jù)保存到文件中voidSaveWaveToFile(BYTECurveWitch,BYTEMemWitch);//將保存在文件中的數(shù)據(jù)讀出來voidGetWaveFromFile(BYTECurveWitch,BYTEMemWitch);(2)預(yù)采用的解決方案預(yù)采用的解決方案如表5-3所示。表5-3預(yù)采用的解決方案功能方案設(shè)置信息存儲主要是菜單選擇、可用或者不可以用、菜單按鈕上的數(shù)據(jù)的保存。另外還有當(dāng)前系統(tǒng)某些特殊信息的存儲,例如:當(dāng)前選擇了哪幾個通道、觸發(fā)類型、同時顯示了幾組波形、各通道的水平時基設(shè)置等。波形數(shù)據(jù)信息存儲將波形數(shù)據(jù)信息按一定的規(guī)則格式保存到文件中,這樣在讀取時就可以按此種規(guī)則來方便的讀取。2.系統(tǒng)使用設(shè)置功能設(shè)計包括聲音的開和關(guān)、系統(tǒng)的自動校正、界面語言的選擇、系統(tǒng)故障記錄的瀏覽、顯示屏,鍵盤以及系統(tǒng)信息的測試、時間校正、查看幫助、波形錄制和播放、示波器接口設(shè)置以及頻率計的使用。(1)接口設(shè)計1)用戶接口:可以通過按示波器右邊的UTILITY按鈕調(diào)出此功能菜單。2)內(nèi)部接口:所有彈出的對話框都對外部提供了接口,下面以日期時間調(diào)整對話框為例說明其具體定義及調(diào)用方法。voidOnButtonYear(); //設(shè)置日期-年voidOnButtonMonth(); //設(shè)置日期-月voidOnButtonDay(); //設(shè)置日期-日voidOnButtonHour(); //設(shè)置時間-時voidOnButtonMinutes(); //設(shè)置時間-分voidOnButtonSecond(); //設(shè)置時間-秒voidOnButtonApply(); //應(yīng)用當(dāng)前的設(shè)置另外在voidOnMenuOff();函數(shù)中編寫對所有對話框的關(guān)閉代碼。對于系統(tǒng)的校驗期限,它直接對應(yīng)存儲在文件中的一個數(shù)據(jù),在系統(tǒng)啟動時通過調(diào)用voidIsToCalDueControl(doubleTerm);來判斷校驗期限是否已到。(2)數(shù)據(jù)結(jié)構(gòu)設(shè)計 typedefstruct { CErrorLogDlg*fErrorLogDlg; //錯誤日志對話框 CDateTimeDlg*fDateTimeDlg; //日期時間調(diào)整對話框 CScreenTestDlg*fScreenTestDlg; //屏幕測試對話框 CKeyTestDlg*fKeyTestDlg; //按鈕測試對話框 BYTEfLanguage; //選擇的語言 BYTECalDueDate; //校驗期限 BYTESound; //聲音設(shè)置 }UtilityInfoStruct;(3)尚未解決的問題錯誤日志還沒有完成。(4)預(yù)采用的解決方案預(yù)采用的解決方案如表5-4所示。表5-4預(yù)采用的解決方案功能方案聲音控制設(shè)計利用一個標(biāo)志來控制聲音是否輸出。系統(tǒng)的自動校正設(shè)計自動校正觸發(fā)電平水平中心位置等。界面語言的選擇設(shè)計通過判斷用戶選擇的語言來從文件中讀取相應(yīng)的語言信息。系統(tǒng)故障記錄的瀏覽設(shè)計從對應(yīng)的故障記錄文件中讀取以前保存下來的故障記錄。鍵盤測試設(shè)計當(dāng)用戶按壓或旋轉(zhuǎn)按鈕時,讓屏幕上對應(yīng)的按鈕顯示相應(yīng)的標(biāo)識。時間校正設(shè)計讀取用戶設(shè)置的時間值,將系統(tǒng)時間設(shè)置成此值。幫助設(shè)計將對應(yīng)的幫助文件中存儲的幫助數(shù)據(jù)讀取出來。5.2系統(tǒng)界面設(shè)計從整體看系統(tǒng)界面主要包括波形顯示背景圖、菜單控制兩部分。波形顯示背景圖要盡量的清潔美觀,并且要給用戶一個測量觀察波形的尺度標(biāo)準(zhǔn),在設(shè)計此背景圖時所有的線條全部用打點來實現(xiàn)。由于嵌入式設(shè)備本身內(nèi)存有限,且系統(tǒng)加載后要占大部分內(nèi)存,所以要求應(yīng)用程序占盡量少的內(nèi)存。在本系統(tǒng)中功能多,按鈕數(shù)量極大,若各個功能都用單獨按鈕提供給用戶要占相當(dāng)大內(nèi)存,且界面操作上不方便。而且示波器液晶屏較小,為實現(xiàn)美觀、大方、友好的人機交互界面,方便操作引導(dǎo),系統(tǒng)采用三級綱目存儲及顯示模式,將菜單存儲成樹型模式,而且采用了動態(tài)加載方法,即用戶用哪一組功能就臨時加載哪組菜單信息,用界面上的幾個按鈕動態(tài)更新菜單信息,這既節(jié)省內(nèi)存又便利用戶操作。示波器運行界面如圖5.5所示。圖5.5示波器運行界面5.波形顯示背景圖設(shè)計進入系統(tǒng)后,在屏幕中央有一塊黑色畫方格的主要用來顯示波形的區(qū)域即波形顯示背景圖。如圖5.6所示。圖5.6波形顯示背景圖根據(jù)用戶選擇的背景方格的不同,系統(tǒng)提供了四種顯示界面:全部、柵格、十字準(zhǔn)線、框架。為了顯示美觀且利于觀察波形,界面上下左右都分別對稱。所有線條均打點實現(xiàn)。在屏幕中央顯示十字線,可用它來確定波形的相對位置。波形顯示界面橫向有十個方格,縱向有八個方格將界面分成八十個正方形。對于每一個正方形,四個邊沿又被分別分成了五等份。在四個邊界和中間的十字線上都有長短不同的刻度,利于用戶測量波形。5.2.2按鈕設(shè)計系統(tǒng)中所有的菜單顯示都是通過按鈕來完成的。本系統(tǒng)中所設(shè)計的按鈕如圖5.7所示。圖5.7按鈕界面此按鈕可以在按鈕的上下左右四個位置顯示位圖或圖標(biāo),可以顯示基本的標(biāo)題信息,可以顯示動態(tài)文本信息。分為可用和不可以用兩種狀態(tài),其中當(dāng)為可用狀態(tài)時又分為按下和彈出兩種情況。根據(jù)以上分析將所有情況分類可以得到八種按鈕類型,各種按鈕類型的說明及對應(yīng)的函數(shù)如表5-5所示。在系統(tǒng)中編寫了CButton類,此類實現(xiàn)各種按鈕類型的畫法。由于在大多數(shù)情況下都是按鈕按下和彈出狀態(tài)的變化,而并沒有文本標(biāo)題或圖標(biāo)的變化,所以專門寫了ResetRightButtonStatus以及ResetBottomButtonStatus函數(shù)只用來改變按鈕按下和彈出狀態(tài)。為了使其它模塊能在程序中修改按鈕按壓、彈出、不可用狀態(tài),在CButton類中為其它模塊的訪問控制提供了幾個接口函數(shù),定義如下://設(shè)置按鈕壓下時的背景顏色voidSetPressBkGroundColor(COLORREFBkColor);//設(shè)置按鈕彈出時的背景顏色voidSetNonPressBkGroundColor(COLORREFBkColor);//設(shè)置按鈕不可用時的背景顏色voidSetDisableBkGroundColor(COLORREFBkColor);此外按鈕顯示的立體效果是通過顯示顏色深度的不同帶給人的視覺的錯覺,在程序中編寫了其它模塊可以設(shè)置邊沿顏色的接口函數(shù),定義如下://設(shè)置按鈕左邊和上邊邊沿的顏色voidSetLeftTopFrameColor(COLORREFLTColor);//設(shè)置按鈕右邊和下邊邊沿的顏色voidSetRightBottomFrameColor(COLORREFRBColor);另外為了標(biāo)識當(dāng)前正在選擇或設(shè)置哪一組菜單,在右部按鈕的頂部專門用一個按鈕顯示了此信息,它會跟隨底部按鈕選取的不同而顯示不同的信息。表5-5按鈕種類及對應(yīng)函數(shù)的說明序號按鈕類型說明對應(yīng)函數(shù)1沒有圖標(biāo)和位圖并且沒有動態(tài)文本的普通按鈕SetButton2沒有圖標(biāo)和位圖但有動態(tài)文本的普通按鈕SetButtonDText3通過資源中的位圖ID來得到位圖但沒有動態(tài)文本的按鈕SetButtonBitmapID4通過資源中的圖標(biāo)ID來得到圖標(biāo)但沒有動態(tài)文本的按鈕SetButtonIconID5通過資源中的位圖ID來得到位圖并且有動態(tài)文本的按鈕SetButtonBitmapIDDText6通過資源中的圖標(biāo)ID來得到圖標(biāo)并且有動態(tài)文本的按鈕SetButtonIconIDDText7通過圖標(biāo)名字符串得到圖標(biāo)但沒有動態(tài)文本的按鈕SetButtonIconName8通過圖標(biāo)名字符串得到圖標(biāo)并且有動態(tài)文本的按鈕SetButtonIconNameDText5.2.3菜單界面設(shè)計由于硬件開發(fā)模具的不同,本系統(tǒng)采用了兩種方式來顯示菜單。一種在底部和右部顯示菜單;一種只在右部顯示菜單。這兩種菜單的顯示都是在同一個工程代碼中實現(xiàn)的,在項目中首先定義了宏NEW_INTERFACE用來標(biāo)識當(dāng)前菜單的樣式,如果想改變菜單顯示的樣式,只要修改此宏的定義,然后重新編譯一次工程就可以生成新的菜單樣式對應(yīng)的應(yīng)用程序。由于系統(tǒng)功能復(fù)雜,菜單種類繁多,為了方便用戶的操作,采用了三級綱目存儲及顯示模式,即在文件中將菜單信息存儲成樹型結(jié)構(gòu)。相鄰兩級菜單通過設(shè)置特殊的數(shù)據(jù)段名稱將其聯(lián)系起來。在程序中通過讀取特定數(shù)據(jù)段中的菜單信息,來動態(tài)加載數(shù)據(jù)。利用此方法進行設(shè)計產(chǎn)生了一個問題,當(dāng)點擊按鈕時應(yīng)該如何判斷出應(yīng)該執(zhí)行哪個函數(shù)?在本系統(tǒng)中每加載一組菜單,就將該菜單對應(yīng)的所有函數(shù)地址存儲到動態(tài)數(shù)組中。當(dāng)用戶點擊按鈕時,通過按鈕所在位置來從動態(tài)數(shù)組中查找到對應(yīng)的函數(shù)地址,然后調(diào)用此函數(shù)來執(zhí)行相應(yīng)的操作。對于函數(shù)地址的查找專門編寫了一個函數(shù)ExecuteFunction,此函數(shù)的定義如下:voidCPcscopeDlg::ExecuteFunction(BYTEBottomWitch,BYTERightWitch){ //定義一個當(dāng)前類的成員函數(shù)地址變量 void(CPcscopeDlg::*FunAddr)(); CStringstr; str.Format(_T("%02u%02u"),BottomWitch,RightWitch); //按鈕位置查找函數(shù)地址 fFunctionMap.Lookup(str,FunAddr); //執(zhí)行找到的函數(shù) (this->*FunAddr)();}在程序中專門寫了一個讀取菜單的函數(shù)LoadMenuInforFromFile。在此函數(shù)中首先將用來存儲菜單信息的動態(tài)數(shù)組清空;然后讀取底部按鈕數(shù)量,再根據(jù)此數(shù)值來讀取每個底部按鈕對應(yīng)的右部按鈕的數(shù)量以及每個底部按鈕的屬性信息;最后根據(jù)得到的右部按鈕數(shù)量來循環(huán)讀取右部按鈕信息并將其存儲到動態(tài)數(shù)組中。菜單的顯示是通過讀取保存在數(shù)組中的菜單信息來完成的。系統(tǒng)詳細設(shè)計與實現(xiàn)系統(tǒng)能否正常、可靠地運行并且達到實用的目的,依賴于它的詳細設(shè)計與開發(fā)過程,本章講述了系統(tǒng)的詳細設(shè)計與實現(xiàn)過程,并對開發(fā)過程中的一些難點及其解決方案進行了闡述。5.3.1數(shù)據(jù)采集模塊數(shù)據(jù)采集模塊主要是從硬件RAM讀取數(shù)據(jù)到內(nèi)存緩沖區(qū)的過程。(1)從硬件讀取數(shù)據(jù)硬件完成采集過程后,把數(shù)據(jù)放入RAM,并通知軟件采集過程完成,軟件通過GetData(intch,short*pDataBuffer,intDataNunber)函數(shù)將數(shù)據(jù)讀入內(nèi)存緩沖區(qū),其核心代碼為:intOutPort;if(ch==0) OutPort=3;elseif(ch==1) OutPort=4;else return;for(inti=0;i<WAVEDATANUMBER;i++){ DP_OutpB(PORT5,0x80);//板卡RAM地址加1(產(chǎn)生讀數(shù)脈沖) DP_OutpB(PORT5,0); DP_OutpB(PORT6,OutPort);//開關(guān)方向到CH0/CH1 pDataBuffer[i]=(short)(128.0-DP_InpB(PORT7));}數(shù)據(jù)處理模塊數(shù)據(jù)處理功能包括波形計算、波形測量兩部分。由于時間有限沒有完成波形的計算,現(xiàn)只介紹波形測量部分:波形測量分為23個測量類型,分別為:頻率、周期、峰峰值、最大、最小、平均值、高、低、幅值、脈沖寬度、周期平均值、周期均方根、延遲、下降時間、均方根、正占空比、正向超調(diào)、正寬度、上升時間、負占空比、負向超調(diào)、負脈沖寬度、相位。由于測量類型比較多,為了較好的管理各個函數(shù),節(jié)省代空間,特別設(shè)計了函數(shù)指針和字符串?dāng)?shù)組。其核心代碼如下所示://以下計算兩個數(shù)據(jù)//fMeasure.ShowMeasureInfo[i].ShowMeasureDate//fMeasure.ShowMeasureInfo[i].ShowMeasureStr//函數(shù)指針,指向該fMeasure.ShowMeasureInfo[i].ShowMeasureSelect//測量類型的計算函數(shù); (this->*(fMeasure.FunAddr[fMeasure.ShowMeasureInfo[i].ShowMeasureSelect-1]))(fMeasure.ShowMeasureData,&fMeasure.ShowMeasureInfo[i]);//拼組顯示字符串fMeasure.ShowMeasureInfo[i].ShowMeasureOnScreenStr=WaveStr[fMeasure.ShowMeasureInfo[i].ShowMeasureWave]+fMeasure.MeasureStr[fMeasure.ShowMeasureInfo[i].ShowMeasureSelect-1]+_T("\r\n")+fMeasure.ShowMeasureInfo[i].ShowMeasureStr;.3數(shù)據(jù)顯示模塊數(shù)據(jù)顯示模塊包括波形顯示、測量線測量顯示兩部分。1.波形顯示模塊的設(shè)計與開發(fā)波形顯示模塊根據(jù)顯示設(shè)置信息將波形數(shù)據(jù)顯示出來,此模塊包括顯示類型、余輝顯示、顯示格式、反向功能、調(diào)色板和菜單保持七部分。(1)顯示類型設(shè)計在屏幕上畫波形時有兩種類型即矢量和點。由于在硬件設(shè)備中用系統(tǒng)的畫線函數(shù)(MoveTo、LineTo)和打點函數(shù)(SetPixel)速度緩慢,使示波器刷新頻率降低,所以在系統(tǒng)中自行實現(xiàn)了這兩個函數(shù)的編寫。畫線函數(shù)是以Bresenham畫線函數(shù)為基礎(chǔ),通過判斷X和Y兩個方向上的絕對差值的大小,然后決定以誰為遞進的基準(zhǔn)。當(dāng)X方向絕對差值較大時,先判斷起點和終點的X值的大小,如果終點較小,則兩個值交換,以保證畫線的方向是從左到右。然后依次將各個點畫出來。在畫線函數(shù)中畫每個點時也是調(diào)用的打點函數(shù)。打點函數(shù)的代碼如下:voidCDrawCurveCtrl::SetPixelFunction(unsignedshortWidth,LPVOIDlpBits_mem,intx,inty,WORDPixelData){ if(y<0||x>(fWindowStruct.fDrawCtrlWindowWidth-1)||y>fWindowStruct.fDrawCtrlWindowHeight||x<0) return; ((WORD*)lpBits_mem)[Width*y+x]=PixelData;}在此打點函數(shù)中可以看到,在打點前有一個非常重要的判斷條件,即所要顯示的點不能超出畫波形背景圖的矩形范圍。真正的打點其實是修改位圖對應(yīng)的內(nèi)存中對應(yīng)位置的數(shù)值。由于系統(tǒng)是16位色,所以直接修改一個字的寬度的數(shù)值。PixelData是一個16位數(shù)值,但顏色值是COLORREF類型即32位,所以需要將一個COLORREF類型的顏色數(shù)值轉(zhuǎn)化成16位的系統(tǒng)能顯示的數(shù)值。16位的顏色值有555和565兩種格式。在555格式下紅、綠、藍的掩碼分別是0x7C00、0x03E0、0x001F,在565格式下紅、綠、藍的掩碼分別是0xF800、0x07E0、0x001F。對于565格式其實現(xiàn)代碼如下:WORDCDrawCurveCtrl::RGBColorTo16Col565(COLORREFCol){ WORDPixelData=0; PixelData|=(((WORD)(Col>>3))&(0X1F))<<11; PixelData|=(((WORD)(Col>>10))&(0X3F))<<5; PixelData|=((WORD)(Col>>19))&(0X1F); returnPixelData;}對于555格式其實現(xiàn)代碼如下:WORDCDrawCurveCtrl::RGBColorTo16Col555(COLORREFCol){ WORDPixelData=0; PixelData|=(((WORD)(Col>>3))&(0X1F))<<10; PixelData|=(((WORD)(Col>>11))&(0X1F))<<5; PixelData|=((WORD)(Col>>19))&(0X1F); returnPixelData;}另外在項目中具體應(yīng)該選擇哪一種顯示格式,經(jīng)過測試發(fā)現(xiàn)應(yīng)該用555格式。為了在代碼中調(diào)用方便,用一個宏(RGBColorTo16Col)來標(biāo)識了兩個函數(shù)的實現(xiàn)。這個宏的定義為:#ifdefWEITU565#defineRGBColorTo16Col RGBColorTo16Col565#else#defineRGBColorTo16Col RGBColorTo16Col555#endif(2)余輝顯示設(shè)計對于余輝的處理,即將屏幕上的顏色矩陣數(shù)據(jù)減少一個包含的元素相等的矩形數(shù)據(jù),其最終計算得到的矩形數(shù)據(jù)即為余輝處理后的顏色數(shù)據(jù)。余輝處理的原理的計算公式為:其中k為應(yīng)該衰減的顏色數(shù)值。k值的計算是一個復(fù)雜的過程,下面對它的具體計算方法進行說明。要實現(xiàn)顏色的衰減顯示效果,在代碼中應(yīng)逐漸衰減位圖對應(yīng)內(nèi)存中存儲的顏色值。具體衰減數(shù)值的大小需要根據(jù)相鄰兩次刷新屏幕的時間差值來計算。下面以計算藍色數(shù)值具體衰減數(shù)值來說明其實現(xiàn)過程。代碼實現(xiàn)如下:fYuHuiStruct.ColOffsetB=((fYuHuiStruct.fEndTime-fYuHuiStruct.fStartTime+fYuHuiStruct.fTimeOffsetB)/(fTimeSelect/B_VALUE)>=1)?((BYTE)((fYuHuiStruct.fEndTime-fYuHuiStruct.fStartTime+fYuHuiStruct.fTimeOffsetB)/(fTimeSelect/B_VALUE))):(0);在實現(xiàn)上面這句代碼時有三點需要注意:1)確定時間值和衰減顏色數(shù)值的倍數(shù)關(guān)系。首先已經(jīng)得到了用戶設(shè)置的希望將顏色衰減至黑色的具體時間,對于16位顏色值藍色最大值為31,可以確定對于藍色如果顏色值減少1那么時間應(yīng)該變化fTimeSelect/B_VALUE(fTimeSelect表示顏色衰減至黑色的具體時間,B_VALUE表示31)。2)注意時間剩余量。相鄰兩次的時間差在大多數(shù)情況下不是時間值和衰減顏色數(shù)值的倍數(shù)關(guān)系(fTimeSelect/B_VALUE)的整數(shù)倍。可以說每次顏色衰減都會產(chǎn)生一個小誤差,此誤差應(yīng)該在下次計算時間是將其計算在內(nèi),以減小誤差對顯示產(chǎn)生的影響。時間剩余量計算如下:fYuHuiStruct.fTimeOffsetB=(WORD)((fYuHuiStruct.fEndTime-fYuHuiStruct.fStartTime+fYuHuiStruct.fTimeOffsetB)%(fTimeSelect/B_VALUE));3)判斷在計算出來的時間差值內(nèi)顏色衰減是否足夠1。如果不夠,則將顏色衰減數(shù)值設(shè)置為零。藍色衰減數(shù)值確定后,紅色和綠色具體衰減數(shù)值也就可以確定了。然后將位圖對應(yīng)內(nèi)存區(qū)域中的數(shù)值衰減,就會實現(xiàn)余輝效果。實現(xiàn)余輝效果的核心代碼如下:for(i=0;i<ScreenLength;i++){ if(((WORD*)fMemStruct.lpBits_mem[1])[i]){ fYuHuiStruct.wData[0]=((WORD*)fMemStruct.lpBits_mem[1])[i]; fYuHuiStruct.wData[1]=0; if(!(fYuHuiStruct.wData[0]&0X001F)){ fYuHuiStruct.ColTemp=(((fYuHuiStruct.wData[0])&R_MASK)); fYuHuiStruct.wData[1]|=(fYuHuiStruct.ColTemp>fYuHuiStruct.ColOffsetR)?(((WORD)(fYuHuiStruct.ColTemp-fYuHuiStruct.ColOffsetR))):(0); fYuHuiStruct.wData[1]|=(fYuHuiStruct.wData[1])>>5; } else{ fYuHuiStruct.ColTemp=(((fYuHuiStruct.wData[0])&B_MASK)); fYuHuiStruct.wData[1]|=(fYuHuiStruct.ColTemp>fYuHuiStruct.ColOffsetB)?(((WORD)(fYuHuiStruct.ColTemp-fYuHuiStruct.ColOffsetB))):(0);#ifdefWEITU565 fYuHuiStruct.wData[1]|=(fYuHuiStruct.wData[1])<<6;#else fYuHuiStruct.wData[1]|=(fYuHuiStruct.wData[1])<<5;#endif } ((WORD*)fMemStruct.lpBits_mem[1])[i]=fYuHuiStruct.wData[1]; }}(3)反向功能設(shè)計當(dāng)反向功能打開時,將采集到的波形數(shù)據(jù)正負取反。(4)調(diào)色板設(shè)置有正常和黑白兩種格式。正常時用通道正常的顏色顯示波形;黑白格式時所有波形顯示白色。當(dāng)黑白格式顯示時效果如圖5.8所示。圖5.8黑白格式顯示2.測量線測量顯示模塊的設(shè)計與開發(fā)測量線測量即依據(jù)象素點與時間或電壓電流間的關(guān)系,通過測量線之間的象素距離計算出真正的時間或電壓電流,并將其顯示在屏幕上。象素與時間的關(guān)系是通過時基來確定的,即根據(jù)橫向每格表示的時間值來確定的;象素與電壓電流間的關(guān)系是通過探頭倍數(shù)、衰減倍數(shù)(即縱向每格電壓)來確定的。由于示波器速度要求高,又根據(jù)測量線只有橫向和縱向兩種情況的特殊性,具體測量線的畫法是通過單獨的函數(shù)畫出來的。現(xiàn)在以橫向虛線畫法為例說明其實現(xiàn)過程,其實現(xiàn)代碼如下:voidCDrawCurveCtrl::DrawDashedLineH(unsignedshortWidth,intXStart,intXEnd,intYValue,LPVOIDlpBits_mem,WORDPixelData){ inti,fTempVal; intEveryDuan=fWindowStruct.fDrawCtrlWindowWidth/25/3; fTempVal=Width*YValue; while(XStart+EveryDuan<=XEnd){ for(i=0;i<EveryDuan;i++) ((WORD*)lpBits_mem)[fTempVal+(XStart++)]=PixelData; XStart+=EveryDuan; }}在函數(shù)中首先確定每一個虛線段的長度EveryDuan,用包含WORD的個數(shù)來表示,這個值是通過比較觀察暫時決定的;然后從畫波形背景圖對應(yīng)位圖的開頭到當(dāng)前要畫虛線位置的距離,也用包含WORD的個數(shù)表示;然后通過一個嵌套循環(huán)來實現(xiàn)了畫虛線的算法。其它的縱向虛線、橫向?qū)嵕€、縱向?qū)嵕€的具體實現(xiàn)與其類似。其測量結(jié)果由一個專門的測量函數(shù)GetCursorInfo()來完成。將測量結(jié)果組成字符串放入數(shù)組中,在顯示時用BaseCursorInfoOnScreen()函數(shù)把光標(biāo)的測量信息顯示到屏幕上。5.4系統(tǒng)設(shè)置模塊系統(tǒng)設(shè)置模塊包括存儲設(shè)置、系統(tǒng)使用設(shè)置兩部分。5.4.1存儲設(shè)置模塊的設(shè)計與開發(fā)此模塊主要是對設(shè)置信息及波形數(shù)據(jù)的存儲和恢復(fù)。(1)設(shè)置信息存儲設(shè)置信息的存儲可分為兩部分:菜單信息的存儲、系統(tǒng)設(shè)置信息的存儲。由于系統(tǒng)關(guān)機是直接切斷電源,所以菜單信息的存儲必須是實時的,即必須是在用戶點擊菜單時直接將菜單項的變化存儲在文件中。由于在用戶點擊菜單按鈕時,在大部分情況下是一個按鈕的彈出和當(dāng)前按鈕的按下,所以將這種情況編寫到了SingleSelectOfRight函數(shù)中,當(dāng)按鈕變化出現(xiàn)這種情況時,直接調(diào)用此函數(shù)就可實現(xiàn)按鈕的變化,同時將變化情況寫到文件中。此函數(shù)的實現(xiàn)如下:BOOLCPcscopeDlg::SingleSelectOfRight(BYTEPointWitch){intBottomWitch=(int)(ceil(log10(fMenuStruct.BottomSelect)/log10(2))); if(fMenuStruct.RightSelect[BottomWitch]&One(PointWitch)) returnFALSE; intRightWitch=(int)(ceil(log10(fMenuStruct.RightSelect[BottomWitch])/log10(2))); fMenuStruct.RightSelect[BottomWitch]=One(PointWitch); if(fMenuStruct.RightNum[BottomWitch]<=RIGHT_NUMBER) ResetRightButtonStatus(BottomWitch,RightWitch); else { if(((RightWitch)/(RIGHT_NUMBER-1))==((PointWitch)/(RIGHT_NUMBER-1))) ResetRightButtonStatus(BottomWitch,RightWitch); } StoreSelect(fCurrentMenuSelect); returnTRUE;}另外系統(tǒng)設(shè)置信息的存儲主要是對某些特殊信息的存儲,例如:當(dāng)前選擇了哪幾個通道、觸發(fā)類型、同時顯示了幾組波形、各通道的水平時基設(shè)置等。(2)波形數(shù)據(jù)信息存儲此功能不但要將采集到數(shù)據(jù)保存下來,而且還要將當(dāng)前屏幕上顯示的第一數(shù)據(jù)的序號、度中心線的位置、第一個顯示的點離背景圖左邊的距離、水平方向上相鄰兩點間的距離、垂直方向上相鄰兩點間的距離保存下來。5.4.2系統(tǒng)使用設(shè)置模塊的設(shè)計與開發(fā)包括聲音的開和關(guān)、系統(tǒng)的自動校正、界面語言的選擇、系統(tǒng)故障記錄的瀏覽、顯示屏,鍵盤以及系統(tǒng)信息的測試、時間校正、查看幫助、波形錄制和播放、示波器接口設(shè)置以及頻率計的使用。此模塊中功能比較簡單,在此不做祥細介紹。5.5多線程實現(xiàn)多線程是這樣一種機制,它允許在程序中并發(fā)執(zhí)行多個指令流,每個指令流都稱為一個線程,彼此間互相獨立。一個采用了多線程技術(shù)的應(yīng)用程序可以更好地利用系統(tǒng)資源。其主要優(yōu)勢在于充分利用了CPU的空閑時間片,可以用盡可能少的時間來對用戶的要求做出響應(yīng),使得進程的整體運行效率得到較大提高。在運行一個多線程的程序時,表面看這些線程似乎在同時運行,而實際情況并非如此,為了運行所有線程,操作系統(tǒng)為每個獨立線程安排一些CPU時間。單CPU操作系統(tǒng)以輪轉(zhuǎn)方式向線程提供時間片,每個線程在使用完時間片后交出控制,系統(tǒng)再將CPU時間片分配給下一個線程。由于每個時間片足夠的短,這樣就給人一種假象,好像這些線程在同時運行。創(chuàng)建額外線程的唯一目的就是盡可能地利用CPU時間。5.5.1由于示波器的特殊要求,數(shù)據(jù)的采集和顯示要不斷的高速運行,兩個模塊的運行順序又有嚴(yán)格的要求,并且它們又同時訪問同一塊內(nèi)存區(qū)域,所以利用了多線程技術(shù)來使數(shù)據(jù)的采集和顯示不斷的運行,同時為了內(nèi)存訪問的順序的正確程序中引入了同步對象Event,通過對同步對象Event的設(shè)置使線程可以按正確順序訪問內(nèi)存,從而避免內(nèi)存訪問沖突。所謂線程同步是指線程之間在相互通信時避免破壞各自數(shù)據(jù)的能力。同步問題是Win32系統(tǒng)的CPU時間片分配方式引起的。雖然在某一時刻,只有一個線程占用CPU(單CPU時)時間,但是沒有辦法知道在什么時候,在什么地方線程被打斷,這樣如何保證線程之間不破壞彼此的數(shù)據(jù)就顯得格外重要。在MFC中,可以使用4個同步對象來保證多線程同時運行。它們分別是臨界區(qū)對象(CCriticalSection)、互斥量對象(CMutex)、信號量對象(CSemaphore)和事件對象(CEvent)。在本系統(tǒng)中用的是CEvent。數(shù)據(jù)采集利用事件同步線程運行波形顯示在系統(tǒng)中線程和數(shù)據(jù)的采集及顯示之間的關(guān)系如圖5數(shù)據(jù)采集利用事件同步線程運行波形顯示圖5.9線程同步圖系統(tǒng)進行波形的顯示時首先進行余輝處理,然后畫各通道波形及計算得到的波形,最后畫背景方格及顯示其它提示信息。數(shù)據(jù)顯示流程圖如5.10所示;從采集卡采集數(shù)據(jù)時,首先要對硬件進行一些初始化設(shè)置,等待硬件的狀態(tài),然后進行數(shù)據(jù)采集工作。波形采集流程圖如5.11所示。是否是否采集數(shù)據(jù)檢查觸發(fā)是否成功檢查是否超過時限返回設(shè)置觸發(fā)電平設(shè)置延遲設(shè)置采集狀態(tài)進入采集模塊是是否余輝顯示是否是否采集數(shù)據(jù)檢查觸發(fā)是否成功檢查是否超過時限返回設(shè)置觸發(fā)電平設(shè)置延遲設(shè)置采集狀態(tài)進入采集模塊是是否余輝顯示否將新內(nèi)存設(shè)為黑色畫各通道波形計算三顏色衰減值計算此次剩余時間余輝處理將位圖拷貝到新內(nèi)存畫各通道波形畫計算及參考波形畫背景方格有無顯示提示信息屏幕顯示是否有提示信息返回進入顯示模塊數(shù)據(jù)采集線程函數(shù):UINTfModifyThreadFunction(LPVOIDlParam){ while(!fExit) { ASSERT(f_MainDlg!=NULL); if(f_MainDlg->fbTest_Card)//如果無采集卡 f_MainDlg->ModifyData();//得到測試數(shù)據(jù) elsef_MainDlg->GetFromCard();//從采集卡得到數(shù)據(jù) if(WaitForSingleObject(fDrawEvent,0xFFFFFFFF)==WAIT_OBJECT_0){ ResetEvent(fDrawEvent); SetEvent(fModifyEvent); } } //線程關(guān)閉,返回 returntrue;}波形顯示線程函數(shù):UINTfDrawThreadFunction(LPVOIDlParam){ while(!fExit) { if(WaitForSingleObject(fModifyEvent,0xFFFFFFFF)==WAIT_OBJECT_0){ ASSERT(f_MainDlg!=NULL); f_MainDlg->DrawCurve();//調(diào)用畫波形函數(shù) ResetEvent(fModifyEvent); SetEvent(fDrawEvent);……………. } } //線程關(guān)閉,返回 returntrue;}在兩線程配合功能工作時,數(shù)據(jù)采集優(yōu)先考慮,當(dāng)?shù)玫搅艘@示的數(shù)據(jù)時查看當(dāng)前時間是否沒有正在顯示,如果沒有則重新設(shè)置線程同步Event對象,它將會啟動畫圖線程。通過應(yīng)用多線程技術(shù)大大提高了波形的顯示速度,從而使用戶可以更明顯的看到波形信號的特征。另外還有一個獨立的鍵盤處理線程,由于采用鍵盤優(yōu)先處理原則,把鍵盤處理線程設(shè)置到高優(yōu)先級,鍵盤處理線程核心代碼如下:UINTfNewKeyThread(LPVOIDlParam)//中斷響應(yīng)線程函數(shù){while(1) {if(WaitForSingleObject(gKeyNotifyEvent,0xFFFFFFFF)==WAIT_OBJECT_0) { ResetEvent(gKeyNotifyEvent); while(1) { //標(biāo)志 WRITE_PORT(8,SCOPE_UPORT6); Flag=READ_PORT(SCOPE_UPORT7); if(Flag==0) { break; } else { //產(chǎn)生讀數(shù)脈沖 f_MainDlg->m_oscCard.SetFifoInfo(0x20); WRITE_PORT(10,SCOPE_UPORT6); tyKeyNotify.DataL=READ_PORT(SCOPE_UPORT7); WRITE_PORT(9,SCOPE_UPORT6); tyKeyNotify.DataH=READ_PORT(SCOPE_UPORT7); if((tyKeyNotify.DataL&0x80)==DataFlag) continue; DataFlag=(tyKeyNotify.DataL&0x80); //以下為函數(shù)指針指向功能函數(shù)代碼,由于空間有限不//加以說明 }}}5.5.2(1)“顯存”的直接操作波形顯示流程圖中的屏幕顯示功能在開始是由系統(tǒng)提供的函數(shù)BitBlt來實現(xiàn)的,此函數(shù)在WinCE系統(tǒng)中運行時占用了很長的時間,為了解決此難題,最終采用了直接操作“顯存”的方法。由于在WinCE系統(tǒng)中“顯存”也是系統(tǒng)劃分的一塊內(nèi)存,所以最終也是對內(nèi)存的操作。首先通過分析內(nèi)核代碼中的顯示驅(qū)動程序,找到“顯存”對應(yīng)內(nèi)存的地址,在本項目中顯存對應(yīng)內(nèi)存的起始地址為0x83d00280,然后在顯示位圖時直接將位圖對應(yīng)的顏色數(shù)據(jù)寫到內(nèi)存中。(2)雙緩沖技術(shù)為了提高處理速度,讓數(shù)據(jù)的顯示和采集同時進行,采用了雙緩沖技術(shù)。通過設(shè)置訪問標(biāo)志,讓采集和顯示兩個線程交互訪問兩塊緩沖區(qū),減少了等待時間,提高了速度。
6軟硬件聯(lián)合測試測試是產(chǎn)品質(zhì)量保證的關(guān)鍵階段,是在產(chǎn)品投入運行前,對產(chǎn)品的需求分析、設(shè)計、實現(xiàn)編碼進行最終審查。系統(tǒng)要想正確穩(wěn)定的運行,必須經(jīng)過嚴(yán)格測試。由于本系統(tǒng)功能較多,現(xiàn)在以測試示波器鍵盤為例說明具體測試過程。6.1測試內(nèi)容產(chǎn)品測試并不僅僅是程序測試,產(chǎn)品測試應(yīng)貫穿于整個軟件生命周期中。需求分析、概要設(shè)計、詳細設(shè)計以及程序編碼等各階段所得到的文檔,包括需求規(guī)格說明、概要設(shè)計規(guī)格說明、詳細設(shè)計規(guī)格說明以及源程序,都應(yīng)成為產(chǎn)品測試的對象。對于示波器鍵盤的測試應(yīng)為分兩個方面進行測試:鍵盤正確測試和鍵盤抖動測試。6.2測試目的測試的目的,是想以最少的人力、物力和時間找出產(chǎn)品中潛在的各種錯誤和缺陷,通過修正各種錯誤和缺陷提高產(chǎn)品質(zhì)量,回避產(chǎn)品發(fā)布后由于潛在的產(chǎn)品缺陷和錯誤造成的隱患所帶來的商業(yè)風(fēng)險。示波器鍵盤是控制示波器采集和顯示最核心的部分,可以說是整個示波器的總控制臺,所以它的正確性直接影響到整體示波器的性能。6.3示波器鍵盤正確性測試示波器鍵盤可以說是整個示波器的總控制臺,所以它的正確性直接影響到整體示波器的性能。所以特制定了如下測試方案:按鍵盤按鈕,看應(yīng)用軟件是否能顯示出相應(yīng)的菜單,并觀察發(fā)光二極管亮滅的正確性。測試過程如下:反復(fù)點擊菜單CH1、CH2、Trigger、Horiz、測量、采樣、光標(biāo)、系統(tǒng)、存儲、顯示。觀察其每次彈出的菜單以及發(fā)光二極管高滅是否正確。然后觀察旋鈕的功能是否和預(yù)期功能相同,最后測試功能鍵是否正確,包括:選擇、粗調(diào)、Setto50%、Setto0、單次、自動、Run/Stop。由于是代碼測試,所以可專門編寫測試代碼測試程序是否正確。下面是具體測試過程。處理過程如圖6.1所示。懸鈕懸鈕進入程序進入鍵盤事件等待線程中斷發(fā)生區(qū)分懸鈕和按鈕按鈕是否退出輸出按鈕位置輸出懸鈕方向和位置位置退出程序是否退出鍵盤事件等待線程圖6.1示波器正確性測試流程圖測試完成后發(fā)現(xiàn)其功能對應(yīng)都十分準(zhǔn)確,只是在單次時,Run/Stop鍵沒有變成紅燈,經(jīng)分析可能是在Nios處理單次功能時漏掉了,經(jīng)檢查代碼發(fā)現(xiàn)確實是在處理單次功能時漏掉了對Run/Stop鍵的發(fā)光二極管的處理,證實了以上推測,改正后發(fā)光二極管正常。6.4示波器鍵盤抖動測試由于使用的按鍵的物理特性不好,抖動是不可避免的,好的消抖算法是十分必要的,我們現(xiàn)在采用的是軟消抖算法,即變化持續(xù)20mS以上視為有效變化。部分按鍵的測試過程和測試結(jié)果如表6-1所示。表6-1消抖前與消抖后比較按鍵消抖之前有效按鍵消抖之后有效按鍵選擇1015109粗調(diào)10301010測量1036109光標(biāo)10261010顯示10141010系統(tǒng)10221010存儲10501012單次104210106.5測試總結(jié)(1)結(jié)果菜單鍵與功能鍵對應(yīng)十分準(zhǔn)確,發(fā)光二極管亮滅與原設(shè)計也基本一致,添加軟消抖效果也十分明顯。(2)缺陷由于采用的硬件的整體速度比較慢,菜單加載時稍有遲鈍。開機到WinCE的啟動,發(fā)光二極管有一個全亮到全滅的過程,全亮設(shè)計的時間比較短,WinCE還沒有完全啟動,燈就全滅了。自動燈的延遲較短,自動還沒設(shè)置好燈已經(jīng)滅了。(3)評價按鍵正確,消抖算法可用,只是發(fā)光二極管的時間控制還不是很理想。
結(jié)束語本人在開發(fā)過程中學(xué)習(xí)到了很的軟硬件知識,同時也認識到自己知識的匱乏,比如鍵盤處理這一塊就涉及到如模擬電路、數(shù)字電路、單片機、接口等很多學(xué)科的知識。同時也意識到網(wǎng)絡(luò)資源的重要性,比如LED控制器74HC595,一開始不了解其使用方法,走了很多彎路,后來在網(wǎng)上搜索它的使用說明書,才發(fā)現(xiàn)原來它是一個串行移入并行輸出的器件,其內(nèi)部是靠一個8位移位寄存器和一個8位鎖存器來實現(xiàn)其控制功能的。了解了其內(nèi)部的工作原理了再使用起來就很得心應(yīng)手了。所以說只有真正了解一個器件的內(nèi)部工作原理,才能方便并正確的使用它。開發(fā)的過程其實就是一個學(xué)習(xí)和實踐的過程,就是向高手學(xué)習(xí)請教,和高手交流經(jīng)驗、互相促進的一個過程。在軟硬件的開發(fā)過程中,知道了許多編程的技巧,積累了許多設(shè)計方面的經(jīng)驗。這些編程的小技巧往往能夠解決很大的問題。設(shè)計是一個舉一反三的過程,有時解決了一個問題之后,類似的問題也就迎刃而解。最后,敬請老師和同學(xué)們多多批評指正。
致謝在本次畢業(yè)設(shè)計中,非常感謝文獻老師,他給予我很多的幫助,從他身上我學(xué)到了很多東西。曾老師認真負責(zé)的工作態(tài)度,嚴(yán)謹?shù)闹螌W(xué)精神和深厚的理論水平都使本人受益匪淺,使自己得到了不少的提高。這對于本人在今后的工作和學(xué)習(xí)中,都是一筆寶貴的財富,感謝他耐心的輔導(dǎo)。同時,也非常感謝和志強老師,在硬件方面給了我很大的幫助,在和老師身上也學(xué)到了很多的硬件知識,也向在畢業(yè)設(shè)計中給予無私幫助的同學(xué)表示感謝。
參考文獻[1]周毓林,寧楊,,第1版,北京:電子工業(yè)出版社,2005年2月,3-354頁[2](美)JeffProsise著,MFCWindows程序設(shè)計,第2版,北京:清華大學(xué)出版社,2001年9月,10-200頁[3](美)BjarneStroustrup著,C++程序設(shè)計語言,第1版,北京:機械工業(yè)出版社,2003年2月,30-500頁[4]嚴(yán)蔚敏,吳偉民,數(shù)據(jù)結(jié)構(gòu)(C語言版),第1版,北京:清華大學(xué)出版社,
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030藥用黃腐酸行業(yè)市場現(xiàn)狀供需分析及重點企業(yè)投資評估規(guī)劃分析研究報告
- 2025-2030腺苷脫氨酶缺乏癥治療行業(yè)市場現(xiàn)狀供需分析及重點企業(yè)投資評估規(guī)劃分析研究報告
- 2025-2030聚四氟乙烯盤根行業(yè)市場現(xiàn)狀供需分析及重點企業(yè)投資評估規(guī)劃分析研究報告
- 2025-2030網(wǎng)上減肥計劃行業(yè)市場現(xiàn)狀供需分析及重點企業(yè)投資評估規(guī)劃分析研究報告
- 2025-2030真空絕緣板行業(yè)市場現(xiàn)狀供需分析及重點企業(yè)投資評估規(guī)劃分析研究報告
- 2025-2030環(huán)境金融行業(yè)市場深度分析及競爭格局與投資價值研究報告
- 2025-2030煉油行業(yè)風(fēng)險投資發(fā)展分析及運作模式與投融資研究報告
- 2025-2030消防車行業(yè)市場發(fā)展分析及發(fā)展趨勢前景預(yù)測報告
- 2025-2030水楊酸注射液行業(yè)市場現(xiàn)狀供需分析及重點企業(yè)投資評估規(guī)劃分析研究報告
- 2025-2030橄欖收獲機行業(yè)市場現(xiàn)狀供需分析及重點企業(yè)投資評估規(guī)劃分析研究報告
- 臨床尿動力學(xué)檢查實施演示文稿
- 新舊物業(yè)公司交接管理流程
- YS/T 394-2007鉭精礦
- GB/T 17193-1997電氣安裝用超重荷型剛性鋼導(dǎo)管
- ETF融資融券的應(yīng)用策略課件
- 東芝空調(diào)用戶使用手冊
- 全國卷高考標(biāo)準(zhǔn)語文答題卡作文紙3欄800字版
- DB32T 4284-2022 居民住宅二次供水工程技術(shù)規(guī)程
- 放射性物品道路運輸申請表樣表
- 110kV變電站高壓試驗報告完整版
- TSG Z7001-2004 特種設(shè)備檢驗檢測機構(gòu)核準(zhǔn)規(guī)則
評論
0/150
提交評論