作者:劉新陽(yáng)
同 VC 之類的通用 C 語(yǔ)言集成開發(fā)環(huán)境(IDE)一樣,Keil 也采用“工程” (Project)的方式管理源代碼及相關(guān)文件,這種管理方式為由多個(gè)源代碼文件組 成的大型程序開發(fā)提供了方便。不管是最簡(jiǎn)單的 C51程序,還是復(fù)雜的多文件 程序都需要以下步驟: 1)先建立新的工程文件; 2)在工程中新建源代碼文件,或是將已經(jīng)存在的源代碼文件加入工程; 3)編譯; 4)調(diào)試,修正錯(cuò)誤再編譯; 5)將生成的二進(jìn)制文件*.hex 燒入單片機(jī)。 本教程重點(diǎn)介紹上述前 4 個(gè)步驟。 二、Keil中新建工程的步驟 1. 單擊菜單“Project——New uVision Project……” 出現(xiàn)新建工程對(duì)話框:
在此對(duì)話框中選擇存放工程各類文件的路徑和文件夾,然后為工程的主文件
取個(gè)名字,以后單擊該主文件即可打開這個(gè)工程項(xiàng)目。
2. 選擇單片機(jī)型號(hào) 上個(gè)窗口關(guān)閉后,馬上會(huì)呈現(xiàn)下面這個(gè)窗口,在這里我們要選擇所使用的單 片機(jī)型號(hào)。
具體到這里,我們選擇 Atmel 文件夾下的 AT89C51。(也可以選擇下面的 AT89C52、AT89S51 或 AT89S52)
 注意:?jiǎn)螕?OK 后會(huì)出現(xiàn)下面這個(gè)提示信息:
這里一定要選“否”,即:不需要自動(dòng)添加起始代碼。
完成后,即可看到 Keil 主界面:
此時(shí)可以看到屏幕左側(cè)的“Project”窗口(工程文件管理器)中,Target1 下面的 Source Group1(源代碼文件組 1)為空,即現(xiàn)在新建的工程中還不包含任 何源代碼文件。所以,接下來(lái)要做的就是新建源代碼文件。 3. 新建源代碼文件 單擊菜單“File——New……”之后,即可在編輯區(qū)看到新建了一個(gè)名為 text1 的文本文件。 單擊工具欄上的“保存”(圖標(biāo)為磁盤)按鈕,可以在保存文件對(duì)話框中選 擇這個(gè)文本文件的保存位置(一般和工程文件保存在同一級(jí)文件夾)和文件的主 名及擴(kuò)展名。如果只有一個(gè)源代碼文件,一般主名命名為工程名,若是 C 語(yǔ)言 源代碼,擴(kuò)展名設(shè)置為.c 即可。設(shè)置為.c 擴(kuò)展名的目的,是為了告訴系統(tǒng)這是 C 語(yǔ)言源代碼,Keil 會(huì)進(jìn)行語(yǔ)法著色。 4. 將源代碼文件加入工程 在屏幕左側(cè)的“Project”窗口(工程文件管理器)中,在 Source Group 1 上 單擊右鍵,選擇 Add Source File to “Source Group 1”菜單項(xiàng)。
在隨后彈出的對(duì)話框中選擇剛才建立的源文件。
注意,這里選中文件單擊“Add”后對(duì)話框并不消失,可以繼續(xù)添加多個(gè)文 件,添加完成后要單擊“Close”才能將對(duì)話框關(guān)閉。 關(guān)閉對(duì)話框后,可以在“Project”窗口(工程文件管理器)中看到剛才添加 進(jìn)來(lái)的源代碼文件:
此時(shí),就可以在右側(cè)的編輯區(qū)進(jìn)行代碼的編寫了。也可以將已經(jīng)編寫好的代
碼粘貼進(jìn)來(lái)。
同理,利用“Source Group 1”上的右鍵菜單也可以將某個(gè)文件移除出工程, 移除并不是徹底刪除掉文件(文件還保留在磁盤上原來(lái)的位置),只是將文件排 除出工程的編譯范圍,該文件就不會(huì)參與編譯了。 5. 設(shè)置工程屬性 1)單擊“Project”窗口中的“Target 1”圖標(biāo),使其高亮顯示(藍(lán)底白字)。 2)單擊 Project——Options for Target ‘Target 1’ 打開如下窗口。 注意一定要確保步驟 1),如果是其他部分處于高亮,則找不到 2)中的菜 單項(xiàng)。
默認(rèn)打開的是“Target”選項(xiàng)頁(yè),此頁(yè)面的項(xiàng)目一般保持默認(rèn)值即可。各個(gè) 項(xiàng)目的具體含義可參加課本 P35。 單擊“Output”打開 Output 選項(xiàng)頁(yè): 勾選“CreateHEXFile”項(xiàng),這樣編譯后才會(huì)生成用來(lái)燒錄進(jìn)單片機(jī)的二 進(jìn)制程序文件(相當(dāng)于 VC 中的 exe 文件),否則只編譯而不生成可執(zhí)行文件.
 其他項(xiàng)目可以保持默認(rèn),生成的二進(jìn)制程序文件默認(rèn)保存在工程文件所在的
