游歷機(jī)器人上位機(jī)軟件
《游歷機(jī)器人上位機(jī)軟件》由會員分享,可在線閱讀,更多相關(guān)《游歷機(jī)器人上位機(jī)軟件(26頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
1、摘要 二十一世紀(jì)已經(jīng)是信息化的時(shí)代。青少年是祖國的未來與希望,培養(yǎng)青少年對計(jì)算機(jī)與電子技術(shù)的興趣愈加顯得重要。各種機(jī)器人比賽目前在高校間已經(jīng)很普及,然而在中小學(xué)卻仍不能普遍開展,其中一個很重要的原因就是對于機(jī)器人編程的運(yùn)行環(huán)境只有具有編程能力的專業(yè)人士才能掌握。一般的中小學(xué)生根本不具有專業(yè)的編程能力。 本論文就是結(jié)合游歷機(jī)器人設(shè)計(jì)開發(fā)一款可供青少年使用的上位機(jī)軟件,具有程序編輯編譯與圖形遍歷自動生成代碼的功能。該論文設(shè)計(jì)的游歷機(jī)器人上位機(jī)軟件使用了VC++6.0開發(fā)環(huán)境,基于MCF框架類界面編程。具有執(zhí)行速度快,易升級等特點(diǎn),同時(shí)對游歷機(jī)器人控制函數(shù)進(jìn)行了封裝,有利于對游歷機(jī)器人知識產(chǎn)
2、權(quán)的保護(hù)。 Abstract It is the century of informatization now.the youngsters is the hope and future of our country,so it is significant to develop the interest to computer and electronic technology.All kinds of competition about robot is co
3、mmon in the universities while there is few competition in the middle schools and the primary schools.The most important reason is that the translating and editing environment could be mastered by the coding worker who can program well. the upper software of the traveling robot is designed and deve
4、loped in the paper which could be used by youngsters.the program can be edited and translated in the software. whats more,the program could be produced through traveling. the soft is developed by C plus plus basic the MFC Class in the developing environment of VC++ 6.0. the soft executed quickly an
5、d easily updated. in the meantime,the function details of the traveling robot is hided which is to the benefit of konwledge rihgt. 第一章 緒論 1.1 引言 隨著信息化的快速發(fā)展,嵌入式和3G物聯(lián)網(wǎng)正成為IT業(yè)發(fā)展的主流。青少年是祖國的未來,提高他們對計(jì)算機(jī)技術(shù)和電子技術(shù)的興趣更加顯得重要與急迫。然而,計(jì)算機(jī)的普及應(yīng)用只是限于文字編輯
6、,簡單圖片處理以及通信等方面的應(yīng)用。這些遠(yuǎn)不能讓青少年了解和應(yīng)用計(jì)算機(jī)。游歷機(jī)器人是基于前后十個光傳感器的游歷小車,可以通過Atmega128處理器進(jìn)行控制小車尋跡。然而其編譯環(huán)境要具有專業(yè)的編程能力才能使用,而且功能繁多復(fù)雜,對于中小學(xué)生而言根本不能使用,從而成為中小學(xué)生對于計(jì)算機(jī)技術(shù)的了解和應(yīng)用的一個巨大的挑戰(zhàn)。 本論文利用VC++相關(guān)知識開發(fā)了一個功能較少,簡單易用的上位機(jī)軟件,旨在完成對程序編輯編譯和通過游歷地圖自動生成程序代碼功能,并且對今后該上位機(jī)軟件的進(jìn)一步升級做出嘗試性探索性。 1.2上位機(jī)的概述 上位機(jī)是一臺可以發(fā)出特定操控命令的計(jì)算機(jī),通過操作預(yù)先設(shè)定好的命令,將
7、命令傳遞給下位機(jī),通過下位機(jī)來控制設(shè)備完成各項(xiàng)操作(應(yīng)用最多的地方如:工業(yè)、水利、供電部門、交通等方面)。上位機(jī)都有特定的編程,有專門的開發(fā)系統(tǒng),或以上是已經(jīng)規(guī)定好任務(wù),只能按特定的任務(wù)進(jìn)行操作。簡單說上位機(jī)就是命令的下達(dá)者,而下位機(jī)則是命令的執(zhí)行者。 兩機(jī)如何通訊,一般取決于下位機(jī)。TCP/IP一般是支持的。但是下位機(jī)一般具有更可靠的獨(dú)有通訊協(xié)議,購買下位機(jī)時(shí),會帶一大堆手冊光盤,告訴你如何使用特有協(xié)議通訊。里面會舉大量例子。一般對編程人員而言一看也就那么回事,使用一些新的API罷了。多語言支持功能模塊,一般同時(shí)支持?jǐn)?shù)種高級語言為上位機(jī)編程。這里給出一種典型的上位機(jī)軟件,物聯(lián)網(wǎng)應(yīng)用中收集感
8、知節(jié)點(diǎn)信息,進(jìn)行顯示,控制的應(yīng)用控制臺。此軟件主要有兩部分組成,數(shù)據(jù)收發(fā)部分和顯示部分 上位機(jī)在系統(tǒng)中的位置:處于網(wǎng)絡(luò)層中,與嵌入式網(wǎng)關(guān)通過網(wǎng)線相連。實(shí)際應(yīng)用時(shí)是放置在實(shí)驗(yàn)室的老師工作臺上,供實(shí)驗(yàn)室的老師使用。 上位機(jī)的功能:此軟件實(shí)時(shí)監(jiān)視實(shí)驗(yàn)實(shí)中每個實(shí)驗(yàn)臺的狀況,包括上電或斷電狀態(tài),實(shí)驗(yàn)臺是否發(fā)出了警告,是否發(fā)出了求助信號,并對這些信號做出應(yīng)答,還控制LED屏的文字顯示。 上位機(jī)的設(shè)計(jì)實(shí)現(xiàn): 此軟件主要有兩部分組成,數(shù)據(jù)收發(fā)部分和顯示部分。數(shù)據(jù)收發(fā)指的是和嵌入式網(wǎng)關(guān)的數(shù)據(jù)收發(fā)。兩者是通過網(wǎng)線連接的,所以應(yīng)用的是TCP/IP 的Socket 套接字編程,嵌入式網(wǎng)關(guān)的設(shè)計(jì)中已經(jīng)提到過,它在
9、和上位機(jī)通信中是作為服務(wù)器的,那么上位機(jī)就是作為連接發(fā)起方。為了能保證網(wǎng)絡(luò)連接的穩(wěn)定性,我們把Socket讀寫的程序代碼放在了try{} catch(){} 塊中,一旦網(wǎng)絡(luò)連接不正常,就會捕獲到該異常,從而關(guān)閉程序。 1.2課題介紹 1.3 編譯器 編譯程序是指這樣一種程序,通過它能夠?qū)⒂酶呒壵Z言編寫的源程序轉(zhuǎn)換為與之在邏輯上等價(jià)的低級語言形式的目標(biāo)程序。一個高級程序的執(zhí)行通常將分為兩個階段,即編譯階段和運(yùn)行階段。編譯階段將院程序變?yōu)槟繕?biāo)程序;運(yùn)行階段則由所生成的目標(biāo)程序聯(lián)通運(yùn)行系統(tǒng)(數(shù)據(jù)空間分配子程序、標(biāo)準(zhǔn)函數(shù)程序等)接受程序的初始數(shù)據(jù)作為輸入,運(yùn)行后輸出計(jì)算結(jié)果。如果編譯生成的
10、目標(biāo)程序是匯編語言程序形式的,那么在編譯與運(yùn)行階段之間還要添加一個匯編階段,它將編譯生成的匯編語言目標(biāo)程序再經(jīng)過匯編程序編程機(jī)器語言目標(biāo)代碼程序 源程序 (高級語言) 編譯程序 計(jì)算機(jī) 目標(biāo)程序 (匯編語言) 匯編程序 (計(jì)算機(jī)) 計(jì)算結(jié)果 初始數(shù)據(jù) 目標(biāo)程序 (機(jī)器語言) 運(yùn)行系統(tǒng) (計(jì)算機(jī)) 用高級語言編寫的程序也可通過解釋程序來執(zhí)行。解釋程序也是一種翻譯程序,它將源程序作為輸入,一條語句接一條語句地讀入并解釋執(zhí)行,解釋程序與編譯程序的主要區(qū)別就是:編譯程序?qū)⒃闯绦蚍g成目標(biāo)程序后再執(zhí)行該目標(biāo)程序;編譯程序?qū)⒃闯绦蚍g成目標(biāo)程序后在執(zhí)行
11、該目標(biāo)程序后再執(zhí)行該目標(biāo)程序;而解釋程序則逐條讀出源程序中的語句并解釋執(zhí)行,即在執(zhí)行程序的孤傲城中并產(chǎn)生目標(biāo)程序。典型的解釋型高級語言是BASIC語言。 初始數(shù)據(jù) 計(jì)算結(jié)果 解釋程序 (計(jì)算機(jī)) 源程序 高級語言 匯編語言大大提高了編程的速度和準(zhǔn)確性,至今人們?nèi)嗽谑褂茫诖鎯θ萘啃『碗S度快的要救下尤其如此。但是,匯編語言依賴于具體的機(jī)器的額提醒是無法改變的,這給編程和調(diào)試增加了難度。很明顯,編程技術(shù)發(fā)展的下一個重要步驟就是要更用簡潔的數(shù)學(xué)定義或自然語言來描述和編寫程序,它應(yīng)與任何機(jī)器無關(guān),而且可以通過翻譯程序?qū)⑵浞g為計(jì)算機(jī)可以直接執(zhí)行的二進(jìn)制代碼。1954~1957
12、年,IBM的John Backs帶領(lǐng)一個研究小組對FORTRAN語言及其編譯器進(jìn)行了開發(fā)。與此同時(shí),波瀾語言學(xué)家Noam Chomsky開始了他的自然語言結(jié)構(gòu)研究,他根據(jù)文法的難易程度及識別他們所需的算法對語言的進(jìn)行了分類,定義了0型,1型,2型和3型這四類文法及其相應(yīng)的形式語言,并分別與相應(yīng)的識別系統(tǒng)相聯(lián)系。2型文法(上下文無關(guān)文法)被證明是程序設(shè)計(jì)語言中最有用的文法,它代表著目前程序設(shè)計(jì)語言的結(jié)構(gòu)標(biāo)準(zhǔn)。Noam Chomsky的研究結(jié)果是編譯器變的異常簡單,甚至還具有自動化的功能。有限自動機(jī)和正規(guī)表達(dá)式與上下文無關(guān)文法緊密相關(guān),它們與Noam Chomsky的3型文法相對應(yīng),并引出了表示程
13、序設(shè)計(jì)語言的單詞符號形式,接著又產(chǎn)生了生成目標(biāo)代碼方法——這就是最初的編譯器。 編譯過程和編譯程序結(jié)構(gòu) 編譯程序結(jié)果過程是指從輸入源程序開始到輸出目標(biāo)程序?yàn)橹沟恼麄€過程。一般要經(jīng)過五個過程 詞法分析:將源程序中的字符串編程單詞符號流的過程,詞法分析所遵守的是語言的構(gòu)詞規(guī)則。 語法分析:在詞法分析的基礎(chǔ)上,根據(jù)語言的語法規(guī)則(文法規(guī)則)把單詞符號流分解成各類語法單位(語法范疇)。語法分析所遵循的是語言的語法規(guī)則,語法規(guī)則通常用上下無關(guān)文法描述。 語義分析和中間代碼生成:對各類不同語法范疇按語言的語義進(jìn)行初步翻譯,包含兩個方面的工作:一是對各種語法范疇星星靜態(tài)語義檢查。二是在語義檢查正確
14、的情況下進(jìn)行中間代碼的翻譯。 優(yōu)化:該階段任務(wù)是對前階段產(chǎn)生的中間代碼進(jìn)行等價(jià)變換或者改造,以期獲得更為高效(節(jié)省時(shí)間和代碼)目標(biāo)代碼。 目標(biāo)代碼生成:該階段任務(wù)是把中間代碼(或經(jīng)優(yōu)化處理之后)變換成特定機(jī)器上的機(jī)器語言程序或匯編語言程序,以實(shí)現(xiàn)最終的翻譯工作。 編譯程序的開發(fā)常常采用自編譯,交叉編譯,移植等技術(shù)實(shí)現(xiàn)。 自編譯:用某種高級語言書寫自己的編譯程序稱為自編譯。 交叉編譯:交叉編譯是指用A機(jī)器上的編譯程序來產(chǎn)生可在B機(jī)器上運(yùn)行的目標(biāo)代碼。 移植:移植是指A機(jī)器上的某種高級語言的編譯程序稍加改動后能夠在B機(jī)器上運(yùn)行。 構(gòu)造編譯程序應(yīng)具備的知識內(nèi)容 對被編譯的源程序,要深
15、刻理解結(jié)構(gòu)和含義。 必須對目標(biāo)機(jī)器的硬件和指令系統(tǒng)有深刻的了解。 必須掌握編譯方法,編譯方法掌握得如何將直接影響到編譯程序的成敗,一個好的編譯方法可能得到事半功倍的效果。 1.2.1選題背景 隨著微電子技術(shù)、網(wǎng)絡(luò)技術(shù)等信息技術(shù)的飛速發(fā)展,嵌入式已經(jīng)成為具有廣闊發(fā)展前的技術(shù)方向之一。結(jié)合機(jī)械等相關(guān)專業(yè),各種下位機(jī)已經(jīng)變得相當(dāng)常見。在各種下位機(jī)中,智能機(jī)器人能夠節(jié)省勞動力,代替人工完成一些危險(xiǎn)性作業(yè),在現(xiàn)代社會中愈加顯得重要。目前在國內(nèi)各種游歷小車已經(jīng)做的相當(dāng)成熟,在軍事排爆,媒體攝影等方面已經(jīng)有很多技術(shù)成熟的產(chǎn)品。例如威海未來機(jī)器人有限公司的消防機(jī)器人,東莞易步機(jī)器人有限公司的智能電
16、動車等。機(jī)器人學(xué)的進(jìn)步和應(yīng)用是20世紀(jì)自動控制最有說服力的成就是當(dāng)代最高意義上的自動化”。機(jī)器人技術(shù)綜合了多學(xué)科的發(fā)展成果代表了高技術(shù)的發(fā)展前沿它在人類生活應(yīng)用領(lǐng)域的不斷擴(kuò)大正引起國際上重新認(rèn)識機(jī)器人技術(shù)的作用和影響。隨著計(jì)算機(jī)技術(shù)和人工智能技術(shù)的飛速發(fā)展使機(jī)器人在功能和技術(shù)層次上有了很大的提高移動機(jī)器人和機(jī)器人的視覺和觸覺等技術(shù)就是典型的代表。由于這些技術(shù)的發(fā)展推動了機(jī)器人概念的延伸。80年代將具有感覺、思考、決策和動作能力的系統(tǒng)稱為智能機(jī)器人這是一個概括的、含義廣泛的概念。這一概念不但指導(dǎo)了機(jī)器人技術(shù)的研究和應(yīng)用而且又賦予了機(jī)器人技術(shù)向深廣發(fā)展的巨大空間水下機(jī)器人、空間
17、機(jī)器人、空中機(jī)器人、地面機(jī)器人、微小型機(jī)器人等各種用途的機(jī)器人相繼問世許多夢想成為了現(xiàn)實(shí)。 智能小車是智能機(jī)器人的前身也是大多機(jī)器人的基本構(gòu)成部分之一智能小車可以自我控制完成一些規(guī)定的任務(wù)或者是通過人對其進(jìn)行遠(yuǎn)程的控制使它按照人們的旨意在一些人類無法工作的環(huán)境中代替人類完成一些復(fù)雜的高精度的工作如壁障功能、循跡、語音提示、金屬探測及轉(zhuǎn)移、里程測量、角度測量、拆彈機(jī)器小車、救火機(jī)器小車等等。這些功能可根據(jù)實(shí)際需要靈活組合還可在此基礎(chǔ)上不斷擴(kuò)展新的功能。 而對于這些機(jī)器人的上位機(jī)軟件大多數(shù)都是基于控制的。 1.2.2課題的工作內(nèi)容 開發(fā)一款上位機(jī)軟件,主要完成兩個工作內(nèi)容 1、完成
18、編輯環(huán)境的開發(fā),該編輯環(huán)境具有一般文字編輯器所具有的功能。 2、實(shí)現(xiàn)函數(shù)檢索功能,對于錯誤函數(shù)能夠檢測出來,并且能夠報(bào)錯。 3、設(shè)計(jì)開發(fā)一個遍歷界面,能夠記錄對圖的遍歷過程,遍歷完成后自動生成代碼。 4、分析游歷小車程序,對小車游歷程序進(jìn)行模塊化。從而可以根據(jù)小車運(yùn)動自動生成代碼。 第二章 開發(fā)工具與硬件設(shè)備 2.1開發(fā)環(huán)境介紹 2.1.1C++概述 面向?qū)ο蟮某绦蛟O(shè)計(jì)方法將數(shù)據(jù)及對數(shù)據(jù)的操作方法封裝在一起,作為一個相互依存、不可分離的整體——對象。對同類型對象抽象出其共性,形成類。類中的大多數(shù)數(shù)據(jù),只能用本類的方法進(jìn)行處理。類通過一個簡單的外部接口,與外界發(fā)生關(guān)系,對象與對
19、象之間通過消息進(jìn)行通信。這樣,程序模塊間的關(guān)系簡單,程序模塊的獨(dú)立性、數(shù)據(jù)的安全性具有良好的保障。同時(shí),通過繼承與多態(tài),使程序有很高的可重用性,使得軟件的開發(fā)和維護(hù)都更為方便。 C++是在C語言基礎(chǔ)上為支持面向?qū)ο蟮某绦蛟O(shè)計(jì)而研制的一個通用目的的程序設(shè)計(jì)語言,它是在1980年由AT&T貝爾實(shí)驗(yàn)室的Bjarne Stroustrup博士創(chuàng)建的。C++語言的主要特點(diǎn)表現(xiàn)在兩個方面,一是全面兼容C,二是支持面向?qū)ο蟮姆椒?。C++的確是一個更好的C語言。它保持了C的簡潔、高效和接近匯編語言等特點(diǎn)。對C的類型系統(tǒng)進(jìn)行了改革和擴(kuò)充,因此C++比C更安全,C++的編譯系統(tǒng)能檢查出更多的類型錯誤。由于C++
20、與C保持兼容,這就使許多C代碼不經(jīng)修改就可以為C++所用,用C編寫的眾多的庫函數(shù)和使用軟件可以用于C++中。另外,由于C語言已被廣泛使用,因而及大地促進(jìn)了C++的普及和面向?qū)ο蠹夹g(shù)的廣泛應(yīng)用。然而,也正式由于對C的兼容,使得C++不是一個純正的面向?qū)ο蟮恼Z言。C++具有雙重特點(diǎn),但它在概念上是和C完全不同的語言,我們應(yīng)該注意按照面向?qū)ο蟮乃季S方式去編寫程序。 2.1.2 VC6.0 概述 Microsoft Visual Studio 6.0是Microsoft推出的應(yīng)用非常廣泛可視化開發(fā)環(huán)境,它提供了功能強(qiáng)大的集成開發(fā)環(huán)境,用以方便有效地管理、編寫、編譯、跟蹤C(jī)++程序、大大減少了程序
21、員的工作,提高了程序代碼的效率。它以C++語言為基礎(chǔ),以眾多的集成工具為骨架,是計(jì)算機(jī)界公認(rèn)的最優(yōu)秀的應(yīng)用程序開發(fā)工具之一。Windows是目前最流行的平臺應(yīng)用程序開發(fā)環(huán)境。Visual Studio 可以用來創(chuàng)建 Windows 平臺下的 Windows 應(yīng)用程序和網(wǎng)絡(luò)應(yīng)用程序,也可以用來創(chuàng)建網(wǎng)絡(luò)服務(wù)、智能設(shè)備應(yīng)用程序和 Office 插件等。 2.1.3 MFC框架類概述 VC++6.0中的MFC框架類是微軟提供的一種應(yīng)用程序框架,其中包括框架類,視圖類,應(yīng)用程序類,文件類等,在建立MFC AppWizard.exe工程時(shí),系統(tǒng)就會為開發(fā)者提供一個現(xiàn)成的界面,其它的功能只要求在其框架
22、類中添加即可。 2.14 燒寫軟件 AVR_fighter AVR單片機(jī)ISP下載編程軟件 版 本: 1.0 (LICENSE) 操作系統(tǒng): Win98,Win2000,WinMe,WinXP,win2003 (注:Windows Vista未測試) 建議設(shè)置: 屏幕分辯率 1024 X 768 以上 第三章 軟件功能簡介 該軟件主要實(shí)現(xiàn)兩個功能 3.1編輯編譯界面 在該編輯界面中可以實(shí)現(xiàn)程序編輯功能,具有剪切復(fù)制等一般文本編輯具有的功能。在菜單欄中添加一個編譯菜單項(xiàng),該編譯菜單項(xiàng)具有編譯和生成機(jī)器代碼兩個功能。 在工具欄中分別添加編譯和生成機(jī)器碼兩個按鈕。
23、 在該編輯框架的左上方添加一個動態(tài)的圖標(biāo),具有不停變換圖標(biāo)的效果。在該編輯框(狀態(tài)欄)的左下方顯示當(dāng)前編輯框中光標(biāo)所在位置(橫坐標(biāo)x與縱坐標(biāo)y的值)。在右下方顯示一個動態(tài)的系統(tǒng)時(shí)間(時(shí)分秒)。 編譯功能:在點(diǎn)擊菜單項(xiàng)中的編譯子菜單后,系統(tǒng)能夠遍歷編輯框中的函數(shù),如果遍歷出函數(shù)有錯,則彈出對話框提示錯誤函數(shù)所在位置。如果遍歷后函數(shù)無錯后則將列表文件中的內(nèi)容顯示在編輯框中。在單機(jī)菜單項(xiàng)的保存后只需保存為.lst問價(jià)即可。 生成機(jī)器代碼:在編譯無誤后單擊菜單項(xiàng)中生成機(jī)器代碼或者單擊工具欄后,在編輯框中顯示響應(yīng)的機(jī)器代碼,然后保存為.hex文件。該代通過通過AVR_fighter軟件燒寫都機(jī)器人
24、內(nèi)后機(jī)器人即可運(yùn)行。 運(yùn)行界面 報(bào)錯對話框 匯編代碼 3.2對途徑的遍歷 本功能通過一個編輯框和若干按鈕實(shí)現(xiàn)。每個按鈕對應(yīng)一個函數(shù),在本遍歷界面中僅實(shí)現(xiàn)前進(jìn)后退左轉(zhuǎn)右轉(zhuǎn)四個函數(shù)。遍歷開始前首先應(yīng)該單擊開始按鈕(后臺添加主函數(shù)代碼),然后根據(jù)圖的遍歷需要單擊各個按鈕(編輯框中同時(shí)顯示單擊按鈕的次序)。在遍歷完成后需要單擊結(jié)束按鈕(后臺添加返回函數(shù))。 單擊顯示C、匯編、機(jī)器碼三個按鈕會在編輯框中顯示響應(yīng)的C語言代碼匯編語言代碼、機(jī)器語言代碼。其中清除按鈕是消除所有代碼。保存按鈕可以將代碼保存為響應(yīng)的文件。圖的遍歷可分為深度遍歷與廣度遍歷,遍歷過程見附錄。 機(jī)器語言代
25、碼 3.3燒寫程序 保存為.lst文件后,需要用AVR_fighter軟件通過USB接口將程序燒寫到小車內(nèi)。 第四章 開發(fā)流程圖 上 位機(jī) 軟 件 編譯界面 遍歷界面 .hex 文件 AVR_fighter 機(jī)器人 上位機(jī)軟件具體功能的技術(shù)實(shí)現(xiàn) 編輯界面的實(shí)現(xiàn) 在VC++中創(chuàng)建一個App Wizard.exe 工程。在創(chuàng)建過程使用單文檔,并且繼承CeditView類,則生成一個編輯框。 編輯框內(nèi)函數(shù)檢索與報(bào)錯功能的實(shí)現(xiàn) 首先得到文本中的內(nèi)容。定義一個字符型數(shù)組用來記錄文本中各種函數(shù)出現(xiàn)的位置與類型,并且將其值均賦
26、值為空格。 在檢索開始時(shí),要將字符串的空格鍵全部消除(LeftTrim()函數(shù)),然后判斷第一個函數(shù)是否為main()函數(shù),如果不是,彈出對話框經(jīng)行報(bào)錯。然后在剩余的字符串中開始檢索,遇到空格則刪除空格,如果遇到函數(shù),判斷其函數(shù)為哪種類型,如果函數(shù)明匹配,則在函數(shù)名類型數(shù)組中添加一個函數(shù)名開頭的字符,將數(shù)組位置后移一位。如果和所有的函數(shù)均不匹配,則進(jìn)行報(bào)錯。定義一個整形變量,每次消除回車換行符時(shí)經(jīng)行加一,則報(bào)錯時(shí)其值就是出錯函數(shù)所在的行。定義另一個整型變量,每次回車換行時(shí)將其值均為零,而在消除空格時(shí)則進(jìn)行加一。在檢索各個函數(shù)后加上各函數(shù)相應(yīng)字符數(shù)目。在報(bào)錯是其值就是出錯函數(shù)所在的列。函數(shù)類型
27、數(shù)組當(dāng)前非空的位置就是函數(shù)出錯的位置(需要再加1)。 各個函數(shù)的匯編代碼和機(jī)器碼的連接的實(shí)現(xiàn) 通過函數(shù)類型數(shù)組中的不同字符可串接不同函數(shù)的匯編代碼和機(jī)器碼 注:串接的不同函數(shù)代碼需要從文件讀出 char function[10]; for(int j=0;j<10;j++) { function[j]= ; } int i=0; int mes=0;//使其得到對話框返回值 bool isture=true; int row=0;//記錄出錯的行號 int col=0;//記錄出錯的列號 bool isEnter=false;//記錄是否換行
28、,據(jù)此判斷當(dāng)前列出錯函數(shù)位置 while(temp.Find(" ")==0)//消除文本開頭的空格 { temp.TrimLeft(" "); } if(temp.Find("main()")!=0) //如果開頭函數(shù)不是主函數(shù)則進(jìn)行報(bào)錯 MessageBox("第一個函數(shù)為主函數(shù)!"); else { while(temp.GetLength()!=0)//依次遍歷所有函數(shù) { if(temp.Find(" ")==0) { temp.TrimLeft(" ");//消除文本中的空格 col+=1; }
29、 else if(temp.Find("\r\n")==0) { //如果遇見換行則進(jìn)行消除 temp.TrimLeft("\r\n"); row+=1;//將報(bào)錯行加1 col=0;//換行后列變?yōu)? } else if(temp.Find("main()")==0) { function[i]=m; i++; temp.TrimLeft("main()"); } else if(temp.Find("line();")==0) { function[i]=i;
30、i++; temp.TrimLeft("line();"); col+=7; } else if(temp.Find("back();")==0) { function[i]=b; i++; temp.TrimLeft("back();"); col+=7; } else if(temp.Find("left();")==0) { function[i]=l; i++; temp.TrimLeft("left();"); col+=7; } else if(temp
31、.Find("right();")==0) { function[i]=r; i++; temp.TrimLeft("right();"); col+=7; } else { CString saywrong,nth,position; saywrong="函數(shù)有錯!"; nth.Format("%d",i+1); position.Format("%d行%d列",row+1,col+1); //彈出對話框顯示第幾個函數(shù)出錯及其位置 mes = MessageBox("第"+nth+saywr
32、ong+position); break; } } //機(jī)器主函數(shù)模塊 CFile file6("主函數(shù).txt",CFile::modeRead);//定義一個文件對象 char *pBufmainm;//聲明一個緩沖池 DWORD dwFileLenm; dwFileLenm=file6.GetLength();//得到文件長度 pBufmainm=new char[dwFileLenm+1];//實(shí)例化一個緩沖區(qū) pBufmainm[dwFileLenm]=0; file6.Read(pBufmainm,dwFileL
33、enm);//讀文件 file6.Close();//關(guān)閉文件 //機(jī)器前進(jìn) CFile file7("前進(jìn)尋跡.txt",CFile::modeRead); char *pBufgom; DWORD dwFileLengom; dwFileLengom=file7.GetLength(); pBufgom=new char[dwFileLengom+1]; pBufgom[dwFileLengom]=0; file7.Read(pBufgom,dwFileLengom); //MessageBox(pBufgo); fil
34、e7.Close(); //機(jī)器向后 CFile file8("向后翻轉(zhuǎn).txt",CFile::modeRead); char *pBufbackm; DWORD dwFileLenbackm; dwFileLenbackm=file8.GetLength(); pBufbackm=new char[dwFileLenbackm+1]; pBufbackm[dwFileLenbackm]=0; file8.Read(pBufbackm,dwFileLenbackm); file8.Close(); //機(jī)器向左 CFile
35、 file9("左轉(zhuǎn)90度.txt",CFile::modeRead); char *pBufleftm; DWORD dwFileLenleftm; dwFileLenleftm=file9.GetLength(); pBufleftm=new char[dwFileLenleftm+1]; pBufleftm[dwFileLenleftm]=0; file9.Read(pBufleftm,dwFileLenleftm); file9.Close(); //機(jī)器向右 CFile file10("右轉(zhuǎn)90度.txt",CFile::modeRead
36、); char *pBufrightm; DWORD dwFileLenrightm; dwFileLenrightm=file10.GetLength(); pBufrightm=new char[dwFileLenrightm+1]; pBufrightm[dwFileLenrightm]=0; file10.Read(pBufrightm,dwFileLenrightm); file10.Close(); if(0==mes)//如果有函數(shù)出錯則不執(zhí)行匯編命令 { CString func=""; int k=0; while(fu
37、nction[k]!= ) { if(function[k]==m&&function[k]!= ) { //主函數(shù)模塊 CFile file("main.txt",CFile::modeRead); char *pBufmain; DWORD dwFileLen; dwFileLen=file.GetLength(); pBufmain=new char[dwFileLen+1]; pBufmain[dwFileLen]=0; file.Read(pBufmain,dwFileLen); file.Close();
38、 funm+=pBufmainm; func+=pBufmain; k++; continue; } else if(function[k]==i&&function[k]!= ) { //前進(jìn) CFile file1("go.txt",CFile::modeRead); char *pBufgo; DWORD dwFileLengo; dwFileLengo=file1.GetLength(); pBufgo=new char[dwFileLengo+1]; p
39、Bufgo[dwFileLengo]=0; file1.Read(pBufgo,dwFileLengo); //MessageBox(pBufgo); file1.Close(); funm+=pBufgom; func+=pBufgo; k++; continue; } else if(function[k]==b&&function[k]!= ) { //向后 CFile file2("back.txt",CFile::modeRead); char *pBufb
40、ack; DWORD dwFileLenback; dwFileLenback=file2.GetLength(); pBufback=new char[dwFileLenback+1]; pBufback[dwFileLenback]=0; file2.Read(pBufback,dwFileLenback); file2.Close(); funm+=pBufbackm; func+=pBufback; k++; continue; } else if(function[k]=
41、=l&&function[k]!= ) // MessageBox("left();"); { //向左 CFile file3("left.txt",CFile::modeRead); char *pBufleft; DWORD dwFileLenleft; dwFileLenleft=file3.GetLength(); pBufleft=new char[dwFileLenleft+1]; pBufleft[dwFileLenleft]=0; file3.Read(pBufleft,dwFileLenleft); file3.
42、Close(); funm+=pBufleftm; func+=pBufleft; k++; continue; } else if(function[k]==r&&function[k]!= ) // MessageBox("right();"); { //向右 CFile file4("right.txt",CFile::modeRead); char *pBufright; DWORD dwFileLenright; dwFileLenright=file4.GetLengt
43、h(); pBufright=new char[dwFileLenright+1]; pBufright[dwFileLenright]=0; file4.Read(pBufright,dwFileLenright); file4.Close(); funm+=pBufrightm; func+=pBufright; k++; continue; } //返回 CFile file5("return.txt",CFile::modeRead); char *pBufreturn; DWORD dwFi
44、leLenreturn; dwFileLenreturn=file5.GetLength(); pBufreturn=new char[dwFileLenreturn+1]; pBufreturn[dwFileLenreturn]=0; file5.Read(pBufreturn,dwFileLenreturn); file5.Close(); func+=pBufreturn; } GetEditCtrl().SetWindowText(func); } } 遍歷功能的實(shí)現(xiàn) 創(chuàng)建一個對話框,雙擊后會有提示創(chuàng)建對話框類的提示,在該提示
45、對話框中填寫類名,下邊會顯示該類所在頭文件(如果類名以C開頭,則該類對應(yīng)的頭文件名字會自動省略C),現(xiàn)對話框類名定義為CDLG。 在菜單欄中添加一個菜單項(xiàng),將其屬性總的Pop_up選項(xiàng)去掉。將其ID 定義為IDS_MAP,Caption定義遍歷。在該按鈕響應(yīng)函數(shù)的類中中添加頭文件:#include “CDLG..h” 。在其AppWizard的視圖類的函響應(yīng)函數(shù)中添加以下代碼 CDLG dialog//定義一個對話框?qū)ο? dialog.DoModal();//將對話框以模式對話框顯示出來 在對話框動態(tài)添加編輯框按鈕等控件。 定義全局變量: CString show,code=
46、"main()\r\n",ccode,mcode;//定義一個公共變量的字符串 在按鈕的App Wizard的響應(yīng)函數(shù)中分別添加響應(yīng)代碼。 例如向前按鈕 //讀入前進(jìn)列表文件內(nèi)容 CFile file1("go.txt",CFile::modeRead); char *pBufgo; DWORD dwFileLengo; dwFileLengo=file1.GetLength(); pBufgo=new char[dwFileLengo+1]; pBufgo[dwFileLengo]=0; file1.Read(pBufgo,dwFileLengo);
47、 //讀出前進(jìn)機(jī)器代碼文件 CFile file7("前進(jìn)尋跡.txt",CFile::modeRead); char *pBufgom; DWORD dwFileLengom; dwFileLengom=file7.GetLength(); pBufgom=new char[dwFileLengom+1]; pBufgom[dwFileLengom]=0; file7.Read(pBufgom,dwFileLengom); //MessageBox(pBufgo); file7.Close(); ccode+=pBufgo;//對匯編
48、代碼串接 mcode+=pBufgom;//對機(jī)器語言代碼串接 show=show+"直線->";//記錄按鈕顯示順序 code=code+"line()\r\n";//對C語言代碼串接 CEdit* edit1=(CEdit*)GetDlgItem(IDC_EDIT1);//得到編輯框指針 edit1->SetWindowText(show);//將點(diǎn)擊的按鈕顯示在編輯框中 顯示按鈕只需調(diào)用獲得編輯框指針函數(shù)和在編輯框中顯示字符串的函數(shù)顯示相應(yīng)語言的字符串即可。 開始和結(jié)束按鈕需要在匯編語言和機(jī)器語言代碼中添加主函數(shù)代碼和返回函數(shù)代碼。 清除按鈕將個字符串變
49、量設(shè)置為空。并且調(diào)用在對話顯示函數(shù)在對話框中顯示為空。 保存按鈕需要調(diào)用保存相關(guān)函數(shù) CFileDialog fileDlg(false); fileDlg.m_ofn.lpstrTitle="我的文件存儲為";//改變對話框名字 fileDlg.m_ofn.lpstrFilter="Text Files(*.txt)\0*.txt\0All File(*.*)\0*.*\0\0";//過濾器作用 fileDlg.m_ofn.lpstrDefExt="text";//設(shè)置缺省文件名 if(IDOK==fileDlg.DoModal()) { CFile file
50、(fileDlg.GetFileName(),CFile::modeCreate |CFile::modeWrite); file.Write(code,strlen(ccode)); file.Close(); } 其他功能的實(shí)現(xiàn) 工具欄一個按鈕的添加編寫 在工具中的resource中雙擊Toolbar中的一個空的按鈕,編寫其ID,其值將與某個菜單項(xiàng)ID相同,然后繪制按鈕標(biāo)識即可。將按鈕的ID改為菜單項(xiàng)的ID,則該按鈕功能與相應(yīng)的菜單項(xiàng)功能相同。 在狀態(tài)欄中提示框(最左邊)添加一個可以顯示當(dāng)前鼠標(biāo)在窗口內(nèi)的位置(x,y) 在view中添加一個鼠標(biāo)移動的消息響應(yīng)函數(shù)O
51、nMouseMove() 在該函數(shù)中添加如下代碼 void CStyleView::OnMouseMove(UINT nFlags, CPoint point) //在狀態(tài)欄的最左邊顯示鼠標(biāo)的當(dāng)前位置 { // TODO: Add your message handler code here and/or call default CString str; str.Format("x=%d,y=%d",point.x,point.y); GetParent()->GetDescendantWindow(AFX_IDW_STATUS_BAR)->SetWindowText(
52、str); CView::OnMouseMove(nFlags, point); } 用同樣的方法我們也可以得到當(dāng)前窗口光標(biāo)的位置 在VEIW中添加一個KEYUP消息響應(yīng)函數(shù),只需添加同樣的代碼即可 動態(tài)圖標(biāo)的實(shí)現(xiàn) 首先在工程目錄下的res文件添加三個.ico的圖標(biāo) //在框架類中增加一個HICON的變量數(shù)組m_hIcon[3]; 在框架類中的CMainFrame::~CMainFrame()添加 用三種方式得到句柄并加載圖標(biāo) m_hIcons[0]=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1))
53、;//加載載圖標(biāo) m_hIcons[1]=LoadIcon(theApp.m_hInstance,MAKEINTRESOURCE(IDI_ICON2));//需要將theApp在框架類中聲明為全局變量 m_hIcons[2]=LoadIcon(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICON3)); SetClassLong(m_hWnd,GCL_HICON,(LONG)m_hIcons[0]);//設(shè)置初始圖標(biāo) //設(shè)置定時(shí)器 SetTimer(1,1000,NULL);設(shè)置一個一秒鐘發(fā)生一次的時(shí)鐘 在框架類中添加一個時(shí)鐘消
54、息處理函數(shù)并且添加以下代碼 static int index=1;//設(shè)置靜態(tài)變量,避免每次時(shí)鐘發(fā)生時(shí)重新賦值 SetClassLong(m_hWnd,GCL_HICON,(LONG)m_hIcons[index]); index=++index%3; //即在每秒中該邊圖標(biāo)一次 菜單項(xiàng)的添加和相應(yīng)響應(yīng)事件程序的編寫 在Resources中的Menu中動態(tài)添加菜單項(xiàng)。注意菜單沒有ID,如果想給菜單設(shè)置ID需要將其屬性中的Pop_up取消。MFC框架類中有框架類(CMainFrame),應(yīng)用程序類(APP),文件類(Doc)和視圖類(View)等四個基礎(chǔ)類。在使用Class
55、Wizzard是選擇Command后,選擇其中響應(yīng)事件的類。這四個類響應(yīng)事件的順序?yàn)関iew->Frame->Doc->應(yīng)用程序類。注意視圖類覆蓋在框架類之上。 在狀態(tài)欄中顯示一個進(jìn)度欄 在狀態(tài)欄中先添加一個形態(tài)的字符串。過程如下 在CMainFrame()函數(shù)static UINT indicators[]數(shù)組中 添加 IDS_TIMER(一個已經(jīng)在字符串資源中定義的字符串?dāng)?shù)組的ID), 首先要添加一個自定義的消息響應(yīng) 將自動生成的狀態(tài)欄(m_StatusBar)的范圍改為公用類型(public) 在Frame類中定義一個消息 #define UM_PROGRESS WM_
56、USER+1 消息響應(yīng)函數(shù)原型的聲明 afx_msg void OnProgess(); 消息映射(CMianFrame()函數(shù)中)添加 ON_MESSAGE(UM_PROGRESS,OnProgess) 消息響應(yīng)函數(shù)的實(shí)現(xiàn)部分 void CMainFrame::OnProgess() { CRect rect; m_wndStatusBar.GetItemRect(2,&rect); m_progress.Create(WS_CHILD | WS_VISIBLE | PBS_SMOOTH//光滑 ,rect,&m_wndStatusBar,123);//水平的進(jìn)
57、度欄 //m_progress.Create(WS_CHILD | WS_VISIBLE | PBS_VERTICAL,CRect(100,100,120,200),this,123);//垂直進(jìn)度欄 m_progress.SetPos(50); } 在CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)中添加消息發(fā)送函數(shù)PostMessage(UM_PROGRESS); (不是//SendMessage(UM_PROGRESS);) 此時(shí)狀態(tài)欄中可顯示一個進(jìn)度欄,然而在窗口大小改變時(shí)即發(fā)生重繪時(shí)進(jìn)度欄的位置不變,解決辦法如下
58、 在MainFrame中添加一個重繪的消息響應(yīng)函數(shù) 并且添加如下代碼 void CMainFrame::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: Add your message handler code here CRect rect; m_wndStatusBar.GetItemRect(2,&rect); if(!m_progress.m_hWnd)//如果沒有創(chuàng)建則創(chuàng)建進(jìn)度欄 { m_progress.Create(WS_CHILD |
59、WS_VISIBLE ,rect,&m_wndStatusBar,123);//水平的進(jìn)度欄 //m_progress.Create(WS_CHILD | WS_VISIBLE | PBS_VERTICAL,CRect(100,100,120,200),this,123);//垂直進(jìn)度欄 } else m_progress.MoveWindow(rect);//如果已經(jīng)創(chuàng)建進(jìn)度欄矩形區(qū)域則將進(jìn)度欄放進(jìn)窗口 m_progress.SetPos(50); // Do not call CFrameWnd::OnPaint() for painting messages }
60、 是進(jìn)度欄動起來 在CMainFrame中添加時(shí)鐘消息響應(yīng)函數(shù)并添加代碼 m_progress.StepIt();//使進(jìn)度欄動起來 給菜單項(xiàng)添加快捷鍵的方式如下 在資源Accelerator中添加相應(yīng)菜單項(xiàng)的ID和快捷鍵即可。 在文件類中的OnNewDocument()函數(shù)中添加SetTitle("標(biāo)題");//即可改變標(biāo)題(默認(rèn)為無標(biāo)題) 第五章 機(jī)器人硬件組裝及代碼分析 小車共有四部分組成,分別為ATmega128單片機(jī),控制變壓電路板,電機(jī)以及傳感器,小車共有十二個傳感器,其中兩個較大傳感器放在小車前后沿中間,用來感應(yīng)前方是否有障礙物,在小車的前后沿下方分別有
61、五個傳感器,用來感應(yīng)小車下方白條,通過傳感器能否感應(yīng)到白條而決定是否做出相應(yīng)動作。 具體小車控制程序編寫對寄存器的設(shè)置 DDRA=0XFF; //設(shè)置PA端口輸入,通過該端口可以將感應(yīng)器信號輸入到寄存器PINA中 PORTA=0XFF;//PORTA為該端口中輸出寄存器,默認(rèn)情況下各位均為1 DDRB=0XFF; //設(shè)置PB端口為輸出, PORTB=0X00; //控制方向 0向后 1向前(低4位有效),第五位和第六位為定時(shí)器輸出PWM 波 DDRC=0X00; //將PD端口設(shè)置為輸入,前5個傳感器得到的信號經(jīng)該端口輸入到空控制器 PORTC=0XFF; //將PD
62、端口中的輸出寄存器默認(rèn)設(shè)置為FF DDRD=0X00; //將PD端口設(shè)置為輸入,后5個傳感器得到的信號經(jīng)該端口輸入到空控制器 PORTD=0XFF; //將PD端口中的輸出寄存器默認(rèn)設(shè)置為FF DDRE=0XFF; 將PD端口設(shè)置為輸出,從該端口輸出PWM波 PORTE=0X00; //PE3和PE4輸出PWM波 TCCR1A=0XF3;//定時(shí)器輸出PWM波模式設(shè)置 TCCR1B=0X01; TCCR3A=0XF3; TCCR3B=0X01; 編寫一個死循環(huán)函數(shù),從而使小車不斷檢測傳感器信號從而調(diào)整動作 //循環(huán)判斷 while(1) { OCR1A=80
63、0; //控制速度PWM波值越大高電平占空比較大,速度較快 OCR1B=800; OCR3A=800; //控制速度PWM波值越大高電平占空比較大,速度較快 OCR3B=800; //該處分別為四個電機(jī)通過輸出的PWM波設(shè)置為相同的速度 if(PINA==0XFE) //如果前面大傳感器得到信號(碰到障礙物時(shí)信號為0) PORTB=0X00; //將PB端口中的輸出寄存器PORTB設(shè)置為0從而小車向后移動 else if(PINA==0XFD) //如果前面大傳感器沒有得到信號 PORTB=0X0F; //將PB端口中的輸出寄存器PORTB設(shè)置為1從而小車向前移動
64、 if(PORTB==0X00)//假設(shè)小車向后移動 { switch(PIND) //通過后五個傳感器信號判斷小車應(yīng)該調(diào)整的動作 { //右轉(zhuǎn)90 case 0xe3: //此時(shí)小車后邊五個傳感器右邊三個測到信號(逆著小車方向看) { PORTB=0X02; //此時(shí)小車右邊兩個電機(jī)中的后邊的電機(jī)不動 for(i=0;i<1000;i++) for(j=0;j<1000;j++) ;//將這種狀態(tài)保持一段世間,根據(jù)力學(xué)原理小車向右偏轉(zhuǎn) PORTB=0X00; //偏轉(zhuǎn)過去以后小車?yán)^續(xù)前進(jìn) break;} //左轉(zhuǎn)90 case 0xf8: /
65、///此時(shí)小車后邊五個傳感器左邊三個測到信號(逆著小車方向看) { PORTB=0X01; //此時(shí)小車右邊兩個電機(jī)中的后邊的電機(jī)不動 for(i=0;i<1000;i++) for(j=0;j<1200;j++) ; 將這種狀態(tài)保持一段世間,根據(jù)力學(xué)原理小車向左偏轉(zhuǎn) PORTB=0X00; //偏轉(zhuǎn)過去以后小車?yán)^續(xù)前進(jìn) break;} //左大轉(zhuǎn) case 0xeb: //此時(shí)小車左邊的第一個和第三個傳感器得到信號 { OCR1B=600; //將控制小車的左邊的前輪速度減?。ㄍㄟ^調(diào)整PWM波) PORTB=0X02; //將小車的左邊后輪設(shè)置為相反的前
66、進(jìn)方向 for(i=0;i<1000;i++) for(j=0;j<1800;j++) ;//將這種情況持續(xù)一段時(shí)間,從而小車可以向做偏轉(zhuǎn)315度 PORTB=0X00; //將小車四個輪子均調(diào)整為向前行駛 break;} //右大轉(zhuǎn) case 0xfa: //此時(shí)小車右邊邊的第一個和第三個傳感器得到信號(傳感器個數(shù)從中間算起) { OCR2B=600; //將控制小車的右邊的前輪速度減小(通過調(diào)整PWM波) PORTB=0X01; //將小車的右邊后輪設(shè)置為相反的前進(jìn)方向 for(i=0;i<1000;i++) for(j=0;j<1800;j++) ; //將這種情況持續(xù)一段時(shí)間,從而小車可以向做偏轉(zhuǎn)315度 PORTB=0X00; //將小車四個輪子均調(diào)整為向前行駛 break;} //左調(diào)轉(zhuǎn) case 0XF3: //此時(shí)小車左邊第二個和第三個傳感器檢測到信號,即小車向右偏了 case 0XF7: //此時(shí)小車左邊第二個檢測到信號,即小車向右偏了 {
- 溫馨提示:
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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。