第8章C51的預處理命令和_第1頁
第8章C51的預處理命令和_第2頁
第8章C51的預處理命令和_第3頁
第8章C51的預處理命令和_第4頁
第8章C51的預處理命令和_第5頁
已閱讀5頁,還剩17頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、第8章 C51的預處理命令和用戶配置文件 用戶編寫的C51程序代碼只能控制程序的執(zhí)行流程,若要對編譯程序進行操作,就要用到預處理命令。在編譯環(huán)境對源程序進行編譯前,先對程序中的預處理命令進行處理,然后將處理結(jié)果和源程序一起進行編譯。 預處理命令通常只進行一些符號的處理,其并不執(zhí)行具體的單片機硬件操作。C51語言中的預處理命令包括文件包含指令、宏定義指令和條件編譯指令等,還有其他一些指令在程序調(diào)試時使用。本章將詳細介紹各種常用的預處理命令的用法,同時還介紹了C51的用戶配置文件相關(guān)的內(nèi)容。8.1 C51的預處理命令概述C51語言中提供了各種預處理命令,其作用類似于匯編程序中的偽指令。一般來說,在

2、對C51源程序進行編譯前,編譯器需要先對程序中的預處理命令進行處理,然后將預處理的結(jié)果和源代碼一并進行編譯,最后產(chǎn)生目標代碼。預處理命令通常只進行一些符號的處理,其并不執(zhí)行具體的硬件操作。為了與C51源代碼中的程序語句相區(qū)別,預處理命令前要加一個“#”。C51語言中的預處理命令,如表所示。C51的預處理命令預處理命令用途#define用于宏定義#error用于程序調(diào)試#include用于文件包含#if用于條件編譯#else用于條件編譯#elif用于多種條件編譯選擇#endif用于條件編譯#ifdef用于條件編譯#ifndef用于條件編譯#undef用于宏定義#line用于更改行號#pragma

3、用于傳送控制指令8.2 文件包含指令 文件包含指令,即#include命令,通常位于C51源程序的開頭,利用#include命令可以將其他的文件引入當前的C51源文件。其中被包含的文件通常是頭文件、宏定義等。使用文件包含指令,有利于更好地調(diào)試C51源文件。當需要調(diào)試修改文件時,只要修改某一包含文件即可,而無需對所有文件進行修改。 8.2.1 #include命令在C51語言中,文件包含指令的一般形式如下:#include 頭文件.h#include #include 宏定義標識符其中,“#include”表示文件包含指令、雙引號或尖括號括起來的文件名是要引入的源文件。典型的文件包含指令示例如下

4、:#include myfile.h/引用自定義文件myfile#include /引用庫函數(shù)文件studio#include /引用寄存器文件define MATH_FILE Ckeilincmath1.h/宏定義自定義文件MATH_FILE#include MATH_FILE/引用自定義文件MATH_FILE 8.2.2 C51常用的頭文件在Keil Vision3集成開發(fā)環(huán)境中,C51標準庫提供了許多包含文件,即C51的頭文件。這些文件存放在目錄KeilC51INC文件夾及其子目錄下。這些頭文件包含常數(shù)、宏定義、類型定義和函數(shù)原型等。C51常用的頭文件如下:absacc.h包含允許直接訪

5、問8051不同存儲區(qū)的宏定義。asscert.h文件定義asscert宏,用來建立程序的測試條件。ctype.h常用的字符轉(zhuǎn)換和分類程序。intrins.h文件包含指示編譯器產(chǎn)生嵌入原有代碼的程序的原型。math.h常用數(shù)學程序。reg51.h51系列單片機特殊寄存器。reg52.h52系列單片機特殊寄存器。setjmp.h定義jmp_buf類型以及setjmp和longjmp程序的原型。stdarg.h可變長度參數(shù)列表程序。stdlib.h存儲區(qū)分配程序。stdio.h常用的輸入和輸出程序。string.h常用的字符串操作程序和緩沖區(qū)操作程序。8.3 宏定義指令 宏定義指令是指用一些標識符作

6、為宏名,來代替其他一些符號或者常量的預處理命令。使用宏定義指令,可以減少程序中字符串輸入的工作量,而且可以提高程序的可移植性。 宏名既可以是字符串或常數(shù),也可以是帶參數(shù)的宏。宏定義指令可分為帶參數(shù)的宏定義和不帶參數(shù)的宏定義。下面分別介紹用于宏定義的一些預處理命令。8.3.1 #define命令 #define命令用于定義一個宏名。宏名是一個標識符,在源代碼中遇到該標識符時,均以宏定義的串的內(nèi)容代替該標識符。ANSI標準宏將定義的標識符稱為“宏名”,而用定義的內(nèi)容代替宏名的過程稱為“宏替換”。#define命令用于定義宏名時,既可以帶參數(shù),也可以不帶參數(shù),下面分別介紹這兩種情況。 1不帶參數(shù)的宏

