第5章 程序設計_第1頁
第5章 程序設計_第2頁
第5章 程序設計_第3頁
第5章 程序設計_第4頁
第5章 程序設計_第5頁
已閱讀5頁,還剩67頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 作者作者 丁向榮丁向榮單片微機原理與接口技術單片微機原理與接口技術第第5章程序設計章程序設計 5.1匯編語言程序設計 5.2 C51程序設計 5.1 匯編語言程序設計 5.1.1 程序編制的方法和技巧程序編制的方法和技巧 1. 程序編制的步驟程序編制的步驟 (1)系統任務的分析)系統任務的分析 首先,要對單片機應用系統的任務進行深入的分析,明首先,要對單片機應用系統的任務進行深入的分析,明確系統的設計任務、功能要求和技術指標。其次,要對系統確系統的設計任務、功能要求和技術指標。其次,要對系統的硬件資源和工作環境進行分析。這是單片機應用系統程序的硬件資源和工作環境進行分析。這是單片機應用系統程

2、序設計的基礎和條件。設計的基礎和條件。 5.1 匯編語言程序設計 5.1.1 程序編制的方法和技巧程序編制的方法和技巧 1. 程序編制的步驟程序編制的步驟 (2)提出算法與算法的優化)提出算法與算法的優化 算法是解決問題的具體方法。一個應用系統經過分析、研究和明確規算法是解決問題的具體方法。一個應用系統經過分析、研究和明確規定后,對應實現的功能和技術指標可以利用嚴密的數學方法或數學模型來定后,對應實現的功能和技術指標可以利用嚴密的數學方法或數學模型來描述,從而把一個實際問題轉化成由計算機進行處理的問題。同一個問題描述,從而把一個實際問題轉化成由計算機進行處理的問題。同一個問題的算法可以有多種,

3、也都能完成任務或達到目標,但程序的運行速度、占的算法可以有多種,也都能完成任務或達到目標,但程序的運行速度、占用單片機資源以及操作方便性會有較大的區別,所以,應對各種算法進行用單片機資源以及操作方便性會有較大的區別,所以,應對各種算法進行分析比較,并進行合理的優化。分析比較,并進行合理的優化。 5.1 匯編語言程序設計 5.1.1 程序編制的方法和技巧程序編制的方法和技巧 1. 程序編制的步驟程序編制的步驟 (3)程序總體設計及繪制程序流程圖)程序總體設計及繪制程序流程圖 經過任務分析、算法優化后,就可以進行程序的總體構思,確定程序經過任務分析、算法優化后,就可以進行程序的總體構思,確定程序的

4、結構和數據形式,并考慮資源的分配和參數的計算等。然后根據程序運的結構和數據形式,并考慮資源的分配和參數的計算等。然后根據程序運行的過程,勾畫出程序執行的邏輯順序,用圖形符號將總體設計思路及程行的過程,勾畫出程序執行的邏輯順序,用圖形符號將總體設計思路及程序流向繪制在平面圖上,從而使程序的結構關系直觀明了,便于檢查和修序流向繪制在平面圖上,從而使程序的結構關系直觀明了,便于檢查和修改。改。 通常,應用程序依功能可以分為若干部分,通過流程圖可以將具有一通常,應用程序依功能可以分為若干部分,通過流程圖可以將具有一定功能的各部分有機地聯系起來,并由此抓住程序的基本線索,對全局可定功能的各部分有機地聯系

5、起來,并由此抓住程序的基本線索,對全局可以有一個完整的了解。清晰正確的流程圖是編制正確無誤的應用程序的基以有一個完整的了解。清晰正確的流程圖是編制正確無誤的應用程序的基礎和條件,所以,繪制一個好的流程圖,是程序設計的一項重要內容。礎和條件,所以,繪制一個好的流程圖,是程序設計的一項重要內容。 5.1 匯編語言程序設計 5.1.1 程序編制的方法和技巧程序編制的方法和技巧 2. 程序流程圖程序流程圖 流程圖可以分為總流程圖和局部流程圖。總流程圖側重反映程序的邏流程圖可以分為總流程圖和局部流程圖。總流程圖側重反映程序的邏輯結構和各程序模塊之間的相互關系。局部流程圖反映程序模塊的具體實輯結構和各程序

6、模塊之間的相互關系。局部流程圖反映程序模塊的具體實施細節。對于簡單的應用程序,可以不畫流程圖。但當程序較為復雜時,施細節。對于簡單的應用程序,可以不畫流程圖。但當程序較為復雜時,繪制流程圖是一個良好的編程習慣。繪制流程圖是一個良好的編程習慣。 常用的流程圖符號有開始和結束符號、工作任務常用的流程圖符號有開始和結束符號、工作任務(肯定性工作內容肯定性工作內容)符號、符號、判斷分支(疑問性工作內容)符號、程序連接符號、程序流向符號等,如判斷分支(疑問性工作內容)符號、程序連接符號、程序流向符號等,如圖圖5.1所示。所示。 5.1 匯編語言程序設計 5.1.1 程序編制的方法和技巧程序編制的方法和技

7、巧 2. 程序流程圖程序流程圖 5.1 匯編語言程序設計 5.1.2 程序的模塊化設計程序的模塊化設計 (1)采用模塊化程序設計方法)采用模塊化程序設計方法 單片機應用系統的程序一般由包含多個模塊的主程序和單片機應用系統的程序一般由包含多個模塊的主程序和各種子程序組成。每一程序模塊都要完成一個明確的任務,各種子程序組成。每一程序模塊都要完成一個明確的任務,實現某個具體的功能,如發送、接收、延時、打印、顯示等。實現某個具體的功能,如發送、接收、延時、打印、顯示等。采用模塊化的程序設計方法,就是將這些不同的具體功能程采用模塊化的程序設計方法,就是將這些不同的具體功能程序進行獨立的設計和分別調試,最

