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

下載本文檔

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

文檔簡(jiǎn)介

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

C51程序設(shè)計(jì)基礎(chǔ)主講人:趙毅長(zhǎng)安大學(xué)電控學(xué)院自動(dòng)化專業(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、運(yùn)算符與表達(dá)式5、C51程序的基本語(yǔ)句6、Keil

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

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

C51介紹Keil

C51是美國(guó)Keil

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

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

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

Keil

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

5萬(wàn)行代碼圖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)試、仿真等整個(gè)開發(fā)流程(開發(fā)人員可用IDE本身或其它編輯器

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

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

Keil

C51編譯器是一個(gè)針對(duì)80C51系列MCU的基于ANSI

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

Keil

C51與標(biāo)準(zhǔn)C語(yǔ)言深入理解并應(yīng)用C51對(duì)標(biāo)準(zhǔn)ANSIC的擴(kuò)展是學(xué)習(xí)C51的關(guān)鍵之一。因?yàn)榇蠖鄶?shù)擴(kuò)展功能都是直接針對(duì)8051內(nèi)核的系列CPU硬件。大致有以下8類:8051存儲(chǔ)類型及存儲(chǔ)區(qū)域存儲(chǔ)模式存儲(chǔ)器類型聲明變量類型聲明位變量與位尋址特殊功能寄存器(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請(qǐng)參考C51關(guān)鍵字表2.3.1

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

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

0000H~

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

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

字尋址,用以控制定時(shí)器、計(jì)數(shù)器、串口、I/O及其它部件,可由以下幾種關(guān)鍵字說(shuō)明: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

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

large要快,是一種中間狀態(tài)。large模式所有缺省變量可放在多達(dá)64KB的外部RAM區(qū),優(yōu)點(diǎn)是空間大,可存變量多,缺點(diǎn)是速度較慢。該模式采用數(shù)據(jù)指針DPTR來(lái)尋址,訪問(wèn)的效率很低?!緜渥ⅰ浚?)存儲(chǔ)模式在C51編譯器選項(xiàng)中選擇;(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,編譯器對(duì)位地址進(jìn)行自動(dòng)分配。sbit是聲明位變量的數(shù)量類型,其取值為0或1。用于聲明定位在sfr區(qū)域的位變量(或位尋址區(qū)變量的某確定位),編譯器不自動(dòng)分配位地址。使用時(shí)需要注意二者的區(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ù)類型字符型整型長(zhǎng)整型浮點(diǎn)型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說(shuō)明函數(shù)和用“usign”指定的函數(shù)不能返回bit值。一個(gè)bit變量不能聲明為指針,如bit

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

arr[5];錯(cuò)誤??晌粚ぶ穮^(qū)說(shuō)明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

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

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

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

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

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

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

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

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

&&條件式2條件式1

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

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

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

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

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

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

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

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

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

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

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

_getkey

(){char

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

循環(huán)語(yǔ)句2.5.6

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

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

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

Keil

C51指針2.6.1

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

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

*

xdata

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

Keil

C51指針2.6.1

C51指針2.存儲(chǔ)器指針基于存儲(chǔ)器的指針說(shuō)明時(shí)即指定了存貯類型,例如:char

data

*

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

int

xdata

*

pow;pow指向外部RAM的int型整數(shù)。這種指針存放時(shí),只需一個(gè)字節(jié)或2個(gè)字節(jié)就夠了,因?yàn)橹恍璐娣牌屏俊?023-07-022.6.2利用指針實(shí)現(xiàn)絕對(duì)地址訪問(wèn)可以利用指針實(shí)現(xiàn)絕對(duì)地址存儲(chǔ)單元的訪問(wè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)提供的庫(kù)函數(shù),二是用戶自定義的函數(shù)。庫(kù)函數(shù)及自定義函數(shù)在被調(diào)用前要進(jìn)行說(shuō)明。庫(kù)函數(shù)的說(shuō)明由系統(tǒng)提供的若干頭文件分類實(shí)現(xiàn),自定義函數(shù)說(shuō)明由用戶在程序中依規(guī)則完成。C51函數(shù)聲明對(duì)ANSI

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

serial_ISR

()

interrupt

4

[using

1]{/*

ISR

*/}2023-07-022.8

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

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

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論