《單片機原理、接口與C51應(yīng)用程序設(shè)計》課件第4章_第1頁
《單片機原理、接口與C51應(yīng)用程序設(shè)計》課件第4章_第2頁
《單片機原理、接口與C51應(yīng)用程序設(shè)計》課件第4章_第3頁
《單片機原理、接口與C51應(yīng)用程序設(shè)計》課件第4章_第4頁
《單片機原理、接口與C51應(yīng)用程序設(shè)計》課件第4章_第5頁
已閱讀5頁,還剩69頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第4章C51語言程序設(shè)計4.1概述

4.2C51基本語法

4.3函數(shù)

4.4C51的組合數(shù)據(jù)類型

4.1概述

4.1.1編程語言

常見的編程語言有機器語言、匯編語言和高級語言三種。

(1)機器語言。機器語言就是二進制代碼,如MCS-51中MOV的機器語言為0111,不易被人理解,太難掌握,而且因機器而異,程序不易移植。

(2)匯編語言。給每條機器指令配上一個助記符,如MCS-51中0111的匯編指令為MOV,匯編語言中的語句與機器指令一一對應(yīng)。匯編語言比機器語言容易一些,但仍然很難掌握,而且因機器而異,程序不易移植。

(3)高級語言。與機器語言和匯編語言相比較,高級語言與具體計算機無關(guān),是一種能方便描述算法過程的程序設(shè)計語言。常用的高級編程語言有C、BASIC、PASCAL、FORTRAN等。

4.1.2匯編語言的特點

匯編語言是面向機器的低級語言,通常是為特定的計算機專門設(shè)計的。匯編語言保持了機器語言的優(yōu)點,具有直接和簡捷的特點,可有效地訪問、控制計算機的各種硬件設(shè)備,如磁盤、存儲器、CPU、I/O端口等,目標代碼簡短,占用內(nèi)存少,執(zhí)行速度快,經(jīng)常與高級語言配合使用。4.1.3C語言的特點

C語言是一種高級程序設(shè)計語言,它提供了十分完備的規(guī)范化流程控制結(jié)構(gòu)。C語言可以對硬件進行直接操作,和匯編語言一樣對位、字節(jié)和地址進行操作。與匯編語言相比,C語言程序編寫方便,可讀性強,開發(fā)時間短,方便移植。其缺點是占用CPU資源較多,執(zhí)行效率沒有匯編語言高(低10%~20%),但目前一般都能滿足要求。

不論什么語言最終都要由編譯器(C編譯器、匯編編譯器)翻譯成機器語言,才能由計算機執(zhí)行。目前支持MCS-51系列單片機的C語言編譯器有很多種,如AmericanAutomation、Avocet、BSO/TASKING、DUNFIELDSHAREWARE和KEIL/Franklin等。各種編譯器的基本情況基本相同,但處理細節(jié)各有區(qū)別,本章將以KEIL/Franklin編譯器介紹MCS-51單片機C語言(簡稱C51)程序設(shè)計。

采用C51語言設(shè)計單片機應(yīng)用系統(tǒng)程序時,首先要盡可能地采用結(jié)構(gòu)化的程序設(shè)計方法,這樣可使整個應(yīng)用系統(tǒng)程序結(jié)構(gòu)清晰,易于調(diào)試和維護。對于一個較大的程序,可將整個程序按功能分成若干個模塊,不同的模塊完成不同的功能。對于不同的功能模塊,分別指定相應(yīng)的入口參數(shù)和出口參數(shù),而經(jīng)常使用的一些程序最好編成函數(shù),這樣既不會引起整個程序管理的混亂,還可增強可讀性,移植性也好。 4.2C51基本語法

4.2.1C51基本數(shù)據(jù)類型

1.?char