7、定義 2帶參數(shù)的宏定義8.3.2 #undef命令#undef命令用于取消前面用#define命令定義過的宏名。一般形式為:#undef 宏名其中,“#undef”是取消宏定義指令,“宏名”為前面用#define命令定義過的標識符。使用#undef命令的目的是將宏名局限在指定的代碼段中,這樣可以限制宏定義的使用范圍。使用#undef命令的程序示例如下:#include /頭文件#define COUNT 50/宏定義void main()/主函數(shù)printf(COUNT =%dn, COUNT);/輸出COUNT =50#undef COUNT/撤銷COUNT宏定義/printf(COUNT

8、=%dn, COUNT);/此時再引用COUNT是錯誤的 8.4 條件編譯指令 在默認情況下,源程序中的所有程序代碼都要進行編譯。但是有時需要某些語句行在條件滿足的情況下,才進行編譯,此時便用到條件編譯指令。目前商業(yè)軟件公司廣泛應(yīng)用條件編譯來制作某個程序的不同用戶的版本,例如專業(yè)版、個人版、試用版等,從而可以限制軟件的某些功能。 條件編譯指令是指對源程序的代碼有選擇地進行編譯。采用條件編譯,可以提高程序的廣泛的適用性,縮小目標源代碼的大小,加快程序執(zhí)行的速度。C51的條件編譯指令有#if、#else、#ifdef、#ifndef、#endif這幾個命令。下面分別介紹這些命令的用法。8.4.1

9、#if、#else和#endif命令 #if、#else和#endif命令是一組常用的條件編譯指令,用于進行條件編譯,其一般形式如下: #if 常量表達式 語句段; #else 語句段; #endif 其中,“#if”、“#else”、“#endif”為條件編譯指令,“常量表達式”為進行條件編譯的判斷條件,語句段為進行條件編譯的程序代碼段。8.4.2 #elif命令#elif命令用于進行在多種編譯條件下進行選擇編譯的情況。其含義與“else if”相同,形成一個階梯狀編譯語句。使用#elif命令的一般形式如下:#if 表達式0語句段;#elif 表達式1語句段;#elif 表達式2語句段;#e

10、lif 表達式n語句段;#endif8.4.3 #ifdef、#ifndef命令 #ifdef與#ifndef命令用于判斷宏名是否被定義過,并根據(jù)判斷的情況進行條件編譯。#ifdef命令的一般形式是: #ifdef 宏名 語句段; #else 語句段; #endif8.5 其他編譯指令#line命令用于修改_LINE_與_FILE_的內(nèi)容。其中“_LINE_”和“_FILE_”是在編譯程序中預先定義的標識符,分別表示行號和源文件。#line命令主要用于調(diào)試及其他一些特殊的應(yīng)用。使用#line命令的一般形式如下:#line 數(shù)字文件名其中,“數(shù)字”為任意正整數(shù),表示源程序中當前語句的行號;“文件

11、名”為可選的任意有效文件標識符,表示源文件的名字。使用#line命令的程序示例如下: #include /頭文件#line 300/初始化行計數(shù)器void main()/行號300/行號301printf(Line Number=%dn,_LINE_);/行號302 8.5.1 #line命令#error命令用于強制使編譯程序停止編譯操作的編譯指令,并同時輸出錯誤信息提示。該命令主要用于程序調(diào)試。其使用的一般形式如下:#error “message”其中,“message”為顯示的錯誤提示的信息。#error命令的程序示例如下:#include /頭文件#define SCORE 85/宏定義

12、void main()/主函數(shù)#ifdef SCORE/條件編譯printf(SCORE is defined!n);/如果宏SCORE存在,則執(zhí)行該語句#else#error SCORE is not defined!n/如果宏SCORE不存在,則執(zhí)行該處#endif#ifndef GREED#error GREED is not defined!n/如果宏GREED存在,則執(zhí)行該處#elseprintf(GREED is defined!n);/如果宏GREED不存在,則執(zhí)行該語句#endif 8.5.2 #error命令#pragma命令用于向編譯程序傳送各種C51編譯器的控制指令。根據(jù)

13、#pragma指令后面的字符串,編譯系統(tǒng)將按照特定的方式來編譯C51的字符串和函數(shù)。其使用的一般形式如下:#pragma 字符串其中,#pragma指令后面的字符串,可以大寫,也可以小寫。#pragma指令示例如下:#pragma sfr/在C51中使用SFR#pragma access/在C51中使用絕對地址#pragma asm/在C51中插入?yún)R編語句 8.5.3 #pragma命令#pragma命令用于向編譯程序傳送各種C51編譯器的控制指令。根據(jù)#pragma指令后面的字符串,編譯系統(tǒng)將按照特定的方式來編譯C51的字符串和函數(shù)。其使用的一般形式如下:#pragma 字符串其中,#pra