8、后將這些模塊程序裝配成序進行獨立的設計和分別調試,最后將這些模塊程序裝配成整體程序并進行聯調。整體程序并進行聯調。 5.1 匯編語言程序設計 5.1.2 程序的模塊化設計程序的模塊化設計 (2)盡量采用循環結構和子程序)盡量采用循環結構和子程序 采用循環結構和子程序可以使程序的長度減少,程序簡采用循環結構和子程序可以使程序的長度減少,程序簡單化,占用內存空間減少。對于多重循環,要注意各重循環單化,占用內存空間減少。對于多重循環,要注意各重循環的初值、循環結束條件與需循環位置,避免出現程序無休止的初值、循環結束條件與需循環位置,避免出現程序無休止循環的循環的“死循環死循環”現象。對于通用的子程序

9、,除了用于存放子現象。對于通用的子程序,除了用于存放子程序入口參數的寄存器外,子程序中用到的其它寄存器的內程序入口參數的寄存器外,子程序中用到的其它寄存器的內容應壓入堆棧進行現場保護,并要特別注意堆棧操作的壓入容應壓入堆棧進行現場保護,并要特別注意堆棧操作的壓入和彈出的順序。對于中斷處理子程序除了要保護程序中用到和彈出的順序。對于中斷處理子程序除了要保護程序中用到的寄存器外,還應保護標志寄存器。的寄存器外,還應保護標志寄存器。 5.1 匯編語言程序設計 5.1.3 偽指令偽指令 (1)設置起始地址指令)設置起始地址指令ORG 指令格式為:指令格式為: ORG 16位地址位地址 該指令的作用是指

10、明后面的程序或數據塊的起始地址,它該指令的作用是指明后面的程序或數據塊的起始地址,它總是出現在每段源程序或數據塊的開始。一個匯編語言源程總是出現在每段源程序或數據塊的開始。一個匯編語言源程序中可以有多條序中可以有多條ORG偽指令,但后一條偽指令,但后一條ORG偽指令指定的地址偽指令指定的地址應大于前面機器碼已占用的存儲地址。應大于前面機器碼已占用的存儲地址。 5.1 匯編語言程序設計 5.1.3 偽指令偽指令 (2)匯編語言源程序結束指令)匯編語言源程序結束指令END 指令格式為:指令格式為: 標號:標號: END mm 其中其中mm 是程序起始地址。標號和是程序起始地址。標號和mm不是必需的

11、。不是必需的。 指令功能是表示源程序到此結束,指令功能是表示源程序到此結束,END指令以后的指令匯指令以后的指令匯編程序將不予處理。一個源程序中只能在末尾有一個編程序將不予處理。一個源程序中只能在末尾有一個END指令。指令。 5.1 匯編語言程序設計 5.1.3 偽指令偽指令 ( 3)賦值偽指令)賦值偽指令EQU 指令格式為:指令格式為: 字符名稱字符名稱 EQU 數值或匯編符號數值或匯編符號 EQU偽指令的功能是使指令中的偽指令的功能是使指令中的“字符名稱字符名稱”等價于給定等價于給定的的“數值或匯編符號數值或匯編符號”。賦值后的字符名稱可在整個源程序中。賦值后的字符名稱可在整個源程序中使用

12、。字符名稱必須先賦值后使用,通常將賦值放在源程序使用。字符名稱必須先賦值后使用,通常將賦值放在源程序的開頭。的開頭。 例例5.3 5.1 匯編語言程序設計 5.1.3 偽指令偽指令 (4)數據地址賦值指令)數據地址賦值指令DATA 指令格式為:指令格式為: 字符名稱字符名稱 DATA 表達式表達式 DATA偽指令的功能是將表達式指定的數據地址賦予規定偽指令的功能是將表達式指定的數據地址賦予規定的字符名稱。的字符名稱。 DATA偽指令與偽指令與EQU偽指令的功能相似,其主要區別是:偽指令的功能相似,其主要區別是: DATA偽指令定義的字符名稱可先使用后定義,放于程序偽指令定義的字符名稱可先使用后

13、定義,放于程序開頭、結尾均可;而開頭、結尾均可;而EQU偽指令定義的字符名稱只能是先定偽指令定義的字符名稱只能是先定義,后使用;義,后使用; EQU偽指令既可以將一個匯編符號賦值給字符名稱,而偽指令既可以將一個匯編符號賦值給字符名稱,而DATA偽指令只能將數據地址賦值給字符名稱。偽指令只能將數據地址賦值給字符名稱。 5.1 匯編語言程序設計 5.1.3 偽指令偽指令 (5)定義字節偽指令)定義字節偽指令DB 指令格式為:指令格式為: 標號:標號: DB 字節常數表字節常數表 DB偽指令的功能是從指定的地址單元開始,定義若干個偽指令的功能是從指定的地址單元開始,定義若干個8位內存單元的內容。字節