char類型的變量長度為l字節(jié),即8位,有signedchar和unsignedchar之分。默認的char為無符號型,用于存放一個單字節(jié)的數(shù)據(jù)。signedchar用于定義帶符號的字節(jié)數(shù)據(jù),其最高位為符號位,“0”表示正數(shù),“1”表示負數(shù),表示數(shù)的范圍是-128~+127。unsignedchar用于定義無符號的數(shù)據(jù),表示數(shù)的范圍是0~255。

2.?int

int類型的變量長度為16位,即2字節(jié),有unsignedint和signedint之分。默認的int為無符號型,用于存放一個雙字節(jié)的數(shù)據(jù)。unsignedint表示一個無符號的數(shù),數(shù)的范圍是0~65535;signedint表示一個有符號的雙字節(jié)數(shù)據(jù),其最高位為符號位,“0”表示正數(shù),“1”表示負數(shù),低15位是數(shù)據(jù),表示數(shù)的范圍為-32768~32767。

3.?long

long類型的變量占用4字節(jié),32位,也有unsignedlong和signedlong之分。默認的long為無符號型,用于存放一個4字節(jié)的數(shù)據(jù)。其表示數(shù)的方式與int類似。

4.?float

浮點型變量占4字節(jié),它用符號位表示數(shù)的符號,用階碼和尾數(shù)表示數(shù)的大小。在存儲時其最高位為符號位,“0”表示負數(shù),“1”表示負數(shù),2~9位是階碼,共8位,低23位是尾數(shù)。實際書寫中一般寫成十進制形式。

5.指針型

指針型本身就是一個變量,在這個變量中存放著指向另一個數(shù)據(jù)的地址。這個指針變量要占用一定的內(nèi)存單元,對不同的處理器其長度不一樣,在C51中它的長度一般為1字節(jié)到3字節(jié)。

6.特殊功能寄存器型

MCS-51單片機的內(nèi)部高128字節(jié)內(nèi)離散地分布著專用寄存器區(qū)(SFR)。對SFR的操作,只能采用直接尋址方式。為了能直接訪問這些特殊功能寄存器,C51擴充了兩個數(shù)據(jù)類型:sfr和sfr16。這種定義方法與標準C語言不兼容。sfr用于定義一個單字節(jié)的特殊功能寄存器數(shù)據(jù),而sfr16用于定義一個雙字節(jié)(16bit)的特殊功能寄存器數(shù)據(jù)。在使用特殊功能寄存器時,必須先用sfr或sfr16聲明。sfr和sfr16變量定義的格式為:

sfr特殊功能寄存器名=特殊功能寄存器地址常數(shù);

sfr16特殊功能寄存器名=特殊功能寄存器地址常數(shù);對于MCS-51片內(nèi)I/O口,定義方法如下:

sfrP1=0x90;//定義P1口,地址90H

sfrP2=0xA0;//定義P2口,地址A0H

sfr16用于定義16位特殊功能寄存器,如8052的T2定時器,可以定義為:

sfr16T2=0xCC;//這里定義8052定時器2,地址為 T2L=CCH,T2H=CDH

即用sfr16定義一個16位特殊功能寄存器時,等號后面是它的低位地址,高位地址一定要位于物理低位地址之上,所以sfr16不能用于定時器0和1的定義。

7.位類型

位類型也是C51中擴展的數(shù)據(jù)類型,用于訪問MCS-51單片機中可位尋址的位單元。在C51中有兩種位類型:bit和sbit。它們在內(nèi)存中占1位。其中bit用來定義變化的位地址,定義的自變量可在位尋址區(qū)變化;sbit用來定義絕對地址不變的位地址,即與MCS-51單片機的可位尋址物理位聯(lián)系起來,可位尋址的特殊功能寄存器用sbit定義。sbit定義某些特殊位,并接受任何符號名,“=”號后將絕對地址賦給變量名,這種地址分配有三種方法。

(1)?sbit位變量名?=?位地址。

(2)?sbit位變量名=特殊功能寄存器名^位位置。

(3)?sbit位變量名=字節(jié)地址^位位置。定義位變量時應(yīng)注意以下問題:

