第2章 Keil C51程序設(shè)計基礎(chǔ)_第1頁
第2章 Keil C51程序設(shè)計基礎(chǔ)_第2頁
第2章 Keil C51程序設(shè)計基礎(chǔ)_第3頁
第2章 Keil C51程序設(shè)計基礎(chǔ)_第4頁
第2章 Keil C51程序設(shè)計基礎(chǔ)_第5頁
已閱讀5頁,還剩52頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

長安大學(xué)電子與控制工程學(xué)院《微機與單片機系統(tǒng)綜合實驗》課程組2020.06.30微機與單片機系統(tǒng)綜合實驗第2章

C51程序設(shè)計基礎(chǔ)主講人:趙毅長安大學(xué)電控學(xué)院自動化專業(yè)Email:z1@主要內(nèi)容1、Keil

C51系統(tǒng)概述2、Keil

C51軟件開發(fā)結(jié)構(gòu)3、Keil

C51與標(biāo)準(zhǔn)C4、運算符與表達(dá)式5、C51程序的基本語句6、Keil

C51函數(shù)9、C51程序結(jié)構(gòu)及應(yīng)用要點Keil

C51是一種專門為8051核的單片機設(shè)計的高級語言C編譯器,支持符合ANSI標(biāo)準(zhǔn)的C語言,并針對8051核單片機作了一些特殊擴(kuò)展。本章主要介紹C51的基本知識,希望讀者能盡快掌握C51的編程技術(shù)。Keil

C51介紹Keil

C51是美國Keil

Software公司出品的51系列兼容單片機C語言軟件開發(fā)系統(tǒng),與匯編相比,C語言在功能上、結(jié)構(gòu)性、可讀性、可維護(hù)性上有明顯的優(yōu)勢,因而易學(xué)易用。用過匯編語言后再使用C來開發(fā),體會更加深刻。Keil

C51軟件提供豐富的庫函數(shù)和功能強大的集成開發(fā)調(diào)試工具,全Windows界面。另外重要的一點,只要看一下編譯后生成的匯編代碼,就能體會到Keil

C51生成的目標(biāo)代碼效率非常之高,多數(shù)語句生成的匯編代碼很緊湊,容易理解。在開發(fā)大型軟件時更能體現(xiàn)高級語言的優(yōu)勢。2.1

Keil

C51系統(tǒng)概述近期工業(yè)機器人項目中STM32,DSP

5萬行代碼圖2-1

Keil

C51軟件開發(fā)結(jié)構(gòu)框圖2.2 Keil

C51軟件開發(fā)結(jié)構(gòu)uVision與Ishell分別是C51

for

Windows和for

Dos的集成開發(fā)環(huán)境(IDE),可以完成編輯、編譯、連接、調(diào)試、仿真等整個開發(fā)流程(開發(fā)人員可用IDE本身或其它編輯器

編輯C或匯編源文件)。然后分別由C51及A51編譯器編譯生成目標(biāo)文件(OBJ)。目標(biāo)文件可由LIB51創(chuàng)建生成庫文件,也可以與庫文件一起經(jīng)L51連接定位生成絕對目標(biāo)文件(ABS)。ABS文件由OH51轉(zhuǎn)換成標(biāo)準(zhǔn)的Hex文件,以供調(diào)試器dScope51或tScope51使用進(jìn)行源代碼級調(diào)試,也可由仿真器使用直接對目標(biāo)板進(jìn)行調(diào)試,也可以直接寫入程序存貯器如EPROM中。在Keil

C語言的軟件包中,包含下列文件:(1)C51編譯器·

Keil

C51編譯器是一個針對80C51系列MCU的基于ANSI

C標(biāo)準(zhǔn)的C編譯器,生成的可執(zhí)行代碼快速、緊湊,在運行效率和速度上可以和匯編程序得到的代碼相媲美。2.3

Keil

C51與標(biāo)準(zhǔn)C語言深入理解并應(yīng)用C51對標(biāo)準(zhǔn)ANSIC的擴(kuò)展是學(xué)習(xí)C51的關(guān)鍵之一。因為大多數(shù)擴(kuò)展功能都是直接針對8051內(nèi)核的系列CPU硬件。大致有以下8類:8051存儲類型及存儲區(qū)域存儲模式存儲器類型聲明變量類型聲明位變量與位尋址特殊功能寄存器(SFR)C51指針函數(shù)屬性2.3.1