14、常數可以采用二進制、十進制、十位內存單元的內容。字節常數可以采用二進制、十進制、十六進制和六進制和ASCII碼等多種表示形式。碼等多種表示形式。 5.1 匯編語言程序設計 5.1.3 偽指令偽指令 (6)定義字偽指令)定義字偽指令DW 指令格式為:指令格式為: 標號:標號: DW 字常數表字常數表 DW偽指令功能是從指定地址開始,定義若干個偽指令功能是從指定地址開始,定義若干個16位數據,位數據,高八位存入低地址,低八位存入高地址。高八位存入低地址,低八位存入高地址。 5.1 匯編語言程序設計 5.1.3 偽指令偽指令 (7)定義存儲區指令)定義存儲區指令DS 指令格式為:指令格式為: 標號:

15、標號: DS 表達式表達式 指令功能為從指定的單元地址開始,保留一定數量的存儲指令功能為從指定的單元地址開始,保留一定數量的存儲單元,以備使用。匯編時,對這些單元不賦值。單元,以備使用。匯編時,對這些單元不賦值。 5.1 匯編語言程序設計 5.1.3 偽指令偽指令 (8)位定義偽指令)位定義偽指令BIT 指令格式為:指令格式為: 字符名稱字符名稱 BIT 位地址位地址 指令功能為將位地址賦值給指定的符號名稱,通常用于指令功能為將位地址賦值給指定的符號名稱,通常用于位符號地址的定義。位符號地址的定義。 5.1 匯編語言程序設計 5.1.3 偽指令偽指令 (9)文件包含命令)文件包含命令INCLU

16、DE 指令格式為:指令格式為: $INCLUDE (文件名)(文件名) INCLUDE用于將寄存器定義文件或其它程序文件包含于用于將寄存器定義文件或其它程序文件包含于當前程序中,寄存器定義文件的后綴名一般為當前程序中,寄存器定義文件的后綴名一般為“.INC”,也可直,也可直接包含匯編程序文件。接包含匯編程序文件。 例如例如 $INCLUDE (STC15F2K60S2.INC) 5.2 基本程序結構與程序設計舉例基本程序結構與程序設計舉例 1. 順序結構程序順序結構程序 順序程序是指無分支、無循環結構的程序,其執行流程順序程序是指無分支、無循環結構的程序,其執行流程是依指令在程序存儲器中的存放

17、順序進行的。順序程序比較是依指令在程序存儲器中的存放順序進行的。順序程序比較簡單,一般不需繪制程序流程圖,直接編程既可。簡單,一般不需繪制程序流程圖,直接編程既可。 例例5.4 試將試將8位二進制數據轉換為十進制(位二進制數據轉換為十進制(BCD碼)數據碼)數據 5.2 基本程序結構與程序設計舉例 2. 分支結構程序分支結構程序 通常情況下,程序的執行是按照指令在程序存儲器中存通常情況下,程序的執行是按照指令在程序存儲器中存放的順序進行的,但有時需要對某種條件的判斷結果來決定放的順序進行的,但有時需要對某種條件的判斷結果來決定程序的不同走向,這種程序結構就屬于分支結構。分支結構程序的不同走向,

18、這種程序結構就屬于分支結構。分支結構可以分成單分支、雙分支和多分支幾種情況,各分支間相互可以分成單分支、雙分支和多分支幾種情況,各分支間相互獨立。獨立。 5.2 基本程序結構與程序設計舉例 2. 分支結構程序分支結構程序-例題例題例例5.5例例5.6 5.2 基本程序結構與程序設計舉例 3. 循環結構程序循環結構程序 在程序設計中,當需要對某段程序進行大量地有規律地重在程序設計中,當需要對某段程序進行大量地有規律地重復執行時,可采用循環方法設計程序。循環結構的程序主要包括復執行時,可采用循環方法設計程序。循環結構的程序主要包括以下四個部分:以下四個部分: 循環初始化部分:設置循環開始時的狀態。

19、如清結果單元、循環初始化部分:設置循環開始時的狀態。如清結果單元、設置地址指針、設定寄存器初值、循環次數等。設置地址指針、設定寄存器初值、循環次數等。 循環體部分:需要重復執行的程序段,是循環結構的主體。循環體部分:需要重復執行的程序段,是循環結構的主體。 循環控制部分:這部分的作用是修改循環變量和控制變量,循環控制部分:這部分的作用是修改循環變量和控制變量,并判斷循環是否結束,直到符合結束條件,跳出循環為止。并判斷循環是否結束,直到符合結束條件,跳出循環為止。 結束部分:該部分主要完成循環結束后的結果處理工作,例結束部分:該部分主要完成循環結束后的結果處理工作,例如對結果進行分析、如對結果進

20、行分析、 處理和存放。處理和存放。 根據條件的判斷位置與循環次數的控制,循環結構又分為根據條件的判斷位置與循環次數的控制,循環結構又分為3種基種基本結構:本結構:while結構、結構、do-while結構和結構和for結構。結構。 5.2 基本程序結構與程序設計舉例 3. 循環結構程序循環結構程序 while結構的特點是先判斷后執行,因此,循環體程序也結構的特點是先判斷后執行,因此,循環體程序也許一次都不執行。許一次都不執行。 do-while結構的特點是先執行后判斷,因此,循環體程序結構的特點是先執行后判斷,因此,循環體程序至少要執行一次。至少要執行一次。 for結構的特點和結構的特點和do

