![第三講C語(yǔ)言基礎(chǔ)_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/12/9eec3da7-4e99-4c68-b72d-ac04d0830cb5/9eec3da7-4e99-4c68-b72d-ac04d0830cb51.gif)
![第三講C語(yǔ)言基礎(chǔ)_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/12/9eec3da7-4e99-4c68-b72d-ac04d0830cb5/9eec3da7-4e99-4c68-b72d-ac04d0830cb52.gif)
![第三講C語(yǔ)言基礎(chǔ)_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/12/9eec3da7-4e99-4c68-b72d-ac04d0830cb5/9eec3da7-4e99-4c68-b72d-ac04d0830cb53.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、3 單片機(jī)的 C 語(yǔ)言基礎(chǔ)C 語(yǔ)言是一種高級(jí)程序設(shè)計(jì)語(yǔ)言,C 語(yǔ)言具有匯編語(yǔ)言和高級(jí)語(yǔ)言的雙重特性,既可以作為系統(tǒng)設(shè)計(jì)語(yǔ)言來(lái)編寫操作系統(tǒng),也可以作為應(yīng)用程序設(shè)計(jì)語(yǔ)言來(lái)編寫不依賴計(jì)算機(jī)硬 件的應(yīng)用程序。它的優(yōu)點(diǎn)是可讀性強(qiáng)和可移植性高。使用 C 語(yǔ)言來(lái)開發(fā)程序不但可以減少 程序開發(fā)的時(shí)間,而且所開發(fā)出來(lái)的程序不會(huì)占據(jù)大量的程序存儲(chǔ)器,因此許多嵌入式系 統(tǒng)程序都使用 C 語(yǔ)言作為開發(fā)工具。目前,單片機(jī)使用 C 語(yǔ)言編寫程序比較流行,特別是對(duì)于初學(xué)者,利用 C 語(yǔ)言編寫單 片機(jī)程序根本不用了解通用寄存器的應(yīng)用過(guò)程以及內(nèi)部各個(gè)部件的地址,只需記住特殊寄 存器的作用就可以編寫完美的程序。單片機(jī) C 語(yǔ)言程
2、序設(shè)計(jì)過(guò)程中,雖然出現(xiàn)了各種不同 的C語(yǔ)言編譯器,但使用C語(yǔ)言編程時(shí)仍然依照 C語(yǔ)言格式進(jìn)行。在這一節(jié)中,我們將學(xué)習(xí)單片機(jī)程序設(shè)計(jì)中常用的C語(yǔ)言基礎(chǔ)知識(shí)。本節(jié)任務(wù):1掌握C語(yǔ)言程序設(shè)計(jì)的基本方法;2掌握C語(yǔ)言的控制命令的使用方法;3.掌握C語(yǔ)言的指針、函數(shù)的使用方法;4掌握C語(yǔ)言程序中嵌入?yún)R編語(yǔ)言的方法。3.1.1 C 語(yǔ)言概述一、C 語(yǔ)言簡(jiǎn)介C語(yǔ)言誕生于20世紀(jì)70年代初在貝爾實(shí)驗(yàn)室,當(dāng)時(shí)的目的是作為UNIX操作系統(tǒng)的實(shí)現(xiàn)語(yǔ)言。隨著 UNIX操作系統(tǒng)的廣泛使用,C語(yǔ)言也迅速得到推廣。C語(yǔ)言在發(fā)展過(guò)程中出現(xiàn)了多種版本,并且得到不斷的改進(jìn)。各個(gè) C 語(yǔ)言版本之間存在一些不一致的地方。美國(guó) 國(guó)家標(biāo)
3、準(zhǔn)協(xié)會(huì)<ANSI)在1983年對(duì)C語(yǔ)言進(jìn)行了改進(jìn)和擴(kuò)充,制定了 ANSIC標(biāo)準(zhǔn),并于 1989 年再次修訂。二、C語(yǔ)言的特點(diǎn)C語(yǔ)言可讀性強(qiáng)和可移植性高的優(yōu)點(diǎn)。C語(yǔ)言的主要特點(diǎn)如下:<1)C語(yǔ)言是一種面向過(guò)程的高級(jí)程序設(shè)計(jì)語(yǔ)言。<2)可移植性好,編寫的程序能夠適應(yīng)各種平臺(tái)。<3)C語(yǔ)言語(yǔ)言簡(jiǎn)潔,結(jié)構(gòu)緊湊,使用方便、靈活。<4)C語(yǔ)言是一種模塊化的程序設(shè)計(jì)語(yǔ)言。<5)數(shù)據(jù)處理能力強(qiáng),運(yùn)算符豐富。三、單片機(jī)使用 C語(yǔ)言的基本格式在開始學(xué)習(xí) C 語(yǔ)言之前,我們先看一個(gè)完整的單片機(jī)程序案例,該程序目的是想讓單 片機(jī)的P0.0 口驅(qū)動(dòng)一個(gè)LED明滅閃爍。本程序利用 Ke
4、il C 軟件編寫。/*/#include<regx51.h>sbit LED=P1A0。/定義 LED 為 P1_0。void delay( void >int i ,j 。for(I=1 。 I<=255 。 i+> / 延時(shí)一段時(shí)間for(j=1 。 j<=255 。 j+> 。void main(void> LED=0 。while(1>delay(>。LED=!LED/*/從以上程序中我們看到 C語(yǔ)言程序有以下特點(diǎn):<1)C語(yǔ)言程序中大小寫是有所區(qū)別的,基本上C語(yǔ)言大都是使用小寫。<2)程序中每一條指令的結(jié)尾都必
5、須加上分號(hào)“;”。每一個(gè)聲明,每一個(gè)語(yǔ)句都必須以分號(hào)結(jié)束。但預(yù)處理命令、函數(shù)頭和大括號(hào)“”之后不能加分號(hào)。<3)C語(yǔ)言程序中,main(>表示主程序,程序都是從該函數(shù)開始運(yùn)行,所以程序中一 定要有且僅有一個(gè) main(>函數(shù),但可以有多個(gè)其他函數(shù)<如min(>函數(shù)等),每一個(gè)函數(shù)完成相對(duì)獨(dú)立的功能,函數(shù)是C語(yǔ)言程序的基本模塊單元。ma in (>是函數(shù)名,后面的一對(duì)圓括號(hào)“ <)”用來(lái)寫函數(shù)的參數(shù),參數(shù)可以省略,但圓括號(hào)不能省略。<4)函數(shù)之后的“ ”表示本函數(shù)開始,“ ”表示本函數(shù)結(jié)束。<5)程序中所使用的變量一定要預(yù)先作聲明,換言之,變
6、量的聲明必須放在程序的開 頭。<6)為了增強(qiáng)程序的可讀性,低一層次的語(yǔ)句或聲明通常比高一層次的語(yǔ)句或聲明縮 進(jìn)若干格后書寫,以體現(xiàn)層次結(jié)構(gòu)四、編譯預(yù)處理所謂預(yù)處理,是指在進(jìn)行編譯的第一遍掃描<詞法掃描和語(yǔ)法分析)之前所做的工作。預(yù)處理是 C語(yǔ)言的一個(gè)重要功能,它由預(yù)處理程序負(fù)責(zé)完成。當(dāng)對(duì)一個(gè)源文件進(jìn)行編譯 時(shí),系統(tǒng)將自動(dòng)調(diào)用預(yù)處理程序?qū)υ闯绦蛑械念A(yù)處理部分作處理,處理完畢自動(dòng)進(jìn)入對(duì)源 程序的編譯。預(yù)處理命令都以“ #”開頭,每個(gè)處理命令必須單獨(dú)占一行,且末尾不使用分號(hào)作為結(jié) 束符。預(yù)處理命令放在源程序的首部,作用域是從當(dāng)前說(shuō)明的地方開始到文件結(jié)束,在文 件之外就失去作用。常用的預(yù)處
7、理命令有宏定義、條件編譯和文件包含。C語(yǔ)言有以下一些編譯指令,如表 2-1-1所示。表3-1-1 編譯預(yù)處理編譯指令說(shuō)明#include包含另一個(gè)文件#define定義一個(gè)宏vmacro)或是常量#undef取消一個(gè)宏或是常量的定義#asm 和 endasm在程序中加入?yún)R編語(yǔ)言的程序#ifdef、#indef、#else 和#endif用于條件式的編譯#in clude 指示編譯器把它所包的文件加進(jìn)來(lái)一起進(jìn)行編譯。#in clude<regx51.h>是把文件regx51.h包含進(jìn)來(lái),而文件regx51.h定義所有8051的特殊用途寄存器的地址和一 些經(jīng)常使用的常量;另外一個(gè)文件
8、stdio.h 定義C語(yǔ)言經(jīng)常使用的基本輸入輸出函數(shù)。#include之后所跟隨的文件如果放在“< > ”內(nèi)就表示該文件位于include 子目錄中;如果被包含的文件保存在當(dāng)前的工作目錄中時(shí),就必須用“”括起來(lái)。如果您使用到C語(yǔ)言的一些特定函數(shù)時(shí),就必須將定義這些函數(shù)的文件包含進(jìn)來(lái)一起 編譯。無(wú)參宏定義命令的一般格式如下#define 標(biāo)識(shí)符字符串其中,“標(biāo)識(shí)符”為所定義的宏名。“字符串”可以是常量、表達(dá)式、格式串等。#define命令出現(xiàn)在程序中所有函數(shù)的外面,宏名的有效范圍為定義命令之后到本源文件 結(jié)束,但可用#undef命令終止宏定義的作用域。其他編譯預(yù)處理內(nèi)容在后面用到時(shí)候
9、具體 講解。五、注釋為增強(qiáng)程序的可讀性,編程人員可以在程序的每一指令后面中加入注釋,這樣可以讓 程序更容易讓人閱讀,一個(gè)高質(zhì)量的程序,應(yīng)在其源程序中加上必要的注釋,在注釋中也 可以使用漢字進(jìn)行注釋。 C語(yǔ)言的注釋可以分成兩種:?jiǎn)涡凶⑨尯投嘈凶⑨?。單行注釋格式?注釋內(nèi)容以雙斜線“ / ”開始,雙斜線之后的文字都是注釋,但是只能在同一行,多行注釋格式為/*注釋內(nèi)容*/多行注釋是以/*開始、以*/結(jié)束的注釋,在“ /* ”和“ */ ”之間的文字都是注釋。并 且必須配對(duì)使用,多行注釋可以占用一行,也可以占用許多行,程序編譯時(shí),不對(duì)注釋做 任何的處理。數(shù)據(jù)類型一、基本數(shù)據(jù)類型C語(yǔ)言提供了 5種基本數(shù)
10、據(jù)類型,分別是整形int )、單精度型float )、雙精度型vdouble )、字符型char)、空類型void),還有一些數(shù)據(jù)類型修飾符,用來(lái)擴(kuò)充基本類 型的意義,以便更準(zhǔn)確地適應(yīng)各種情況的需要。修飾符有Iong(長(zhǎng)型、short(短型、signed(有符號(hào)、unsigned(無(wú)符號(hào) 。這些修飾符與基本數(shù)據(jù)類型的關(guān)鍵字組合可以表示 不同的數(shù)值范圍以及數(shù)據(jù)所占內(nèi)存空間的大小。如表2-1-2所示。表2-4-2 Keil C可以使用的合法數(shù)據(jù)類型和說(shuō)明數(shù)據(jù)類型數(shù)據(jù)類型說(shuō)明長(zhǎng)度數(shù)據(jù)長(zhǎng)度bit位1位0,1char字符8位-128 127unsigned無(wú)符號(hào)字符8位0 255Signed char有
11、符號(hào)字符8位-128 127int整型16位-32768 32767shor int短整型16位-32768 32767unsigned int無(wú)符號(hào)整型16位065535signed int有符號(hào)整型16位-32768 32767long int長(zhǎng)整型32位-2147483648 2147483647unsigned long int無(wú)符號(hào)長(zhǎng)整型32位04294967295signed long int有符號(hào)長(zhǎng)整型32位-2147483648 2147483647float浮點(diǎn)數(shù)32位0.175e-38 0.402e38double雙精度浮點(diǎn)32位0.175e-38 0.402e38void
12、空0位沒(méi)有任何數(shù)據(jù)除了基本數(shù)據(jù)類型之外,用戶也可以自己的數(shù)據(jù)類型。譬如,用戶要記錄時(shí)間或日期 時(shí),可以分別用不同的變量?jī)?chǔ)存時(shí)、分、秒,可是年、月、日,如:char hour, minu te,seco nd,year,moth,day;但是也利用結(jié)構(gòu)體自定義時(shí)間和日期等數(shù)據(jù)類型,如下所示:typedef structchar hour ;char minute ;char second ;time ;typedet structchar year ;char month ;char day ;data ;/*/當(dāng)用戶定義好 time 和 date 之后,就可以聲明數(shù)據(jù)類型是 time 和 da
13、te 變量,如 time now,alarm ; date today,tmpday 。實(shí)際上, C 語(yǔ)言編譯器會(huì)在數(shù)據(jù)存儲(chǔ)器中保留適當(dāng)?shù)奈恢靡詢?chǔ)存這些變量,如圖 3-1 所 示。用戶自定義數(shù)據(jù)類型的定義格式如下:typedef struct 數(shù)據(jù)類型 變量序列 1 ;數(shù)據(jù)類型 變量序列 2; 自定義數(shù)據(jù)類型的名稱;二、標(biāo)識(shí)符標(biāo)識(shí)符就是編程人員為程序中的變量、常量、標(biāo)示或取的名字。在 C 語(yǔ)言的每一個(gè)程 序中所使用的函數(shù)和變量等都應(yīng)有唯一的名稱,這樣才能被識(shí)別和使用。在上面的范例 中,變量 i 和 j 者是用戶自己取的名稱,因?yàn)樗麄兌际菢?biāo)識(shí)符。符號(hào)常量名、變量名、函 數(shù)名、標(biāo)號(hào)、數(shù)組名、文件名
14、、結(jié)構(gòu)體類型名和其他各種用戶定義的對(duì)象名都是標(biāo)識(shí)符。 編程人員所命名的標(biāo)識(shí)符發(fā)布遵守一定的命名規(guī)則,如下所述:<1)標(biāo)識(shí)符只能英文字母、數(shù)字以及下劃線<_)所組成。<2)標(biāo)識(shí)符只能以英文字母或下劃線開頭。<3)標(biāo)識(shí)符的長(zhǎng)度不能超過(guò)32 字符。<4)大小寫英文字母是不同的。<5)保留字不能作為標(biāo)識(shí)符。如:以下是合法的標(biāo)識(shí)符: Num, num1,buffer_1,i,flag ,以下是不合法的標(biāo)識(shí)符: 1num,buffer 1,int 。標(biāo)識(shí)符在使用過(guò)程中用于標(biāo)識(shí)量,可以用單詞和短語(yǔ)來(lái)表示一定含義,避免混淆。Num和 num 是不同的標(biāo)識(shí)符,因?yàn)?C 語(yǔ)言中
15、大小寫英文字母是不同的。三、關(guān)鍵字關(guān)鍵字是 C 語(yǔ)言使用的命令,作為關(guān)鍵字的每個(gè)標(biāo)識(shí)符在 C 語(yǔ)言程序中都有預(yù)先定義 好的特殊意義,這些關(guān)鍵字不能用于任何其他目的。所以不能用作變量的名字,在Keil C中的關(guān)鍵字除了 ANSI C 標(biāo)準(zhǔn)中的 32 個(gè)關(guān)鍵字外,還根據(jù) 51 單片機(jī)的特點(diǎn)擴(kuò)展了相關(guān)的 關(guān)鍵字,以下是 KeilC 的關(guān)鍵字。_at_alienbdatabreakbitcasecharcodecompactdatadefaultdodoublefarelseenumexternfloatforgotoifidata intin li nein terruptlargel on gpd
16、ata_priority_ree ntran tretur nsbitsfrsfr16shortsig nedsizeofsmallstructtypedefus ingunionun sig nedvoidwhilexdata四、常量整型常量即為整型常數(shù),可以用十進(jìn)制、八進(jìn)制和十六進(jìn)制三種形式表示。凡是以數(shù) 字0開頭,由數(shù)字07組成的序列均作為八進(jìn)制數(shù)處理;凡是以0x或Ox)開頭的由數(shù)字、字符af或AF)組成的序列均作為十六進(jìn)制數(shù)處理;其他情況下的數(shù)字序列均作為十進(jìn)制數(shù)處理。表3-1-3各種常量使用的規(guī)則和范例各種常數(shù)規(guī)則范例十進(jìn)制一般十進(jìn)制格式1234二進(jìn)制開頭加上Ob0b00110110
17、八進(jìn)制開頭加上0O0123十六進(jìn)制開頭加上0xOXffOO無(wú)符號(hào)整數(shù)常量結(jié)尾加上U30000U長(zhǎng)整數(shù)常量結(jié)尾加上L299L無(wú)符號(hào)長(zhǎng)整數(shù)常量結(jié)尾加上UL320000UL浮點(diǎn)數(shù)的常量結(jié)尾加上F4.312F字符常量:以單引號(hào)括起來(lái) a'字符常量以雙引號(hào)括起來(lái)“ Hello ”在C語(yǔ)言程序中,可以定義一個(gè)符號(hào)來(lái)代表一個(gè)常量,這種相應(yīng)的符號(hào)稱為符號(hào)常量。定義符號(hào)常量的目的是為了提高程序的可讀性,便于程序的調(diào)試、修改和移植。因此 在定義符號(hào)常量時(shí),所使用的符號(hào)常量名應(yīng)盡可能地表達(dá)其所代表的常量的含義。在C語(yǔ)言中,符號(hào)常量在使用前必須先用預(yù)處理命令#define進(jìn)行定義。例如:#define TRU
18、E 1#define FALSE 0這種語(yǔ)句的格式是在#define 后面跟一個(gè)標(biāo)識(shí)符和一串字符,彼此之間用空格隔開。因?yàn)椴皇?C語(yǔ)句,因此語(yǔ)句末不用分號(hào)。當(dāng)程度被編譯時(shí),先被編譯預(yù)處理。即當(dāng)預(yù)處理遇到#define時(shí),就用標(biāo)識(shí)符后面的字符串替換程度中的所有該標(biāo)識(shí)符。五、變量C語(yǔ)言程序中常常需要將數(shù)據(jù)存儲(chǔ)在內(nèi)存中,方便后面使用或者修改這個(gè)數(shù)據(jù)的值,所使用的變量一定要預(yù)先聲明,變量聲明時(shí)的格式化如下:存儲(chǔ)類型數(shù)據(jù)類型變量名;變量初始化的一般格式如下:存儲(chǔ)類型數(shù)據(jù)類型 變量名1=初值1,變量名2=初值2,;每個(gè)變量都必須有一個(gè)名字這就是變量名。變量的命名規(guī)則與用戶自定義標(biāo)識(shí)符的命名規(guī)則相同。變量值
19、存儲(chǔ)在內(nèi)存中,不同類型的變量,占用的內(nèi)存單元 字節(jié))數(shù)不同。在程序中,通過(guò)變量名來(lái)引用變量值。六、運(yùn)算符各種數(shù)據(jù)類型、常量、變量可以用代表運(yùn)算功能的運(yùn)算符將運(yùn)算對(duì)象連接起來(lái),并且以符合C語(yǔ)言中的語(yǔ)法規(guī)則的一個(gè)說(shuō)明運(yùn)算過(guò)程的式子即表達(dá)式)來(lái)完成對(duì)數(shù)據(jù)的處理。表達(dá)式中的操作數(shù)可以是常量、變量或子表達(dá)式。各種運(yùn)算符彼此間的優(yōu)先級(jí)及結(jié)合性。優(yōu)先級(jí):當(dāng)表達(dá)式中存在不同優(yōu)先級(jí)的運(yùn)算符參與操作時(shí),優(yōu)先級(jí)較高的先于優(yōu)先級(jí)較低的進(jìn)行運(yùn)算。結(jié)合性:當(dāng)表達(dá)式中各種運(yùn)算符優(yōu)先級(jí)相同時(shí),由運(yùn)算符的結(jié)合性確定表達(dá)式的運(yùn)算順序。一類運(yùn)算符的結(jié)合性為從左到右占多數(shù)運(yùn)算符),這是人們習(xí)慣的運(yùn)算順序;另一類運(yùn)算符的結(jié)合性是從右到
20、左,即單目、三目和賦值運(yùn)算符。1)算數(shù)運(yùn)算符算數(shù)運(yùn)算符是C語(yǔ)言中使用較多的的運(yùn)算符號(hào),不同的運(yùn)算符用法見表表2-1-4所示,為了便于了解運(yùn)算符的應(yīng)用,表中假設(shè)a等于8,b等于2。表3-1-4算術(shù)運(yùn)算運(yùn)算符說(shuō)明范例執(zhí)行結(jié)果+加c=a+b;c等于10一減d=a b;d等于6*乘e=a*b ;e等于16/除f=a/b ;f等于4%取余數(shù)g=a%bg等于o+加 1C+;相當(dāng)于 c=c+1c等于11減1d-;相當(dāng)于d=d-1d等于5=等于a=8 ;設(shè)置a等于8+=先相加冉等于e+=5;相當(dāng)于 e=e+5;e等于21一=先相減再等于f =5;相當(dāng)于f=f 5 ;f等于1*=先相乘再等于f*=5 ;相當(dāng)于
21、f=f*5 ;b等于是0/=先相除再等于a/=5 ;相當(dāng)于 a=a/5 ;a等于1整數(shù)除法)%=先取余數(shù)再等于a%=5相當(dāng)于a=a%5a等于3a原來(lái)等于8)雖然對(duì)于基本數(shù)據(jù)類型的變量進(jìn)行+、-運(yùn)算完全可以用 n=n± 1完成,但使用+、-運(yùn)算可以提高程序的執(zhí)行效率。這是因?yàn)?、-運(yùn)算只需要一條機(jī)器指令就可以完成,而n=n± 1則要對(duì)應(yīng)3條機(jī)器指令。自增、自減運(yùn)算符的運(yùn)算對(duì)象只能是簡(jiǎn)單變量,不能是常量或是帶有運(yùn)算符的算式。例如,123+、x+y) +是錯(cuò)誤的。賦值運(yùn)算符:“=”。賦值運(yùn)算符是一個(gè)雙目運(yùn)算符,其結(jié)合性是從右至左。賦值運(yùn) 算符的左邊部分稱為左值,左值只能是一個(gè)變量
22、;賦值運(yùn)算符的右邊部分稱為右值,右值 可以是一個(gè)表達(dá)式。賦值表達(dá)式:由“=”連接的式子稱為賦值表達(dá)式。其功能是將賦值號(hào)右邊表達(dá)式的結(jié)果送到左邊的變量中保存?!?”和“=”是兩種完全不同的運(yùn)算符,前者為關(guān)系運(yùn)算符中的相等運(yùn)算符,后者為賦值運(yùn)算符。2)關(guān)系運(yùn)算符關(guān)系運(yùn)算符用來(lái)測(cè)試兩個(gè)操作數(shù)之間的關(guān)系。C語(yǔ)言中的關(guān)系運(yùn)算符均為雙目運(yùn)算符,包括 (大于 ,(小于 ,=(大于等于 ,=(小于等于,=等于),!=不等于), 其中前4個(gè)的優(yōu)先級(jí)相同且高于后兩個(gè)的優(yōu)先級(jí)后兩個(gè)的優(yōu)先級(jí)相同)。關(guān)系運(yùn)算符主要用在條件語(yǔ)句中,其結(jié)果為邏輯值或稱為布爾值)。如果比較后關(guān)系式成立,則稱之為“真” 結(jié)果為非0);如果比較
23、后關(guān)系式不成立,則稱之為“假”結(jié)果為0)。如表2-1-5所示。表3-1-5 關(guān)系運(yùn)算運(yùn)算符說(shuō)明范例執(zhí)行結(jié)果=等于a=5FALSE!=不等于a!=5TRUE>小于a<5FALSE>大于a>5TRUE<=小于等于a<=5FALSE>=大于等于a>=5TRUE<3)邏輯運(yùn)算符邏輯運(yùn)算符用于對(duì)幾個(gè)關(guān)系運(yùn)算表達(dá)式的運(yùn)算結(jié)果進(jìn)行組合,做出綜合的判斷。邏輯運(yùn)算的結(jié)果以非0為“真”,0為“假”。如果 A代表一個(gè)關(guān)系表達(dá)式的運(yùn)算結(jié)果,B代表另一個(gè)關(guān)系表達(dá)式的運(yùn)算結(jié)果,則A和B的各種邏輯運(yùn)算的真值關(guān)系如表2-1-6所示。表3-1-6邏輯運(yùn)算真值表ABA&
24、;&BA|B!A!B真真真真假假真假假真假真假真假真真假假假假假真真對(duì)于與運(yùn)算,全真為真,有假為假;對(duì)于或運(yùn)算,有真為真,全假為假。C語(yǔ)言程序中可以使用以下的邏輯運(yùn)算,邏輯運(yùn)算的結(jié)果是一個(gè)布爾值:TRUE或FALSE在以下的運(yùn)算中,假設(shè) a=8,如表2-1-6所示。表3-1-6邏輯運(yùn)算運(yùn)算符說(shuō)明范例執(zhí)行結(jié)果&&AND(a>5>&&( a<10>TRUEIIOR(a<5> II (a>10>FALSE!NOT!(a>10>TRUE<4)位運(yùn)算符位邏輯運(yùn)算是針對(duì)運(yùn)算元的每一個(gè)位逐一地實(shí)施邏輯運(yùn)
25、算。在以下的運(yùn)算中假設(shè)a=5,如表3-1-7所示。表3-1-7位運(yùn)算運(yùn)算符說(shuō)明范例執(zhí)行結(jié)果&ANDa&0x01a等于11ORa | 0x80a等于0x85NOTaa等于0xFAaAXORaAOxFFa等于0xFAaVV左移avv 1a等于0x02>>右移a>> 1a等于0x0A程序的三種基本控制結(jié)構(gòu)程序的三種基本控制結(jié)構(gòu)為順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu),這三種基本結(jié)構(gòu)可以組 成所有的復(fù)雜程序。一、順序結(jié)構(gòu)順序結(jié)構(gòu)是 C語(yǔ)言程序最簡(jiǎn)單的程序結(jié)構(gòu),是構(gòu)成復(fù)雜程序的基礎(chǔ)。僅包含順序結(jié)構(gòu) 的程序會(huì)按照語(yǔ)句的書寫順序執(zhí)行。C語(yǔ)言程序是由若干語(yǔ)句組成的,每個(gè)語(yǔ)句以分號(hào)
26、作為結(jié)束符。C語(yǔ)言的語(yǔ)句可以分為5類,分別是控制語(yǔ)句、表達(dá)式語(yǔ)句、函數(shù)調(diào)用語(yǔ)句、空語(yǔ)句和復(fù)合語(yǔ)句。除了控制語(yǔ)句外,其余4類都屬于順序執(zhí)行語(yǔ)句。<1)表達(dá)式語(yǔ)句表達(dá)式語(yǔ)句由表達(dá)式加上分號(hào)組成的,最常見的就是賦值語(yǔ)句,它是由一個(gè)賦值表達(dá) 式后跟一個(gè)分號(hào)形成。例如:i=7。/將7賦值給變量事實(shí)上,任何表達(dá)式都可以加上分號(hào)而成為語(yǔ)句,例如:i+。/ 使i變量的值加1<2)函數(shù)調(diào)用語(yǔ)句 由函數(shù)調(diào)用加上分號(hào)組成,例如: delay(>。 / 調(diào)用延時(shí)函數(shù)函數(shù)是一段程序,這段程序可能存在于函數(shù)庫(kù)中,也可能是由用戶自己定義的當(dāng)調(diào)用 函數(shù)時(shí)會(huì)轉(zhuǎn)到該程序執(zhí)行。但函數(shù)調(diào)用語(yǔ)句與前后語(yǔ)句之間的關(guān)系是
27、按順序執(zhí)行的。<3)空語(yǔ)句 只有分號(hào)組成的語(yǔ)句稱為空語(yǔ)句。在程序中,如果沒(méi)有什么操作需要進(jìn)行,但從語(yǔ)句 的結(jié)構(gòu)上來(lái)說(shuō)必須有一個(gè)語(yǔ)句在進(jìn),可以書寫一個(gè)空語(yǔ)句。<4)復(fù)合語(yǔ)句把多個(gè)語(yǔ)句用大括號(hào)“”括號(hào)來(lái)組成一個(gè)語(yǔ)句稱復(fù)合語(yǔ)句。例如:delay(> 。LED=!LED 。 復(fù)合語(yǔ)句內(nèi)的各條語(yǔ)句都必須以分號(hào)結(jié)尾,在大括號(hào)外不能加分號(hào)。二、選擇結(jié)構(gòu) 在解決實(shí)際問(wèn)題中,有進(jìn)需要根據(jù)給定的條件來(lái)做決定,即條件滿足時(shí)做什么,條件 不滿足時(shí)做什么。選擇結(jié)構(gòu)程序可解決這類問(wèn)題,其作用是根據(jù)所給定的兩個(gè)或多個(gè)分支 中,選擇其中的一個(gè)分支來(lái)執(zhí)行。 C 語(yǔ)言中有兩種選擇結(jié)構(gòu)語(yǔ)句,即 if 語(yǔ)句和 sw
28、itchcase 語(yǔ)句。<1) if 語(yǔ)句1) 單分支 if 語(yǔ)句結(jié)構(gòu) if( 條件)語(yǔ)句 1;如果表達(dá)式的值為真,則執(zhí)行其后的語(yǔ)句,否則不執(zhí)行該語(yǔ)句;2 )雙分支 if 語(yǔ)句 雙分支 if 語(yǔ)句的語(yǔ)法格式如下:if( 表達(dá)式 >語(yǔ)句 1 ; else 語(yǔ)句 2。如果表達(dá)式的值的為真,則執(zhí)行語(yǔ)句1,否則執(zhí)行語(yǔ)句 2 其中 else 的部分可以省略。電腦首先判斷 if 后面的條件是真還是假,如果是真就執(zhí)行語(yǔ)名1,否則就執(zhí)行語(yǔ)句2。else 子句不能作為語(yǔ)句單獨(dú)使用,必須與 if 配對(duì)使用。例如:if(i>3> i=0 。else i=2 。嵌套 if 語(yǔ)句是指 if 語(yǔ)句
29、中又有 if 語(yǔ)句,:if(>if( >語(yǔ)句 1;else語(yǔ)句 2;else當(dāng)if語(yǔ)句嵌套使用時(shí),會(huì)出現(xiàn) if與else的配對(duì)問(wèn)題。C語(yǔ)言規(guī)定,else總是與其上 面最近的 if 配對(duì)。如果要改變這種默認(rèn)的配對(duì)關(guān)系,可以在相應(yīng)的if 選擇語(yǔ)句上加上” ”來(lái)重新確定配對(duì)關(guān)系。3)多分支 if 語(yǔ)句多分支語(yǔ)句的語(yǔ)法格式如下:if ( 表達(dá)式 1語(yǔ)句 1;else if( 表達(dá)式 2語(yǔ)句 2;else if ( 表達(dá)式n語(yǔ)句n。else 語(yǔ)句 n+1。依次判斷表達(dá)式的值,當(dāng)出現(xiàn)某個(gè)值為真時(shí),則執(zhí)行其對(duì)應(yīng)的語(yǔ)句。然后跳到整個(gè)if語(yǔ)句之外繼續(xù)執(zhí)行程序。如果所有的表達(dá)式均為假,則執(zhí)行語(yǔ)句n。然
30、后繼續(xù)執(zhí)行。2) switch-case 語(yǔ)句使用語(yǔ)句的嵌套結(jié)構(gòu)實(shí)現(xiàn)多分支選擇功能時(shí),程序的結(jié)構(gòu)顯得不夠清晰,因此使用switch 語(yǔ)句。 switch 語(yǔ)名的格式: switch ( 變量)case 常量 1:語(yǔ)句 1; break 。; break 。; break 。case case常量 2:語(yǔ)句 2常量 3:語(yǔ)句 3default :語(yǔ)句 n 。計(jì)算表達(dá)式的值,并將其逐個(gè)與其后的常量表達(dá)式的值相比較,當(dāng)表達(dá)式的值與某個(gè) 常量表達(dá)式的值相等時(shí),即執(zhí)行其后的語(yǔ)句,而不再進(jìn)行判斷,但繼續(xù)執(zhí)行case 后面所有的語(yǔ)句;如果表達(dá)式的值與所有 case 后的常量表達(dá)式均不相同時(shí),則執(zhí)行defau
31、lt 后的語(yǔ)句。case 后的語(yǔ)句既可以是單個(gè)語(yǔ)句,也可以是復(fù)合語(yǔ)句,不需要用大括號(hào)括起來(lái)。case常量表達(dá)式和 default 子句可以按任何順序出現(xiàn),但其本身不改變控制流程。switch 號(hào)內(nèi)的表達(dá)式的值和 case 后面常量表達(dá)式的值,都必須是整型的或字符型 的,不允許是實(shí)數(shù)在后的各個(gè)常量表達(dá)式的值不能相同。否則會(huì)出現(xiàn)錯(cuò)誤。三、循環(huán)結(jié)構(gòu) 循環(huán)是計(jì)算機(jī)解題的一個(gè)重要特征。其特點(diǎn)是,在給定條件成立時(shí),反復(fù)執(zhí)行某程序 段,直到條件不成立為止。給定的條件稱為循環(huán)條件,反復(fù)執(zhí)行的程序段稱為循環(huán)體。C語(yǔ)言提供了 5 種循環(huán)語(yǔ)句: while 語(yǔ)句、 do-while 語(yǔ)句、 for 語(yǔ)句、 goto
32、 語(yǔ)句和 if 語(yǔ)句。1) for 循環(huán)for 循環(huán)格式如下:for 表達(dá)式 1;表達(dá)式 2;表達(dá)式 3)語(yǔ)句或 程序;執(zhí)行過(guò)程是: (1計(jì)算“表達(dá)式 1”; (2進(jìn)行第一輪循環(huán):“計(jì)算表達(dá)式 2”,若值為 假,則退出循環(huán);否則執(zhí)行“語(yǔ)句”;(3計(jì)算“表達(dá)式 3”; (4進(jìn)行第二輪循環(huán):計(jì)算“表達(dá)式2”,若值為假,則退出循環(huán);否則執(zhí)行“語(yǔ)句”;(5計(jì)算“表達(dá)式 3”其執(zhí)行過(guò)程如圖所示。例如:for(i=1。i<=200。i+> / 延時(shí)一段時(shí)間for(j=1。jv=200。j+>。/前一個(gè) for 語(yǔ)句的循環(huán)體“表達(dá)式1 ”、“表達(dá)式 2 ”,和“表達(dá)式3”都是選擇項(xiàng),可以省
33、略,但其后的分號(hào)不能省略。省略“表達(dá)式1 ”,表示不對(duì)循環(huán)控制變量賦初值。省略“表達(dá)式2”,則不作其他處理時(shí)變成為死循環(huán),需要在循環(huán)體中用break等語(yǔ)句退出循環(huán)。省略表達(dá)式3,則不對(duì)循環(huán)控制變量進(jìn)行操作,這進(jìn)可在語(yǔ)句體中加入修改循環(huán)控制變量的語(yǔ)句?!氨磉_(dá) 式1”和“表達(dá)式 3”可以同時(shí)省略,需要使用相關(guān)語(yǔ)句保證循環(huán)結(jié)束。3個(gè)表達(dá)式都可省略。例如,for(。>語(yǔ)句相當(dāng)于 while(1>語(yǔ)句。<2)while 循環(huán)while語(yǔ)句的使用格式:while<表達(dá)式)語(yǔ)句;計(jì)算表達(dá)式的值,當(dāng)值為真(非0>時(shí),執(zhí)行循環(huán)體語(yǔ)句。例如:while(i-> a=a+。當(dāng)循環(huán)
34、體由多個(gè)語(yǔ)句組成時(shí),必須用大括號(hào)括起來(lái),使其形成復(fù)合語(yǔ)句。while(i<5>a=a+1。i+。下面是一個(gè)無(wú)窮while循環(huán):while(1>。<3 ) do/while 循環(huán) do-while語(yǔ)句的使用格式如下:do語(yǔ)句或程序;while(表達(dá)式>;do-while 循環(huán)與 while 循環(huán)的不同在于,do-while循環(huán)語(yǔ)句先執(zhí)行循環(huán)中的語(yǔ)句,do-然后再判斷表達(dá)式是否為真,如果為真則繼續(xù)循環(huán);如查為假,則終止循環(huán)。因此,while 循環(huán)至少要執(zhí)行一次循環(huán)語(yǔ)句。例如:doa=a+1 。i=i+3 。while (i<30> 。四、goto 語(yǔ)句go
35、to 語(yǔ)句是一種無(wú)條件轉(zhuǎn)移語(yǔ)句,建議在程序中最好不使用它。因?yàn)?goto 語(yǔ)句會(huì)破 壞結(jié)構(gòu)化設(shè)計(jì)的 3 種基本結(jié)構(gòu),并給閱讀和理解程序帶來(lái)困難。但在多層嵌套退出時(shí),用 goto 語(yǔ)句則比較合理。 goto 語(yǔ)句格式如下:goto 語(yǔ)句標(biāo)號(hào)。 其中的語(yǔ)句標(biāo)號(hào)是用戶任意選取的標(biāo)號(hào)符,其后跟一個(gè)“:”,可以放在程序中任意一 條語(yǔ)句之前,作為該語(yǔ)句的一個(gè)代號(hào)。執(zhí)行 goto 語(yǔ)句后,程序?qū)⑻D(zhuǎn)到該標(biāo)號(hào)處并執(zhí)行 其后的語(yǔ)句。另外標(biāo)號(hào)必須與 goto 語(yǔ)句同處于一個(gè)函數(shù)中,但可以不在一個(gè)循環(huán)層中。 loop1:x+ 。if(x<100> goto loop1。雖然大部分 gogo 語(yǔ)句都是可以
36、避免的,并且應(yīng)該盡量少用,但是在某些時(shí)候, goto 語(yǔ)句會(huì)使程序的流程更清楚,不過(guò)使用的進(jìn)修一定要很小心同,避免讓程序變得難懂。利用 keil 軟件進(jìn)行單片機(jī) C 語(yǔ)言程序設(shè)計(jì)時(shí),程序的每一條語(yǔ)句和程序結(jié)構(gòu)往往不很 復(fù)雜,對(duì)于沒(méi)有 C語(yǔ)言基礎(chǔ)的人,學(xué)習(xí)單片機(jī)C程序設(shè)計(jì)能很快就能入門,但程序的語(yǔ)句之間有較強(qiáng)的邏輯關(guān)系,一個(gè)清晰的程序設(shè)計(jì)思路是程序設(shè)計(jì)的關(guān)鍵,另外還要有過(guò)硬的 硬件技術(shù)基礎(chǔ),通過(guò)不斷的編程練習(xí),才能成為一個(gè)編程的高手。3.1.4 指針指針 <pointer )實(shí)際上就是存儲(chǔ)器的地址,因?yàn)槲覀兛梢园阉胂癯梢粋€(gè)指向存儲(chǔ)器 的箭頭,所以稱為指針。而指針變量就是儲(chǔ)存存儲(chǔ)器地址的變
37、量。內(nèi)存單元的指針和內(nèi)存 單元的內(nèi)容是兩個(gè)不同的概念。使用指針變量時(shí)也必須預(yù)先聲明。對(duì)于一個(gè)內(nèi)存單元來(lái)說(shuō),它的地址即為指針,其中存放的數(shù)據(jù)是該單元的內(nèi)容。在c語(yǔ)言中,允許用一個(gè)變量來(lái)存放指針,這種變量稱為指針變量。因此,一個(gè)指針變量的值 就是某個(gè)內(nèi)存單元的地址,或稱為某內(nèi)存單元的指針。指針變量也是一個(gè)變量,它和普通變量一樣占用一定的存儲(chǔ)空間。但與普通變量不同之 處在于,指針變量的存儲(chǔ)空間存放的不是普通的數(shù)據(jù),而是另一個(gè)變量的地址。因此,指 針變量是一個(gè)地址變量。聲明指針變量的格式如下所示: 數(shù)據(jù)類型 * 指針變量名; 在指針定義中,“指針變量”前的“*”僅是一個(gè)符號(hào),并不是指針運(yùn)算符;“基類型
38、”表示該項(xiàng)指針變量所指向變量的數(shù)據(jù)類型,并非指針變量自身的數(shù)據(jù)類型,因?yàn)樗?指針變量都是地址,所以所有指針變量的類型相同,只是所指向的變量的數(shù)據(jù)類型不同。 例如:char *p 。表示 p 是一個(gè)指針變量,其值是個(gè)整型變量的地址,或者說(shuō) p 指向一個(gè)整型變量。至 于 p 究竟指向哪一個(gè)整型變量,應(yīng)由向p 賦予的地址來(lái)決定。指針也可以指向用戶自定義的數(shù)據(jù)類型變量,如下所示:typedef struct char year 。char moth 。char day 。date 。date *dispaly_date 。一、指針與數(shù)組 數(shù)組的名字后面沒(méi)有加上任何索引值時(shí),就是指向數(shù)組開始位置的地址
39、值,所以數(shù)組 的名字也是指針。范例char filename80 。char *p 。p=filename 。 / 指針 p 存放 filename 的開始地址 反之,指針也可以當(dāng)成數(shù)組來(lái)使用,如下例所示。范例int x5=1,2,3,4,5 。int *p,sum,i。p=x。/指針 p 存放數(shù)組 x 的開始地址for(i=0 。i<5。i+>sum=sum+pi。/pi相當(dāng)于 xi二、指針的運(yùn)算<1)指針變量前面上 * 號(hào)就是取得指針?biāo)赶蛭恢玫膬?nèi)容。范例int x5=1,2,3,4,5。int *p 。p=x。/ 指針 p 存放數(shù)組 x 的開始地址*p=10 。/相當(dāng)于
40、 x0 等于 10<2)變量前面加上&符號(hào),可以取得一個(gè)變量的位置。范例int x,y。int *p。p=&x 。/指針p存放x的地址,相當(dāng)于p是指向x的指針*p=1 。/相當(dāng)于設(shè)置 x 等于 1<3)&符號(hào)也可以加在數(shù)組元數(shù)的前面。范例int x5。int *p 。p=&x2 。 / 指針 p 存放 x2 的地址,相當(dāng)于 p 是指向 x2 的指針*p=50;/ 相當(dāng)于設(shè)置 x2 等于 503.1.5 數(shù)組在本案例中,數(shù)碼管的顯示碼是一組有規(guī)律的同類型數(shù)據(jù),如果定義大量的簡(jiǎn)單變 量,程序?qū)⒆兊梅浅7爆崱榱颂幚矸奖悖?C 語(yǔ)言把具有相同類型的若干變量
41、或常量,用 一個(gè)帶下標(biāo)數(shù)組定義。對(duì)各個(gè)變量的相同操作可以利用循環(huán)改變下標(biāo)值來(lái)進(jìn)行重復(fù)的處 理,使程序變得簡(jiǎn)明清晰。帶下標(biāo)的變量由數(shù)組名稱和用方括號(hào)括起來(lái)的下標(biāo)共同表示, 稱為數(shù)組元素。通過(guò)數(shù)組名和下標(biāo)可直接訪問(wèn)數(shù)組的每個(gè)元素。數(shù)組有兩個(gè)特點(diǎn):一是其 長(zhǎng)度是確定的,在定義的同時(shí)確定了其數(shù)組的大小,在程序中不允許隨機(jī)變動(dòng);二是其元 素必須是相同類型,不允許出現(xiàn)混合類型。一、一維數(shù)組在 C 語(yǔ)言中使用數(shù)組必須先進(jìn)行定義或聲明,一旦定義了一個(gè)數(shù)組,系統(tǒng)就將在內(nèi)存 中為其分配一個(gè)所申請(qǐng)大小的空間,該空間大小固定,以后不能改變。一維數(shù)組的定義格 式為數(shù)據(jù)類型 數(shù)組名常量表達(dá)式;在 C 語(yǔ)方中規(guī)定,一個(gè)數(shù)組
42、的名字表示該數(shù)組在內(nèi)存中所分配的一塊存儲(chǔ)區(qū)域的首地 址,因此,數(shù)組名是一個(gè)地址常量,不允許對(duì)其進(jìn)得修改?!俺A勘磉_(dá)式”表示該數(shù)組擁 有的元素個(gè)數(shù),即定義了數(shù)組的大小,必須是正整數(shù)。例如,以下語(yǔ)句定義了 int 型的長(zhǎng) 度為 10 的一維數(shù)組unsigned char seven_seg10 在定義了一個(gè)數(shù)組后,系統(tǒng)在內(nèi)存在分配一塊連續(xù)的存儲(chǔ)空間用于存儲(chǔ)數(shù)組。一個(gè)數(shù) 組中的元素下標(biāo)必須從 0 開始。所以,定義數(shù)組時(shí),若“常量表達(dá)式”指出數(shù)組長(zhǎng)度為 N,數(shù)組元素下標(biāo)只能從0到n-1。"常量表達(dá)式”能包含常量,但不能包含變量。二、一維數(shù)組元素的引用 在程序中,一維數(shù)組元素可以直接作為變量或
43、常量直接飲用,其的引用格式為數(shù)組名下標(biāo) 其中,“下標(biāo)”可以是整型常量或是整型表達(dá)式。下標(biāo)是數(shù)組元素到數(shù)組開始的偏移量, 第一個(gè)元素的偏移量是0亦稱 0 號(hào)元素),第二個(gè)元素的偏移量是1亦稱 1 號(hào)元素),依此類推。例如,Seven_seg5表示引用數(shù)組seven_seg的下標(biāo)為5的元素,即0x99。三、一維數(shù)組的初始化 每個(gè)數(shù)組元素可以表示一個(gè)變量,對(duì)數(shù)組的賦值也就是對(duì)數(shù)組元素的賦值。在定義數(shù)組的語(yǔ)句中,可以直接為數(shù)組賦值,這稱為數(shù)組的初始化。數(shù)組的初始化方法是將數(shù)組元 素的初值信存放在由大括號(hào)括起來(lái)的初始值表中,每個(gè)初值之間由逗號(hào)隔開。例子:?jiǎn)纹瑱C(jī)內(nèi)部存儲(chǔ)的漢字字庫(kù)uchar code ke
44、ji32= /*- 文字 : 河 -*/*-宋體12。此字體下對(duì)應(yīng)的點(diǎn)陣為:寬x高=16x16 -*/0x20,0x00,0x17,0xFE,0x10,0x08,0x00,0x08,0x88,0x08,0x4B,0xC8,0x52,0x48,0x12,0x48, 0x22,0x48,0x23,0xC8,0xE2,0x48,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x28,0x20,0x10, /*- 文字 : 南 -*/*-宋體12。此字體下對(duì)應(yīng)的點(diǎn)陣為:寬x高=16x16 -*/0x01,0x00,0x01,0x04,0xFF,0xFE,0x01,0x00,0x
45、02,0x00,0x3F,0xFC,0x24,0x24,0x22,0x44, 0x2F,0xF4,0x21,0x04,0x3F,0xFC,0x21,0x04,0x21,0x04,0x21,0x14,0x21,0x08,0x00,0x00, /*- 文字 : 科 -*/*-宋體12。此字體下對(duì)應(yīng)的點(diǎn)陣為:寬x高=16x16 -*/0x06,0x08,0x78,0x88,0x08,0x48,0x08,0x48,0xFE,0x08,0x18,0x88,0x1C,0x48,0x2A,0x48, 0x28,0x0E,0x48,0x78,0x8B,0x88,0x08,0x08,0x08,0x08,0x08
46、,0x08,0x08,0x08,0x08,0x08, /*- 文字 : 技 -*/*-宋體12。此字體下對(duì)應(yīng)的點(diǎn)陣為:寬x高=16x16 -*/0x10,0x20,0x10,0x20,0x10,0x20,0xFD,0xFE,0x10,0x20,0x14,0x20,0x19,0xFC,0x31,0x08, 0xD0,0x88,0x10,0x90,0x10,0x60,0x10,0x60,0x10,0x90,0x11,0x0E,0x56,0x04,0x20,0x00,/*- 文字 : 學(xué) -*/*- 宋體 12。 此字體下對(duì)應(yīng)的點(diǎn)陣為:寬 x 高 =16x16 -*/ 0x01,0x08,0x10,
47、0x8C,0x0C,0xC8,0x08,0x90,0x7F,0xFE,0x40,0x04,0x8F,0xE8,0x00,0x40, 0x00,0x80,0x7F,0xFE,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x02,0x80,0x01,0x00, /*- 文字 : 院 -*/C 語(yǔ)言31.6 函數(shù)調(diào)用與文件包含 按照一定順序把單片機(jī)的程序在一個(gè)函數(shù)或一個(gè)中全部完成,是簡(jiǎn)單的單片機(jī)系統(tǒng)程 序設(shè)計(jì)常用的一種結(jié)構(gòu),當(dāng)程序只有幾十行或幾百行的時(shí)候,采用順序結(jié)構(gòu)編程的方法很 容易讓人看明白。如果一個(gè)程序超過(guò)幾千行的時(shí)候,分析就會(huì)變得很復(fù)雜。單片機(jī) 程序也支持
48、模塊化設(shè)計(jì),在模塊化程序設(shè)計(jì)過(guò)程,經(jīng)常會(huì)用到函數(shù)的調(diào)用、文件的包含問(wèn) 題。 C 語(yǔ)言的模塊化程序設(shè)計(jì)給單片機(jī)編程帶來(lái)很大的方便,在這里以本節(jié)程序?yàn)槔?,?jiǎn) 單介紹在 Keil 軟件中實(shí)現(xiàn)模塊化設(shè)計(jì)常用的技巧。一、自定義函數(shù) 程序中經(jīng)常反復(fù)執(zhí)行的部分可以寫成一個(gè)函數(shù),然后就可以在程序中反復(fù)地調(diào)用。以 下是函數(shù)的一般格式函數(shù)類型函數(shù)名稱 <參數(shù)序列);函數(shù)的主體 其中函數(shù)類型用來(lái)設(shè)置一個(gè)函數(shù)被調(diào)用之后所返回?cái)?shù)值的類型,如果用戶希望寫一個(gè) 不返回任何數(shù)據(jù)的函數(shù)時(shí),可以將函數(shù)類型設(shè)為 void 。(1> 無(wú)返回值函數(shù)本節(jié)案例中 delay< )函數(shù)聲明和調(diào)用情況為 /*/ void d
49、elay (unsigned int x> / 沒(méi)有返回值,有形參 unsigned inti 。unsigned charj。for(i = 0。 i < x。 i+>for (j = 0 。 j = 200。 j+>。void main (void>while (1>delay(1000>。/調(diào)用時(shí)間延遲函數(shù),有實(shí)參/*<2)有返回值函數(shù)如果函數(shù)中要返回?cái)?shù)值時(shí),必須使用 return 命令。并且返回值的類型必須與函數(shù)的類型一致,以下是有返回值函數(shù)的例子 /*/ unsigned char sum(unsigned char a,unsigne
50、d char b> unsigned char x 。check_GLCD_busyflag(> 。 / 函數(shù)中可以調(diào)用另一個(gè)函數(shù)x=a+b。return x 。 /return 會(huì)返回 unsigned char 類型的數(shù)據(jù) /*/一、函數(shù)調(diào)用我們可以把一些具有一定功能的程序打包為一個(gè)個(gè)獨(dú)立的函數(shù),用到此功能時(shí)直接調(diào) 用即可。如在本節(jié)的幾個(gè)程序中,主函數(shù)都調(diào)用了延時(shí)函數(shù)。函數(shù)的調(diào)用是單片機(jī)程序模 塊化設(shè)計(jì)的一個(gè)方法,函數(shù)的調(diào)用讓 C 語(yǔ)言的單片機(jī)程序具有很強(qiáng)的可移植性,同時(shí)也大 大簡(jiǎn)化了程序的結(jié)構(gòu)。函數(shù)調(diào)用比較簡(jiǎn)單,如本例和上一節(jié)的程序中,主函數(shù)中的出現(xiàn)的 delay< )
51、語(yǔ)句就是 一種函數(shù) 調(diào)用 ,當(dāng) 單片機(jī) 運(yùn)行主 函數(shù) 的 delay<1000 )語(yǔ) 句時(shí) , 調(diào)用 延時(shí) 函數(shù) delay (unsigned int x> ,其中 1000 為延時(shí)函數(shù)的實(shí)參, x 為函數(shù)的形參,在還有形參函數(shù)中,實(shí) 參必須與形參類型統(tǒng)一,本例中如果 x 為 char 變量,則程序運(yùn)行中會(huì)出錯(cuò)。另外,為了提 高單片機(jī)程序的可靠性,在函數(shù)調(diào)用時(shí),無(wú)返回值的函數(shù)盡量用 void 聲名,沒(méi)有形參的函 數(shù)也要用 void 聲名。二、文件的包含函數(shù)調(diào)用只能使程序的結(jié)構(gòu)簡(jiǎn),并不能使程序設(shè)計(jì)簡(jiǎn)化。在復(fù)雜的單片機(jī)程序中也常 常用到文件包含和文件關(guān)聯(lián)。本例中程序前面的#inclu
52、d e<reg51.h> 語(yǔ)句是一種文件包含形式。所謂文件包含,是指一個(gè)文件將另外一個(gè)文件的內(nèi)容全部包含進(jìn)來(lái)。 reg51.h 是 Kiel 軟件中定義 51 系列單片機(jī)內(nèi)部資源的頭文件,在編寫單片機(jī)程序時(shí),只要用到 51 單片機(jī) 內(nèi)部資源,程序前面必須把此文件包含進(jìn)來(lái)。復(fù)雜的單片機(jī)系統(tǒng),程序可以有主程序和若干子程序組成,子程序服務(wù)與主程序,并 通過(guò)文件包含與主程序關(guān)聯(lián),文件包含最簡(jiǎn)單應(yīng)用是直接在主程序中包含子程序的 C 語(yǔ)言 文件,也可以把子程序做成頭文件形式被主程序包含。本例程序中,我們可以把延時(shí)函數(shù)在文檔中剪切保存為一個(gè) delay.c 文件,并存放在與 主程序同一個(gè)目中。這
53、個(gè) C 文件內(nèi)容為/*/void delay (unsigned int x>unsigned inti 。unsigned charj。for(i = 0。 i < x。 i+>for (j = 0 。 j = 200。 j+>。/*/在設(shè)計(jì) LED 閃爍程序時(shí)直接包含即可,這樣主程序可以得到簡(jiǎn)化,如:/*/#include<reg51.h> / 包含 51 頭文件#include "delay.c”包含 delay.c 文件 void main (voidunsigned char i。/* 變量 i 作為數(shù)組的 09 編號(hào)while (1>P0 =seven_segi。/*輸出 09 到共陽(yáng)七段顯示器 */delay(1000>。/* 調(diào)用時(shí)間延遲函數(shù) delay<)*/i+;if<i = 10 )i = 0;/*/也可以把 delay.c 文件生成一個(gè) del
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫(yī)藥行業(yè)運(yùn)輸協(xié)議模板
- 體育館裝修終止合同協(xié)議書
- 商業(yè)街區(qū)改造開發(fā)居間合同
- 水上清潔服務(wù)合同范本
- 成品油內(nèi)河運(yùn)輸協(xié)議
- 校園食堂裝修工程合同
- 教室環(huán)保石膏吊頂裝修協(xié)議
- 保健食品居間代理協(xié)議
- 路塹石方爆破施工方案
- 合同范例不需審查
- GB/T 7251.5-2017低壓成套開關(guān)設(shè)備和控制設(shè)備第5部分:公用電網(wǎng)電力配電成套設(shè)備
- 2023年湖南高速鐵路職業(yè)技術(shù)學(xué)院高職單招(數(shù)學(xué))試題庫(kù)含答案解析
- 中考語(yǔ)文非連續(xù)性文本閱讀10篇專項(xiàng)練習(xí)及答案
- 勇者斗惡龍9(DQ9)全任務(wù)攻略
- 經(jīng)顱磁刺激的基礎(chǔ)知識(shí)及臨床應(yīng)用參考教學(xué)課件
- 小學(xué)語(yǔ)文人教四年級(jí)上冊(cè)第四單元群文閱讀“神話故事之人物形象”PPT
- ISO 31000-2018 風(fēng)險(xiǎn)管理標(biāo)準(zhǔn)-中文版
- 油氣藏類型、典型的相圖特征和識(shí)別實(shí)例
- DBJ61_T 179-2021 房屋建筑與市政基礎(chǔ)設(shè)施工程專業(yè)人員配備標(biāo)準(zhǔn)
- 建筑消防設(shè)施基礎(chǔ)知識(shí)PPT通用課件
- 五年級(jí)英語(yǔ)閱讀理解(20篇)
評(píng)論
0/150
提交評(píng)論