Keil

C51擴(kuò)展關(guān)鍵字idataalienlargereentrantC51

V4.0版本有以下擴(kuò)展關(guān)鍵字_at_

_task_

data

bdataxdata

pdata

sfr

sfr16interrupt

small

compactcode

bit

sbit

using請參考C51關(guān)鍵字表2.3.1

內(nèi)存區(qū)域程序區(qū)域由Code說明可有多達(dá)64kBytes的程序存儲器。內(nèi)部數(shù)據(jù)存儲內(nèi)部數(shù)據(jù)存儲器可用以下關(guān)鍵字說明:data:直接尋址區(qū)(00H~7FH),為內(nèi)部RAM的低128字節(jié)。idata:間接尋址區(qū)(00H~FFH),包括整個內(nèi)部RAM區(qū)。

bdata:可位尋址區(qū)(20H~2FH)外部數(shù)據(jù)存儲外部RAM視使用情況可由以下關(guān)鍵字標(biāo)識:xdata:可指定多達(dá)64KB的外部直接尋址區(qū),地址范圍

0000H~

0FFFFHpdata:能訪問1頁(25bBytes)的外部RAM,主要用于緊湊模式 (Compact

Model)。特殊功能寄存器存儲8051提供128Bytes的SFR尋址區(qū),這區(qū)域可位尋址、字節(jié)尋址或

字尋址,用以控制定時器、計數(shù)器、串口、I/O及其它部件,可由以下幾種關(guān)鍵字說明:sfr:字節(jié)尋址

比如

sfr

P0=0x80;為PO口地址為80H,“=”后 H~FFH之間的常數(shù)。sfr16:字尋址,如sfr16

T2=0xcc;指定Timer2口地址

T2L=0xcc

T2H=0xCDsbit:位尋址,如sbitEA=0xAF;指定第0xAF位為EA即中斷允許。2.3.2

存儲模式存儲模式指定了默認(rèn)的存儲器類型,該類型應(yīng)用于函數(shù)參數(shù)、局部變量和定義時未包含存儲器類型的變量。存儲模式?jīng)Q定了沒有明確指定存儲類型的變量,函數(shù)參數(shù)等的缺省存儲區(qū)域,共三種:Small模式在此模式下所有缺省變量參數(shù)均裝入內(nèi)部RAM,優(yōu)點是訪問速度快,缺點是空間有限,只適用于小程序。Compact模式所有缺省變量均位于外部RAM區(qū)的一頁(256Bytes),具體哪一頁可由P2口指定,在STARTUP.A51文件中說明,也可用pdata指定,優(yōu)點是空間較Small為寬裕速度較Small慢,較

large要快,是一種中間狀態(tài)。large模式所有缺省變量可放在多達(dá)64KB的外部RAM區(qū),優(yōu)點是空間大,可存變量多,缺點是速度較慢。該模式采用數(shù)據(jù)指針DPTR來尋址,訪問的效率很低?!緜渥ⅰ浚?)存儲模式在C51編譯器選項中選擇;(2)盡可能使用小模式,它產(chǎn)生速度快、效率高的代碼。2.3.3

變量或數(shù)據(jù)類型C51提供以下幾種擴(kuò)展數(shù)據(jù)類型:(1)特殊功能寄存器sfrsfr用于聲明字節(jié)型(8位)特殊功能寄存器;sfr16用于聲明字型(16位)特殊功能寄存器。sfr是sfr字節(jié)地址,其取值范圍是0~255。sfr16是sfr字地址,其取值范圍是0~65535。(2)位型bit和sbitbit是定義位變量數(shù)據(jù)類型,其取值為0或1。用于定義定位在內(nèi)部RAM的20H~2FH單元的位變量,位地址范圍是

00~7FH,編譯器對位地址進(jìn)行自動分配。sbit是聲明位變量的數(shù)量類型,其取值為0或1。用于聲明定位在sfr區(qū)域的位變量(或位尋址區(qū)變量的某確定位),編譯器不自動分配位地址。使用時需要注意二者的區(qū)別,例如:bit

