- Keil Cx51 V7.0單片機高級語言編程與μVision2應用實踐
- 徐愛鈞 彭秀華編著
- 12字
- 2018-12-29 19:18:11
第1章 8051單片機與Keil Cx51基礎
1.1 8051單片機的存儲器組織結構
8051單片機最早由Intel公司推出,它在一塊超大規模集成電路芯片上同時集成了CPU、ROM、RAM以及TIMER/COUNTER,使用者只需外接少量的接口電路就可組成自己的專用微處理器系統。目前,市場上8051單片機的硬件支持芯片及軟件應用程序的種類十分豐富,除了Intel公司之外,還有Philips、Siemens、ADM、Fujutsu、OKI、ATMEL等公司都推出了以8051為核心的單片機。新一代的8051單片機集成度更高,在片內集成了更多的功能部件,如A/D、PWM、PCA、WDT以及高速I/O口等,在工業測量控制領域內得到極為廣泛的應用,因此,有人指出8051單片機已成為事實上的工業標準。目前已有多個廠家生產不同型號的8051單片機,它們各有特點,但其基本內核相同,指令系統也完全兼容。
圖1.1所示為8051基本內核的結構框圖,包括:
● 中央處理器CPU,用于執行各種指令和運算處理;
● 內部數據存儲器RAM,用于存放可以讀寫的數據;
● 內部程序存儲器ROM,用于存放程序指令或某些常數表格;
● 4個8位的并行I/O接口P0、P1、P2和P3(每個接口都可以用做輸入或者輸出);
● 2個定時器/計數器,用做外部事件計數器或內部定時;
● 中斷系統具有5個中斷源(2個外部中斷、2個定時器中斷、1個串行口中斷,采用2個優先級的嵌套中斷結構,可實現二級中斷服務程序嵌套,每一個中斷源都可用軟件程序規定為高優先級中斷或低優先級中斷);
● 1個串行接口電路(用做異步接收發送器);
● 內部時鐘電路(晶體和微調電容需要外接,振蕩頻率可以高達40MHz)。
以上各部分通過內部總線相連接。在很多情況下,單片機還要和外部設備或外部存儲器相連接,連接方式采用三總線(地址、數據、控制)方式,但在8051單片機中,沒有單獨的地址總線和數據總線,而是與并行I/O口中的P0口及P2口公用的,進行外部擴展時,P0口分別作為低8位地址線和8位數據線,P2口則作為高8位地址線用,所以也是16條地址線和8條數據線。但是讀者一定要建立一個明確的概念,單片機進行外部擴展的地址線和數據線都不是獨立的總線,而是與并行I/O口公用的,這是8051單片機結構上的一個特點。
對于采用高級語言Keil Cx51的用戶來說,了解和熟悉8051單片機的存儲器組織結構是十分必要的,這樣在具體編程時可以合理安排各種變量,最大限度實現代碼優化。從使用者的角度看,8051單片機有如下3個存儲器空間。

