本節書摘來自異步社群《51單片機應用開發範例大全(第3版)》一書中的第1章,第1.2節,作者 張傑,宋戈,黃鶴松,員玉良,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。
mcs-51單片機的開發除了需要硬體的支援以外,同樣離不開軟體。cpu真正可執行的是機器碼,用彙編語言或c等進階語言編寫的源程式必須轉換為機器碼才能運作,轉換的方法有手工彙編和機器彙編兩種,前者目前已極少使用。機器彙編是指通過彙編軟體将源程式變為機器碼的編譯方法。這種彙編軟體稱為編譯器。本節将向大家介紹目前十分流行的keil vision2。
keil vision2是一個內建開發環境(intergrated development environment,ide),它包括編譯器、彙編器、實時作業系統、項目管理器和調試器等。它可以用于編寫、調試和軟仿真所有的51核心控制器,也可以和ide連接配接進行晶片的線上調試。同時c編譯器保留了彙編代碼高效、快速的特點,可以作為許多程式設計工具的第三方支援。是以,它無疑是8051開發使用者的首選。
當使用vision2的開發工具進行項目開發時,項目的開發流程和其他軟體開發項目的流程極其相似,一般遵循下面的幾步。
(1)建立一個項目,從器件庫中選擇目标器件,配置工具設定。
(2)用c語言或彙編語言建立源程式。
(3)用項目管理生成應用。
(4)修改源程式中的錯誤。
(5)測試、連接配接應用。
用帶有vision內建開發環境的keil vision2工具進行軟體開發的流程如圖1-12所示。