flag=0;

//定義flag,位地址由編譯器00~7FH范圍分配,并賦初始值0sbit

var=0xe6;//聲明位變量var的位地址為0xe6,“=”含義是聲明,不表示賦值。其余數(shù)據(jù)類型如:char,short,int,long,float等與

ANSI

C相同,如表2-1所示。數(shù)據(jù)類型位數(shù)取值范圍標(biāo)準(zhǔn)C數(shù)據(jù)類型C51擴(kuò)展數(shù)據(jù)類型字符型整型長整型浮點型signed8-128

~

127unsigned80

~

255signed16-32768

~

32767unsigned160

~

65535signed32-21474883648

~

21474883647unsigned320

~

4294967295float32±1.75494E-38

~

±3.402823E+38IEEE

754(標(biāo)準(zhǔn))SFR型位型sfr80

~

255sfr16160

~

65535bit10,1sbit10,1表2-1

C51常用數(shù)據(jù)類型2.3.4

位變量與聲明bit型變量bit型變量可用變量類型,函數(shù)聲明、函數(shù)返回值等,存貯于內(nèi)部RAM的20H~2FH。注意:用#pragmadisable說明函數(shù)和用“usign”指定的函數(shù)不能返回bit值。一個bit變量不能聲明為指針,如bit

*ptr;錯誤。不能有bit數(shù)組如:bit

arr[5];錯誤??晌粚ぶ穮^(qū)說明20H~2FH可作如下定義:int

bdata

i; char

bdata

arr[3];然后:sbit

bit15

=

i^15;sbit

arr07

=

arr[0]^7;sbit

arr15

=

arr[i]^7;2.程序練習(xí)2.4

運算符與表達(dá)式Keil

C51對數(shù)據(jù)有極強的表達(dá)能力,具有十分豐富的運算符,運算符就完成某種特定運算的符號,表達(dá)式則是由運算符及運算對象所組成的具有特定含義的一個式子。在任意一個表達(dá)式的后面加一個分號“;”就構(gòu)成了一個表達(dá)式語句。由運算符和表達(dá)式可以組成C51程序的各種語句。運算符按其在表達(dá)式中所起的作用,可分為賦值運算符、算術(shù)運算符、增量與減量運算符、關(guān)系運算符、邏輯運算符、位運算符、復(fù)合賦值運算符、逗號運算符、條件運算符、指針和地址運算符、強制類型轉(zhuǎn)換運算符。2.4.1

賦值運算符在C語言程序中,符號“=”稱為賦值運算符,它的作用是將一個數(shù)據(jù)的值賦給一個變量,利用賦值運算符將一個變量與一個表達(dá)式連接起來的式子稱為賦值表達(dá)式,在賦值表達(dá)式的后面加一個分號“;”便構(gòu)成了賦值語句,賦值語句的格式如下:變量=表達(dá)式;該語句的意義是先計算出右邊的表達(dá)式的值,然后將該值賦給左邊的變量。上式中的“表達(dá)式”還可以是一個賦值表達(dá)式,即C語言允許進(jìn)行多重賦值。例如:x=9;x=y=8;/*將常數(shù)9賦給變量x*//*將常數(shù)8同時賦給變量x和y*/在使用賦值運算符“=”應(yīng)注意不要與關(guān)系運算符“==”相混淆。2.4.2

算術(shù)運算符C語言中的算術(shù)運算符有:+(加或取正值)運算符、—(減或取負(fù)值)運算符、*(乘)運算符、/(除)運算符、%(取余)運算符。這些運算符中對于加、減和乘法符合一般的運算規(guī)則,除法有所不同:如果是兩個整數(shù)相除,其結(jié)果為整數(shù),舍去小數(shù)部分;如果兩個浮點數(shù)相除,其結(jié)果為浮點數(shù)。取余運算要求兩個運算對象均為整型數(shù)據(jù)。算術(shù)運算符將運算對象連接起來的式子即為算術(shù)表達(dá)式。算術(shù)運算的一般形式為:表達(dá)式1算術(shù)運算符表達(dá)式2例如:x+y/(a-b),(a+b)*(x-y)都是合法的算術(shù)表達(dá)式。在求一個算術(shù)表達(dá)式的值時,要按運算符的優(yōu)先級別進(jìn)行。算術(shù)運算符中取負(fù)值(-)的優(yōu)先級最高,其次是乘法(*)、除法(/)和取余(%)運算符,加法(+)和減法(—)運算符的優(yōu)先級最低。需要時可在算術(shù)表達(dá)式中采用圓括號來改變運算符的優(yōu)先級,括號的優(yōu)先級最高。2.4.3