14、gma指令后面的字符串,可以大寫,也可以小寫。#pragma指令示例如下:#pragma sfr/在C51中使用SFR#pragma access/在C51中使用絕對地址#pragma asm/在C51中插入?yún)R編語句8.6 C51的用戶配置文件C51的用戶配置文件是用來在程序執(zhí)行前,配置單片機系統(tǒng)的一些相關(guān)設(shè)置。在C51中,用戶可以根據(jù)需要適當修改配置文件以滿足不同的硬件環(huán)境需要。這些用戶配置文件存放在KeilC51LIB文件夾中。C51編譯器在對用戶創(chuàng)建的項目進行編譯連接時,會自動將用戶配置文件中的代碼添加到用戶程序中去。如果用戶要對配置文件進行修改,可以通過Keil Vision3的項目窗

15、口,先將需要修改的配置文件添加到自己的項目文件組中,然后在編輯窗口進行修改,最后再進行總體編譯連接,這樣就可以將修改后的用戶配置文件代碼連接到自己的源程序代碼中。C51的用戶配置文件包括啟動代碼文件、變量初始化文件、基本I/O函數(shù)文件、分組配置文件幾類。下面分別介紹這幾類用戶配置文件。8.6.1 C51的啟動代碼詳解C51啟動代碼文件用于在源程序進入主函數(shù)前,完成對單片機片內(nèi)外RAM清零、開設(shè)常規(guī)堆棧和再入函數(shù)堆棧、設(shè)置堆棧指針等任務(wù)。在Keil Vision3編譯環(huán)境中,針對不同類型的8051單片機提供了多種啟動代碼配置文件,其中最常用的啟動代碼文件是 STARTUP.A51,其他的啟動代碼

16、都和STARTUP.A51作用相似。這里以啟動代碼文件 STARTUP.A51為例進行介紹,其可以實現(xiàn)以下幾方面功能:定義內(nèi)部RAM大小、外部RAM大小和可重入堆棧位置。初始化8051硬件堆棧指針。按存儲模式初使化重入堆棧及堆棧指針。清除內(nèi)部、外部或者以此頁為單元的外部存儲器。向主函數(shù)main()交權(quán)。8.6.2 C51的變量初始化文件變量初始化文件用于對源程序中聲明的變量進行初始化賦值。在Keil Vision3集成開發(fā)環(huán)境中,主要的變量初始化文件為INIT.A51。此外,對于不使用外部XDATA存儲器的RTX-51 TINY實時操作系統(tǒng),還提供了INIT_TNY.A51變量初始化文件。變量

17、初始化文件的目標代碼已經(jīng)駐留在Keil Vision3的編譯器的運行庫內(nèi)。當用戶的C51源程序中包含有初始值的外部變量和靜態(tài)變量時,連接定位器BL51將會自動將該變量初始化文件代碼加入到C51源程序的前面,對已確定初始化的外部變量和靜態(tài)變量進行賦值。如果需要對變量初始化文件進行修改,可以將其添加到用戶自己的項目文件中,修改完畢后重新對項目進行編譯即可。變量初始化文件INIT.A51包含一個看門狗定時器的宏定義WATCHDOG。如果程序使用了看門狗定時器,并且對變量初始化處理所需的時間比看門狗定時器的刷新時間要長。此時宏定義WATCHDOG中必須包含看門狗刷新時間的代碼。8.6.3 C51的基本

18、I/O函數(shù)文件在Keil C51中提供了一些常用的I/O函數(shù),主要有兩個:PUTCHAR.C和GETKEY.C。用戶可以直接調(diào)用,而不需要重新編寫,這樣可以大大節(jié)省程序開發(fā)的時間。下面分別介紹這兩個文件。PUTCHAR.C用于將字符串從8051單片機的串行口輸出。其采用XON/XOFF協(xié)議進行控制,將換行字符“LF”(n)被轉(zhuǎn)換為“CR,LF”(rn)。在Keil Vision3集成開發(fā)環(huán)境中,是printf、puts等函數(shù)的字符輸出核心函數(shù)。用戶也可以根據(jù)自己的需要來修改該文件中的函數(shù),從而實現(xiàn)特定的輸出效果,例如LCD或LED顯示等。GETKEY.C用于字符的串口輸入,其不進行數(shù)據(jù)轉(zhuǎn)換。在Keil Vision3集成開發(fā)環(huán)境中,是C51編譯器運行庫中的getchar、scanf等函數(shù)的字符輸入核心函數(shù)。用戶也可以根據(jù)自己的需要來修改該文件中的函數(shù),可以實現(xiàn)特定的輸入效果,例如44矩陣鍵盤的輸入等。8.6.4 C51的分組配置文件C5

溫馨提示

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

評論

0/150

提交評論