圖1.1 8051基本內核的結構框圖
程序存儲器ROM 對于普通8051單片機,程序存儲器ROM空間大小為64KB,用于存放程序代碼和一些表格常數,稱為CODE空間。普通8051可采用“代碼分組”(CODE BANK)設計技術,將ROM空間擴展到32×64KB,新型Philips 80C51Mx單片機的ROM空間最大可擴展到16 MB,稱為ECODE和HCONST空間。8051單片機專門提供一個引腳“EA”來區分片內ROM和片外ROM,EA引腳接高電平時,單片機從片內ROM中讀取指令,當指令地址超過片內ROM空間范圍后,就自動地轉向片外ROM讀取指令;EA引腳接低電平時,所有的取指操作均對片外ROM進行。程序存儲器的某些地址單元是保留給系統使用的:0000H~0002H單元是所有執行程序的入口地址,復位后CPU總是從0000H地址開始執行程序;0003H~002BH單元均勻地分為5段,用于5個中斷服務程序的入口,產生某個中斷時,將自動進入其對應入口地址開始執行中斷服務程序,一些新型8051單片機增加了更多的中斷源,它們的中斷入口地址也相應增加。
片內數據存儲器RAM 對于普通8051單片機,片內數據存儲器RAM空間最大為256 B,用于存放程序執行過程的各種變量及臨時數據。片內RAM的低128個字節可用直接尋址方式進行訪問,也可用間接尋址方式訪問,稱為DATA區。其中,00H~1FH地址范圍平均分為4組,每組都有8個工作寄存器R0~R7,稱為工作寄存器區(Register Banks)。20H~2FH地址范圍中,每個存儲器單元的每一位都可以用位處理指令直接操作,該段地址范圍稱為位尋址區(BDATA區),其中每一位稱為一個bit。對于51子系列單片機僅有上述低128個字節,對于52子系列單片機,增加了高128個字節的片內RAM,地址范圍為80H~FFH,該范圍只能采用間接尋址方式訪問,整個片內RAM地址范圍00H~FFH稱為IDATA區。與IDATA空間高128個字節(地址范圍80H~FFH)重疊部分稱為特殊功能寄存器區(SFR SPACE),有些特殊功能寄存器是可以位尋址的,其可尋址位稱為sbit。Philips公司推出的新型單片機80C51Mx,其片內RAM最大可擴充到64 KB,稱為EDATA區。
片外數據存儲器RAM 對于普通8051單片機,片外數據存儲器RAM空間大小為64 KB,稱為XDATA區。在XDATA空間內進行分頁尋址操作時,稱為PDATA區。有些新型80C51單片機的擴充片內RAM,需要用專門的特殊功能寄存器“映像”(MAP)到XDATA地址空間;還有一些新型80C51單片機可以將片外RAM最大擴展到16 MB,稱為HDATA區。
圖1.2所示為普通8051單片機的存儲器組織結構,其中,各部分空間說明及地址范圍見表1-1。
表1-1 普通8051單片機存儲器空間分配表


圖1.2 普通8051單片機的存儲器組織結構
圖1.3所示為新型80C51單片機的擴展存儲器組織結構,其中各部分空間說明及地址范圍見表1-2。
表1-2 新型80C51單片機擴展存儲器空間分配表

圖1.4所示為Philips 80C51Mx單片機的存儲器組織結構,其中各部分空間說明及地址范圍見表1-3。
表1-3 Philips 80C51Mx單片機存儲器空間分配表


圖1.3 新型8051單片機的擴展存儲器組織結構

圖1.4 Philips 80C51Mx單片機的存儲器組織結構
1.2 Keil Cx51開發工具
C語言是一種通用的計算機程序設計語言,在國際上十分流行,它既可用來編寫計算機的系統程序,也可用來編寫一般的應用程序。以前計算機的系統軟件主要是用匯編語言編寫的,對于單片機應用系統來說更是如此。由于匯編語言程序的可讀性和可移植性都較差,采用匯編語言編寫單片機應用程序的周期長,而且調試和排錯也比較困難。為了提高編制單片機應用程序的效率,改善程序的可讀性和可移植性,采用高級語言無疑是一種最好的選擇。
C語言既具有一般高級語言的特點,又能直接對計算機的硬件進行操作,表達和運算能力也較強,許多以前只能采用匯編語言來解決的問題現在都可以改用C語言來解決。德國Keil Software公司多年來致力于單片機C語言編譯器的研究,該公司開發的Keil Cx51是一種專為8051單片機設計的高效率C語言編譯器,符合ANSI標準,生成的程序代碼運行速度極高,所需要的存儲器空間極小,完全可以和匯編語言相媲美。
Keil公司目前已經推出了V7.0以上版本的Cx51編譯器,為8051單片機軟件開發提供了全新的C語言環境,同時保留了匯編代碼高效、快速的特點。Cx51已被完全集成到一個功能強大的全新集成開發環境μVision2中,其中包括項目(Project)管理器、Cx51編譯器、Ax51宏匯編器、BL51/Lx51連接定位器、RTX51實時操作系統、Simulator軟件模擬器以及Monitor51硬件目標調試器,所有這些功能均可在μVision2提供的單一而靈活的開發環境中極為簡便地進行操作。
μVision2提供了強大的項目管理功能,可以十分方便地進行結構化多模塊程序設計。μVision2內部集成源級瀏覽器(Browser)利用符號數據庫中詳細的符號信息,使用戶可以快速瀏覽源文件,并優化用戶的變量數據存儲器。
μVision2內部集成器件數據庫(Device Database)儲存了多種不同型號單片機的片上資源信息,通過它可以自動設置Cx51編譯器、Ax51宏匯編器、BL51/Lx51連接定位器及調試器的默認選項,充分滿足用戶利用特定單片機片上集成外圍功能的要求。
μVision2內部集成源程序編輯器允許用戶在編輯源程序文件時(甚至在未經編譯和匯編之前)設置程序調試斷點,便于在程序調試過程中快速檢查和修改程序。
μVision2提供文件查找功能,能對單一文件或全部項目文件進行指定搜索。此外還提供了用戶工具菜單接口,允許在μVision2中直接啟動用戶功能。
μVision2支持軟件模擬仿真(Simulator)和用戶目標板調試(Monitor51)兩種工作方式,在軟件模擬仿真方式下不需要任何8051單片機硬件即可完成用戶程序仿真調試,極大地提高了用戶程序開發效率,在用戶目標板調試方式下,利用硬件目標板中的監控程序可以直接調試目標硬件系統,使用戶可以節省購買昂貴硬件仿真器的費用。
1.3 Cx51簡單編程與調試
采用Keil Cx51開發8051單片機應用程序一般需要以下步驟。
① 在μVision2集成開發環境中創建一個新項目(Project),并為該項目選定合適的單片機CPU器件。
② 利用μVision2的文件編輯器編寫C語言(或匯編語言)源程序文件,并將文件添加到項目中去。一個項目可以包含多個文件,除源程序文件外還可以有庫文件或文本說明文件。
③ 通過μVision2的各種選項,配置Cx51編譯器、Ax51宏匯編器、BL51/Lx51連接定位器以及Debug調試器的功能。
④ 利用μVision2的構造(Build)功能對項目中的源程序文件進行編譯連接,生成絕對目標代碼和可選的HEX文件,如果出現編譯連接錯誤則返回到第②步,修改源程序中的錯誤后重新構造整個項目。
⑤ 將沒有錯誤的絕對目標代碼裝入μVision2調試器進行仿真調試,調試成功后將HEX文件寫入到單片機應用系統的EPROM中。
下面通過一個簡單實例進行說明這幾個步驟。啟動μVision2后,單擊“Project/New Project”菜單選項,在彈出的對話框窗口中輸入項目文件名max,并選擇合適的保存路徑(通常為每個項目建一個單獨的文件夾),單擊“保存”按鈕,這樣就創建了一個文件名為max.uv2的新項目文件,如圖1.5所示。