(1)位變量不能定義成一個指針,如不能定義bit*aa。

(2)不能定義位數(shù)組,如不能定義bitarray[2]。

(3)?bit與sbit不同,bit不能指定位變量的絕對地址,當需要指定位變量的絕對地址(范圍必須在0x80~0xff)時,需要使用sbit來定義,如sbitflag=P1^0。

(4)變量的存儲類型為bdata時,該變量的某一位可以用sbit來定義,當然也可用bit。

KeilμVision2所能識別的基本數(shù)據(jù)類型如表4.1所示。在標準C語言中基本的數(shù)據(jù)類型還有short、double,而在C51編譯器中int和short相同,float和double相同,這里就不列出說明了。表4.1Keil

Vision2編譯器能識別的基本數(shù)據(jù)類型程序中,若運算對象的數(shù)據(jù)類型不一致,則數(shù)據(jù)類型可以自動進行轉(zhuǎn)換,轉(zhuǎn)換按以下優(yōu)先級別自動進行:

bit→char→int→long→float

unsigned→signed

C51編譯器除了支持自動數(shù)據(jù)類型轉(zhuǎn)換外,還可以通過強制性數(shù)據(jù)類型轉(zhuǎn)換符“()”對數(shù)據(jù)類型進行人為強制轉(zhuǎn)換。在進行復(fù)雜的數(shù)學運算時,特別是當運算表達式左右兩邊的數(shù)據(jù)類型不同時,一定要注意變量的長度變化問題,必要時要進行強制類型轉(zhuǎn)化,以免造成數(shù)據(jù)溢出。4.2.2C51的運算

1.常量

在程序運行中其值不能改變的量稱為常量。C51中支持的常量有下列幾種。

(1)整型常量。整型常量即整型常數(shù),可以表示為十進制,如456、0、-7等,也可以表示成十六進制形式,以0x開頭,如0x36表示十六進制的36H。長整型就是在數(shù)字后面加字母L,如10L、0xF340L等。

(2)浮點型常量。浮點型常量也就是實型常數(shù),有十進制和指數(shù)兩種表示形式。十進制由數(shù)字和小數(shù)點組成,如0.475、23.565等。指數(shù)表示形式為:[±]數(shù)字[.數(shù)字]e[±]數(shù)字。

[?]中的內(nèi)容為可選項,其中的內(nèi)容根據(jù)具體情況可有可無,但其余部分必須有,如123e2、4e5、-1.0e-2,而e5、3e4.0是非法的表示形式。

(3)字符型常量。字符型常量是單引號內(nèi)的字符,如‘a(chǎn)’、‘4’、‘A’等,單引號內(nèi)可以是可顯示的ASCII字符,也可以是轉(zhuǎn)義字符。轉(zhuǎn)移字符用“\”來標示。C51中的轉(zhuǎn)義字符如表4.2所示。表4.2C51中的轉(zhuǎn)義字符

(4)字符串型常量。字符串型常量由雙引號內(nèi)的字符組成,如“hello”、“325”、“and”等。當引號內(nèi)沒有字符時,為空字符串。字符串常量與字符常量不一樣:一個字符常量用一個字節(jié)存放,而一個字符串常量在內(nèi)存中存放時除一個字符占一個字節(jié)外,系統(tǒng)還自動在后面加一個“\0”作為字符串的結(jié)束符。

2.變量

一個變量由變量名和變量值兩部分構(gòu)成。在C51中,變量在使用前必須定義,指出變量的數(shù)據(jù)類型及存儲模式。變量的定義格式為:

[存儲種類]數(shù)據(jù)類型[存儲器類型]變量名1[=初值],變量名2[=初值],…;

(1)存儲種類。存儲種類指變量在程序執(zhí)行中的作用范圍。C51變量的存儲種類有下列4種。

①?auto(自動)。auto(自動)的作用范圍是定義它的函數(shù)體或復(fù)合語句中。存儲種類默認為auto類型,當定義它的函數(shù)和復(fù)合語句執(zhí)行時,C51才為變量分配存儲空間,auto類型的變量一般分配在堆棧中。