21、-while結構一樣也是先執行后判斷,但結構一樣也是先執行后判斷,但是,是, for結構循環體程序的執行次數是固定的。結構循環體程序的執行次數是固定的。 5.2 基本程序結構與程序設計舉例 3. 循環結構程序循環結構程序-例題例題 例例5.8 例例5.9 例例5.10 例例5.11 5.2 基本程序結構與程序設計舉例 4. 子程序子程序 1)子程序的調用與返回)子程序的調用與返回 2)現場保護與恢復)現場保護與恢復 3)參數傳遞)參數傳遞 利用累加器或寄存器利用累加器或寄存器 利用存儲器(指針傳遞)利用存儲器(指針傳遞) 利用堆棧利用堆棧 例例5.12 例例5.13 例例5.145.3 C51

22、程序設計 5.3.1 C51基礎基礎 標識符是用來標識源程序中某個對象的名字,這些對象標識符是用來標識源程序中某個對象的名字,這些對象可以是語句、數據類型、函數、變量、常量、數組等。可以是語句、數據類型、函數、變量、常量、數組等。 關鍵字是編程語言保留的特殊標識符,也稱為保留字,關鍵字是編程語言保留的特殊標識符,也稱為保留字,它們具有固定名稱和含義。在它們具有固定名稱和含義。在C語言的程序編寫中,不允許標語言的程序編寫中,不允許標識符與關鍵字相同。識符與關鍵字相同。 5.3 C51程序設計 5.3.1 C51基礎基礎 標識符是用來標識源程序中某個對象的名字,這些對象標識符是用來標識源程序中某個

23、對象的名字,這些對象可以是語句、數據類型、函數、變量、常量、數組等。可以是語句、數據類型、函數、變量、常量、數組等。 關鍵字是編程語言保留的特殊標識符,也稱為保留字,關鍵字是編程語言保留的特殊標識符,也稱為保留字,它們具有固定名稱和含義。在它們具有固定名稱和含義。在C語言的程序編寫中,不允許標語言的程序編寫中,不允許標識符與關鍵字相同。識符與關鍵字相同。 5.3 C51程序設計 5.3.1 C51基礎基礎 1 . C51數據類型數據類型 (1)Keil C51編編譯器支持的數據譯器支持的數據類型類型 見表見表5.3。5.3 C51程序設計 5.3.1 C51基礎基礎 (2)數據類型分析)數據類

24、型分析 1)char字符類型字符類型 有有unsigned char和和signed char之分,默認值為之分,默認值為signed char,長度為長度為1個字節,用以存放個字節,用以存放1個單字節數據。對于個單字節數據。對于signed char型型數據,其字節的最高位表示該數據的符號,數據,其字節的最高位表示該數據的符號,“0”表示正數,表示正數,“1”表示負數,數據格式為補碼形式,所能表示的數值范圍為:表示負數,數據格式為補碼形式,所能表示的數值范圍為:128127;而;而unsigned char型數據是無符號字符型數據,型數據是無符號字符型數據,所能表示的數值范圍為:所能表示的數

25、值范圍為:0255。 5.3 C51程序設計 5.3.1 C51基礎基礎 (2)數據類型分析)數據類型分析 2)int整型整型 有有unsigned int和和signed int之分,默認值為之分,默認值為signed int,長度,長度為為2個字節,用以存放雙字節數據。個字節,用以存放雙字節數據。signed int是有符號整型數,是有符號整型數,unsigned int是無符號整型數。是無符號整型數。 3)long長整型長整型 有有unsigned long和和signed long之分,默認值為之分,默認值為signed long,長度為長度為4個字節。個字節。signed long是

26、有符號長整型數,是有符號長整型數,unsigned long是無符號長整型數。是無符號長整型數。 5.3 C51程序設計5.3.1 C51基礎基礎 (2)數據類型分析)數據類型分析 4)float浮點型浮點型 它是符合它是符合IEEE-754標準的單精度浮點型數據。標準的單精度浮點型數據。float浮點型浮點型數據占用數據占用4個字節(個字節(32位二進制數),其存放格式為:位二進制數),其存放格式為:5.3 C51程序設計5.3.1 C51基礎基礎 (2)數據類型分析)數據類型分析 5)指針型)指針型 指針型數據不同于以上指針型數據不同于以上4種基本數據類型,它本身是一個種基本數據類型,它本

27、身是一個變量。但在這個變量中存放的不是普通的數據而是指向另一變量。但在這個變量中存放的不是普通的數據而是指向另一個數據的地址。指針變量也要占據一定的內存單元,在個數據的地址。指針變量也要占據一定的內存單元,在Keil C51中,指針變量的長度一般為中,指針變量的長度一般為13字節。指針變量也具有類字節。指針變量也具有類型,其表示方法是在指針符號型,其表示方法是在指針符號“*”的前面冠以數據類型符號,的前面冠以數據類型符號,如如“char *point”是一個字符型指針變量。指針變量的類型表示是一個字符型指針變量。指針變量的類型表示該指針所指向地址中數據的類型。該指針所指向地址中數據的類型。 5

28、.3 C51程序設計5.3.1 C51基礎基礎 (2)數據類型分析)數據類型分析 6)bit位標量位標量 這是這是C51編譯器的一種擴充數據類型,利用它可以定義編譯器的一種擴充數據類型,利用它可以定義一個位標量。一個位標量。 7)sfr 定義特殊功能寄存器定義特殊功能寄存器 這是這是C51編譯器的一種擴充數據類型,利用它可以訪問編譯器的一種擴充數據類型,利用它可以訪問8051單片機的所有內部的特殊功能寄存器。它占用一個內存單片機的所有內部的特殊功能寄存器。它占用一個內存單元,其取值范圍是單元,其取值范圍是0255。 5.3 C51程序設計 5.3.1 C51基礎基礎 (2)數據類型分析)數據類

