版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
./附錄AKeilμVision4集成開發(fā)環(huán)境與C語言程序設(shè)計Keil公司是一家業(yè)界領(lǐng)先的微控制器〔MCU軟件開發(fā)工具的獨立供應(yīng)商.Keil公司由兩家私人公司聯(lián)合運(yùn)營,分別是德國慕尼黑的KeilElektronikGmbH和美國德克薩斯的KeilSoftwareInc.Keil公司制造和銷售種類廣泛的開發(fā)工具,包括ANSIC編譯器、宏匯編程序、調(diào)試器、連接器、庫管理器、固件和實時操作系統(tǒng)核心<real-timekernel>.有超過10萬名微控制器開發(fā)人員在使用這種得到業(yè)界認(rèn)可的解決方案.其KeilC51編譯器自1988年引入市場以來成為事實上的行業(yè)標(biāo)準(zhǔn),并支持超過500種80C51變種.Keil公司在2007年被ARM公司收購.其兩家公司分別更名為ARMGermanyGmbH和ARMInc和.2009年2月,Keil公司發(fā)布了KeilμVision4,KeilμVision4引入靈活的窗口管理系統(tǒng),使開發(fā)人員能夠使用多臺監(jiān)視器,提供可在虛擬接口上隨意放置窗口的完整控制能力.新的用戶界面可以更好地利用屏幕空間和更有效地組織多個窗口,提供一個整潔,高效的環(huán)境來開發(fā)應(yīng)用程序.新版本支持更多最新的80C51兼容芯片及ARM芯片,還添加了一些其他新功能,如系統(tǒng)查看器<SystemViewer>窗口、多項目工作空間<Multi-ProjectWorkspace>等.附A.1KeilμVision4集成開發(fā)環(huán)境附A.1.1KeilμVision4集成開發(fā)環(huán)境〔IntegratedDevelopmentEnvironment,IDE是一個基于Windows的開發(fā)平臺,它包含高效的源代碼編輯器、項目〔Project管理器和程序生成〔MAKE工具.KeilμVision4支持所有的80C51嵌入式應(yīng)用工具,它包括C/C++編譯器宏匯編器、連接/定位器和一個HEX文件生成器.KeilμVision4通過以下特性加速MCU嵌入式應(yīng)用系統(tǒng)的開發(fā)過程:★全功能的源代碼編輯器;★器件庫用來配置開發(fā)工具設(shè)置;★項目管理器用來創(chuàng)建和維護(hù)項目;★集成的MAKE工具可以匯編、編譯和連接用戶的嵌入式應(yīng)用;★所有開發(fā)工具的設(shè)置都是以對話框的形式出現(xiàn)的;★具有真正的源代碼級的對CPU和外圍器件的調(diào)試器;★高級GDI接口用來在目標(biāo)硬件上進(jìn)行軟件調(diào)試以及和Monitor-51進(jìn)行通信;★與開發(fā)工具手冊、器件數(shù)據(jù)手冊和用戶指南有直接的鏈接.1.C51編譯器和A51匯編器源代碼由μVision4創(chuàng)建,并被C51編譯成A51匯編.編譯器和匯編器從源代碼生成可重定位的目標(biāo)文件.KeilC51編譯器完全遵照ANSIC語言標(biāo)準(zhǔn),支持C語言的所有標(biāo)準(zhǔn)特性.另外,直接支持80C51結(jié)構(gòu)的幾個特性被添加里面.KeilA51宏匯編器支持80C51及其派生系列的全部指令集.2.LIB51庫管理器LIB51庫管理器允許從由編譯器或匯編器生成的目標(biāo)文件創(chuàng)建目標(biāo)庫.庫是一種被特別地組織過并在以后可以被連接重用的對象模塊.當(dāng)連接器處理一個庫時,僅僅那些被使用的目標(biāo)模塊才被真正使用.3.BL51連接器/定位器BL51連接器/定位器利用從庫中提取的目標(biāo)模塊和由編譯器或匯編器生成的目標(biāo)模塊創(chuàng)建一個絕對地址的目標(biāo)模塊.一個絕對地址目標(biāo)模塊或文件包含不可重定位的代碼和數(shù)據(jù).所有的代碼和數(shù)據(jù)被安置在固定的存儲器單元中.此絕對地址目標(biāo)文件可以用來:寫入EPROM或其他存儲器件.通過μVision4調(diào)試器來模擬和調(diào)試.通過仿真器來測試程序.4.OH51目標(biāo)文件轉(zhuǎn)換器OH51目標(biāo)文件轉(zhuǎn)換器可以把前面編譯連接好的目標(biāo)文件轉(zhuǎn)換成能寫入EPROM中的HEX文件.5.μVision4調(diào)試器μVision4源代碼級調(diào)試器是一個理想的快速、可靠的程序調(diào)試器.此調(diào)試器包含一個高速模擬器,能夠模擬整個8051系統(tǒng),包括片上外圍器件和外部硬件.當(dāng)從器件庫中選擇器件時,這個器件的特性將自動配置.μVision4調(diào)試器為在實際目標(biāo)板上測試程序提供了以下2種方法:安裝MON51目標(biāo)監(jiān)控器到目標(biāo)系統(tǒng)并且通過Monitor-51接口下載程序;利用高級的GDI〔AGDI接口,把μVision4調(diào)試器綁定到目標(biāo)系統(tǒng).6.Monitor-51μVision4調(diào)試器支持用Monitor-51進(jìn)行目標(biāo)板調(diào)試.此監(jiān)控程序駐留在目標(biāo)板的存儲器里,它利用串口和μVision4調(diào)試器進(jìn)行通信.利用Monitor-51,μVision4調(diào)試器可以對目標(biāo)硬件實行源代碼級的調(diào)試.7.RTX-51實時操作系統(tǒng)RTX-51實時操作系統(tǒng)是一個針對8051系統(tǒng)的多任務(wù)核.RTX-51實時內(nèi)核從本質(zhì)上簡化了對實時事件反應(yīng)速度要求高的復(fù)雜應(yīng)用系統(tǒng)的設(shè)計、編程和調(diào)試.RTX-51實時內(nèi)核是完全集成到C51編譯器中的,從而方便使用.任務(wù)描述表和操作系統(tǒng)的連接由BL51連接器/定位器自動控制.附A.1.2了解了KeilμVision4的一些基本概況后,下面開始在計算機(jī)上搭建MCU的集成開發(fā)環(huán)境.操作步驟如下:首先準(zhǔn)備KeilμVision4安裝源文件,雙擊μVision4的Setup安裝文件,彈出KeilμVision4安裝的歡迎界面,如圖A-1所示.圖A-1KeilμVision4歡迎界面單擊"Next"按鈕,彈出"LicenseAgreement"對話框,如圖A-2所示.這里顯示了一些用戶安裝的協(xié)議和許可的要求,選擇"IagreetoallthetermsoftheprecedingLicenseAgreement"即可,否則無法進(jìn)入下一步.圖A-2"LicenseAgreement"對話框單擊"Next"按鈕,彈出"FolderSelection"對話框,如圖A-3所示.系統(tǒng)默認(rèn)安裝在"C:\Keil"文件夾下.在這里,單擊"Browse"按鈕,可以選擇安裝的目錄.圖A-3"FolderSelection"對話框單擊"Next"按鈕,彈出"CustomerInformation"對話框,如圖A-4所示.此時,用戶需要輸入用戶名、公司名稱和E-mail,缺一不可.圖A-4用戶信息輸入單擊"Next"按鈕,下面便開始自動安裝.KeilμVision4安裝完成后,彈出安裝完成對話框,如圖A-5所示.這里的幾個選項的含義如下.圖A-5完成安裝ShowReleaseNotes:顯示安裝的版本注釋信息.AddExampleprojectstotherecentlyusedprojectlist:添加一個示例程序到當(dāng)前項目列表中.RetaincurrentμVisionconfiguration:保持當(dāng)前的設(shè)置〔如果是第一次安裝,則不存在這個選項.最后,單擊"Finish"按鈕,便可以結(jié)束KeilμVision4集成開發(fā)環(huán)境的安裝.需要注意的是,剛剛安裝完的版本是試用版〔EvaluationVersion,代碼長度有2KB限制.如果代碼長度超過2KB,可與Keil公司〔聯(lián)系,購買LIC〔LicenseIDCode.附A.1.3KeilμVision4安裝完成后,會在桌面上出現(xiàn)KeilμVision4程序的圖標(biāo),并在"開始"程序里增加"KeilμVision4"程序項.從"開始"程序里選擇"KeilμVision4"程序項或者直接雙擊桌面上的KeilμVision4程序圖標(biāo),即可啟動KeilμVision4.啟動KeilμVision4后,如果是第一次運(yùn)行,則打開工程項目"Hello",如圖A-6所示.圖A-6KeilμVision4集成開發(fā)環(huán)境界面這里可以看到,KeilμVision4集成開發(fā)環(huán)境具有典型的Windows界面風(fēng)格.整個編程界面主要包括菜單欄、工具欄、項目管理區(qū)、源代碼工作區(qū)和輸出信息窗口.另外,還有一些功能窗口將在后面逐步介紹.下面我們將帶領(lǐng)讀者逐一認(rèn)識KeilμVision4集成開發(fā)環(huán)境的主要組成部分.附A.1.4KeilμVision4菜單KeilμVision4的菜單欄提供了項目操作、編輯操作、編譯調(diào)試及幫助等各種常用操作.所有的操作基本上都可以通過菜單命令來實現(xiàn).為了快速執(zhí)行KeilμVision4的許多功能,有些菜單命令在工具欄上還具有工具條.為了更快速執(zhí)行一些功能,KeilμVision4提供了比工具欄上的工具條更為快捷的操作,即快捷鍵.在KeilμVision4集成開發(fā)環(huán)境中不僅提供了常用功能的默認(rèn)快捷鍵,同時用戶也可以根據(jù)自己的需要自定義快捷鍵.下面就菜單命令、工具條、快捷鍵分別進(jìn)行介紹.1.File菜單File菜單和標(biāo)準(zhǔn)的Windows軟件的File菜單類似,提供了項目和文件的操作功能.File菜單各個命令的功能如表A-1所示.表A-1File菜單菜單命令工具條快捷鍵功能說明NewCtrl+N創(chuàng)建一個新的空白文件OpenCtrl+O打開一個已存在的文件Close關(guān)閉當(dāng)前打開的文件SaveCtrl+S保存當(dāng)前打開的文件Saveas當(dāng)前文件另存為Saveall保存所有打開的文件DeviceDatabase打開器件庫LicenseManagement產(chǎn)品注冊管理PrintSetup設(shè)置打印機(jī)PrintCtrl+P打印當(dāng)前文件PrintPreview打印預(yù)覽1..10列出最近打開的源文件或文本文件Exit退出KeilμVision42.Edit菜單Edit菜單提供了常用的代碼編輯操作命令.Edit菜單各個命令的功能如表A-2所示.表A-2Edit菜單菜單命令工具條快捷鍵功能說明UndoCtrl+Z取消上次操作RedoCtrl+Y重復(fù)上次操作CutCtrl+X剪切選定的內(nèi)容CopyCtrl+C復(fù)制選定的內(nèi)容PasteCtrl+V粘貼已復(fù)制的內(nèi)容NavigateBackwardsCtrl+Shift+-光標(biāo)移動到使用Find或gotoline命令的前一行NavigateForwardsCtr+-光標(biāo)移動到使用Find或gotoline命令的后一行Insert/RemoveBookmarkCtrl+F2設(shè)置/取消當(dāng)前行的標(biāo)簽GotoNextBookmarkF2光標(biāo)移動到下一個標(biāo)簽GotoPreviousBookmarkShift+F2光標(biāo)移動到上一個標(biāo)簽ClearAllBookmarksCtrl+Shift+F2清除當(dāng)前文件的所有標(biāo)簽FindCtrl+F在當(dāng)前文件中查找ReplaceCtrl+H替換FindinFilesCtrl+Shift+F在多個文件中查找IncrementalFindCtrl+I漸進(jìn)式尋找Outlining源代碼概要顯示模式Advanced各種高級編輯命令Configuration顏色、字體等高級配置3.View菜單View菜單提供了在源代碼編輯和仿真調(diào)試過程中,各個窗口和工具欄的顯示和隱藏命令.View菜單各個命令的功能如表A-3所示.表A-3View菜單菜單命令工具條功能說明StatusBar顯示/隱藏狀態(tài)條Toolbars顯示/隱藏工具欄ProjectWindow顯示/隱藏項目管理窗口BooksWindow顯示/隱藏參考書窗口FunctionsWindow顯示/隱藏函數(shù)窗口TemplatesWindow顯示/隱藏模板窗口SourceBrowserWindow顯示/隱藏資源瀏覽器窗口BuildOutputWindow顯示/隱藏輸出信息窗口FindinFilesWindow顯示/隱藏在所有文件中查找文本窗口FullScreen顯示/隱藏全屏顯示窗口調(diào)試模式下的菜單命令CommandWindow顯示/隱藏命令行窗口DisassemblyWindow顯示/隱藏反匯編窗口SymbolsWindow顯示/隱藏字符變量窗口RegistersWindow顯示/隱藏寄存器窗口CallStackWindow顯示/隱藏堆棧窗口WatchWindows顯示/隱藏變量子菜單觀察窗口MemoryWindows顯示/隱藏存儲器子菜單窗口SerialWindows顯示/隱藏串行口觀察子菜單窗口AnalysisWindows顯示/隱藏分析子菜單窗口Trace顯示/隱藏跟蹤子菜單窗口SystemViewer顯示/隱藏外設(shè)子菜單窗口ToolboxWindow顯示/隱藏自定義工具條窗口PeriodicWindowUpdate在程序運(yùn)行時刷新調(diào)試窗口4.Project菜單Project菜單提供了MCU項目的創(chuàng)建、設(shè)置和編譯等命令.Project菜單各個命令的功能如表A-4所示.表A-4Project菜單菜單命令工具條快捷鍵功能說明NewμVisionProject...
創(chuàng)建新項目NewMulti-ProjectWorkspace...創(chuàng)建多項目工作空間OpenProject...打開一個已存在的項目CloseProject關(guān)閉當(dāng)前項目Export導(dǎo)出當(dāng)前一個或多個項目為μVision3格式Manage管理項目的包含文件、庫的路徑及多項目工作空間SelectDeviceforTargetname...為當(dāng)前項目選擇一個MCU類型Removeobject從當(dāng)前項目中移除選擇的文件或項目組OptionsforobjectAlt+F7設(shè)置當(dāng)前文件、項目或項目組的配置選項Cleantarget清除編譯過程中創(chuàng)建的中間文件BuildtargetF7編譯文件并生成應(yīng)用文件Rebuildalltargetfiles重新編譯所有文件并生成應(yīng)用文件BatchBuild...批量編譯文件并生成應(yīng)用文件TranslatefileCtrl+F7編譯當(dāng)前文件Stopbuild停止編譯當(dāng)前項目1..10列出最近打開的項目〔最多10個5.Flash菜單Flash菜單提供了下載程序、擦除MCU程序存儲器等操作.這里的命令需要外部的編程器支持才可以使用.Flash菜單各個命令的功能,如表A-5所示.表A-5Flash菜單菜單命令工具條功能說明Download下載MCU程序Erase擦除程序存儲器ConfigureFlashTools...打開配置工具6.Debug菜單Debug菜單中的命令大多用于仿真調(diào)試過程中,提供了斷點、調(diào)試方式及邏輯分析等功能.Debug菜單各個命令的功能如表A-6所示.表A-6Debug菜單菜單命令工具條快捷鍵功能說明Start/StopDebugSessionCtrl+F5開始/停止仿真調(diào)試模式ResetCPU復(fù)位CPU〔MCURunF5運(yùn)Stop停止運(yùn)行程序StepF11單步執(zhí)行程序,遇到子程序則進(jìn)入StepoverF10單步執(zhí)行程序,跳過子程序StepoutCtrl+F11程序執(zhí)行到當(dāng)前函數(shù)的結(jié)束RuntoCursorlineCtrl+F10程序執(zhí)行到光標(biāo)所在行ShowNextStatement顯示下一條指令BreakpointsCtrl+B打開斷點對話框Insert/RemoveBreakpointF9設(shè)置/取消當(dāng)前行的斷點Enable/DisableBreakpointCtrl+F9使能/禁止當(dāng)前行的斷點DisableAllBreakpoints禁用所有斷點KillAllBreakpointsCtrl+Shift+F9取消所有斷點OSSupport打開查看事件、任務(wù)及系統(tǒng)信息的子菜單ExecutionProfiling打開一個帶有配置選項的子菜單MemoryMap打開存儲器空間配置對話框InlineAssembly對某一行進(jìn)行重新匯編,可以修改匯編代碼FunctionEditor<OpenIniFile>編輯調(diào)試函數(shù)和調(diào)試配置文件DebugSettings設(shè)置調(diào)試參數(shù)7.Peripherals菜單Peripherals菜單提供了MCU各種硬件資源的仿真對話框.這里的所有命令都只在仿真調(diào)試環(huán)境下才顯示并可以使用,而且顯示的資源內(nèi)容隨用戶選擇的MCU型號的不同而不同.這里列出一些常用到的Peripherals菜單命令的功能,如表A-7所示.表A-7Peripherals菜單菜單命令功能說明Interrupt打開中斷仿真對話框I/OPorts打開并行端口仿真對話框Serial打開串口仿真對話框Timer打開定時器仿真對話框Watchdog打開看門狗仿真對話框A/DConverter打開A/D轉(zhuǎn)換器仿真對話框D/AConverter打開D/A轉(zhuǎn)換器仿真對話框I2CController打開I2C總線控制器仿真對話框CANController打開CAN總線控制器仿真對話框8.Tools菜單Tools菜單提供了一些第三方軟件的支持,例如PC-Lint.用戶需要額外安裝相應(yīng)的軟件才可以使用.Tools菜單一般使用得比較少,這里僅列出各個命令的功能,如表A-8所示.表A-8Tool菜單菜單命令功能說明Set-upPC-Lint配置PC-Lint程序Lint用PC-Lint程序處理當(dāng)前編輯的文件LintAllC-SourceFiles 用PC-Lint程序處理項目中所有的C源代碼文件CustomizeToolsMenu...自定義工具菜單9.SVSC菜單SVSC菜單提供了程序的版本控制,該菜單下僅包括"ConfigureVersionControl"一個命令,用于配置軟件版本.另外,Windows菜單下提供了對工作區(qū)窗口布局的管理,Help菜單提供了一些幫助信息,這里不再具體介紹.附A.2KeilμVision4匯編語言程序的調(diào)試方法KeilμVision4集成開發(fā)環(huán)境中包括一個項目管理器,它可以使基于80C51內(nèi)核的MCU應(yīng)用系統(tǒng)設(shè)計變得簡單.要創(chuàng)建一個應(yīng)用,需要按下列步驟操作:1.啟動KeilμVision4,新建一個項目文件并從器件庫中選擇一個器件;2.新建一個源文件并把它加入到項目中;3.設(shè)置目標(biāo)硬件選項;4.編譯項目并生成可以編程到程序存儲器的HEX文件;5.軟件模擬調(diào)試及下載到MCU中進(jìn)行仿真調(diào)試.下面通過一個實例,詳細(xì)介紹如何在KeilμVision4集成開發(fā)環(huán)境中調(diào)試80C51系列MCU的匯編語言程序.[例A-1]假設(shè)晶振頻率為11.0592MHz,將MCU片外RAM中40H—5FH單元中的內(nèi)容全部移到片內(nèi)相同地址區(qū)域,并將原數(shù)據(jù)區(qū)全部清零.附A.2.1啟動Keil雙擊桌面KeilμVision4程序圖標(biāo)或單擊開始菜單中的KeilμVision4程序項,啟動KeilμVision4集成開發(fā)環(huán)境.要新建一個項目文件,可以從KeilμVision4的Project菜單中選擇"NewProject"項,打開"CreateNewProject"對話框,如圖A-7所示.圖A-7"CreateNewProject"對話框在此對話框的"文件名"欄中輸入項目文件名.建議為每一個項目建立一個獨立的文件夾.首先,在下拉列表中選擇要保存的位置,最好選擇邏輯盤D或E〔不要保存在系統(tǒng)盤C,避免因系統(tǒng)重新安裝而丟失文件.單擊"新建文件夾",,得到一個空文件夾,給該文件夾重命名為"test"〔文件夾的名字最好能夠體現(xiàn)項目名稱.雙擊該文件夾,在"文件名〔N"欄中輸入項目的名稱,如"movedata",創(chuàng)建一個文件名為"movedata.uvproj"的新項目文件.單擊"保存〔S"按鈕,將彈出"SelectDeviceforTarget‘Target1’"對話框,提示為項目選擇一個MCU.在該對話框中,"Database"列表框中顯示出各個MCU的生產(chǎn)商.首先找到選用的MCU生產(chǎn)商,單擊前面的"+"號,顯示出KeilμVision4所支持的該公司的MCU型號列表,單擊其中選定的MCU型號.如本例中,選擇Atmel公司的型號為AT89S52的MCU,如圖A-8所示.圖A-8"SelectDeviceforTarget‘Target1’"對話框單擊"OK"按鈕,彈出如圖A-9所示的對話框,提示是否將標(biāo)準(zhǔn)8051啟動代碼復(fù)制到項目文件夾中并將該文件添加到項目中去.圖A-9復(fù)制啟動代碼提示對話框在KeilμVision4中,啟動代碼在復(fù)位目標(biāo)系統(tǒng)后立即被執(zhí)行.啟動代碼主要實現(xiàn)以下功能:★清除內(nèi)部數(shù)據(jù)存儲器;★清除外部數(shù)據(jù)存儲器;★清除外部頁存儲器;★初始化small模式下的可重入棧和指針;★初始化large模式下的可重入棧和指針;★初始化compact模式下的可重入棧和指針;★初始化8051硬件棧指針;★傳遞初始化全局變量的控制命令或者在沒有初始化全局變量時給main函數(shù)傳遞命令.在每一個啟動文件中,提供了可供用戶自己修改有來控制程序執(zhí)行的匯編常量.如果只是調(diào)試簡單程序,可以選擇"否〔N",如果項目復(fù)雜可選擇"是〔Y".用戶可根據(jù)需要修改啟動代碼,但一般不建議修改啟動代碼.附A.2.2從"File"菜單中選擇"New"項新建一個源文件,或者單擊工具欄上的按鈕,打開一個空白的編輯窗口,用戶可以輸入程序源代碼.輸入以下程序源代碼:ORG 0000HLJMP MAINORG 0040HMAIN:MOV SP,#70HMOV R0,#40HMOV R1,#20HLOOP: MOV P2,#00H;軟件仿真時必須有 MOVX A,@R0MOV @R0,AMOV A,#00HMOVX @R0,AINC R0DJNZ R1,LOOPEND從"File"菜單中選擇"Save"項或者單擊工具欄中的保存按鈕,將文件保存為想要的名字.如果使用匯編語言編寫程序,則文件的后綴名是:.asm或者.a51,如test.asm,如圖A-10所示〔如果使用C語言編寫程序,則文件的后綴名是:.c,以下步驟與匯編語言程序相同.保存后,KeilμVision4將高亮顯示匯編語言語法字符,如圖A-11所示.圖A-10保存源文件圖A-11保存后程序顯示界面源文件創(chuàng)建完成后,就可以將它加入到項目中〔如不加入,則無法對此文件操作.KeilμVision4提供了幾種方法讓用戶把源文件加入到項目中.〔1在"ProjectWorkspace"〔項目管理器窗口中單擊"Target1"前面的"+"號,展開下一層的"SourceGroup1"文件夾,在"SourceGroup1"文件夾上單擊鼠標(biāo)右鍵,彈出快捷菜單,如圖A-12所示.從彈出的快捷菜單中單擊"AddFilestoGroup‘SourceGroup1’…"項,彈出"AddFilestoGroup‘SourceGroup1’…"對話框,如圖A-13所示.圖A-12將源文件加入到項目中圖A-13"AddFilestoGroup‘SourceGroup1’…"對話框在該對話框中,默認(rèn)的文件類型是"CSourcefile〔*.c".若使用匯編語言進(jìn)行設(shè)計,則需要從"文件類型"下拉列表框中選擇"AsmSourcefile〔*.S*;*.src;*.a*"文件類型.這樣,以.asm為擴(kuò)展名的匯編語言程序文件才會出現(xiàn)在文件列表框中.從文件列表框中選擇要加入的文件并雙擊即可添加到項目中;也可以單擊選中文件,然后單擊"Add"按鈕將該文件加入項目中.添加文件后,對話框不會自動關(guān)閉,而是繼續(xù)等待添加其它文件,用戶可單擊"Close"按鈕,關(guān)閉對話框.當(dāng)給項目添加文件成功后,項目管理器的"SourceGroup1"文件夾前面會出現(xiàn)"+"號,單擊它可看到test.asm文件已經(jīng)包含在項目中了.雙擊它即可打開進(jìn)行修改.附A.2.3KeilμVision4允許用戶為目標(biāo)硬件設(shè)置選項.可以通過單擊工具條圖標(biāo)、菜單"Project"的"OptionsforTarget‘Target1’…"項或者在"ProjectWorkspace"窗口的"Target1"上單擊鼠標(biāo)右鍵,打開"OptionsforTarget‘Target1’…"對話框.在各選項卡中,可以修改與目標(biāo)硬件及所選MCU的片上集成器件的所有參數(shù),如圖A-14所示.圖A-14OptionsforTarget‘Target1’對話框主要設(shè)置CPU的時鐘頻率、編譯器的存儲模式等.晶振頻率設(shè)置應(yīng)與實際使用的晶振頻率相同.如果僅進(jìn)行軟件模擬調(diào)試,則采用默認(rèn)設(shè)置即可.附A.2.單擊工具欄中的"Rebuild"圖標(biāo),可以編譯所有的源文件并生成應(yīng)用.當(dāng)程序中有語法錯誤時,KeilμVision4將在"BuildOutput"窗口顯示錯誤或者警告信息.雙擊一行錯誤提示信息,將打開此信息對應(yīng)的文件,并定位到語法錯誤處,如圖A-15所示.在錯誤信息上雙擊鼠標(biāo),光標(biāo)會自動定位到出現(xiàn)該錯誤的程序行上.例如,如圖A-15所示,出現(xiàn)"test.asm<15>:errorA45:UNDEFINEDSYMBOL<PASS-2>"〔未定義符號錯誤信息,雙擊該信息,光標(biāo)定位到出現(xiàn)該錯誤的行上.用戶很容易發(fā)現(xiàn)錯誤原因是將標(biāo)號"LOOP"錯寫成"LOO",漏掉字母P.由輸入引起的用戶常犯的編譯錯誤還有:錯將數(shù)字0輸成字母o,使用中文輸入法輸入了全角逗號〔,和冒號〔:,大于9FH〔如A8H的十六進(jìn)制數(shù)忘記在前面加上數(shù)字0〔正確寫法0A8H等.根據(jù)錯誤信息提示,修改程序中出現(xiàn)的錯誤,直到編譯成功為止.一旦編譯成功,則顯示如圖A-16所示信息.提示信息最后一行為""movedata"-0Error<s>,0Warning<s>.",不但沒有錯誤,而且最好也沒有警告.需要注意的是,KeilμVision4默認(rèn)是不生成HEX文件的.這時就需要設(shè)置目標(biāo)硬件選項中的"Output"選項卡,選中"CreateHEXFile"前面的復(fù)選框,如圖A-17所示.圖A-15編譯出現(xiàn)錯誤信息時的提示圖A-16編譯成功提示信息圖A-17生成HEX文件的選項附A.2.5軟件模擬調(diào)試及下載到一旦編譯成功,就可以進(jìn)行程序的仿真調(diào)試了.對于程序的調(diào)試,有兩種方式:一種是軟件模擬仿真調(diào)試,另一種就是下載到硬件仿真器或者M(jìn)CU中進(jìn)行在線仿真調(diào)試.一般情況下,首先使用軟件模擬仿真調(diào)試,通過之后,再用硬件仿真器或者直接下載到MCU中進(jìn)行在線仿真調(diào)試.由于軟件模擬仿真調(diào)試與在線仿真調(diào)試方法基本相同,所以就以軟件模擬仿真調(diào)試為例,介紹程序的調(diào)試方法.為了對前面編寫的程序能夠在不連接硬件仿真器或者M(jìn)CU的情況下進(jìn)行仿真調(diào)試〔即軟件模擬,需對KeilμVision4做一下設(shè)置.按照2.3設(shè)置目標(biāo)硬件選項打開"OptionsforTarget‘Target1’…"對話框,選中"Debug"頁,如圖A-18所示.一般情況下,如果沒有進(jìn)行硬件仿真,則"UseSimulator"單選框是默認(rèn)選中的,此時,進(jìn)行軟件模擬調(diào)試,其它選項不做修改;否則,則選中"Use:"單選框,并在其下拉框中選擇相應(yīng)的硬件驅(qū)動,并點擊"Settings"按鈕對目標(biāo)仿真硬件進(jìn)行設(shè)置.圖A-18設(shè)置"OptionsforTarget‘Target1’…"對話框中的"Debug"頁通過以上設(shè)置,就可以進(jìn)行軟件模擬調(diào)試了.單擊工具欄中的"Start/StopDebugSession"按鈕,或者從"Debug"菜單中選中"Start/StopDebugSession"項〔其快捷鍵為Ctrl+F5,,開始模擬調(diào)試過程.在調(diào)試過程中,可以進(jìn)行如下操作:1.連續(xù)運(yùn)行單擊工具欄中的按鈕,或者"Debug"菜單中的"Run"〔快捷鍵F5,可以使程序全速運(yùn)行.2.停止程序運(yùn)行當(dāng)程序全速運(yùn)行時,可以單擊工具欄中的按鈕,或者"Debug"菜單中的"Stop",使程序停止運(yùn)行.3.復(fù)位CPU當(dāng)程序運(yùn)行過一次以上后,累加器A、某些寄存器或者其它資源的值修改了,而再次運(yùn)行需要恢復(fù)到初始狀態(tài),這時就需要執(zhí)行復(fù)位CPU的命令.單擊工具欄中的按鈕,或者"Debug"菜單中的"ResetCPU",可以使MCU恢復(fù)到初始狀態(tài).4.單步運(yùn)行單擊工具欄中的按鈕,或者"Debug"菜單中的"Step"〔快捷鍵F11,可以執(zhí)行一行程序.如果遇到函數(shù)調(diào)用,則進(jìn)入函數(shù)內(nèi)部并單步運(yùn)行.5.單步跳過函數(shù)運(yùn)行單擊工具欄中的按鈕,或者"Debug"菜單中的"StepOver"〔快捷鍵F10,可以執(zhí)行一行程序.如果遇到函數(shù)調(diào)用,則將函數(shù)調(diào)用看做一行程序運(yùn)行,不進(jìn)入函數(shù)內(nèi)部運(yùn)行.6.運(yùn)行到當(dāng)前函數(shù)的結(jié)束這種情況出現(xiàn)在單步運(yùn)行后進(jìn)入到函數(shù)內(nèi)部運(yùn)行程序,通過單擊工具欄中的按鈕,或者"Debug"菜單中的"StepOut"〔快捷鍵Ctrl+F11,以運(yùn)行到當(dāng)前函數(shù)的結(jié)束.7.運(yùn)行到光標(biāo)行單擊工具欄中的按鈕,或者"Debug"菜單中的"RuntoCursorLine"〔快捷鍵Ctrl+F10,可以執(zhí)行到光標(biāo)所在的程序行.8.設(shè)置斷點在要設(shè)置斷點的程序行上雙擊鼠標(biāo)左鍵,或者單擊工具欄上的按鈕,或者"Debug"菜單中的"Insert/RemoveBreakpoint"〔快捷鍵F9,可以在當(dāng)前行上插入或者刪除斷點.只要在當(dāng)前行上設(shè)置了斷點,則在當(dāng)前行的最左邊顯示一個紅色的小方塊.連續(xù)運(yùn)行程序后,執(zhí)行到該行時,程序會暫停運(yùn)行.此時用戶可以查看程序運(yùn)行的一些中間狀態(tài)和結(jié)果〔累加器A、工作寄存器、SFR、數(shù)據(jù)存儲器等.9.查看寄存器當(dāng)進(jìn)入調(diào)試狀態(tài)后,KeilμVision4集成開發(fā)環(huán)境中左側(cè)的項目管理器,變成寄存器查看器.如圖A-19所示.用戶可以通過這個窗口觀察工作寄存器、部分SFR的內(nèi)容.圖A-19觀察寄存器的內(nèi)容10.查看變量及堆棧在調(diào)試狀態(tài)中,在KeilμVision4集成開發(fā)環(huán)境中的右下側(cè)會出現(xiàn)如圖A-20所示的窗口,即調(diào)用堆棧和變量查看窗口〔使用C語言編程調(diào)試的時候常用.圖A-20調(diào)用堆棧和變量查看窗口11.查看存儲器在圖A-20中單擊Memory1選項卡則在在KeilμVision4集成開發(fā)環(huán)境中的右下側(cè)會出現(xiàn)如圖A-21所示的窗口,即存儲器查看窗口.圖A-21存儲器查看窗口默認(rèn)情況下,想查看內(nèi)部RAM〔片內(nèi)數(shù)據(jù)存儲器中的內(nèi)容,需在"Address"編輯框中輸入"D:0"并按回車鍵即可.拖動窗口的左邊框可以調(diào)整窗口的大小,經(jīng)過調(diào)整,最佳的顯示范圍如圖A-22所示.圖A-22片內(nèi)數(shù)據(jù)存儲器查看窗口可以通過"View"菜單中的"MemoryWindows"項,添加存儲器查看窗口,這樣可通過不同的窗口查看不同存儲器的內(nèi)容.例如,可再增加一個窗口查看外部RAM中的內(nèi)容.如圖A-23所示,在在"Address"編輯框中輸入"X:0"并按回車鍵即可.圖A-23片外數(shù)據(jù)存儲器查看窗口要改變某個地址單元中的內(nèi)容,可在上面雙擊鼠標(biāo)左鍵即可修改;或者在要修改內(nèi)容的單元上單擊鼠標(biāo)右鍵,彈出菜單,選擇"ModifyMemoryat…"修改.通過彈出菜單,還可修改進(jìn)制、有符號數(shù)、無符號數(shù)、ASCII碼等"Address"編輯框一般輸入格式如下:X:XXXX其中X為:D,查看內(nèi)部RAM;X,查看外部RAM;I,查看間接訪問的內(nèi)部RAM;C,查看程序ROM.XXXX為:查看的起始地址〔0000H~FFFFH.12.查看外部設(shè)備單擊菜單"Peripherals"可選擇查看所選MCU集成的不同外部設(shè)備.例如:〔1"Interrupt"打開中斷向量表窗口,在窗口里顯示了所有的中斷向量.如圖A-24所示.對選定的中斷向量可以用窗口下面的復(fù)選框進(jìn)行設(shè)置.圖A-24中斷向量表窗口〔2"I/O-Ports":打開I/O端口〔P0~P3的觀察窗口,在窗口里顯示了程序運(yùn)行時的端口狀態(tài).可以隨時查看并修改端口的狀態(tài),從而模擬外部的輸入.例如,要查看P2口的狀態(tài),可打開P2口的觀察窗口,如圖A-25所示.當(dāng)運(yùn)行到第10行時,則如圖A-26所示.圖中標(biāo)有"√"的復(fù)選框表示這一位的值是1,沒有的為0.對于不同的MCU,可能圖A-25、圖A-26的顯示略有不同.圖A-25剛進(jìn)入調(diào)試狀態(tài)時P2口的查看窗口圖A-26運(yùn)行到程序行第10行時P2口的查看窗口〔3"Serial":打開串行口的觀察窗口,可以隨時修改窗口里顯示的不同狀態(tài).〔4"Timer":打開定時器的觀察窗口,可以隨時修改窗口里顯示的不同狀態(tài).除此以外,對于不同公司生產(chǎn)的MCU,在"Peripherals"菜單中會出現(xiàn)很多與該型號MCU相關(guān)的外部設(shè)備資源菜單項.掌握了上述的操作過程,就可以進(jìn)行基本的程序調(diào)試工作了.只有不斷調(diào)試程序,才能逐步積累經(jīng)驗,增強(qiáng)對MCU的使用,做到靈活運(yùn)用,熟練掌握.附A.3KeilC51語言雖然MCU上使用的C語言都是直接針對具體硬件的,但任何一家公司開發(fā)的C語言,都必須符合ANSIC的標(biāo)準(zhǔn),或者說,要與ANSIC兼容.因此,不論哪一家公司為MCU開發(fā)的C語言,其主要部分必然要與ANSIC保持一致,不同的只是非ANSIC的擴(kuò)展部分,KeilC51也不例外.KeilC51是一個兼容ANSIC的編譯器,為了支持80C51系列MCU加入了一些擴(kuò)展的內(nèi)容.C51編譯器與ANSIC相比,擴(kuò)展的內(nèi)容包括:數(shù)據(jù)類型、存儲器類型、存儲模式、指針及函數(shù)〔包括:定義函數(shù)的重入性、指定函數(shù)的寄存器組、指定函數(shù)的存儲模式及定義中斷服務(wù)程序.閱讀本書的讀者請注意,本書沒有詳細(xì)介紹標(biāo)準(zhǔn)的C語言,只是介紹KeilC51對ANSIC的擴(kuò)展.對于通用的C語言部分,如果需要,請查閱相關(guān)介紹C語言的教材.下面詳細(xì)介紹KeilC51對ANSIC的擴(kuò)展部分.附A.3.1KeilC51編譯器支持的各種規(guī)格的數(shù)據(jù)類型列于表A-8.除了這些數(shù)據(jù)類型以外,變量可以組合成結(jié)構(gòu)、聯(lián)合及數(shù)組.表A-8KeilC51支持的數(shù)據(jù)類型數(shù)據(jù)類型位數(shù)字節(jié)數(shù)值范圍signedchar81-128到+127unsignedchar810到255signedshort162-32768到+32767unsignedshort1620到65535signedint162-32768到+32767unsignedint1620到65535signedlong324-2147483648到+2147483647unsignedlong3240到4294967295float3241.175494E-38到3.402823E+38bit10或1sbit10或1sfr810或255sfr161620或65535數(shù)據(jù)表A-1所列的數(shù)據(jù)類型中,關(guān)鍵字bit、sbit、sfr和sfr16等四種類型在ANSIC中是沒有的,是KeilC51編譯器中新增加的.其中,關(guān)鍵字bit用于操作80C51中的位尋址區(qū),而關(guān)鍵字sbit、sfr和sfr16用于操作80C51的特殊功能寄存器SFR.例如,下面的表達(dá)式: sfrP0=0x80; /*定義80C51P0口的特殊功能寄存器*/ 聲明了一個變量P0,并且把它和位于0x80〔80C51的P0口處的特殊功能寄存器聯(lián)系在一起.1.bit類型bit數(shù)據(jù)類型用于定義操作位尋址區(qū)的變量,可用于變量聲明、參數(shù)列表、函數(shù)聲明和函數(shù)返回值等.所有的bit變量存放在80C51內(nèi)部存儲區(qū)的位尋址區(qū).因為這個區(qū)域只有16字節(jié)長,所以最多只能聲明128個位變量.一個bit變量的聲明與其它數(shù)據(jù)類型相似,例如:staticbitgbFlag=0; /*位變量*/bitbFunc< /*位函數(shù)*/ bitbFlag1, /*位變量*/ bitbFlag2>/*位變量*/{??return<0> /*位返回值*/}bit變量的聲明中,可包含存儲器類型.但是因為bit變量存儲在80C51的內(nèi)部數(shù)據(jù)區(qū),只能使用data和idata存儲類型,不能使用別的存儲類型.例如:intdataiBase; /*在在直接訪問數(shù)據(jù)區(qū)定義一個整型變量iBase*/charidatacAry[4]; /*在間接訪問數(shù)據(jù)區(qū)定義一個數(shù)組iBase*/bitmybit0=iBase^0;bitmybit15=iBase^0;bitbAry07=cArybitbAry37=cArybit變量和bit聲明有以下限制:〔1如果在函數(shù)中禁止使用中斷〔#pragmadisable或者函數(shù)中包含有明確的寄存器組切換〔usingn,則該函數(shù)不能返回一個位值.否則,在編譯時會產(chǎn)生編譯錯誤.〔2一個位不能被聲明為一個指針,如bit*bPtr;是錯誤的.〔3不能聲明使用一個bit類型的數(shù)組,如bitbArr[5];是錯誤的.2.sfr類型sfr和C語言的其它類型變量聲明是一樣的.例如:sfrP0=0x80; /*P0口,地址為80H*/ sfrP1=0x90; /*P1口,地址為90H*/sfrP2=0xA0; /*P2口,地址為0A0H*/sfrP3=0xB0; /*P3口,地址為0B0H*/P0、P1、P2和P3是聲明的SFR名.在等號〔=后指定的地址必須是一個常數(shù)值不允許用帶操作數(shù)的表達(dá)式.標(biāo)準(zhǔn)的80C51系列支持SFR地址從0x80到0xFF.3.sfr16KeilC51編譯器提供的sfr16數(shù)據(jù)類型,可以將兩個8位的SFR作為一個16位的SFR來訪問.訪問該16位的SFR只能是低字節(jié)跟著高字節(jié),即將低字節(jié)的地址用作sfr16聲明的地址.例如:sfr16T2=0xCC; /*定義Timer2的16位數(shù)據(jù)寄存器,TL2的地址為0CCH,TH2的地址為0CDH*/在這個例子中,定時器T2的16位的數(shù)據(jù)寄存器被聲明為16位SFR.當(dāng)然,這個16位的數(shù)據(jù)寄存器可以聲明為2個8位的數(shù)據(jù)寄存器.如下所示:sfrTL2=0xCC; /*定義Timer2的16位數(shù)據(jù)寄存器的低8位,TL2的地址為 0CCH*/sfrTH2=0xCD; /*定義Timer2的16位數(shù)據(jù)寄存器的高8位,TH2的地址為 0CDH*/sfr16聲明和sfr聲明遵循相同的原則.任何符號名可用在sfr16的聲明中.等號〔=指定的地址,必須是一個常數(shù)值.不允許使用帶操作數(shù)的表達(dá)式,而且必須使用SFR的低位和高位字節(jié)中的低位字節(jié)的地址.4.sbit類型在80C51系列MCU中,經(jīng)常需要訪問SFR中的某些位,這時需使用關(guān)鍵字sbit,利用它可以定義可位尋址的對象.定義方法有如下三種.〔1sbit位變量名=位地址這種方法將位的絕對地址賦給位變量,位地址必須位于0x80~0xFF之間.例如:sbitOV=0xD2;sbitCY=0xD7;〔2sbit位變量名=SFR名^位位置當(dāng)可位尋址的位位于SFR中的時候,可采用此方法."位位置"是一個0~7之間的常數(shù).例如:sfrPSW=0xD0;sbitOV=PSW^2;sbitCY=PSW^7;〔3sbit位變量名=字節(jié)地址^位位置這種方法以字節(jié)地址作為基地址,該字節(jié)地址必須位于0x80~0xFF之間."位位置"是一個0~7之間的常數(shù).例如:sbitOV=0xD0^2;sbitCY=0xD0^7;附A.3.280C51的存儲區(qū)域有兩個特奌:★程序存儲器和數(shù)據(jù)存儲器是截然分開的;★特殊功能寄存器與內(nèi)部數(shù)據(jù)存儲器是統(tǒng)一編址的.C51編譯器支持80C51的這種存儲器結(jié)構(gòu),能夠訪問80C51的所有存儲器空間.針對80C51存儲空間的多樣性,提出了修飾存儲空間的修飾符,用以指明所定義的變量應(yīng)分配在什么樣的存儲空間,如表A-9所示.表A-9存儲空間類型說明符存儲器類型描述code程序空間〔64KB;通過MOVC@A+DPTR訪問.data直接訪問的內(nèi)部數(shù)據(jù)存儲器;訪問速度最快〔128字節(jié).idata間接訪問的內(nèi)部數(shù)據(jù)存儲器;可以訪問所有的內(nèi)部存儲器空間〔256字節(jié).bdata可位尋址的內(nèi)部數(shù)據(jù)存儲器;可用字節(jié)方式也可用位方式訪問〔16字節(jié).xdata外部數(shù)據(jù)存儲器〔64KB;通過MOVX@DPTR訪問.pdata分頁的外部數(shù)據(jù)存儲器〔256字節(jié);通過MOVX@Ri訪問.1.程序存儲區(qū)程序的代碼〔CODE存儲區(qū)是只讀的,不能寫入.硬件決定最多可能有64KB的程序存儲區(qū).用code標(biāo)識符來訪問片內(nèi)、片外統(tǒng)一編址的程序存儲區(qū),尋址范圍為0000H~FFFFH.在此空間存放程序代碼、數(shù)據(jù)和表格.用間接尋址的方式訪問程序存儲區(qū)數(shù)據(jù),如"MOVCA,@A+DPTR"或"MOVCA,@A+PC".2.內(nèi)部數(shù)據(jù)存儲區(qū)內(nèi)部的數(shù)據(jù)存儲區(qū)是可讀、可寫的.80C51系列最多可有256字節(jié)的內(nèi)部數(shù)據(jù)存儲區(qū).內(nèi)部數(shù)據(jù)區(qū)可以分成三個不同的存儲類型data、idata和bdata.data存儲類型標(biāo)識符通常是指低128字節(jié)的內(nèi)部數(shù)據(jù)區(qū),為片內(nèi)直接尋址的RAM空間,尋址范圍為0~127.在此空向內(nèi)存取速度最快.idata存儲類型標(biāo)識符是指全部256個字節(jié)的內(nèi)部存儲區(qū),為片內(nèi)間接尋址的RAM空間,尋址范圍為0~255.尋址方式為"MOV@Ri".由于只能間接尋址,訪問速度比直接尋址慢.bdata存儲類型標(biāo)識符是指可位尋址的16字節(jié)內(nèi)部存儲區(qū)〔20H~2FH,位地址范圍為0~127.本空間允許按字節(jié)和按位尋址.在本區(qū)域可以聲明可位尋址的數(shù)據(jù)類型.3.外部數(shù)據(jù)存儲區(qū)外部數(shù)據(jù)存儲區(qū)是可讀、可寫的.可通過一個數(shù)據(jù)指針加載一個地址來間接訪問外部數(shù)據(jù)區(qū).因此,訪問外部數(shù)據(jù)存儲區(qū)比訪問內(nèi)部數(shù)據(jù)存儲區(qū)來得慢.外部數(shù)據(jù)存儲區(qū)最多可有64KB.這些地址不一定都用來作為數(shù)據(jù)存儲區(qū).因為,硬件設(shè)計可能把外圍設(shè)備影射到該存儲區(qū).編譯器提供兩種不同的存儲類型來訪問外部數(shù)據(jù)——xdata和pdata.xdata存儲類型標(biāo)識符是指外部數(shù)據(jù)存儲區(qū)〔64KB內(nèi)的任何地址,尋址范圍為0000H~FFFFH.尋址方式為"MOVX@DPTR".pdata存儲類型標(biāo)識符僅指一頁或256字節(jié)的外部數(shù)據(jù)存儲區(qū),尋址范圍為00H~FFH.尋址方式為"MOVX@Ri".在定義變量時,通過指明存儲器類型,可以將所定義的變量存儲在指定的存儲區(qū)域中.訪問內(nèi)部數(shù)據(jù)存儲器將比訪問外部數(shù)據(jù)存儲器快的多.因此,應(yīng)該把頻繁使用的變量放置在內(nèi)部數(shù)據(jù)存儲器中,把很少使用的變量放在外部數(shù)據(jù)存儲器中.在變量的聲明中,可以包括存儲器類型和signed或unsigned屬性.例如: chardatavar1; charcodetext[]="ENTERPARAMETER"; unsignedlongxdataarray[100]; floatidatax,y,z; unsignedintpdatadimension; unsignedcharxdatavector[10][4][4]; charbdataflags;如果在變量的定義中,沒有包括存儲器類型,將自動選用默認(rèn)的存儲器類型.附A.3.3如果省略存儲器類型,系統(tǒng)則會按編譯模式SMALL,COMPACT或LARGE所規(guī)定的默認(rèn)存儲器類型去指定變量的存儲區(qū)域.無論什么存儲模式都可以聲明變量在任何的8051存儲區(qū)范圍,然而把最常用的命令如循環(huán)計數(shù)器和隊列索引放在內(nèi)部數(shù)據(jù)區(qū)可以顯著的提高系統(tǒng)性能.還有要指出的就是變量的存儲種類與存儲器類型是完全無關(guān)的.1.SMALL模式SMALL存儲模式把所有函數(shù)變量和局部數(shù)據(jù)段放在8051系統(tǒng)的內(nèi)部數(shù)據(jù)存儲區(qū)這使訪問數(shù)據(jù)非???但SMALL存儲模式的地址空間受限.在寫小型的應(yīng)用程序時,變量和數(shù)據(jù)放在data內(nèi)部數(shù)據(jù)存儲器中是很好的因為訪問速度快,但在較大的應(yīng)用程序中data區(qū)最好只存放小的變量、數(shù)據(jù)或常用的變量〔如循環(huán)計數(shù)、數(shù)據(jù)索引,而大的數(shù)據(jù)則放置在別的存儲區(qū)域.2.COMPACT模式COMPACT存儲模式中所有的函數(shù)和程序變量和局部數(shù)據(jù)段定位在8051系統(tǒng)的外部數(shù)據(jù)存儲區(qū).外部數(shù)據(jù)存儲區(qū)可有最多256字節(jié)〔一頁,在本模式中外部數(shù)據(jù)存儲區(qū)的短地址用R0/R1.3.LARGELARGE存儲模式所有函數(shù)和過程的變量和局部數(shù)據(jù)段都定位在8051系統(tǒng)的外部數(shù)據(jù)區(qū)外部數(shù)據(jù)區(qū)最多可有64KB,這要求用DPTR數(shù)據(jù)指針訪問數(shù)據(jù).一般情況下,應(yīng)該使用小<SMALL>模式,它產(chǎn)生最快,最緊湊,效率最高的代碼.在定義變量時,最好要指定存儲器類型.只有當(dāng)應(yīng)用不可能在SMALL模式下操作時,才需要往上增加你的存儲模式.附A.3.4C51編譯器支持用星號〔*進(jìn)行指針聲明.可以用指針完成在標(biāo)準(zhǔn)C語言中有的所有操作.由于80C51及其派生系列所具有的獨特結(jié)構(gòu),C51編譯器支持兩種不同類型的指針:通用指針和存儲器指針.1.通用指針通用或未定型的指針的聲明和標(biāo)準(zhǔn)C語言中一樣.如: char*s; /*stringptr*/ int*numptr; /*intptr*/ long*state; /*longptr*/通用指針需要三個字節(jié)來存儲.第一個字節(jié)用來表示存儲器類型,第二個字節(jié)是指針的高字節(jié),第三字節(jié)是指針的低字節(jié).通用指針可以用來訪問所有類型的變量,而不管變量存儲在哪個存儲空間中.因而許多庫函數(shù)都使用通用指針.通過使用通用指針,一個函數(shù)可以訪問數(shù)據(jù),而不用考慮它存儲在什么存儲器中.通用指針很方便,但是也很慢.在所指向目標(biāo)的存儲空間不明確的情況下,它們用的最多.2.存儲器指針存儲器指針或類型確定的指針在定義時要包含一個存儲器類型說明,并且總是指向此說明的特定存儲器空間.例如: chardata*str; /*指向data區(qū)域的字符串*/ intxdata*numtab; /*指向xdata區(qū)域的int*/ longcode*powtab; /*指向code區(qū)域的long*/正是由于存儲器類型在編譯時已經(jīng)確定,通用指針中用來表示存儲器類型的字節(jié)就不再需要了.指向idata,data,bdata和pdata的存儲器指針使用一個字節(jié)來保存;指向code和xdata的存儲器指針用兩個字節(jié)來保存.由此可見,使用存儲器指針比通用指針效率要高,速度要快.當(dāng)然,存儲器指針的使用不是很方便.只有在所指向目標(biāo)的存儲空間明確并不會變化的情況下,才用它.附A.3.51.重入函數(shù) 函數(shù)的嵌套調(diào)用是指當(dāng)一個函數(shù)正被調(diào)用尚未返回時,又被本函數(shù)或其它函數(shù)再次調(diào)用的情況,只有等到后次調(diào)用返回到了本次,本次被暫時擱置的程序才得以恢復(fù)接續(xù)原來的正常運(yùn)行,直到本次返回.允許被嵌套調(diào)用的函數(shù)必須是可重入函數(shù),即函數(shù)應(yīng)具有可重入性.通常情況下,C51函數(shù)一般是不能被遞歸調(diào)用的.這是由于函數(shù)參數(shù)和局部變量是存儲在固定的地址單元中的.重入函數(shù)需要使用重入堆棧,這種堆棧是在存儲模式所指的空間內(nèi)從頂端另行分配的一個非覆蓋性的堆棧.該堆棧將被嵌套調(diào)用的每層參數(shù)及局部變量一直保留到由深層返回到本層,而又終止本層的返回.在一個基本函數(shù)的基礎(chǔ)上添加reentrant說明,從而使它具有重入特性.如: intcalc<chari,intb>reentrant { intx; x=table[i]; return<x*b>;}在實時應(yīng)用中以及中斷服務(wù)程序代碼和非中斷程序代碼必須共用一個函數(shù)的場合中,經(jīng)常用到重入函數(shù).需要注意的是,不應(yīng)將全部程序聲明為重入函數(shù).把全部程序聲明為重入函數(shù)將增加目標(biāo)代碼的長度并減慢運(yùn)行速度.應(yīng)該選擇哪些必須的函數(shù)作為重入函數(shù).2.函數(shù)使用指定的寄存器組usingn函數(shù)使用指定寄存器組的定義性說明如下:viod函數(shù)標(biāo)識符〔形參表usingn其中n=0~3為寄存器組號,對應(yīng)80C51中的四個寄存器組.函數(shù)使用了usingn后,C51編譯器自動在函數(shù)的匯編碼中加入如下的函數(shù)頭段和尾段:{ push pswmov psw,#與寄存器組號n有關(guān)的常量┆pop psw}應(yīng)該注意的是,usingn不能用于有返回值的函數(shù).因為,C51的返回值是放在寄存器中的,而返回前寄存器組卻改變了,將會導(dǎo)致返回值發(fā)生錯誤.3.函數(shù)使用指定的存儲模式針對80C51存儲空間的多樣性,提出了修飾存儲空間的修飾符,用以指明所定義的變量應(yīng)分配在什么樣的存儲空間,其定義性格式為: 類型說明符函數(shù)標(biāo)識符〔形參表存儲模式修飾符{small,compact,large}其中,修飾符可用small、compact、large三者中的一個.存儲模式為本函數(shù)的參數(shù)和局部變量指定的存儲空間,在指定了存儲模式之后,該空間將再也不隨編譯模式而變.如:externintfunc<inti,intj> large; /*修飾為大模式*/4.中斷服務(wù)程序C51編譯器允許用C語言創(chuàng)建中斷服務(wù)程序.只需關(guān)心中斷號和寄存器組的選擇.編譯器自動產(chǎn)生中斷向量和程序的入棧及出棧代碼.在函數(shù)聲明時包括interruptm,將把所聲明的函數(shù)定義為一個中斷服務(wù)程序.其格式為: viod函數(shù)標(biāo)識符〔viod interruptm其中,m=0~31,0對應(yīng)于外部中斷0;1對應(yīng)于定時器0中斷;2對應(yīng)于外部中斷1;3對應(yīng)于定時器1中斷;4對應(yīng)于串行口中斷;其它為預(yù)留.從定義中可以看出,中斷的函數(shù)必須是無參數(shù)、無返回值的函數(shù).如:unsignedintinterruptcnt; unsignedcharsecond; voidtimer0<void>interrupt1using2 {if<++interruptcnt==4000> /*計數(shù)到4000*/{second++; /*秒計數(shù)器*/ interruptcnt=0; /*清除中斷計數(shù)器*/ } }附A.4CC51語言編程與匯編語言編程各有所長.使用C51語言,開發(fā)速度快,可讀性、可維護(hù)性、可移植性都好;而使用匯編語言,則可以更為充分地利用芯片的軟、硬件資源,使得程序代碼的執(zhí)行效率高.為了發(fā)揮C51語言與匯編語言兩種語言各自的優(yōu)勢,希望能夠?qū)崿F(xiàn)它們的混合編程.這一點特別適用于要求占用空間小、有嚴(yán)格時間限制的子程序設(shè)計,這類子程序總是希望用匯編語言來編寫,然后由C51語言主程序來調(diào)用;或者直接在C51語言中直接嵌入?yún)R編語言.附A.4.1通過一個例子,介紹在C51程序中調(diào)用匯編函數(shù)的一種方法.在這個例子里,外部函數(shù)的入口參數(shù)是一個字符型變量和一個位變量,返回值是一個整型變量.例中,先用C51寫出這個函數(shù)的主體,然后用SRC控制指令編譯產(chǎn)生ASM文件,進(jìn)一步修改這個ASM文件就得到我們所要的匯編函數(shù).該方法讓編譯器自動完成各種段的安排,提高了匯編程序的編寫效率.1.建立項目按寫普通C51程序方法,建立項目,在里面導(dǎo)入main.c文件和cfunc.c文件. //main.c文件#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintexternuintAFUNC<ucharv_achr,bitv_bflag>;voidmain<>{bitBFLAG;ucharmav_chr;uintmvintrslt;mav_chr=0xd4;BFLAG=1;mvintrslt=AFUNC<mav_chr,BFLAG>;}//CFUNC.c文件#defineucharunsignedchar#defineuintunsignedintuintAFUNC<ucharv_achr,bitv_bflag>{uchartmp_vchr;uinttp_vint;tmp_vchr=v_achr;tp_vint=<uint>v_bflag;returntmp_vchr+<tp_vint<<8>;}2.設(shè)置文件選項在項目管理器窗口中,在將要得到匯編代碼的C文件"cfunc.c"上單擊右鍵,彈出菜單,選擇"OptionsforFile‘cfunc.c’",點擊右邊的"GenerateAssemblerSRCFile"和"AssembleSRCFile",使復(fù)選框由灰色變成黑色〔有效狀態(tài).在選擇時需注意,該選項有3種狀態(tài),未選中、無效〔灰色和有效〔黑色,如圖A-27所示.圖A-27"OptionsforFile‘cfunc.c’"選項3.向項目中添加庫文件根據(jù)選擇的編譯模式,把相應(yīng)的庫文件〔如Small模式時,是Keil\C51\Lib\C51S.Lib加入工程中,該文件必須作為項目的最后文件.4.生成匯編語言文件并調(diào)整項目文件編譯這個項目后將會產(chǎn)生一個CFUNC.SRC的文件,將這個文件改名為CFUNC.A51〔也可以通過編譯選項直接產(chǎn)生CFUNC.A51文件,然后在項目里去掉庫文件〔如C51S.Lib>和CFUNC.c,而將CFUNC.A51添加到項目里.;.\cfunc.SRCgeneratedfrom:cfunc.c;COMPILERINVOKEDBY:;C:\Keil\C51\BIN\C51.EXEcfunc.cBROWSEDEBUGOBJECTEXTENDSRC<.\cfunc.SRC>NAMECFUNC?PR?_AFUNC?CFUNCSEGMENTCODE?BI?_AFUNC?CFUNCSEGMENTBITOVERLAYABLEPUBLIC?_AFUNC?BITPUBLIC_AFUNCRSEG?BI?_AFUNC?CFUNC?_AFUNC?BIT:v_bflag?041:DBIT1;//CFUNC.c文件;;#defineucharunsignedchar;#defineuintunsignedint;;uintAFUNC<ucharv_achr,bitv_bflag>RSEG?PR?_AFUNC?CFUNC_AFUNC:USING0;SOURCELINE#6;Variable'v_achr?040'assignedtoRegister'R7';{;SOURCELINE#7;uchartmp_vchr;;uinttp_vint;;;tmp_vchr=v_achr;;SOURCELINE#11;Variable'tmp_vchr?042'assignedtoRegister'R5'MOVR5,AR7;tp_vint=<uint>v_bflag;;SOURCELINE#12MOVC,v_bflag?041CLRARLCA;Variable'tp_vint?043'assignedtoRegister'R6/R7';returntmp_vchr+<tp_vint<<8>;;SOURCELINE#13MOVR6,AMOVR4,#00HCLRAADDA,R5MOVR7,AMOVA,R4ADDCA,R6MOVR6,A;};SOURCELINE#14?C0001:RET;ENDOF_AFUNCEND5.編譯項目再次編譯這個項目,到此已經(jīng)得到匯編函數(shù)的主體,修改函數(shù)里面的匯編代碼就得到所需的匯編函數(shù)了.附A.4.21.C51中嵌入?yún)R編語言程序的格式要在C51文件中嵌入?yún)R編語言程序,需要按照如下格式加入:#pragmaASM匯編語言程序#pragmaENDASM在上例中,將main.c文件內(nèi)容修改成如下所示://main.c文件#include"reg52.h"#defineucharunsignedchar#defineuintunsignedintexternuintAFUNC<ucharv_achr,bitv_bflag>;voidmain<>{bitBFLAG;ucharmav_chr;uintmvintrslt;mav_chr=0xd4;BFLAG=1;mvintrslt=AFUNC<mav_chr,BFLAG>;#pragmaasmMOVP1,mvintrslt?042MOVP2,mvintrslt?042+01H#pragmaendasm}即將調(diào)用函數(shù)AFUNC<>得到的返回值通過P1口、P2口輸出.2.設(shè)置文件選項在項目管理器窗口中,在將要得到匯編代碼的C文件"main.c"上單擊右鍵,彈出菜單,選擇"OptionsforFile‘main.c’",點擊右邊的"GenerateAssemblerSRCFile"和"AssembleSRCFile",使復(fù)選框由灰色變成黑色〔有效狀態(tài).3.向項目中添加庫文件根據(jù)選擇的編譯模式,把相應(yīng)的庫文件〔如Small模式時,是Keil\C51\Lib\C51S.Lib加入工程中,該文件必須作為項目的最后文件.4、編譯并生成目標(biāo)代碼編譯整個項目,即可得到用戶需要的目標(biāo)代碼.使用此方法可以在C51源代碼的任意位置嵌入?yún)R編語言程序.但是,需要注意的是,在直接使用形參時,在不同的優(yōu)化級別下產(chǎn)生的匯編代碼可能有所不同.附A.5C例A.1〔匯編語言見例4.1#include<reg52.h>#include<intrins.h>sbitkey=P1^7;sbitled=P1^0;voiddelay<unsignedinttime>;voidmain<void>{ P1=0x80; //P1.7寫"1",作為輸入口線 while<1> { while<key>; //檢測P1.7是否為0,是,則按鍵按下 delay<12500>; //延時,去除按鍵抖動 while<key>; //檢測P1.7是否為0,是,則確認(rèn)按鍵按下 while<!key>; //檢測按鍵是否抬起 led=!led; //LED點亮或熄滅 } }voiddelay<unsignedinttime>{ while<time--> { _nop_<>; }}例A.2〔匯編語言見例4.2#include<reg52.h>sbitsquare=P1^0;voidmain<>{ TMOD=0x10; //T1為方式1 TH1=0xFE; //設(shè)置計數(shù)初值 TL1=0X0C; EA=1; //允許中斷 ET1=1; //允許T1中斷 TR1=1; //啟動T1 while<1>; //等待中斷}voidtimer1<void>interrupt3{ TH1=0xFE; //重新設(shè)置初值 TL1=0x0C; square=!square; //定時1ms時間到,輸出取反}例A.3〔匯編語言見例4.3#include<reg52.h>sbitsquare=P1^0;voidmain<>{ TMOD=0x02; //T0為方式2 TH0=0x9C; //設(shè)置計數(shù)初值 TL0=0x9C; EA=1; //允許中斷 ET0=1; //允許T0中斷 TR0=1; //啟動T0 while<1>; //等待中斷}voidtimer0<void>interrupt1{ s
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度特種環(huán)境配電室建設(shè)與防腐蝕合同4篇
- 二零二四年度醫(yī)療設(shè)備采購合同終止及設(shè)備召回協(xié)議3篇
- 二零二四年生態(tài)補(bǔ)償機(jī)制實施合同3篇
- 面向DNA存儲的信道編碼關(guān)鍵技術(shù)研究
- 2025年度瓷磚回收利用與環(huán)保處理合同3篇
- 2025年度企業(yè)員工社會保險繳納合同3篇
- 二零二五年度企業(yè)宣傳片劇本定制與制作合同2篇
- 二零二四年度虛擬現(xiàn)實(VR)內(nèi)容開發(fā)服務(wù)合同3篇
- 二零二四年度云南智能交通系統(tǒng)工程設(shè)計與施工合同3篇
- 二零二五年度車展場地租賃及數(shù)據(jù)統(tǒng)計分析服務(wù)合同4篇
- 海洋工程用高性能建筑鋼材的研發(fā)
- 蘇教版2022-2023學(xué)年三年級數(shù)學(xué)下冊開學(xué)摸底考試卷(五)含答案與解析
- 英語48個國際音標(biāo)課件(單詞帶聲、附有聲國際音標(biāo)圖)
- GB/T 6892-2023一般工業(yè)用鋁及鋁合金擠壓型材
- 冷庫安全管理制度
- 2023同等學(xué)力申碩統(tǒng)考英語考試真題
- 家具安裝工培訓(xùn)教案優(yōu)質(zhì)資料
- 在雙減政策下小學(xué)音樂社團(tuán)活動有效開展及策略 論文
- envi二次開發(fā)素材包-idl培訓(xùn)
- 2022年上海市初中語文課程終結(jié)性評價指南
- 醫(yī)院手術(shù)室醫(yī)院感染管理質(zhì)量督查評分表
評論
0/150
提交評論