增量與減量運算符C語言中除了基本的加、減、乘、除運算之外,還提供兩種特殊的運算符:++(增量)運算符和--(減量)運算符。增量和減量是C51中特有一種運算符,它們的作用分別是對運算對象做加1和減1運算。例如:++i,i++,--

j,j--等。增量運算符和減量運算符只能用于變量,不能用于常數(shù)或表達(dá)式,在使用中要注意運算符的位置。例如,++i與i++的意義完全不同,前者為在使用i之前先對i的值加1,而后者則是在使用i之后再對i的值加1。2.4.4

關(guān)系運算符C語言中有6種關(guān)系運算符:>(大于)、<(小于)、>=(大于等于)、<=(小于等于)、==(等于)、!=(不等于)。前4種關(guān)系運算符具有相同的優(yōu)先級,后兩種關(guān)系運算符也具有相同的優(yōu)先級;但前4種的優(yōu)先級高于后兩種。用關(guān)系運算符將兩個表達(dá)式連接起來即成為關(guān)系表達(dá)式。關(guān)系表達(dá)式的一般形式為:表達(dá)式1關(guān)系運算符表達(dá)式2例如:x>y,x+y>z,(x=3)>(y=4)都是合法的關(guān)系表達(dá)式。關(guān)系運算符通常用來判別某個條件是否滿足,關(guān)系運算的結(jié)果只有0和1兩種值。當(dāng)所指定的條件滿足時結(jié)果為1,條件不滿足時結(jié)果為0。2.4.5

邏輯運算符C語言中有3種邏輯運算符:||(邏輯或)、&&(邏輯與)、?。ㄟ壿嫹牵?。邏輯運算符用來求某個條件式的邏輯值,用邏輯運算符將關(guān)系表達(dá)式或邏輯量連接起來就是邏輯表達(dá)式。邏輯運算的一般形式為:邏輯與邏輯或邏輯非條件式1

&&條件式2條件式1

||條件式2!條件式例如:x&&y,a||b,!z都是合法的邏輯表達(dá)式。進(jìn)行邏輯與運算時,首先對條件式1進(jìn)行判斷,如果結(jié)果為真(非0值),則繼續(xù)對條件式2進(jìn)行判斷,當(dāng)結(jié)果也為真時,表示邏輯運算結(jié)果為真(值為1);反之,如果條件式1的結(jié)果為假,則不再判斷條件式2,而直接給出邏輯運算的結(jié)果為假(值為0)。進(jìn)行邏輯或運算時,只要兩個條件式中有一個為真,邏輯運算的結(jié)果便為真(值為1),只有當(dāng)條件式1和條

件式2均不成立時,邏輯運算的結(jié)果才為假(值為0)。進(jìn)行邏輯非運算時,對條件式的邏輯值直接取反。與關(guān)系運算符類似,邏輯運算符通常用來判別某個邏輯條件是否滿足,邏輯運算的結(jié)果只有0和1兩種值。上面幾種運算符的優(yōu)先級為(由高至低):邏輯非→算術(shù)運算符→關(guān)系運算符→邏輯與→邏輯或。2.4.6