對keil vision2軟體及其內建開發環境有了整體認識後,本小節将詳細介紹如何使用keil vision2軟體來進行單片機程式的開發。
1.建立工程
首先啟動keil vision2軟體的內建開發環境,如圖1-13所示。幾秒鐘後出現編輯界面,程式視窗的左邊會出現一個工程管理視窗,如圖 1-14 所示。該視窗中有 3 個标簽,分别是“files”、“regs”和“books”,這3個标簽頁分别顯示目前項目的檔案結構、cpu的寄存器及部分特殊功能寄存器的值(調試時才出現)和所選cpu的附加說明檔案,如果是第一次啟動keil vision2,則這3個标簽頁全是空的。
使用菜單“file/new”或者單擊工具欄的建立檔案按鈕,即可在項目視窗的右側打開一個新的文本編輯視窗,在該視窗中輸入源程式代碼,然後儲存該檔案,注意必須加上擴充名“.c”。源檔案不一定使用keil vision2 自帶的文本編輯器編寫,可以使用任意文本編輯器編寫。
在項目開發中,并不僅是有一源程式就行了,還要為這個項目選擇cpu(keil vision2支援數百種cpu,這些cpu的特性不完全相同),确定編譯、彙編、連接配接的參數,指定調試的方式。有一些項目還會由多個檔案組成,為管理和使用友善,keil vision2使用工程(project)這一概念,将這些參數設定和所需的所有檔案都加在一個工程中,對工程裡的main.c檔案進行編譯、連接配接,這樣生成的代碼才有意義。
選擇“project/new project”菜單,彈出一個對話框,如圖1-15所示。
要求給将要建立的工程起一個名字,不需要擴充名,單擊“儲存”按鈕,然後出現第二個對話框,如圖1-16所示。這個對話框要求選擇目标cpu,從圖中可以看出keil vision2支援的cpu種類繁多,幾乎所有目前流行的晶片廠家的cpu型号都包括其中。選擇時,單擊所選廠家前面的“+”号,展開之後選擇所需要的cpu類型即可。
選好以後回到主界面,此時在工程視窗的檔案頁中,出現了“target 1”,“target 1”的前面有一個“+”号,單擊“+”号展開,可以看到下一層的“source group 1”,這時的工程還是一個空的工程,裡面什麼檔案也沒有,需要手動把編寫好的源程式檔案輸入。單擊“source group 1”使其反白顯示,然後單擊滑鼠右鍵,出現一個下拉菜單,如圖1-17所示。
選擇其中的“add files to group‘source group 1’”選項,出現如圖1-18所示的“添加源檔案”對話框。
注意該對話框下面的“檔案類型”預設為“c source files (*.c)”,也就是以c為擴充名的檔案,找到并選中需要加入的檔案,将檔案拖入到項目中,此後還可以繼續加入其他需要的檔案。
2.工程的設定
vision2允許使用者為目标硬體設定選項。先單擊左邊“project”視窗的“target 1”,然後選擇菜單“project/options for target‘target 1’”,即出現工程設定對話框,此對話框共有8個頁籤,絕大部分設定取預設值即可。
(1)target頁籤。
單擊target頁籤,如圖1-19所示。
其中各參數設定如下。
xtal(mhz):用于設定單片機的工作頻率,預設設定是所選目标cpu的最高可用頻率值,該數值與最終産生的目标代碼無關,僅用于軟體模拟調試時顯示程式執行時間。正确設定該數值可使顯示時間與實際所用時間一緻,一般将其設定為開發的硬體所用的晶振頻率。
memory model:用于設定資料存儲空間的類型,有3個選擇項:“small”指變量存儲在内部ram裡;“compact”指變量存儲在外部ram裡,使用8位間接尋址;“large”指變量存儲在外部ram裡,使用16位間接尋址。
code rom size:用于設定rom空間的使用,同樣也有3個選項值:“small”模式,表示隻使用不超過2kb的程式空間;“compact”模式,表示函數的代碼量不能超過2kb,整個程式可以使用64kb的程式空間;“large”模式,程式和函數可用全部的64kb空間。
operating:用于選擇是否使用作業系統,keil vision2提供了兩種作業系統:rtx-51 tiny和rtx-51 full。一般情況下不使用作業系統,即使用該項的預設值:“none”。
off-chip code memory:用于确定系統外擴rom的位址範圍,如果沒有外接rom不要填任何資料。
off-chip xdata memory:用于确定系統外展ram的位址範圍,如果沒有外接ram不要填任何資料。
(2)output頁籤。
單擊output頁籤,如圖1-20所示。
output頁籤的設定比較多,下面逐一介紹。
select folder for objects:用于選擇最終的目标檔案所在的檔案夾,預設是與工程檔案在同一個檔案夾中。
name of executable:用于指定最終産生的目标檔案夾的名字,預設與工程的名字相同,這兩項一般不需要更改。
debug information:用于産生調試資訊,這些資訊用于調試。如果需要對程式進行調試,應當選中該項。
browse information:用于産生浏覽資訊,該資訊可以用菜單“view/browse”來檢視,這裡取預設值。
creat hex file:用于生成可執行代碼檔案,擴充名為“.hex”,預設情況下該項未被選中,如果要需要生成hex檔案,必須選中該項。
create library:生成庫檔案。選中該選項時将生成lib庫檔案,根據使用者的需要是否生成庫檔案,一般的應用是不生成庫檔案的。
(3)listing頁籤。
“listing”頁籤用于調整生成的清單檔案選項。在彙編或編譯完成後将産生.lst的清單檔案,在連接配接完成後也将産生.m51的清單檔案,該頁籤用于對清單檔案的内容和形式進行細緻的調節。其中比較常用的選項是“c compile listing”下的“assemble code”項,選中該項可以在清單檔案中生成c語言源程式所對應的彙編代碼。
(4)c 51頁籤。
用于對keil vision2的mcs-51單片機的編譯過程進行控制,其中比較常用的是“code optimization”組,如圖1-21所示。
該組中“level”是優化等級,mcs-51在對源程式進行編譯時,可以對代碼進行多至9級優化,預設使用第8級,一般不必修改。如果在編譯中出現一些問題,可以降低優化級别試一試。
“emphasis”是選擇編譯優先方式,第一項是代碼量優化(最終生成的代碼量最小),第二項是速度優先(最終生成的代碼速度最快),第三項是預設選項。預設的是速度優先,可根據需要更改。
設定完成後單擊“确定”按鈕傳回主界面,工程檔案設定完畢。
編譯與連接配接
利用程式設計環境通過程式設計器将可執行的.hex檔案寫入到51晶片的程式存儲器rom裡,然後插入到目标硬體系統上電就可以執行。程式設計器的種類繁多,但使用方法大多相同(界面有些差別),具體過程本書不作介紹。
在開發産品時,軟體仿真是晶片不具有線上調試接口時的首要步驟(8051低端單片機不具備此功能,f系列的soc除外),可以用軟體模拟仿真器(simulator)對應用程式進行軟體模拟調試。另外,現在應用程式的開發往往由幾個人共同開發的情形較多,是以直接用硬體方法調試軟體會帶來一定的困難。keil vision2提供了一種軟體仿真器dscope,為mcs-51單片機應用程式的調試帶來了極大的友善。本小節将詳細介紹dscope for windows的使用方法。
1.如何啟動
如果源程式代碼編譯成功,那麼運作dscope可以對mcs-51應用程式進行軟體仿真調試simulator。為了運作dscope,在圖1-22所示的“option for target”對話框的“debug”頁籤中要選中“use simulator”單選項。“load application at startup”複選框用于在dscope啟動時能夠調用自己應用程式的omf檔案,是以也要選中這個複選框。如果不選中此複選框而運作了dscope,則要手動裝載應用程式。
“run to main()”選項用于選擇在dscope啟動後,是否從c源程式的main()函數開始,是以推薦選中此複選框。
“use”選項中的監控軟體“keil vision2 monitor”,具有把已經編譯好的代碼下載下傳到使用者目标硬體系統後,監控硬體目标系統的功能。該監控軟體通過rs-232序列槽實時地實作keil vision2的dscope和硬體目标系統互相聯系的強大功能。這裡由于使用軟體仿真,是以不選取。
進入調試狀态後,界面與編輯界面相比有明顯的變化,“debug”菜單項中原來不能用的指令現在已可以使用了,工具欄中會多出一個用于運作和調試的工具條,如圖1-24所示。
2.如何調試
調試是在源檔案編輯、編譯無誤之後才得以進行的,主要是反複修改程式并檢驗編寫的程式是否能夠可靠地實作預期目标的過程。在做開發計劃時,通常就把開發周期和調試周期同等對待。
程式調試時,必須明确兩個重要的概念,即單步執行與全速運作。全速運作是指一程式行執行完以後緊接着執行下一程式行,中間不停止,這樣可以看到該段程式執行的總體效果,即最終結果正确還是錯誤,但如果程式錯誤,則難以确認錯誤出現的位置。單步執行是每次執行一行程式,執行完該行程式即停止,等待指令執行下一行程式,此時可以觀察該程式行執行完以後得到的結果,是否與我們寫該程式行所想要得到的結果相同,由此可以找到程式中的問題所在。程式調試中,這兩種運作方式都要用到。
在進入keil vision2的調試環境以後,如果發現程式有錯,可以直接對源程式進行修改,但是要實作重新編譯,必須先退出調試環境,然後重新編譯、連接配接後再次進入調試。如果隻是需要對某些程式進行作測試,或僅需要對源程式進行臨時的修改,這樣的過程未免有些麻煩,可以采用keil vision2軟體提供的線上彙編的方法。将光标定位于需要修改的程式行上,選擇菜單“debug/inline assembly”,會彈出如圖 1-25 所示的對話框,在“enter new instruction”後面的編輯框内直接輸入需更改的程式語句,輸入完成以後回車将自動指向下一條語句,可以繼續修改,如果不再需要修改,可以單擊右上角的關閉按鈕關閉視窗。
程式調試時,一些程式行必須滿足一定的條件才能被執行(如程式中某變量達到一定的值、按鍵被按下、序列槽接收到資料、有中斷産生等),這些條件往往是異步發生或難以預先設定的,這類問題使用單步執行的方法是很難調試的,這時就需要使用到程式調試中的另一種非常重要的方法——斷點設定。
3.調試視窗
keil vision2軟體在調試程式時提供了多個視窗,主要包括輸出視窗(output window)、觀察視窗(watch & call stack window)、存儲器視窗(memory window)、反彙編視窗(disassembly window)和串行視窗(serial window)等。進入調試模式後,可以通過菜單“view”下的相應指令打開或關閉這些視窗。
在進入調試模式之前,工程視窗的寄存器頁面是空白的,進入調試模式以後,此頁面就會顯示出目前模拟狀态下單片機寄存器的值,如圖1-26所示。
寄存器頁面包括了目前的工作寄存器組和系統寄存器,系統寄存器有一些是實際存在的寄存器(如a、b、dptr、sp、psw等),有一些是實際中并不存在或雖然存在卻不能對其進行操作的(如pc、status等)。每當程式中執行到對某寄存器的操作時,該寄存器會以反色(藍底白字)顯示,用滑鼠單擊然後按下f2鍵,即可修改該值。
圖1-27所示是調試模式下的輸出視窗、存儲器視窗和觀察視窗。
進入調試程式後,輸出視窗自動切換到“command”頁(指令視窗)。輸出視窗可以輸入調試指令,同時可以輸出調試資訊,調試指令以文本的形式輸入,詳細的指令語句可以參照“getting started with vision2”的說明,大約有30個指令,這裡不做詳細介紹。
存儲器視窗可以顯示系統中各種記憶體中的值,通過在address後的編輯框内輸入“字母:數字”即可顯示相應記憶體值,其中字母可以是c、d、i和x,它們分别代表代碼存儲空間、直接尋址的片記憶體儲空間、間接尋址的片記憶體儲空間和擴充的外部ram空間。數字代表想要檢視的位址。如輸入“d:5”,即可觀察到位址0x05開始的片内ram單元值,鍵入“c:0”即可顯示從0開始的rom單元中的值,即檢視程式的二進制代碼。該視窗的顯示值可以以各種形式顯示,如十進制、十六進制、字元型等。
改變顯示方式的方法是:按滑鼠右鍵,在彈出的快捷菜單中選擇,該菜單用分隔條分成3部分,其中第一部分與第二部分的3個選項為同一級别,選中第一部分的任意選項,内容将以整數形式顯示;而選中第二部分的“ascii”項将以字元型顯示,選中“float”項内容将以相鄰4位元組組成的浮點數形式顯示,選中“double”項内容将以相鄰8位元組組成的雙精度形式顯示。第一部分又有多個選項,其中“decimal”項是一個開關,如果選中該選項,則視窗中的值将以十進制的形式顯示,否則按預設的十六進制方式顯示。“unsigned”和“signed”後分别有3個選項:char,int,long,分别代表以單位元組方式顯示、相鄰雙位元組組成整型數方式顯示、相鄰4位元組組成長整型方式顯示,而“unsigned”和“signed”則分别代表無符号形式和有符号形式,至于究竟從哪一個單元開始相鄰單元則與設定有關。第三部分的“modify memory at x:xx”用于更改滑鼠處的記憶體單元值,選中該項即出現如圖1-28所示的對話框,可以在對話框中輸入要修改的内容。
觀察視窗是很重要的一個視窗,工程視窗中僅可觀察到工作寄存器和有限的系統寄存器,如a、b、dptr等,如果需要觀察其他寄存器的值或者在進階語言程式設計時需要直接觀察變量,就要借助于觀察視窗了。比如如果想要觀察程式中某個臨時變量tmp在單步工作時的變化情況,就可以在觀察視窗中按f2鍵,然後鍵入變量名tmp,這樣在程式運作的時候會看到tmp變量的即時值。一般情況下,僅在單步執行時才對變量值的變化感興趣,全速運作時,變量的值是不變的,隻有在程式停下來之後,才會将這些最新的變化反映出來。但是,在一些特殊的場合也可能需要在全速運作時觀察變量的變化,此時可以選擇“view/periodic window updata”菜單,确認該項處于被選中狀态,即可在全速運作時動态地觀察有關變量值的變化。選中該項,将會使程式模拟執行的速度變慢。
選擇菜單“view/disassembly window”可以打開反彙編視窗,如圖1-29所示。
該視窗可以顯示反彙編後的代碼、源程式和相應反彙編代碼的混合代碼,可以在該視窗進行線上彙編、利用該視窗跟蹤已執行的代碼、在該視窗按彙編代碼的方式單步執行。打開反彙編視窗,單擊滑鼠右鍵,出現快捷菜單,如圖1-30所示,其中“mixed mode”是以混合方式顯示,“assembly mode”是以反彙編碼方式顯示。
程式調試中常使用設定斷點然後全速執行的方式,在斷點處可以獲得各變量值,但卻無法知道程式在斷點前究竟執行了哪些代碼,而這往往是需要了解的。為此,keil vision2提供了跟蹤功能,在運作程式之前打開調試工具條上的運作跟蹤代碼開關,然後全速運作程式。當程式停止運作後,單擊檢視跟蹤代碼按鈕,自動切換到反彙編視窗,其中前面标有“-”号的行就是中斷以前執行的代碼,可以按視窗邊的上卷按鈕向上翻檢視代碼執行記錄。
keil vision2提供了2個串行觀察視窗,用于pc機與模拟的51單片機視窗通信。從模拟的51單片機的cpu序列槽輸出的資料,将在這個串行視窗中顯示,而在序列槽中輸入的字元,将被輸入到模拟的51單片機的cpu序列槽中,利用這一點,可以在沒有外部硬體的情況下模拟51單片機cpu的uart。這是一種進階調試技巧,本書不再做詳細介紹。