29、型分析 8)sfr16定義定義16位特殊功能寄存器位特殊功能寄存器 它占用兩個內存單元,其取值范圍是它占用兩個內存單元,其取值范圍是065535。 9)sbit 定義可尋址位定義可尋址位 這也是這也是C51編譯器的一種擴充數據類型,利用它可以訪編譯器的一種擴充數據類型,利用它可以訪問問8051單片機內部單片機內部RAM中的可尋址位和特殊功能寄存器的可尋中的可尋址位和特殊功能寄存器的可尋址位。址位。 5.3 C51程序設計 5.3.1 C51基礎基礎 (3)變量的數據類型選擇)變量的數據類型選擇 變量的數據類型選擇的基本原則:變量的數據類型選擇的基本原則: 1)若能預算出變量的變化范圍,則可根據

30、變量長度來選)若能預算出變量的變化范圍,則可根據變量長度來選擇變量的類型,則盡量減少變量的長度。擇變量的類型,則盡量減少變量的長度。 2)如果程序中不需使用負數,則選擇無符號數類型的變)如果程序中不需使用負數,則選擇無符號數類型的變量。量。 3)如果程序中不需使用浮點數,則要避免使用浮點數變)如果程序中不需使用浮點數,則要避免使用浮點數變量。量。 5.3 C51程序設計 5.3.1 C51基礎基礎 (4)數據類型之間的轉換)數據類型之間的轉換 在在C語言程序的表達式或變量的賦值運算中,有時會出語言程序的表達式或變量的賦值運算中,有時會出現運算對象的數據類型不一樣的情況,現運算對象的數據類型不一

31、樣的情況,C語言程序允許在標準語言程序允許在標準數據類型之間隱式轉換,隱式轉換按以下優先級別(由低到數據類型之間隱式轉換,隱式轉換按以下優先級別(由低到高)自動進行:高)自動進行: bitcharintlongfloatsignedunsigned5.3 C51程序設計5.3.1 C51基礎基礎 2. C51的變量的變量 : C51中對變量的定義格式為:中對變量的定義格式為: 存儲種類存儲種類 數據類型數據類型 存儲器類型存儲器類型 變量名表變量名表 1 auto int data x ; 2 char code y=0 x22 ; 5.3 C51程序設計5.3.1 C51基礎基礎 2.C51

32、的變量的變量 : (1)變量的存儲種類)變量的存儲種類 變量的存儲種類有變量的存儲種類有4種,分別為:種,分別為: auto(自動)、(自動)、extern(外部)、(外部)、 static(靜態)、(靜態)、register(寄存器)。(寄存器)。 5.3 C51程序設計 5.3.1 C51基礎基礎 2. C51的變量的變量 : (2)變量的存儲器類型)變量的存儲器類型 Keil C編譯器完全支持編譯器完全支持8051系列單片機的硬件結構、可以訪問其硬件系統系列單片機的硬件結構、可以訪問其硬件系統的各個部分,對于各個變量可以準確地賦予其存儲器類型,使之能夠在單片機的各個部分,對于各個變量可以

33、準確地賦予其存儲器類型,使之能夠在單片機內準確定位。內準確定位。Keil C編譯器支持的存儲器類型見表所示。編譯器支持的存儲器類型見表所示。 5.3 C51程序設計 5.3.1 C51基礎基礎 2. C51的變量的變量 (3) Keil C編譯器的編譯模式與默認存儲器類型編譯器的編譯模式與默認存儲器類型 SMALL 變量被定義在變量被定義在8051單片機的內部數據存儲器(單片機的內部數據存儲器(data)區)區中,因此對這種變量的訪問速度最快。另外,所有的對象,中,因此對這種變量的訪問速度最快。另外,所有的對象,包括堆棧,都必須嵌入內部數據存儲器。包括堆棧,都必須嵌入內部數據存儲器。 5.3

34、C51程序設計 5.3.1 C51基礎基礎 2. C51的變量的變量 (3) Keil C編譯器的編譯模式與默認存儲器類型編譯器的編譯模式與默認存儲器類型 COMPACT 變量被定義在外部數據存儲器(變量被定義在外部數據存儲器(pdata)區中,外部數)區中,外部數據段長度可達據段長度可達256字節。這時對變量的訪問是通過寄存器間字節。這時對變量的訪問是通過寄存器間接尋址(接尋址(MOVX Ri)實現的。采用這種模式編譯時,變量)實現的。采用這種模式編譯時,變量的高的高8位地址由位地址由P2口確定。因此,在采用這種模式的同時,口確定。因此,在采用這種模式的同時,必須適當改變啟動程序必須適當改變

35、啟動程序STARTUP.A51中的參數:中的參數:PDATASTART和和PDATALEN,用,用L51進行連接時還必須采用控制命令進行連接時還必須采用控制命令PDATA來對來對P2口地址進行定位,這樣才能確保口地址進行定位,這樣才能確保P2口為所需要的高口為所需要的高8位地址。位地址。 5.3 C51程序設計 5.3.1 C51基礎基礎 2. C51的變量的變量 (3) Keil C編譯器的編譯模式與默認存儲器類型編譯器的編譯模式與默認存儲器類型 LARGE 變量被定義在外部數據存儲器(變量被定義在外部數據存儲器(xdata)區中,使用數據)區中,使用數據指針指針DPTR進行訪問。這種訪問數