位運算符C能對運算對象進(jìn)行按位操作是C語言的一大特點,使之能對計算機的硬件直接進(jìn)行操作、語言中共有6種位運算符:~(按位取反)《(左移)》(右移)&(按位與)(位異或)|(按位或)位運算的一般形式如下:變量1位運算符變量2位運算符的作用是按位對變量進(jìn)行運算,并不改變參與運算的變量的值。若希望按位改變變量的值,則應(yīng)采用相應(yīng)的賦值運算。另外位運算符不能用來對浮點型數(shù)據(jù)進(jìn)行操作,例如,先用賦值語句a=0xEA;將變量a賦值為0xEA,接著對變量a進(jìn)行移位操作a<<2,其結(jié)果是將十六進(jìn)制數(shù)0xEA左移2位,移空的2位補0,移出的2位丟棄,移位的結(jié)果為0xa8,而變量a的值在執(zhí)行后仍為0xEA。如果希望變量a在執(zhí)行之后為移位操作的結(jié)果,則應(yīng)采用語句為:a=a<<2。位運算符的優(yōu)先級從高到低依次是:按位取反(~)→左移(<<)和右移(>>)→按位與(&)→按位異或(^)→按位或(|)。2.4.7

復(fù)合賦值運算符在賦值運算符“=”的前面加上其他運算符,就構(gòu)成了所謂復(fù)合賦值運算符,C語言中共有10種賦值復(fù)合運算符:+=(加法賦值)、-=(減法賦值)、*=(乘法賦值)、/=(除法賦值)、%=(取模賦值)、<<=(左移位賦值)、>>=(右移位賦值)、&=(邏輯與賦值)、|=(邏輯或賦值)、^=(邏輯異或賦值)、~=(邏輯非賦值)。復(fù)合賦值運算首先對變量進(jìn)行某種運算,然后將運算的結(jié)果再賦值給該變量。復(fù)合運算的一般形式為:變量復(fù)合賦值運算符表達(dá)式例如:a+=3等價于a=a+3;x*=y+8等價于x=x*(y+8)。采用復(fù)合賦值運算符,可以使程序簡化,同時還可以提高程序的編譯效率。2.4.8

條件運算符條件運算符“?:”是C語言中唯一的一個三目運算符,它要求有3個運算對象,用它可以將3個表達(dá)式連接構(gòu)成一個條件表達(dá)式。條件表達(dá)式的一般形式如下:邏輯表達(dá)式?表達(dá)式1:表達(dá)式2其功能是首先計算邏輯表達(dá)式,當(dāng)值為真(非0值)時,將表達(dá)式一的值作為整個條件表達(dá)式的值:當(dāng)邏輯表達(dá)式的值為假(0值)時,將表達(dá)式2的值作為整個表達(dá)式的值。例如,條件表達(dá)式max=(a>b)?a:b的執(zhí)行結(jié)果是將a和b中較大者賦值給變量max。另外,條件表達(dá)式中邏輯表達(dá)式的類型可以與表達(dá)式1和表達(dá)式2的類型不一樣。2.4.9

指針和地址運算符指針是C語言中的最重要的概念,也是最難理解和掌握的。C語言中專門規(guī)定了一種指針類型的數(shù)據(jù)。變量的指針就是該變量的地址,還可以定義一個指向某個變量的指針變量。為了表示指針變量和它所指向的變量地址之間的關(guān)系,C語言提供兩個專門的運算符:*(取內(nèi)容)和&(取地址)。取內(nèi)容和取地址的一般形式為:變量=*指針變量指針變量=&目標(biāo)變量2.4.10

強制類型轉(zhuǎn)換運算符C語言中的圓括號“()”也可作為一種運算符使用,這就是強制類型轉(zhuǎn)換運算符,它的作用是將表達(dá)式或變量的類型強制轉(zhuǎn)換為所指定的類型。在C51程序中進(jìn)行算式運算時需要注意數(shù)據(jù)類型的轉(zhuǎn)換,數(shù)據(jù)類型轉(zhuǎn)換分為隱式轉(zhuǎn)換和顯式轉(zhuǎn)換。隱式轉(zhuǎn)換是在對程序進(jìn)行編譯時由編譯器自動處理的,并且只有幾種數(shù)據(jù)類型(即char、

int、long和float)可以進(jìn)行隱式轉(zhuǎn)換。其他數(shù)據(jù)類型不能進(jìn)行隱式轉(zhuǎn)換。2.4.11