②?extern(外部)。在一個函數(shù)體內(nèi)要使用一個已在該函數(shù)體外或別的程序中定義的變量時,該變量用extern類型來說明。外部變量被定義后分配固定的存儲空間,在整個程序執(zhí)行期間都有效。③?static(靜態(tài))。靜態(tài)分為內(nèi)部靜態(tài)(又稱局部靜態(tài))和外部靜態(tài)(又稱全程靜態(tài))。內(nèi)部靜態(tài)是指在函數(shù)體內(nèi)定義的變量,在函數(shù)體內(nèi)有效,體外不可見,與auto變量相比較,其作用域同樣限于定義內(nèi)部靜態(tài)變量的函數(shù)內(nèi)部,但內(nèi)部靜態(tài)變量始終是存在的,其初值只是在進入時賦值一次,退出函數(shù)后變量的值仍然保存,但不能訪問。

【例4.1】內(nèi)部靜態(tài)變量與自動變量的區(qū)別。外部靜態(tài)是指在函數(shù)體外定義的變量,只在定義它的源文件中可見而在其它源文件中不可見的變量。它與全程變量的區(qū)別是:全程變量可以再說明為外部變量(extern),被其它源文件使用,而靜態(tài)全程變量不能再被說明為外部的,即只能被所在的源文件使用。④?register(寄存器)。C51編譯器在編譯時,自動將使用最頻繁的變量存為register(寄存器)類型,用戶無需聲明。該類型的變量存放在CPU內(nèi)的寄存器中,處理速度快,但數(shù)量有限。

(2)數(shù)據(jù)類型。在定義變量時,必須指定數(shù)據(jù)類型,以確定變量在存儲中占用的字節(jié)數(shù)。數(shù)據(jù)類型可以是前述的基本型,也可以是復(fù)合型(后面部分將會講到)。

在編寫程序時,為了書寫和閱讀方便,經(jīng)常使用簡化的縮寫形式或別名來定義變量的數(shù)據(jù)類型。其方法是在源程序開頭使用#define語句或typedef語句,格式如下:

#define別名C51固有名

typedefC51固有名別名

(3)存儲器類型。存儲器類型指變量在單片機硬件系統(tǒng)中所使用的存儲區(qū)域。MCS-51系列單片機在物理上有四個存儲空間:片內(nèi)ROM、片內(nèi)RAM、片外ROM、片外RAM。C51編譯器所能識別的存儲器種類如表4.3所示。

(4)變量名。C51中的變量名可以由字母、數(shù)字和下劃線三種字符組成,且第一個字符必須為字母或下劃線。表4.3C51編譯器所能識別的存儲器種類

3.編譯模式

編譯模式是指對程序編譯時,C51確定參數(shù)及變量的存放位置。不同的編譯模式對變量默認的存儲器類型不同。C51支持的存儲器模式如表4.4所示。表4.4C51支持的存儲器模式

4.絕對地址的訪問

MCS-51單片機編程時,常常需要進行絕對地址(確定地址)的訪問,特別是對硬件操作,如DA、AD、LCD液晶操作以及打印操作等。C51提供了以下三種訪問絕對地址的方法。

(1)絕對宏。C51在“absacc.h”中定義了絕對宏。在程序中,用“#include<absacc.h>”即可使用其中定義的宏來訪問絕對地址,包括CBYTE、DBYTE、PBYTE、XBYTE、CWORD、DWORD、PWORD、XWORD?8個宏定義,其函數(shù)原型如下:4.2.3C51的運算符與表達式

1.賦值運算符“=”

利用賦值運算符將一個變量與一個表達式連接起來的式子稱為賦值表達式,在表達式后面加“;”便構(gòu)成了賦值語句。使用“=”的賦值語句其格式如下:

變量=表達式;

2.算術(shù)運算符及算術(shù)表達式