36、據的方法效率是不高的,進行訪問。這種訪問數據的方法效率是不高的,尤其是對于尤其是對于2個或多個字節的變量,用這種數據訪問方法對個或多個字節的變量,用這種數據訪問方法對程序的代碼長度影響非常大。另外一個不便之處是數據指針程序的代碼長度影響非常大。另外一個不便之處是數據指針不能對稱操作。不能對稱操作。 5.3 C51程序設計 5.3.1 C51基礎基礎 3. 51單片機特殊功能寄存器變量的定義單片機特殊功能寄存器變量的定義 (1) 8位地址特殊功能寄存器的定義位地址特殊功能寄存器的定義 定義格式:定義格式: sfr 特殊功能寄存器名特殊功能寄存器的地址常數特殊功能寄存器名特殊功能寄存器的地址常數

37、; 例如:例如: sfr P0 = 0 x80 ; /定義特殊功能寄存器定義特殊功能寄存器P0口的地址為口的地址為80H。 5.3 C51程序設計 5.3.1 C51基礎基礎 3. 51單片機特殊功能寄存器變量的定義單片機特殊功能寄存器變量的定義 : ( 2) 16位特殊功能寄存器變量的定義位特殊功能寄存器變量的定義 在新一代的增強型在新一代的增強型8051單片機中,特殊功能寄存器經常單片機中,特殊功能寄存器經常組合成組合成16位使用。為了有效地訪問這種位使用。為了有效地訪問這種16位的特殊功能寄存位的特殊功能寄存器,可采用關鍵字器,可采用關鍵字sfr16進行定義。進行定義。 5.3 C51程

38、序設計 5.3.1 C51基礎基礎 3. 51單片機特殊功能寄存器變量的定義單片機特殊功能寄存器變量的定義 (3)特殊功能寄存器中位變量的定義)特殊功能寄存器中位變量的定義 1)sbit 位變量名位地址位變量名位地址 這種方法將位的絕對地址賦給位變量,位地址必須位于這種方法將位的絕對地址賦給位變量,位地址必須位于80HFFH之間。例如:之間。例如:sbit OV = 0 xD2 ; /定義位變量定義位變量OV(溢出標志),其位地址為(溢出標志),其位地址為D2H。sbit CY = 0 xD7; /定義位變量定義位變量CY(進位位),其位地址為(進位位),其位地址為D7H。sbit RSPIN

39、= 0 x80; /定義位變量定義位變量RSPIN,其位地址為,其位地址為80H。 5.3 C51程序設計 5.3.1 C51基礎基礎 3. 51單片機特殊功能寄存器變量的定義單片機特殊功能寄存器變量的定義 : (3)特殊功能寄存器中位變量的定義)特殊功能寄存器中位變量的定義 2)sbit 位變量名特殊功能寄存器名位位置位變量名特殊功能寄存器名位位置 適用已定義的特殊功能寄存器位變量的定義,位位置值為適用已定義的特殊功能寄存器位變量的定義,位位置值為07。例如:例如:sbit OV= PSW2 ; /定義位變量定義位變量OV(溢出標志),它是(溢出標志),它是PSW的第的第2位。位。sbit

40、CY= PSW7 ; /定義位變量定義位變量CY(進位位),它是(進位位),它是PSW的第的第7位。位。sbit RSPIN = P00; /定義位變量定義位變量RSPIN,它是,它是P0口第口第0位。位。 5.3 C51程序設計 5.3.1 C51基礎基礎 3. 51單片機特殊功能寄存器變量的定義單片機特殊功能寄存器變量的定義 : (3)特殊功能寄存器中位變量的定義)特殊功能寄存器中位變量的定義 3)sbit 位變量名字節地址位位置位變量名字節地址位位置 這種方法是以特殊功能寄存器的地址作為基址,其值位這種方法是以特殊功能寄存器的地址作為基址,其值位于于80HFFH之間,位位置值為之間,位位

41、置值為07。例如:。例如:sbit OV = 0 xD02 ; /定義位變量定義位變量OV(溢出標志),直接指明了特殊功能寄存器(溢出標志),直接指明了特殊功能寄存器PSW 的地址,它是的地址,它是 0 xD0地址單元的第地址單元的第2位。位。sbit CY = 0 xD07 ; /定義位變量定義位變量CY(進位位),直接指明了特殊功能寄存器(進位位),直接指明了特殊功能寄存器PSW的的地址,它是地址,它是0 xD0地址單元第地址單元第7位。位。sbit RSPIN = 0 x800; /定義位變量定義位變量RSPIN,直接指明了,直接指明了P0口的地址為口的地址為80H,它是,它是80H的的

42、第第0位。位。 5.3 C51程序設計 5.3.1 C51基礎基礎 4. 51單片機位尋址區(單片機位尋址區(20H2FH)位變量的定義)位變量的定義 : (1)定義位尋址區變量)定義位尋址區變量 int bdata my_y = 0 x20 (2) 定義位尋址區位變量定義位尋址區位變量 sbit my_ybit0 = my_y0 ; sbit my_ybit15 = my_y15 ; 5.3 C51程序設計 5.3.1 C51基礎基礎 5. 函數的定位函數的定位 : (1)指定工作寄存器區)指定工作寄存器區 當需要指定函數中使用的工作寄存器區時,使用關鍵當需要指定函數中使用的工作寄存器區時,