sizeof運算符C語言中提供了一種用于求取數(shù)據(jù)類型、變量及表達(dá)式的字節(jié)數(shù)的運算符:sizeof。該運算符的一般適用形式為:sizeof(表達(dá)式)或sizeof(數(shù)據(jù)類型)應(yīng)該注意的是,sizeof是一種特殊的運算符,不要錯誤地認(rèn)為它是一個函數(shù)。實際上,字節(jié)數(shù)的計算在程序編譯時就完成了,而不是在程序執(zhí)行的過程中才計算出來。2.5

C51程序的基本語句2.5.1表達(dá)式語句C語言提供了十分豐富的程序控制語句,表達(dá)式語句是最基本的一種語句。在表達(dá)式的后邊加一個分號“;”就構(gòu)成了表達(dá)式語句。下面的語句都是合法的表達(dá)式語句:a=++b*9;x=8;y=7;z=(x+y)/a;++i;空語句通常有以下兩種用法。在程序中為有關(guān)語句提供標(biāo)號,用以標(biāo)記程序執(zhí)行的位置。例如,采用下面的語句可以構(gòu)成一個循環(huán)。repeat:;…goto

repeat;在用while語句構(gòu)成的循環(huán)語句后面加一個分號,形成一個不執(zhí)行其他操作的空循環(huán)體。這種空語句在等待某個事件發(fā)生時特別有用。/*插入8051單片機的預(yù)定義文#include<reg51.h>件*/char

_getkey

(){char

c;while(!RI);行c=SBUF;RI=0;Return

(0);}/*函數(shù)定義*//*函數(shù)體開始*//*定義變量*//*空語句,等待8051單片機串口接收結(jié)束*//*讀串行口內(nèi)容*//*清除串行口接收標(biāo)志*//*返回*//*函數(shù)體結(jié)束*/采用分號“;”作為空語句使用時,要注意與簡單語句中有效組成部分的分號相區(qū)別。不能濫用空語句,以免引起程序的誤操作,甚至造成程序語法上的錯誤。復(fù)合語句的一般形式為:{局部變量定義;語句1;語句2;........語句n;}稱為該復(fù)合語句中的局部變量,它僅在當(dāng)前這個復(fù)合語句中有效。2.5.2

條件語句條件語句又稱為分支語句,它是用關(guān)鍵字“if”構(gòu)成的。C語言提供了三種形式的條件語句。if(條件表達(dá)式)語句其含義為:若條件表達(dá)式的結(jié)果為真(非0值),就執(zhí)行后面的語句;反之若條件表達(dá)式的結(jié)果為假(0值),就不執(zhí)行后面的語句。這里的語句也可以是復(fù)合語句。

if(條件表達(dá)式)語句1else語句2其含義為:若條件表達(dá)式的結(jié)果為真(非0值),就執(zhí)行后面的語句;反之若條件表達(dá)式的結(jié)果為假(0值),就執(zhí)行語句2。這里的語句1和語句2均可以是復(fù)合語句。2.5.3

開關(guān)語句開關(guān)語句也是一種用來實現(xiàn)多方向條件分支的語句。雖然采用條件語句也可以實現(xiàn)多方向條件分支,但是當(dāng)分支較多時會使條件語句的嵌套層次太多,程序冗長,可讀性降低。開關(guān)語句直接處理多分支選擇,使程序結(jié)構(gòu)清晰,使用方便。開關(guān)語句是用關(guān)鍵字switch構(gòu)成的,它的一般形式如下:

switch(表達(dá)式){break;break;case常量表達(dá)式1:語句1;case常量表達(dá)式2:語句2;……case常量表達(dá)式n:語句n;break;default: 語句d}2.5.4

開關(guān)語句開關(guān)語句的執(zhí)行過程是將switch后面的表達(dá)式的值與case后面的各個常量表達(dá)式的值逐個進(jìn)行比較,若遇到匹配時,就執(zhí)行相應(yīng)的case后面的語句,然后執(zhí)行break語句,break語句又稱間斷語句,它的功能是終止當(dāng)前的語句執(zhí)行,使程序跳出switch語句。若無匹配的情況,則執(zhí)行語句d。2.5.5

循環(huán)語句實際應(yīng)用中很多地方需要用到循環(huán)控制,如對于某種操作需要反復(fù)進(jìn)行多次等。在需要程序中用來構(gòu)成循環(huán)控制語句的有:while語句,do