C51中的算術(shù)運算符有如下幾個,其中只有正值符號和負值符號是單目運算符,其他都是雙目運算符。

(1)?+:加法運算符,也稱正值符號。

(2)?-:減法運算符,也稱負值符號。

(3)?*:乘法運算符。

(4)?/:除法運算符。

(5)?%:模運算符,又稱求余運算符。模運算規(guī)定:運算結(jié)果的符號與被除數(shù)一致。例如,5%3=2,-5%3=-2,5%-3=2。

3.關(guān)系運算

C51中的關(guān)系運算符有下列6個:

(1)<:小于。

(2)>:大于。

(3)<=:小于或等于。

(4)>=:大于或等于。

(5)?==:等于。

(6)?!=:不等于。

其中,前四個具有相同的優(yōu)先級,后兩個也具有相同的優(yōu)先級,但是前四個的優(yōu)先級要高于后兩個。關(guān)系運算符的結(jié)合性為左結(jié)合。關(guān)系表達式通常用來判別某個條件是否滿足。關(guān)系表達式結(jié)構(gòu)如下:

表達式1關(guān)系運算符表達式2

要注意的是,用關(guān)系運算符的運算其結(jié)果只有0和1兩種,也就是邏輯的真與假,當指定的條件滿足時結(jié)果為1,不滿足時結(jié)果為0。

4.邏輯運算

C51提供了三種邏輯運算:邏輯與(&&)、邏輯或(||)、邏輯非(!)。邏輯表達式的一般形式為:

(1)邏輯與:條件式1&&條件式2。

(2)邏輯或:條件式1||條件式2。

(3)邏輯非:!?條件式。

邏輯表達式的運算結(jié)果不是0就是1,不可能是其它值。例如,8&&4=1。

5.位運算

C51對于MCS-51單片機有強大、靈活的位處理能力,也提供了位操作指令。C51中共有6種位運算符:

(1)?&:按位與。

(2)?|:按位或。

(3)?^:按位異或。

(4)?~:按位取反。

(5)?<<:位左移。

(6)?>>:位右移。

位運算符不能對浮點型數(shù)據(jù)進行操作。位運算符的作用是按位對變量進行運算,但是并不改變參與運算的變量的值如果要求按位改變變量的值,則要利用相應(yīng)的賦值運算。位運算符也有優(yōu)先級,從高到低依次是:“|”→“^”→“&”→“>>”→“<<”→“~”。

位左移運算符“<<”和位右移運算符“>>”用來將一個數(shù)的各二進制位全部左移或右移若干位,移位后,空白位補0,而溢出的位舍棄。

6.自增減運算

C51提供了下列4種自增減運算:

(1)?++i; //在使用i之前,先使i值加1

(2)?--i; //在使用i之前,先使i值減1

(3)?i++; //在使用i之后,再使i值加1

(4)?i--; //在使用i之后,再使i值減1

自增運算和自減運算只能用于變量,而不能用于常量表達式。

7.復(fù)合運算

復(fù)合運算就是在賦值運算符“=”的前面加上其它運算符。下列是C51支持的復(fù)合運算:

(1)?+=:加法賦值。

(2)?-=:減法賦值。

(3)?*=:乘法賦值。

(4)?/=:除法賦值。

(5)?&=:邏輯與賦值

(6)?|=:邏輯或賦值。

(7)?^=:邏輯異或賦值。

(8)?~=:邏輯非賦值。

(9)?<<=:左移位賦值。

(10)?>>=:右移位賦值。

(11)?%=:取模賦值。

處理過程是先將變量與后面的表達式進行前面運算賦的運算,然后將運算結(jié)果賦予前面的變量。

8.逗號運算符

逗號運算符“,”將兩個或多個表達式連接起來,形成逗號表達式。逗號表達式的一般形式為:

表達式1,表達式2,表達式3,…,表達式n

逗號運算符組成的表達式在程序運行時從左到右計算出各個表達式的值,而整個用逗號運算符組成的表達式的值等于最右邊表達式的值。