43、使用關鍵字字using后跟一個后跟一個03的數,對應工作寄存器組的數,對應工作寄存器組03區。例如:區。例如:unsigned char GetKey(void) using 2 /*用戶代碼區用戶代碼區*/5.3 C51程序設計 5.3.1 C51基礎基礎 5. 函數的定位函數的定位 : ( 2.)指定存儲模式)指定存儲模式 用戶可以使用用戶可以使用small、compact及及large說明存儲模式。說明存儲模式。 例如:例如:void OutBCD(void) small 5.3 C51程序設計 5.3.1 C51基礎基礎 6. 中斷服務函數中斷服務函數 : (1)中斷服務函數的定義)中

44、斷服務函數的定義 中斷服務函數定義的中斷服務函數定義的般形式為:般形式為: 函數類型函數類型 函數名(形式參數表)函數名(形式參數表)interrupt n using m 其中,關鍵字其中,關鍵字interrupt后面的后面的n是中斷號,是中斷號,n的取值范圍為的取值范圍為031。編譯器從。編譯器從8n3處產生中斷向量,具體的中斷號處產生中斷向量,具體的中斷號n和和中斷向量取決于不同的單片機芯片。中斷向量取決于不同的單片機芯片。 5.3 C51程序設計 5.3.1 C51基礎基礎 6. 中斷服務函數中斷服務函數 : (2) 8051單片機中斷源的中斷號與中斷向量單片機中斷源的中斷號與中斷向量

45、 5.3 C51程序設計 5.3.1 C51基礎基礎 6. 中斷服務函數中斷服務函數 : (3)中斷服務函數的編寫規則中斷服務函數的編寫規則 1)中斷函數不能進行參數傳遞,如果中斷函數中包含任何參數聲明都將導致編譯)中斷函數不能進行參數傳遞,如果中斷函數中包含任何參數聲明都將導致編譯出錯。出錯。 2)中斷函數沒有返回值,如果企圖定義一個返回值將得到不正確的結果。因此,)中斷函數沒有返回值,如果企圖定義一個返回值將得到不正確的結果。因此,最好定義中斷函數時將其定義為最好定義中斷函數時將其定義為void類型,以明確說明沒有返回值。類型,以明確說明沒有返回值。 3)在任何情況下都不能直接調用中斷函數

46、,否則會產生編譯錯誤。因為中斷函數)在任何情況下都不能直接調用中斷函數,否則會產生編譯錯誤。因為中斷函數的返回是由的返回是由8051單片機指令單片機指令RETI完成的,完成的,RETI指令影響指令影響8051單片機的硬件中斷單片機的硬件中斷系統。系統。 4)如果中斷函數中用到浮點運算,必須保存浮點寄存器的狀態,當沒有其他程序)如果中斷函數中用到浮點運算,必須保存浮點寄存器的狀態,當沒有其他程序執行浮點運算時可以不保存。執行浮點運算時可以不保存。 5)如果在中斷函數中調用了其他函數,則被調用函數所使用的寄存器組必須與中)如果在中斷函數中調用了其他函數,則被調用函數所使用的寄存器組必須與中斷函相同

47、。用戶必須保證按要求使用相同的寄存器組,否則會產生不正確的結斷函相同。用戶必須保證按要求使用相同的寄存器組,否則會產生不正確的結果。如果定義中函數時沒有使用果。如果定義中函數時沒有使用using選項,則由編譯器選擇一個寄存器組作絕選項,則由編譯器選擇一個寄存器組作絕對寄存器組訪問。對寄存器組訪問。 5.3 C51程序設計 5.3.1 C51基礎基礎 7. 函數的遞歸調用與再入函數函數的遞歸調用與再入函數 C語言中允許在調用一個函數過程中,又間接或直接地調用該函數自己,這就稱為函數的遞歸調用。遞歸調用可以使程序簡潔,代碼緊湊,但速度會稍慢,并目要占用較大的堆棧空間。 在C51中,采用一個擴展關鍵

48、字reentrant,作為定義函數時的選項,從而構造成再入函數,使其在函數體內可以直接或間接地調用自身函數,實現遞歸調用。需要將一個函數定義為再入函數時,只要在函數名后面加上關鍵字reentrant就可以了,格式如下: 函數類型函數類型 函數名(形式參數表)函數名(形式參數表)reentrant5.3 C51程序設計 5.3.1 C51基礎基礎 8. 在在C51中嵌入匯編中嵌入匯編 : (1)在)在C文件中以如下方式嵌入匯編代碼文件中以如下方式嵌入匯編代碼pragma ASM ;嵌入的匯編語言代碼;嵌入的匯編語言代碼 ;pragma ENDASM (2)在)在Keil C51編譯器編譯器Pro

49、ject窗口中包含匯編代碼的窗口中包含匯編代碼的C文件文件上單擊鼠標右鍵,選擇上單擊鼠標右鍵,選擇“Options for”,單擊右邊的,單擊右邊的“Generate Assembler SRC File”并在并在“Assemble SRC File”前打勾,使檢查前打勾,使檢查框由灰色變成黑色(有效)狀態。框由灰色變成黑色(有效)狀態。 5.3 C51程序設計 5.3.1 C51基礎基礎 8. 在在C51中嵌入匯編中嵌入匯編 : (3)根據選擇的編譯模式,把相應的庫文件(如)根據選擇的編譯模式,把相應的庫文件(如Small模式模式時,是時,是Keil C51 Lib C 5 I S Lib)