while語句,for語句和goto語句。采用while語句構(gòu)成循環(huán)結(jié)構(gòu)的一般形式如下:while(條件表達(dá)式)語句:其意義為,當(dāng)條件表達(dá)式的結(jié)果為真(非0值時),程序就重復(fù)執(zhí)行后面的語句,一直執(zhí)行到條件表達(dá)式的結(jié)果變?yōu)榧?0值)時為止。這種循環(huán)結(jié)構(gòu)是先檢查表達(dá)式所給出的條件,再根據(jù)檢查的結(jié)果決定是否執(zhí)行后面的語句。如果條件表達(dá)式的結(jié)果一開始就為假,則后面的語句一次也不會被執(zhí)行。這里的語句可以是復(fù)合語句。2.5.5

循環(huán)語句采用do-while語句構(gòu)成循環(huán)結(jié)構(gòu)的一般形式如下:do語句while

(條件表達(dá)式);這種循環(huán)結(jié)構(gòu)的特點是先執(zhí)行給定的循環(huán)語句,然后再檢查條件表達(dá)式的結(jié)果。當(dāng)條件表達(dá)式的值為真(非0值)時,則重復(fù)執(zhí)行循環(huán)體語句,直到條件表達(dá)式的值變?yōu)榧贂r為止。因此,用do

while語句構(gòu)成的循環(huán)結(jié)構(gòu)在任何條件下,循環(huán)語句至少會被執(zhí)行一次。采用for語句構(gòu)成循環(huán)語句結(jié)構(gòu)的一般形式如下:for([初值設(shè)定表達(dá)式];[循環(huán)條件表達(dá)式];[更新表達(dá)式])語句for語句的執(zhí)行過程是:先計算出初值設(shè)定表達(dá)式的值,將其作

為循環(huán)控制變量的初值。再檢查循環(huán)條件表達(dá)式的結(jié)果。當(dāng)滿足條件

時就執(zhí)行循環(huán)體語句并計算更新表達(dá)式,然后再根據(jù)更新表達(dá)式的計

算結(jié)果來判斷計算結(jié)果是否滿足......一直進(jìn)行到循環(huán)條件表達(dá)式為假(0值)時退出循環(huán)體。循環(huán)結(jié)構(gòu)中,for語句的使用最為靈活。它不僅可以用于循環(huán)次數(shù)已經(jīng)確定的情況,而且可以用于循環(huán)次數(shù)不確定而只給出循環(huán)結(jié)束條件的情況。另外,for語句中的三個表達(dá)式是相互獨立的,并不一定要求三個表達(dá)式之間有依賴關(guān)系。并且for語句中的三個表達(dá)式都可能是默認(rèn)的,但無論默認(rèn)的哪一個表達(dá)式,其中的兩個分號都不能默認(rèn)。一般不要默認(rèn)的循環(huán)條件表達(dá)式,以免形成死循環(huán)。2.5.5

循環(huán)語句2.5.6

goto、break、continue語句goto語句是一個無條件轉(zhuǎn)向語句,它的一般形式為:goto語句標(biāo)號:其中語句標(biāo)號是一個帶冒號“:”的標(biāo)識符。將goto語句和if語句一起使用,可以構(gòu)成一個循環(huán)結(jié)構(gòu)。但更常見的是在C51程序中采用goto語句來跳出多重循環(huán),需要注意的是只能用goto語句從內(nèi)層循環(huán)到外層循環(huán),而不允許從外層循環(huán)跳到內(nèi)層循環(huán)。break語句也可以用于跳出循環(huán)體,它的一般形式為:break;對于多重循環(huán)的情況,break語句只能跳出它所處的那一層循環(huán),而不像

