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

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

4、:#include myfile.h/引用自定義文件myfile#include /引用庫(kù)函數(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標(biāo)準(zhǔn)庫(kù)提供了許多包含文件,即C51的頭文件。這些文件存放在目錄KeilC51INC文件夾及其子目錄下。這些頭文件包含常數(shù)、宏定義、類型定義和函數(shù)原型等。C51常用的頭文件如下:absacc.h包含允許直接訪

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

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

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

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

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

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

11、名”為可選的任意有效文件標(biāo)識(shí)符,表示源文件的名字。使用#line命令的程序示例如下: #include /頭文件#line 300/初始化行計(jì)數(shù)器void main()/行號(hào)300/行號(hào)301printf(Line Number=%dn,_LINE_);/行號(hào)302 8.5.1 #line命令#error命令用于強(qiáng)制使編譯程序停止編譯操作的編譯指令,并同時(shí)輸出錯(cuò)誤信息提示。該命令主要用于程序調(diào)試。其使用的一般形式如下:#error “message”其中,“message”為顯示的錯(cuò)誤提示的信息。#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中使用絕對(duì)地址#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中使用絕對(duì)地址#pragma asm/在C51中插入?yún)R編語句8.6 C51的用戶配置文件C51的用戶配置文件是用來在程序執(zhí)行前,配置單片機(jī)系統(tǒng)的一些相關(guān)設(shè)置。在C51中,用戶可以根據(jù)需要適當(dāng)修改配置文件以滿足不同的硬件環(huán)境需要。這些用戶配置文件存放在KeilC51LIB文件夾中。C51編譯器在對(duì)用戶創(chuàng)建的項(xiàng)目進(jìn)行編譯連接時(shí),會(huì)自動(dòng)將用戶配置文件中的代碼添加到用戶程序中去。如果用戶要對(duì)配置文件進(jìn)行修改,可以通過Keil Vision3的項(xiàng)目窗

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

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

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

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

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論