50、加入工程中,該文件必須作為)加入工程中,該文件必須作為工程的最后文件。工程的最后文件。 (4)編譯,即可生成目標代碼。)編譯,即可生成目標代碼。 這樣,在這樣,在“asm”和和“endasm”中的代碼將被復制到輸出的中的代碼將被復制到輸出的SRC文件中,然后這個文件編譯并和其他的目標文件連接后產生文件中,然后這個文件編譯并和其他的目標文件連接后產生最后的可執行文件。最后的可執行文件。 5.3 C51程序設計 5.3.2 C51程序設計程序設計 1. C51程序框架程序框架 : (1)預處理部分)預處理部分 (2)全局變量定義與函數聲明)全局變量定義與函數聲明 (3)主函數)主函數 (4)子函數

51、與中斷服務函數)子函數與中斷服務函數 5.3 C51程序設計 5.3.2 C51程序設計程序設計 1. C51程序框架程序框架 : (1)預處理)預處理 所謂編譯預處理,是編譯器在對所謂編譯預處理,是編譯器在對C語言源程序進行正常編譯之語言源程序進行正常編譯之前,先對一些特殊的預處理命令作解釋,產生一個新的源程序。前,先對一些特殊的預處理命令作解釋,產生一個新的源程序。編譯預處理主要是為程序調試、程序移植提供便利。編譯預處理主要是為程序調試、程序移植提供便利。 在源程序中,為了區分預處理命令和一般的在源程序中,為了區分預處理命令和一般的C語句的不同,所語句的不同,所有預處理命令行都以符號有預處

52、理命令行都以符號“#”開頭,并且結尾不用分號。預處理命開頭,并且結尾不用分號。預處理命令可以出現在程序任何位置,但習慣上盡可能地寫在源程序的開令可以出現在程序任何位置,但習慣上盡可能地寫在源程序的開頭,其作用范圍從其出現的位置到文件尾。頭,其作用范圍從其出現的位置到文件尾。 C語言提供的預處理命令主要有:宏定義、文件包含和條件編譯。語言提供的預處理命令主要有:宏定義、文件包含和條件編譯。 5.3 C51程序設計 5.3.2 C51程序設計程序設計 1. C51程序框架程序框架 : (1)預處理)預處理 1)文件包含)文件包含 文件包含實際上就是一個源程序文件可以包含另外一個文件包含實際上就是一

53、個源程序文件可以包含另外一個源程序文件的全部內容。文件包含不僅可以包含頭文件,如源程序文件的全部內容。文件包含不僅可以包含頭文件,如include ,還可以包含用戶自己編寫的源程序文,還可以包含用戶自己編寫的源程序文件,如件,如#include“MYPROC.C”。 C51文件中首先必須包含有關文件中首先必須包含有關51單片機特殊功能寄存器單片機特殊功能寄存器地址以及位地址定義的頭文件,比如地址以及位地址定義的頭文件,比如include 。 5.3 C51程序設計 5.3.2 C51程序設計程序設計 1. C51程序框架程序框架 : (1)預處理)預處理 1)文件包含)文件包含 文件包含預處理

54、命令的一般格式文件包含預處理命令的一般格式 #include 或或# include 文件名文件名 前一種形式的文件名用尖括弧括起來,系統將到包含前一種形式的文件名用尖括弧括起來,系統將到包含C語言庫函數的頭文件所在的目錄(通常是語言庫函數的頭文件所在的目錄(通常是KEIL目錄中的目錄中的include子目錄)中尋找文件;后一種形式的文件名用雙引號子目錄)中尋找文件;后一種形式的文件名用雙引號括起來,系統先在當前目錄下尋找,若找不到,再到其他路括起來,系統先在當前目錄下尋找,若找不到,再到其他路徑中尋找。徑中尋找。C51程序設計 5.3.2 C51程序設計程序設計 1. C51程序框架程序框架

55、 : (1)預處理)預處理 1)文件包含)文件包含 文件包含使用注意文件包含使用注意 一個一個#include命令只能指定一個被包含的文件。命令只能指定一個被包含的文件。 如果文件如果文件1包含了文件包含了文件2,而文件,而文件2要用到文件要用到文件3的內容,則的內容,則在文件在文件1中用兩個中用兩個#include命令分別包含文件命令分別包含文件2和文件和文件3,并且,并且文件文件3包含要寫在文件包含要寫在文件2的包含之前,即在的包含之前,即在file1.c中定義:中定義: # includefile3.c includefile2.c 文件包含可以嵌套。文件包含可以嵌套。 5.3 C51程

56、序設計 5.3.2 C51程序設計程序設計 1. C51程序框架程序框架 : (1)預處理)預處理 2)宏定義)宏定義 宏定義分為帶參數的宏定義和不帶參數的宏定義。宏定義分為帶參數的宏定義和不帶參數的宏定義。 不帶參數的宏定義不帶參數的宏定義 #define 標識符標識符 字符串字符串 define PI 3.14 /*PI即為即為3.148/ 5.3 C51程序設計 5.3.2 C51程序設計程序設計 1. C51程序框架程序框架 : (1)預處理)預處理 2)宏定義)宏定義 無參數的宏定義使用時,要注意以下幾個問題:無參數的宏定義使用時,要注意以下幾個問題: 宏名一般用大寫字母,以便于與變量名的區別。當然,宏名一般用大寫字母,以便于與變量名的區別。當然,用小寫字母也不為錯。用小寫字母也不為錯。 在編譯預處理中宏名與字符串進行替換時,不作語法檢在編譯預處理中宏名與字符串進行替換時,不作語法檢查,只是簡單的字符替換,只有在編譯時才對已經展開宏名查,只是簡單的字符替換,只有在編譯時才對已經展開宏名的源程序進行語法

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論