文件夾中,擴(kuò)展名為.hex 6. 編譯源代碼 單擊工具欄第 2 行左起第 3 個(gè)圖標(biāo)“ReBuild all Target Files”,即可啟動(dòng)編譯 過(guò)程(第 2 個(gè)圖標(biāo)也可以,一般在修改了代碼后習(xí)慣用第 3個(gè)“重新編譯”),若 有錯(cuò)誤,在下方的信息窗口中會(huì)給出提示,若顯示“0 Error(s), 0 Warning(s).”(0 個(gè)錯(cuò)誤,0 個(gè)警告)則意味著編譯通過(guò)(有時(shí)有警告存在也可編譯通過(guò),只要錯(cuò) 誤為 0 個(gè)即可,但謹(jǐn)慎起見,對(duì)警告也應(yīng)該重視)。
單擊工具欄 第 2 行,左起第 3 個(gè)圖標(biāo) 啟動(dòng)編譯
此處為提示信息窗口
這里要特別注意的是,如果 Source Group 里有多個(gè)源代碼文件,就像在 VC 里面一樣,會(huì)將多個(gè)文件分別編譯然后連接(Link)成最后的可執(zhí)行文件。因此, 多個(gè)源代碼文件中只能有一個(gè) main函數(shù)。 經(jīng)常出現(xiàn)類似這樣的錯(cuò)誤:在調(diào)試完一個(gè)程序又調(diào)試下一個(gè)時(shí),沒(méi)有新建工 程,而是新建了一個(gè)源代碼文件并添加到現(xiàn)有的工程中,也沒(méi)有把剛才調(diào)試的源 代碼文件移除,這樣再編譯時(shí)便會(huì)出錯(cuò),因?yàn)榇嬖?2 個(gè) main 函數(shù)。 若不想每次都新建工程,可將調(diào)試完畢的源代碼文件移除出工程,再新建源 代碼文件調(diào)試新的代碼。或者將調(diào)試完成的代碼復(fù)制出來(lái)另外保存,用待調(diào)試的 代碼覆蓋原文件內(nèi)容即可。 三、基本調(diào)試方法
代碼中的語(yǔ)法錯(cuò)誤可以通過(guò)編譯器的 error 信息提示,只要沒(méi)有語(yǔ)法錯(cuò)誤即 可通過(guò)編譯,但只有通過(guò)單步執(zhí)行、設(shè)置斷點(diǎn)等調(diào)試手段,才能快速找出程序中 存在的邏輯錯(cuò)誤。掌握基本的調(diào)試方法,對(duì)于我們觀察程序的運(yùn)行過(guò)程,理解程 序算法思想也是非常重要的。 1. 進(jìn)入與退出調(diào)試狀態(tài) 單擊工具欄第 1 行中部,紅色 d 字圖標(biāo)(Start/End Debug Session),即可進(jìn) 入調(diào)試狀態(tài),再次單擊該圖標(biāo)即可退出調(diào)試狀態(tài),對(duì)應(yīng)的快捷鍵是 Ctrl+F5。
 2. 單步運(yùn)行程序  進(jìn)入調(diào)試狀態(tài)后,第 2 行工具欄會(huì)自動(dòng)變成“調(diào)試工具欄”,代碼窗口中的 黃色箭頭代表下一步要執(zhí)行的行,剛進(jìn)入調(diào)試狀態(tài)時(shí)黃色箭頭指向 main 函數(shù)的 第一條執(zhí)行語(yǔ)句。