圖1.5 在μVision2中新建一個項目
項目名保存完畢后將彈出如圖1.6所示器件數據庫對話框窗口,用于為新建項目選擇一個CPU器件(窗口的Description欄對不同公司生產的8051CPU器件做了必要說明),根據需要選擇CPU器件(例如Atmel公司的AT89C51),選定后μVision2將按所選器件自動設置默認的工具選項,從而簡化了項目的配置過程。

圖1.6 為項目選擇CPU器件
創建一個新項目后,項目中會自動包含一個默認的目標(Target 1)和文件組(Source Group 1)。用戶可以給項目添加其他文件組(Group)以及文件組中的的源文件,這對于模塊化編程特別有用。項目中的目標名、組名以及文件名都顯示在μVision2的項目窗口“Files”標簽頁中。接下來要給項目添加源程序文件,源文件可以是已有的,也可以是新建的。新建源文件時單擊菜單“File /New”,在打開的編輯窗口中輸入下例的C51源程序。
例:求兩個輸入數據中的較大者。
# include<stdio.h> /* 預處理命令 */ # include<reg51.h> char max (char x , char y) { /* 定義max函數,x、y為形式參數*/ if ( x > y ) return (x); /* 將計算得到的最大值返回到調用處*/ else return(y) ; } /* max函數結束 */ main() { /* 主函數 */ char a, A, c; /* 主函數的內部變量類型說明 */ SCON=0x52; /* 8051單片機串行口初始化 */ TMOD=0x20; TCON=0x69; TH1=0x0F3; scanf ("%c %c", &a, &A); /* 輸入變量a和b的值 */ c= max (a,A); /* 調用max函數 */ printf ( " \n max =%c \n ", c); /* 輸出變量c的值 */ } /* 主程序結束 */
程序輸入完成后,單擊菜單“Files /Save As…”,如圖1.7所示,將其另存為擴展名為.C的源程序文件,其存放的路徑一般設為與項目文件相同。

圖1.7 保存新建項目中的源程序文件
μVision2具有十分完善的右鍵功能,將鼠標指向項目窗口的“Files”標簽頁中的“Source Group 1”文件組并單擊右鍵,會彈出一個快捷菜單,如圖1.8所示。