在實際應(yīng)用中,使用逗號表達式只是為了分別得到各個表達式的值,而并不一定要得到和使用整個逗號表達式的值。

并不是在程序的任何位置出現(xiàn)的逗號,都可以認為是逗號運算符。

9.條件運算符

C51支持一個三目運算符,即條件運算符“?:”,它可以把三個表達式連接起來構(gòu)成一個條件表達式。

條件表達式的一般形式如下:

邏輯表達式?表達式1:表達式2

條件運算符的作用是根據(jù)邏輯表達式的值選擇使用表達式的值。

當邏輯表達式的值為真(非0值)時,整個表達式的值為表達式1的值;當邏輯表達式的值為假(值為0)時,整個表達式的值為表達式2的值。

10.指針與地址運算符

C51中提供了專門的指針與地址運算符:

(1)?*:指針運算符。

(2)?&:取地址運算符。

4.2.4C51的輸入/輸出函數(shù)

1.?printf()函數(shù)

printf()函數(shù)的調(diào)用格式為

printf("<格式化字符串>",<參量表>);

其中,格式化字符串包括三部分內(nèi)容:第一部分是需要輸出的正常字符,這些字符將按原樣輸出;第二部分是格式化規(guī)定字符,以“%”開始,后跟一個或幾個規(guī)定字符,用來確定輸出內(nèi)容格式;第三部分是轉(zhuǎn)義字符。有關(guān)轉(zhuǎn)義字符參照表4.2。參量表是需要輸出的一系列參數(shù),其個數(shù)必須與格式化字符串所說明的輸出參數(shù)個數(shù)一樣多,各參數(shù)之間用“,”分開,且順序一一對應(yīng)。

格式化規(guī)定字符如下:

(1)?%d:十進制有符號整數(shù)。

(2)?%u:十進制無符號整數(shù)。

(3)?%f:浮點數(shù)。

(4)?%s:字符串。

(5)?%c:單個字符。

(6)?%p:指針的值。

(7)?%e:指數(shù)形式的浮點數(shù)。

(8)?%x,%X:無符號以十六進制表示的整數(shù)(a~f或A~F)。

(9)?%O:無符號以八進制表示的整數(shù)。

(10)?%g:自動選擇合適的表示法。

可以在“%”和字母之間插進數(shù)字表示最大場寬。例如,“%3d

”表示輸出3位整型數(shù),不夠3位則右對齊;“%9.2f”表示輸出場寬為9的浮點數(shù),其中小數(shù)位為2,整數(shù)位為6,小數(shù)點占一位,不夠9位則右對齊。

還可以在“%”和字母之間加小寫字母“l(fā)”,表示輸出的是長型數(shù)。

2.?scanf()函數(shù)

scanf()函數(shù)從標準輸入設(shè)備(鍵盤)讀取輸入的信息。其調(diào)用格式為

scanf("<格式化字符串>",<地址表>);

其中,格式化字符串與printf()函數(shù)中的格式字符串基本相同;地址表是需要讀入的所有變量的地址,而不是變量本身,這與printf()函數(shù)完全不同,要特別注意。各個變量的地址之間用“,”分開。4.2.5C51程序的基本結(jié)構(gòu)與相關(guān)語句

1.順序結(jié)構(gòu)

順序結(jié)構(gòu)是指程序由低地址向高地址順序執(zhí)行指令代碼,這是一種最基本、最簡單的程序結(jié)構(gòu)。

2.選擇結(jié)構(gòu)

在選擇結(jié)構(gòu)中,程序首先對一個條件語句進行測試,當條件為“真”(True)時,執(zhí)行一個方向上的程序流程,當條件為“假”(False)時,執(zhí)行另一個方向上的程序流程。選擇結(jié)構(gòu)有兩種語句:

(1)?if語句。if語句是一個最基本的條件選擇語句,有下列三種形式:

(2)?switch-case語句。條件語句if-elseif的形式可以從多個選項中確定一個結(jié)果,如果選項的數(shù)目很多,使用起來就很不方便,這種情況下使用switch-case語句來描述則非常簡便。switch-case語句的一般格式為:其語義是計算表達式的值,并逐個與其后的常量表達式值相比較,當表達式的值與某個常量表達式的值相等時,執(zhí)行其后的語句,然后不再進行判斷,繼續(xù)執(zhí)行case語句后面的語句。如果表達式的值與所有case后的常量表達式均不相同,則執(zhí)行default后的語句。case語句中也可以不帶break語句,若不帶,則繼續(xù)執(zhí)行后面的case,直到碰到break或“}”才結(jié)束。各case和default子句的先后順序可以變動,而不會影響程序執(zhí)行結(jié)果。default子句可以省略不用。

3.循環(huán)結(jié)構(gòu)

某一段程序需要重復(fù)執(zhí)行多次時采用循環(huán)結(jié)構(gòu)。C51有while、do-while和for三種循環(huán)語句。

(1)?while語句。while語句為當型循環(huán)結(jié)構(gòu),先判斷條件是否成立,若條件成立則執(zhí)行循環(huán)體。while語句的一般格式為:

while(表達式){語句組;}

其中,表達式是循環(huán)條件,語句組為循環(huán)體。

while語句的語義是:計算表達式的值,當值為真(非0)時,執(zhí)行循環(huán)體語句。

(2)?do-while語句。do-while語句為直到型循環(huán)結(jié)構(gòu),其一般格式為:

do{語句組;}

while(表達式);

其中,語句組是循環(huán)體,表達式是循環(huán)條件。

do-while語句的語義是:先執(zhí)行循環(huán)體語句一次,再判別表達式的值,若為真(非0)則繼續(xù)循環(huán),否則終止循環(huán)(至少要執(zhí)行一次循環(huán)體)。

(3)?for語句。C51中,for語句是使用最靈活、用得最多的循環(huán)語句。for語句的一般格式為:

for(變量賦初值;循環(huán)繼續(xù)條件;循環(huán)變量增值)

{循環(huán)體語句組;}

4.轉(zhuǎn)移語句

C51提供了4種轉(zhuǎn)移語句:goto、break、continue和return。

(1)?goto語句。goto語句為無條件轉(zhuǎn)移語句,一般格式為:

goto語句標號;

在結(jié)構(gòu)化程序設(shè)計中一般不主張使用goto語句,以免造成程序流程的混亂。

(2)?break語句。break語句只能用在switch語句或循環(huán)語句中,其作用是跳出switch語句或跳出本層循環(huán),轉(zhuǎn)去執(zhí)行后面的程序。一般形式為:

break;

(3)?continue語句。continue語句只能用在循環(huán)體中,其一般格式是:

continue;

其語義是:結(jié)束本次循環(huán),即不再執(zhí)行循環(huán)體中continue語句之后的語句,轉(zhuǎn)入下一次循環(huán)條件的判斷與執(zhí)行。應(yīng)注意的是,本語句只結(jié)束本層本次的循環(huán),并不跳出循環(huán)。

(4)?return語句。return語句有兩種形式:

return; //執(zhí)行到函數(shù)的最后一條語句后返回一個不確定值。其用途是立即從所在的函數(shù)中

//退出,返回到調(diào)用它的程序中。

return(表達式);//執(zhí)行到語句return時返回表達式的值。其用途是返回一個值給調(diào)用它的函數(shù)。

常見的形式有如下幾種:

return;不返回值

return();返回隨機數(shù)

return(p);返回變量p的值

return(0);返回0

return(1);返回1

return(表達式);返回表達式的值 4.3函數(shù)

4.3.1函數(shù)的定義

函數(shù)的定義格式如下:

函數(shù)類型

函數(shù)名(形參表)[reentrant][interruptm][usingn]

{

函數(shù)體;

}

1.函數(shù)類型