上圖紅線上方(第 2 行工具欄即調(diào)試工具欄)的前 5 個(gè)按鈕是最常用的。 第 1 個(gè)按鈕為“CPU 復(fù)位”,相當(dāng)于按下復(fù)位按鈕,不管現(xiàn)在程序運(yùn)行到何 處,馬上回到程序開始執(zhí)行之前的狀態(tài)。 第 2 個(gè)按鈕為“全速運(yùn)行程序”,快捷鍵 F5,即開始正常運(yùn)行程序,如果連 接有仿真器或是聯(lián)機(jī) Proteus 軟件仿真(具體方法后面講),則在硬件設(shè)備或者 Proteus 界面上可以看到真實(shí)的運(yùn)行效果(如 LED 的閃爍)。 第 3 個(gè)按鈕為“Stop”,停止程序的運(yùn)行。因單片機(jī)上的程序主體多為死循 環(huán),一旦啟動(dòng)不會(huì)停止,可以通過(guò)此按鈕結(jié)束程序。也可以直接單擊上面的紅色
d 按鈕(Ctrl+F5)直接退出調(diào)試狀態(tài)。 第 4 個(gè)按鈕為“單步執(zhí)行”,快捷鍵 F11,第 5 個(gè)按鍵也是單步執(zhí)行,快捷 鍵 F10。如果你熟悉 VC 的調(diào)試方法,對(duì)這兩個(gè)快捷鍵一定不會(huì)陌生,這里與 VC 里的含義完全相同,F(xiàn)10 會(huì)把函數(shù)調(diào)用語(yǔ)句當(dāng)成是一行處理,即不會(huì)進(jìn)入函 數(shù)內(nèi)部,如需進(jìn)入函數(shù)內(nèi)部跟蹤調(diào)用過(guò)程,可按 F11。通過(guò)這兩個(gè)按鈕的圖標(biāo)(一 個(gè)箭頭指向{}內(nèi),一個(gè)越過(guò){})也可以很直觀地區(qū)分。 第 6 個(gè)按鈕(圖標(biāo)為從{}內(nèi)跳出的箭頭)的功能是從被調(diào)函數(shù)返回主程序, 對(duì)應(yīng)快捷鍵為 Ctrl+F11,如果單步運(yùn)行時(shí)不想進(jìn)入函數(shù)內(nèi)部,但誤按了 F11,可 可以用這個(gè)功能返回。注意按這個(gè)按鈕時(shí)并不是不再執(zhí)行被調(diào)函數(shù)內(nèi)的語(yǔ)句,而 是不再單步執(zhí)行被調(diào)函數(shù)內(nèi)的語(yǔ)句,全速執(zhí)行完所有剩余的語(yǔ)句,回到調(diào)用函數(shù) 處。 第 7 個(gè)按鈕(圖標(biāo)為箭頭指向{}),功能是執(zhí)行到當(dāng)前光標(biāo)所在行,快捷鍵 是 Ctrl+F10,如果單步執(zhí)行的過(guò)程中想全速執(zhí)行一段代碼(如前面有一個(gè)需要運(yùn) 行 1000 次的循環(huán),如果不用全速運(yùn)行的話,必須按 1000 次 F10,此時(shí)可以將光 標(biāo)定位到該循環(huán)的后面,然后按Ctrl+F10)。 3. 監(jiān)視寄存器、變量及端口的狀態(tài) 單步執(zhí)行的目的是為了能跟蹤各個(gè)變量、寄存器及端口的狀態(tài)變化,以便找 出程序編寫中存在的邏輯錯(cuò)誤。下面是常用的 3 種方法: 1)單步執(zhí)行的過(guò)程中,鼠標(biāo)指向代碼中相關(guān)變量,會(huì)提示其當(dāng)前值。 2)在左側(cè)的“Register”(寄存器狀態(tài))窗口中,可以看到部分特殊功能寄 存器的值,如果某個(gè)值剛剛被修改,則會(huì)高亮顯示。 3)打開 Peripherial菜單,可以查看各中斷、I/O口、串口及定時(shí)/計(jì)數(shù)器的 狀態(tài),這在調(diào)試相關(guān)程序時(shí)非常有用。
這是單擊“Port 0”子菜單后,打開的 P0 口各位狀態(tài)的窗口: 第 1 行顯示的是 P0 口端口寄存器的狀態(tài),如果執(zhí)行了對(duì) P0 寫的語(yǔ)句(如 P0=0x00),這里的狀態(tài)就會(huì)發(fā)生改變。 第 2 行顯示的是 P0 端口各對(duì)外引腳的狀態(tài),默認(rèn)為全 1,當(dāng)需要模擬外部 輸入的時(shí)候,可以通過(guò)單擊第 2 行的相應(yīng)位進(jìn)行輸入(有勾表示 1,無(wú)勾表示 0)。 如現(xiàn)在想模擬 P0.0 引腳上輸入一個(gè)低電平,則只需將第 2 行最右端(第 0 位) 的勾去掉。接下來(lái)當(dāng)程序讀取 P0.0引腳時(shí),就會(huì)讀到 0。 4. 設(shè)置斷點(diǎn) 調(diào)試程序時(shí)如果僅靠單步執(zhí)行,則顯得過(guò)于麻煩。特別是對(duì)于一些比較大型 的程序,我們可能只希望對(duì)其中一部分代碼仔細(xì)跟蹤觀察,此時(shí)可以設(shè)置斷點(diǎn)。 顧名思義,斷點(diǎn)就是程序執(zhí)行到此處就會(huì)停下來(lái),這時(shí)可以再結(jié)合單步執(zhí)行來(lái)仔 細(xì)追蹤調(diào)試。
4 個(gè)斷點(diǎn)工具按鈕
設(shè)置斷點(diǎn)的方法:
1)將光標(biāo)定位于要設(shè)置斷點(diǎn)的行; 2)單擊“設(shè)置斷點(diǎn)按鈕”。該按鈕位于工具欄第 2 行,為啟動(dòng)調(diào)試的“紅色 d”按鈕后面的第 1 個(gè)按鈕(圖標(biāo)為紅色圓點(diǎn),快捷鍵為 F9)。 如上圖所示,當(dāng)前程序執(zhí)行到第 8 行(以黃色箭頭指示),當(dāng)前分別在第 10 行和第 12 行設(shè)置了 2 個(gè)斷點(diǎn)(以紅色方塊表示,其中 12 行的斷點(diǎn)為白色方塊,
 表示此斷點(diǎn)當(dāng)前無(wú)效,即運(yùn)行到此處不會(huì)停下來(lái))。