goto語句可以直接從最內(nèi)層循環(huán)中跳出來。由此可見,要跳出多重循環(huán)時,采用goto語句比較方便。需要指出的是break語句只能用于開關(guān)語句和循環(huán)語句之中,它是一種具有特殊功能的無條件轉(zhuǎn)移語句。continue是一種中斷語句,它的功能是中斷本次循環(huán),它的一般形式為:continue;continue語句通常和條件語句一起用在由while、do-while和for語句構(gòu)成的循環(huán)結(jié)構(gòu)中,它也是一種具有特殊功能的無條件轉(zhuǎn)移語句,但與break語句不同,continue語句并不跳出循環(huán)體,而只是根據(jù)循環(huán)控制條件確定是否繼續(xù)執(zhí)行循環(huán)語句。2023-07-022.5.7

返回語句返回語句用于終止函數(shù)的執(zhí)行,并控制程序返回到調(diào)用函數(shù)時所處的位置。返回語句有兩種形式:return(表達(dá)式)、return。如果return語句后邊帶有表達(dá)式,則要計算表達(dá)式的值,并將表達(dá)式的值作為該函數(shù)的返回值。若使用不帶表達(dá)式的第2種形式,則被調(diào)用函數(shù)返回主調(diào)函數(shù)時,函數(shù)值不確定。一個函數(shù)的內(nèi)部也可以沒有return語句,在這種情況下,當(dāng)程序執(zhí)行到最后一個界限符“}”處時,就自動返回主調(diào)函數(shù)。2023-07-022.6

Keil

C51指針2.6.1

C51指針C51支持一般指針(Generic

Pointer)和存儲器指針(Memory_SpecPointer)。1.一般指針一般指針的聲明和使用均與標(biāo)準(zhǔn)C相同,不過同時還可以說明指針的存儲類型,例如:long*state;為一個指向long型整數(shù)的指針,而state本身則依儲模式存放。char

*

xdata

ptr;ptr為一個指向char數(shù)據(jù)的指針,而ptr本身外部RAM區(qū),以上的long,char等指針指向的數(shù)據(jù)可存放于任何存儲器中。2023-07-022.6

Keil

C51指針2.6.1

C51指針2.存儲器指針基于存儲器的指針說明時即指定了存貯類型,例如:char

data

*

str;str指向data區(qū)中char型數(shù)據(jù)。

int

xdata

*

pow;pow指向外部RAM的int型整數(shù)。這種指針存放時,只需一個字節(jié)或2個字節(jié)就夠了,因為只需存放偏移量。2023-07-022.6.2利用指針實現(xiàn)絕對地址訪問可以利用指針實現(xiàn)絕對地址存儲單元的訪問。例如:unsignedchardata

*p;p

=

0x50;*p

=

0x80;//定義指針p,指向內(nèi)部RAM數(shù)據(jù)//指針p賦值,指向內(nèi)部RAM的0x50單元//數(shù)據(jù)0x80送入內(nèi)部RAM的0x50單元2.7

Keil

C51函數(shù)C51程序由主函數(shù)和若干子函數(shù)構(gòu)成,函數(shù)是構(gòu)成C51程序的基本模塊。C51函數(shù)可分為兩大類,一是系統(tǒng)提供的庫函數(shù),二是用戶自定義的函數(shù)。庫函數(shù)及自定義函數(shù)在被調(diào)用前要進(jìn)行說明。庫函數(shù)的說明由系統(tǒng)提供的若干頭文件分類實現(xiàn),自定義函數(shù)說明由用戶在程序中依規(guī)則完成。C51函數(shù)聲明對ANSI

C作了擴(kuò)展,具體包括:1.中斷函數(shù)聲明中斷聲明方法如下:void

serial_ISR

()

interrupt

4

[using

1]{/*

ISR

*/}2023-07-022.8

C51程序結(jié)構(gòu)及應(yīng)用要點2.8.1

C51程序結(jié)構(gòu)C51程序由函數(shù)構(gòu)成,其中至少應(yīng)包含一個主函數(shù)main。函數(shù)與子程序或過程具有相同的性質(zhì)。程序從主函數(shù)開始執(zhí)行,調(diào)用其他函數(shù)后又返回主函數(shù)。被調(diào)用函數(shù)如果位于主函數(shù)前面,可以直接調(diào)用,否則應(yīng)該先聲明該函數(shù),然后再調(diào)用。被調(diào)用函數(shù)可以是用戶自定義的函數(shù),也可以是C51編

溫馨提示

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

最新文檔

評論

0/150

提交評論