函數(shù)類型是該函數(shù)返回值的數(shù)據(jù)類型,可以是以前介紹的int、long、char、float以及無值型void,也可以是指針,包括結(jié)構(gòu)指針。無值型表示函數(shù)沒有返回值,程序中一般省略不寫。

2.形參表

形參表是主函數(shù)與被調(diào)用函數(shù)之間進行數(shù)據(jù)傳輸?shù)膮?shù)。對形參的說明可以在函數(shù)名后面,也可以在函數(shù)體前面。若沒有數(shù)據(jù)傳輸,形參可以沒有。

3.?reentrant修飾符

該修飾符用于將函數(shù)定義為可重入,即允許函數(shù)被遞歸調(diào)用(自身調(diào)用自身)。reentrant修飾的重入函數(shù)被調(diào)用時,實參表內(nèi)不允許有bit類型的參數(shù),函數(shù)體內(nèi)不允許存在任何關(guān)于位變量的操作,更不能返回bit類型的值。

4.?interruptm修飾符

interruptm修飾符用于將函數(shù)定義為中斷函數(shù)。其中,m的取值為0~31,含義如下(其它位保留):0表示外部中斷0;1表示定時器/計數(shù)器T0;2表示外部中斷1;3表示定時器/計數(shù)器T1;4表示串口中斷;5表示定時器/計數(shù)器T2。

在編寫中斷函數(shù)時需要注意下列幾點:

(1)中斷函數(shù)不能進行參數(shù)傳遞。

(2)中斷函數(shù)無返回值,一般定義為void型。

(3)任何情況下不能直接調(diào)用中斷函數(shù),因為中斷函數(shù)的返回由RETI完成,且RETI影響單片機的硬件。

(4)若中斷函數(shù)中調(diào)用了其它函數(shù),則被調(diào)用的函數(shù)使用的寄存器與中斷函數(shù)使用的寄存器相同。

(5)?C51在編譯時會自動對中斷函數(shù)進行入棧、出棧處理,用戶不必操心。

(6)中斷函數(shù)最好寫在文件的尾部,并禁止使用extern存儲類型,以防止其它程序調(diào)用。

5.?usingn修飾符

usingn修飾符用于指定在本函數(shù)內(nèi)部所使用的工作寄存器組,n=0~3。usingn不能用于有返回值的函數(shù)。

4.3.2函數(shù)的聲明

C51中使用的函數(shù)必須是已經(jīng)存在的,要么是自定義的,要么是庫函數(shù)。庫函數(shù)在使用時用#include<>預(yù)處理命令就可以,自定義函數(shù)要作適當處理。

C51程序中,若函數(shù)的調(diào)用在定義之后,則函數(shù)在調(diào)用之前可以不說明(一般還是要聲明);若函數(shù)的調(diào)用在定義之前,或被調(diào)用的函數(shù)不在本文件內(nèi)部,而是在另一個文件之中,則函數(shù)在調(diào)用之前必須聲明,以便系統(tǒng)在編譯時分配合適的存儲空間。

函數(shù)聲明的格式為:

[extern]函數(shù)類型函數(shù)名(形參表);

不帶extern說明被聲明的函數(shù)在本文件之中,帶extern說明聲明的函數(shù)不在本文件之中。函數(shù)聲明與函數(shù)定義的區(qū)別是結(jié)尾帶“;”。4.3.3函數(shù)的調(diào)用

C51調(diào)用函數(shù)時直接使用函數(shù)名和實參的方法,也就是把要賦給被調(diào)用函數(shù)的參量,按該函數(shù)說明的參數(shù)形式傳遞過去,然后進入子函數(shù)運行,運行結(jié)束后再按子函數(shù)規(guī)定的數(shù)據(jù)類型返回一個值給調(diào)用函數(shù)。函數(shù)調(diào)用的格式為:

函數(shù)名(實參表);

對于沒有形參的函數(shù),在調(diào)用時沒有實參表

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論