如果想取消斷點(diǎn),只需將光標(biāo)定位到斷點(diǎn)行,然后再次單擊這個(gè)按鈕即可。 取消斷點(diǎn)是將斷點(diǎn)徹底消除掉,不可恢復(fù);如果想暫時(shí)不在斷點(diǎn)處停止運(yùn)行, 而不是永久消除斷點(diǎn),可以使用第 2、第 3 個(gè)按鈕將斷點(diǎn)設(shè)置為暫時(shí)無(wú)效。 第 2、第 3 個(gè)斷點(diǎn)按鈕(紅色圓點(diǎn)圖標(biāo)后面,分別為單個(gè)紅色圓圈和兩個(gè)紅 色圓圈)的功能是將當(dāng)前光標(biāo)所在行的斷點(diǎn)(第 2 個(gè)按鈕)或所有斷點(diǎn)(第 3 個(gè)按鈕)設(shè)置為無(wú)效或有效。注意這同樣是個(gè)乒乓開關(guān),按一下設(shè)為無(wú)效,再按 一下又恢復(fù)為有效。 第 4 個(gè)按鈕(圖標(biāo)為兩個(gè)紅點(diǎn)和一個(gè)黃叉)的功能是刪除所有斷點(diǎn),對(duì)應(yīng)的 快捷鍵是 Ctrl+Shift+F9。 5. 調(diào)試狀態(tài)下的其他窗口
這些按鈕對(duì)應(yīng)于各個(gè)調(diào)試窗口
在調(diào)試狀態(tài)下,除了上面所提到的寄存器窗口、代碼窗口外,還可以看到很 多其他窗口,這些窗口都可以通過(guò)工具欄第 2 行后半部分的各個(gè)按鈕打開和關(guān) 閉。 常用的有以下幾個(gè):
Disassembly Window(反編譯窗口,對(duì)應(yīng)紅線上方第 2 個(gè)按鈕,上圖中最右 上方的窗口):該窗口中顯示每一行代碼對(duì)應(yīng)的匯編語(yǔ)言指令; Symbol Window(標(biāo)識(shí)符窗口,對(duì)應(yīng)紅線上方第 3 個(gè)按鈕,上圖中最右下方 的窗口):該窗口中顯示程序中全部變量、常量及函數(shù)的數(shù)據(jù)類型、存儲(chǔ)空間、
地址及當(dāng)前值。
Memory Window(存儲(chǔ)器窗口,對(duì)應(yīng)紅線上方第 7 個(gè)按鈕),可顯示內(nèi)部 RAM、內(nèi)部 ROM 及外部 ROM 等存儲(chǔ)的信息。在地址前加 D:則顯示內(nèi)部 RAM 中的信息,地址前加 C:則顯示內(nèi)部 ROM(程序存儲(chǔ)器)中的信息,地址前加 X:則顯示外部 ROM 中的信息。 6. 配置 Keil 與 Proteus 聯(lián)機(jī)仿真 在 Proteus 中繪制好硬件電路圖,在 Keil 中調(diào)試運(yùn)行程序,即可在 Proteus 中觀察到硬件的運(yùn)行狀態(tài)(如 LED 的閃爍、繼電器的動(dòng)作等),這樣可以在不需 要實(shí)際焊接硬件線路和燒錄程序的前提下實(shí)現(xiàn)純軟件仿真。 實(shí)現(xiàn) Keil 與 Proteus 聯(lián)機(jī)仿真的設(shè)置如下: (一)計(jì)算機(jī)系統(tǒng)中應(yīng)該安裝有 TCP/IP 協(xié)議(一般操作系統(tǒng)默認(rèn)安裝,任 何能正常上網(wǎng)的計(jì)算機(jī)都滿足這個(gè)條件),因?yàn)閮蓚(gè)軟件是通過(guò)該協(xié)議通信的。 需要注意的是當(dāng)出現(xiàn)防火墻的攔截提示時(shí),應(yīng)該選擇“解除阻止”,允許其正常 通信。 (二)Keil 端的設(shè)置
參見前面設(shè)置工程屬性(第 5 頁(yè))的操作步驟,打開“Options for Targe‘t 1’”菜單,在工程屬性窗口中,選擇“Debug”標(biāo)簽頁(yè): Target
注意:只有在代碼編輯狀態(tài)才能執(zhí)行上述操作,若當(dāng)前正處于調(diào)試狀態(tài),需
退出。
 單擊選中紅色橢圓中的“ Use”前的單選鈕,并將其后的下拉菜單設(shè)置為 “ProteusVSMSimulator”,若找不到這一項(xiàng),可以先關(guān)閉 Keil,下載一個(gè)名為 vdmagdi.exe 的驅(qū)動(dòng)程序并安裝后,再次打開 Keil 即可。 其他均保持默認(rèn),至此,Keil 端設(shè)置完成。 (三)Proteus 端的設(shè)置 Proteus 端的設(shè)置很簡(jiǎn)單,只需將“Debug”菜單下的“Use Remote Debug Monitor”勾選上即可。 完成上面的設(shè)置后,在 Keil 里面啟動(dòng)調(diào)試,并運(yùn)行程序(單步或全速均可), 即可在 Proteus 里面看到響應(yīng)。在 Keil 里停止調(diào)試后,Proteus 里的仿真運(yùn)行也會(huì) 自動(dòng)停止。
pdf下載:http://m.raoushi.com/bbs/dpj-180551-1.html
|