圖1.8 項目窗口的右鍵菜單
單擊快捷菜單中的“Add Files to Group ‘Source Group 1’”選項,彈出如圖1.9所示添加源文件選擇窗口,選中剛才保存的源程序文件“max.c”,并單擊“Add”按鈕,將其添加到新創建的項目中去。

圖1.9 添加源文件選擇窗口
接下來根據需要配置Cx51編譯器、Ax51宏匯編器、BL51/Lx51連接定位器以及Debug調試器的各項功能。單擊菜單“Project/Options for Target”,彈出如圖1.10所示窗口,這是一個十分重要的窗口,包括“Device”、“Target”、“Output”、“Listing”、“C51”、“A51”、“BL51 Locate”、“BL51 Misc”和“Debug”等多個選項標簽頁,其中許多選項可以直接用其默認值,必要時可進行適當調整。
圖1.10所示為其中的“Target”標簽頁,用于設定目標硬件系統的時鐘頻率Xtal為24.0 MHz;C51編譯器的存儲器模式為Small(C51程序中局部變量位于片內數據存儲器DATA空間);程序存儲器ROM空間設為Large(使用64KB程序存儲器);不采用實時操作系統;不采用代碼分組設計。

圖1.10 配置“Target”標簽頁
圖1.11所示為“Output”標簽頁,用于設定當前項目在編譯連接之后生成的執行代碼輸出文件。輸出文件名默認為與項目文件同名(也可以指定其他文件名),存放在當前項目文件所在的目錄中,也可以單擊“Select Folder For Objects”來指定存放輸出文件的目錄路徑。
● 選中“Create Executable”表示項目編譯連接后生成執行代碼輸出文件。
● 選中復選框“Debug Information”將在輸出文件中包含進行源程序調試的符號信息。
● 選中復選框“Browse Information”將在輸出文件中包含源程序瀏覽信息。
● 選中復選框“Create HEX File”表示當前項目編譯連接完成之后生成一個用于EPROM編程的HEX文件。
● 在“After Make”欄中選中復選框“Beep When Complete”和復選框“Start Debugging”表示編譯連接完成之后計算機將發出一聲提示音,并立即進入調試狀態。

圖1.11 設定執行代碼輸出文件選項
圖1.12所示為“C51”標簽頁,用于設定當前項目對Cx51編譯器的控制命令選項。“Preprocessor Symbols”欄用于定義Cx51預處理器符號,定義符號后一般要在源程序中增加相應的“ifdef”、“ifndef”、“endif”等預處理器命令。
●“Code Optimization”欄用于設定Cx51編譯器的優化級別,需要注意的是優化級別并非越高越好,應根據具體要求適當選擇,關于Cx51編譯器優化級別的詳細描述請參閱本書第9章。
●“Warning”欄用于選擇編譯時給出警告信息的詳細程度,編號越大越詳細。
●“Include Paths”欄用于指定用戶規定的包含文件路徑,可以手工指定路徑,也可以通過該欄右邊的“…”按鈕來瀏覽選擇路徑。
●“Misc Controls”用于增加除了Cx51編譯器默認選項之外的其他命令選項。
● 所有選定的編譯命令選項都會顯示在“Compiler control string”欄內。
圖1.13所示為“BL51 Locate”標簽頁,用于設定當前項目對BL51連接定位器的命令選項。選中復選框“Use Memory Layout from Target Dialog”時,BL51連接定位器將按前面“Target”標簽頁中的設定對執行代碼進行存儲器地址空間定位,這也是BL51的默認選項。不選中該復選框則應在其他欄內填入希望的存儲器地址空間范圍值。關于BL51連接定位器對存儲器地址空間處理的詳細討論請參閱本書第11章。

圖1.12 設定Cx51編譯器命令選項

