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