圖1.13 設定BL51連接定位命令選項
圖1.14所示為“Options”選項中的“Debug”標簽頁,用于設定μVision2調試器的一些選項。在μVision2中可以對經編譯連接所生成的執行代碼進行兩種仿真調試:軟件模擬仿真調試和目標硬件仿真調試,前者不需要8051單片機硬件,僅在PC機上就可以完成對8051單片機各種片內資源的仿真,仿真結果可以通過μVision2的串行窗口、觀察窗口、存儲器窗口及其他一些窗口直接輸出,其優點是不言而喻的,缺點是不能觀察到實際硬件的動作。
Keil公司還提供了一種目標監控程序Monitor51,通過它可以實現μVision2與用戶目標硬件系統相連接,進行目標硬件的在線仿真調試,這種方法可以立即觀察到目標硬件的實際動作,特別有利于分析和排除各種硬件故障。通常可以先對用戶程序進行軟件模擬仿真,排除一般性錯誤,然后再進行目標硬件仿真調試。
進行軟件模擬仿真時應選中“Debug”標簽頁中的“Use Simulator”圓形單選框,進行目標硬件仿真調試時則要選中“Use Keil Monitor-51 Driver”圓形單選框,為了便于讀者進一步學習Keil Cx51應用編程,開發自己的單片機系統,本書作者設計了一種能直接與μVision2接口的“Keil Cx51源程序仿真硬件目標板”,其中預裝了Keil公司提供的Monitor-51監控程序,可以實現與μVision2無縫連接,使用非常方便,節省用戶購買昂貴硬件仿真器的費用,關于它的具體使用方法請參閱本書8.4節。

圖1.14 設定Debug仿真調試選項
在該窗口所有的標簽頁中都有一個“Defaults”按鈕,用于設定各種默認命令選項,初次使用時可以直接采用這些默認值,待熟悉之后再進一步采用其他選項。有關其他標簽頁的詳細描述請參閱本書第7章。
完成上述關于編譯、連接定位、仿真調試工具配置的基本選項設定之后,就可以對當前新建項目進行整體創建(Build target)。將鼠標指向項目窗口中的文件“max.c”并單擊右鍵,從彈出的快捷菜單中單擊“Build target”選項,如圖1.15所示,μVision2將按“Options for Target”窗口內各種選項設置,自動完成對當前項目中所有源程序模塊文件的編譯連接,同時μVision2的輸出窗口將顯示編譯連接提示信息,如圖1.16所示,如果有編譯連接錯誤,將鼠標指向窗口內的提示信息后雙擊,光標將自動跳到編輯窗口源程序文件發生錯誤的地方,以便于修改。如果沒有編譯連接錯誤則生成絕對目標代碼文件。
編譯連接完成后將μVision2轉入仿真調試狀態,在此狀態下的“項目窗口”自動轉到“Regs”標簽頁,顯示調試過程中單片機內部工作寄存器R0~R7、累加器A、堆棧指針SP、數據指針DPTR、程序計數器PC以及程序狀態字PSW等的值,如圖1.17所示。
在仿真調試狀態下單擊“Debug/Go”菜單項,啟動用戶程序全速運行,再單擊“View/Serial Window #1”選項,打開調試狀態下μVision2的串行窗口1,用戶程序中采用scanf()和printf()所進行的輸入和輸出操作,都是通過串行窗口1實現的,將鼠標指向該窗口并鍵入數字2和9,立即得到輸出結果“max=9”,如圖1.18所示。

圖1.15 利用右鍵快捷菜單對當前項目進行編譯連接

圖1.16 編譯連接完成后輸出窗口的提示信息
μVision2調試器的仿真功能十分完善,除了全速運行之外還可以進行單步、設置斷點、運行到光標指定位置等多種操作,調試過程中可隨時觀察局部變量以及用戶設置的觀察點狀態、存儲器狀態、片內集成外圍功能狀態,通過調用信號函數或用戶函數可實現其他多種仿真功能。關于μVision2調試器的詳細介紹請參閱本書第7章。

圖1.17 μVision2的仿真調試狀態窗口

圖1.18 μVision2調試狀態下串行窗口1及其數據輸入和結果輸出
- Learn ECMAScript(Second Edition)
- UML和模式應用(原書第3版)
- 摩登創客:與智能手機和平板電腦共舞
- TypeScript實戰指南
- Learning Python by Building Games
- Unreal Engine 4 Shaders and Effects Cookbook
- 移動界面(Web/App)Photoshop UI設計十全大補
- OpenCV 4計算機視覺項目實戰(原書第2版)
- 51單片機C語言開發教程
- Spring+Spring MVC+MyBatis從零開始學
- RESTful Web Clients:基于超媒體的可復用客戶端
- Python自然語言理解:自然語言理解系統開發與應用實戰
- HTML+CSS+JavaScript網頁制作:從入門到精通(第4版)
- Android熱門應用開發詳解
- 3D Printing Designs:Design an SD Card Holder