單片機C51語言及程序設(shè)計_第1頁
單片機C51語言及程序設(shè)計_第2頁
單片機C51語言及程序設(shè)計_第3頁
單片機C51語言及程序設(shè)計_第4頁
單片機C51語言及程序設(shè)計_第5頁
已閱讀5頁,還剩74頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

單片機C51語言基礎(chǔ)

及C51程序設(shè)計

2021/5/91主要內(nèi)容:C51語言概述C51的標識符與關(guān)鍵字C51的變量及數(shù)據(jù)類型C51的運算符及表達式C51的程序結(jié)構(gòu)C51開發(fā)環(huán)境C51編程實例2021/5/92一、C51語言概述單片機C51語言是ANSIC的擴展。C51語言除了具有C語言的優(yōu)點外,同時具有匯編語言的硬件操作能力。運行于單片機平臺,支持的微處理器種類繁多,可移植性好。對于兼容的8051系列單片機,只要將一個硬件型號下的程序稍加修改,甚至不加改變,就可移植到另一個不同型號的單片機中運行。具有高級語言的特點,盡量減少底層硬件寄存器的操作。單片機C51語言提供了完備的數(shù)據(jù)類型、運算符及函數(shù)供使用。C51語言代碼執(zhí)行的效率方面十分接近匯編語言,且比匯編語言的程序易于理解,便于代碼共享。2021/5/93二、C51的標識符與關(guān)鍵字標識符即特定的字符或字符串,用來給變量、函數(shù)、符號常量、自定義類型等命名。用標識符給C語言程序中各種對象命名時,要用字母、下劃線和數(shù)字組成的字符序列,并要求首字符是字母或下劃線,不能是數(shù)字。字母的大小寫是有區(qū)別的。通常下劃線開頭的標識符是編譯系統(tǒng)專用的,因此在編寫C語言源程序時一般不使用以下劃線開頭的標識符,而將下劃線用作分段符。C51編譯器規(guī)定標識符最長可達255個字符,但只有前32個字符在編譯時有效,因此標識符的長度一般不要超過32個字符。關(guān)鍵字是一種已被系統(tǒng)使用過的具有特定含義的標識符。用戶不得再用關(guān)鍵字給變量等命名。C語言關(guān)鍵字較少,ANSIC標準一共規(guī)定了32個關(guān)鍵字,見表2021/5/94關(guān)鍵字用途說明auto存儲種類說明用以說明局部變量,缺省值為此break程序語句退出最內(nèi)層循環(huán)case程序語句Switch語句中的選擇項char數(shù)據(jù)類型說明單字節(jié)整型數(shù)或字符型數(shù)據(jù)const存儲種類說明在程序執(zhí)行過程中不可更改的常量值continue程序語句轉(zhuǎn)向下一次循環(huán)default程序語句Switch語句中的失敗選擇項do程序語句構(gòu)成do…while循環(huán)結(jié)構(gòu)double數(shù)據(jù)類型說明雙精度浮點數(shù)else程序語句構(gòu)成if…else選擇結(jié)構(gòu)enum數(shù)據(jù)類型說明枚舉類型extern存儲種類說明在其他程序模塊中說明了的全局變量float數(shù)據(jù)類型說明單精度浮點數(shù)for程序語句構(gòu)成for循環(huán)結(jié)構(gòu)goto程序語句構(gòu)成goto轉(zhuǎn)移結(jié)構(gòu)ANSIC語言的關(guān)鍵字2021/5/95if程序語句構(gòu)成if…else選擇結(jié)構(gòu)int數(shù)據(jù)類型說明基本整型數(shù)long數(shù)據(jù)類型說明長整型數(shù)register存儲種類說明使用CPU內(nèi)部寄存器的變量return程序語句函數(shù)返回short數(shù)據(jù)類型說明短整型數(shù)signed數(shù)據(jù)類型說明有符號數(shù),二進制數(shù)據(jù)的最高位為符號位sizeof運算符計算表達式或數(shù)據(jù)類型的字節(jié)數(shù)static存儲種類說明靜態(tài)變量struct數(shù)據(jù)類型說明結(jié)構(gòu)類型數(shù)據(jù)switch程序語句構(gòu)成Switch選擇結(jié)構(gòu)typedef數(shù)據(jù)類型說明重新進行數(shù)據(jù)類型定義union數(shù)據(jù)類型說明聯(lián)合類型數(shù)據(jù)unsigned數(shù)據(jù)類型說明無符號數(shù)數(shù)據(jù)void數(shù)據(jù)類型說明無類型數(shù)據(jù)volatile數(shù)據(jù)類型說明該變量在程序執(zhí)行中可被隱含地改變while程序語句構(gòu)成while和do…while循環(huán)結(jié)構(gòu)2021/5/96KeilC51編譯器除了有ANSIC標準的32個關(guān)鍵字外,還根據(jù)51單片機的特點擴展了相應(yīng)的關(guān)鍵字。在KeilC51開發(fā)環(huán)境的文本編輯器中編寫C程序,系統(tǒng)可以把保留字以不同的顏色顯示,缺省顏色為藍色。下表為KeilC51編譯器擴展的關(guān)鍵字。關(guān)鍵字用途說明bit位標量聲明聲明一個位標量或位類型的函數(shù)sbit位變量聲明聲明一個可位尋址變量sfr特殊功能寄存器聲明聲明一個特殊功能寄存器(8位)sfr16特殊功能寄存器聲明聲明一個16位的特殊功能寄存器data存儲器類型說明直接尋址的8051內(nèi)部數(shù)據(jù)存儲器bdata存儲器類型說明可位尋址的8051內(nèi)部數(shù)據(jù)存儲器idata存儲器類型說明間接尋址的8051內(nèi)部數(shù)據(jù)存儲器pdata存儲器類型說明“分頁”尋址的8051外部數(shù)據(jù)存儲器xdata存儲器類型說明8051外部數(shù)據(jù)存儲器code存儲器類型說明8051程序存儲器interrupt中斷函數(shù)聲明定義一個中斷函數(shù)reentrant再入函數(shù)聲明定義一個再入函數(shù)using寄存器組定義定義8051的工作寄存器組2021/5/971.C51的變量

在程序執(zhí)行過程中,數(shù)值可以發(fā)生改變的量稱為變量。變量名與存儲單元地址相對應(yīng),變量值與存儲單元的內(nèi)容相對應(yīng)。例如三、C51的變量及數(shù)據(jù)類型2021/5/98【存儲類別】

數(shù)據(jù)類型

【存儲器類型】

變量名(標準C)(標準C)*括號項——可以缺省(但需有缺省值)C51變量定義的四要素:(C51特有)(標準C+C51)2021/5/99【存儲類別】

數(shù)據(jù)類型

【存儲器類型】

變量名共有四個說明符:1、auto(自動型)——變量的作用范圍在定義它的函數(shù)體或語句塊內(nèi)。執(zhí)行結(jié)束后,變量所占內(nèi)存即被釋放。2、extern(外部型)——在一個源文件中被定義為外部型的變量,在其它源文件中需要通過extern說明方可使用。3、static(靜態(tài)型)——利用static可使變量定義所在的函數(shù)或語句塊執(zhí)行結(jié)束后,其分配的內(nèi)存單元繼續(xù)保留。4、register(寄存器型)——將變量對應(yīng)的儲存單元指定為通用寄存器,以提高程序運行速度。缺省存儲種類為auto(自動)型變量2021/5/910數(shù)據(jù)的不同格式叫做數(shù)據(jù)類型*有符號數(shù)類型可以忽略signed標識符標準C語言的數(shù)據(jù)類型【存儲類別】

數(shù)據(jù)類型

【存儲器類型】

變量名2021/5/911C51擴充數(shù)據(jù)類型:bit、sfr或sfr16、sbitbit型關(guān)鍵詞bit用于定義一個位變量,語法規(guī)則:bitbit_name

[=0或1];例如:bitdoor=0;//定義一個叫door的位變量且初值為0標準C的變量定義舉例:

inta=5; //定義一個初值為5的整形變量a

語法規(guī)則:intint_name[=常數(shù)];

注意:上述變量的物理地址是由編譯器分配的2021/5/912sfr或sfr16型關(guān)鍵詞sfr或sfr16用于定義SFR字節(jié)地址變量,語法規(guī)則:

sfr

sfr16sfr_name=

字節(jié)地址常數(shù);51MCU中有21個SFR,如何定義與這些單元相關(guān)的變量?2021/5/913例如,sfrP0=0x80;//定義P0口地址80H

sfrPCON=0x87;//定義PCON地址87H

sfr16DPTR=0x82;//定義DPTR的低端地址82H注意:SFR字節(jié)地址變量的物理地址是由MCU資源決定的2021/5/914sbit型部分SFR具有位地址,如何定義與這些位地址相關(guān)的變量?CYACF0RS1RS0OVF1PCYACF0RS1RS0OVF1PCYACF0RS1RS0OVF1PCYACF0RS1RS0OVF1PD0^7

D7HD6HD5HD4HD3HD2HD1HD0HD0HPSWD0^6

D0^5

D0^4

D0^3

D0^2

D0^1

D0^0

絕對位地址相對位地址字節(jié)地址兩種位地址表達形式:絕對位地址、相對位地址2021/5/9151)將SFR的絕對位地址定義為位變量名

sbit

bit_name=

位地址常數(shù);例如,sbitCY=0xD7;3)將SFR的相對位位置定義位變量名

sbitbit_name=

sfr_name

^

位位置;例如,sbitCY=PSW^7;2)將SFR的相對位地址定義為位變量名

sbit

bit_name=

sfr字節(jié)地址

^

位位置;例如,sbitCY=0xD0^7;關(guān)鍵詞sbit用于定義SFR位地址變量,三種定義形式:2021/5/916C51編譯器在頭文件“REG51.H”中定義了全部sfr/sfr16和sbit變量。用一條預(yù)處理命令#include<REG51.H>把這個頭文件包含到C51程序中,無需重新定義即可直接使用它們的名稱。2021/5/917應(yīng)用舉例:2021/5/918【存儲類別】

數(shù)據(jù)類型

【存儲器類型】

變量名51單片機的三個邏輯存儲空間:片內(nèi)數(shù)據(jù)存儲器,片外數(shù)據(jù)存儲器和程序存儲器。2021/5/919建立C51存儲類型與存儲空間的對應(yīng)關(guān)系data區(qū)code區(qū)xdata區(qū)bdata區(qū)pdata區(qū)idata區(qū)2021/5/920C51的存儲類型與存儲空間對應(yīng)關(guān)系表

SMALL系統(tǒng)COMPACT系統(tǒng)LARGE系統(tǒng)編譯模式2021/5/921三種編譯模式分別對應(yīng)于三種缺省存儲類型:【存儲類別】

數(shù)據(jù)類型

【存儲器類型】

變量名C51編譯器可根據(jù)當前采取的編譯模式自動認定默認的存儲類型約定:若無特殊聲明,一般均為“SMALL編譯模式”2021/5/922變量名可以由字母、數(shù)字和下劃線三種字符組成,且第一個字符必須為字母或下劃線,變量名長度隨編譯系統(tǒng)而定。變量名具有字母大小寫的敏感性,如SUM和sum代表不同的變量?!敬鎯︻悇e】

數(shù)據(jù)類型

【存儲器類型】

變量名變量名不得使用標準C語言和C51語言的關(guān)鍵字。2021/5/923unsignedchardatasystem_status=0;

//定義system_status為無符號字符型自動變量,該變量位于data區(qū)中且初值為0。變量定義舉例變量名為system_status位于片內(nèi)RAM區(qū)無符號字符型自動型初值為零2021/5/924unsignedcharbdatastatus_byte;

unsignedintcodeunit_id[2]={0x1234,0x89ab};

staticcharm,n;

//定義status_byte為無符號字符型自動變量,該變量位于bdata區(qū)//定義unit_id[2]為無符號整型自動變量,該變量位于code區(qū)中,是長度為2的數(shù)組,且初值為0x1234和0x89ab。//定義m和n為2個位于data區(qū)中的有符號字符型靜態(tài)變量。2021/5/9252.C51的指針

定義了一個指向由“數(shù)據(jù)類型”說明的變量的指針變量;被指向變量和指針變量位于C編譯器默認的內(nèi)存區(qū)域中。標準C語言指針的一般定義形式為:數(shù)據(jù)類型*指針變量名;例如:inta=’A’;int*p1=&a;表示:p1是一個指向int型變量的指針變量p1的值是int型變量a的地址a和p1兩個變量都位于C編譯器默認的內(nèi)存區(qū)域中2021/5/926在C51里定義指針,需要額外說明兩個問題:

1)指針變量自身位于哪個存儲區(qū)域?2)被指向變量位于哪個存儲區(qū)中?C51指針的一般定義形式:

數(shù)據(jù)類型【存儲類型1】*【存儲類型2】

指針變量名;數(shù)據(jù)類型——被指向變量的數(shù)據(jù)類型,不能缺省存儲類型1——被指向變量所在的存儲區(qū)類型,缺省時根據(jù)該變量的定義語句確定存儲類型2——指針變量所在的存儲區(qū)類型,缺省時根據(jù)C51編譯模式的默認值確定指針變量名——按C51變量名的規(guī)則選取2021/5/927例1charxdataa=‘A’;char*ptr=&a;舉例說明C51指針定義的用法(SMALL編譯模式下)【解】ptr是一個指向char型變量的指針變量;它本身位于SMALL編譯模式默認的data存儲區(qū)里;它的值是位于xdata存儲區(qū)里的char型變量a的地址;“存儲類型1”缺省時,靠被指向變量的定義確定存儲類型。數(shù)據(jù)類型【存儲類型1】*【存儲類型2】

指針變量名;2021/5/928例2charxdataa=‘A’;char*ptr=&a;charidatab=‘B’;*ptr=&b;【解】Ptr先指向位于xdata存儲區(qū)的char型變量a,后指向位于idata存儲區(qū)的char型變量b;“存儲類型1”缺省時,ptr指針具有一定隨意性。數(shù)據(jù)類型【存儲類型1】*【存儲類型2】

指針變量名;2021/5/929例3charxdataa=‘A’;charxdata*ptr=&a;【解】a是位于xdata存儲區(qū)里的char型變量;ptr是固定指向xdata存儲區(qū)中char型變量的指針變量;“存儲類型1”存在時,ptr指針具有固定指向性。數(shù)據(jù)類型【存儲類型1】*【存儲類型2】

指針變量名;2021/5/930例4charxdataa=‘A’;charxdata*idataptr=&a;【解】ptr是固定指向xdata存儲區(qū)的char型變量的指針變量;它自身存放在idata存儲區(qū)中;“存儲類型2”存在時,ptr

指針具有明確的存儲區(qū)域。數(shù)據(jù)類型【存儲類型1】*【存儲類型2】

指針變量名;2021/5/931四、C51的運算符及表達式1算術(shù)運算符和算術(shù)表達式(1)、基本算術(shù)運算符+加法運算符,或正值符號;-減法運算符,或負值符號;

×乘法運算符;/除法運算符;

%模(求余)運算符;例11%3=2,結(jié)果是11除以3所得余數(shù)為2。在上述運算符中,加、減和乘法符合一般的算術(shù)運算規(guī)則。除法運算時,如果是兩個整數(shù)相除,其結(jié)果為整數(shù);如果是兩個浮點數(shù)相除,其結(jié)果為浮點數(shù)。而對于取余運算,則要求兩個運算對象均為整型數(shù)據(jù)。2021/5/932C語言規(guī)定了算術(shù)運算符的優(yōu)先級和結(jié)合性。

優(yōu)先級---指當運算對象兩側(cè)都有運算符時,執(zhí)行運算的先后次序。按運算符優(yōu)先級別的高低順序執(zhí)行運算。

結(jié)合性---指當一個運算對象兩側(cè)的運算符優(yōu)先級別相同時的運算順序。算術(shù)運算符中取負運算的優(yōu)先級最高,其次是乘法、除法和取余,加法和減法的優(yōu)先級最低。也可以根據(jù)需要,在算術(shù)表達式采用括號來改變優(yōu)先級的順序。如:a+b/c;該表達式中,除號優(yōu)先級高于加號,故先運算b/c所得結(jié)果,之后再與a相加。(a+b)*(c-d)-e;該表達式中,括號優(yōu)先級最高,其次是“*”,最后是減號。故先運算(a+b)和(c-d),然后再將二者結(jié)果相乘,最后與e相減。2021/5/933(2)、自增減運算符自增減運算符的作用是使變量值自動加1或減1。

++自增運算符;

--自減運算符;

++和--運算符只能用于變量,不能用于常量和表達式。如++(a+1)是錯誤的。如:++i、--i在使用i之前,先使i值加(減)1。

i++、i--在使用i之后,再使i值加(減)1。粗略的看,++i和i++的作用都相當于i=i+1,但++i和i++的不同之處在于++i先執(zhí)行i=i+1,再使用i的值;而i++則是先使用i的值,再執(zhí)行i=i+1。如:若i值原來為5.則

j=++i;j的值為6,i的值也為6;

j=i++;j的值為5,i的值為6;2021/5/934(3)、類型轉(zhuǎn)換運算符兩側(cè)的數(shù)據(jù)類型不同時,要轉(zhuǎn)換成同種類型。轉(zhuǎn)換的方法有兩種,一是自動轉(zhuǎn)換,是編譯系統(tǒng)在編譯時自動進行的類型轉(zhuǎn)換,順序是:

bit→char→int→long→float,signed→unsigned。二是強制類型轉(zhuǎn)換,是通過類型轉(zhuǎn)換運算來實現(xiàn)的。其一般形式:(類型說明符)(表達式)

功能:把表達式的運算結(jié)果強制轉(zhuǎn)換成類型說明符所表示的類型。如:(double)a將a強制轉(zhuǎn)換成double類型(int)(x+y)將x+y值強制轉(zhuǎn)換成int類型

(float)(5%3)將模運算5%3的值強制轉(zhuǎn)換成float類型。2021/5/9352關(guān)系運算符、關(guān)系表達式及優(yōu)先級(1)、C51提供六種關(guān)系運算符﹤小于;﹤=小于等于;﹥大于;﹥=大于等于==測試等于;==!=測試不等于;(2)、關(guān)系運算符的優(yōu)先級

1)<、>、<=、>=的優(yōu)先級相同,兩種==、==相同;前4種優(yōu)先級高于后兩種。2)關(guān)系運算符的優(yōu)先級低于算術(shù)運算符。3)關(guān)系運算符的優(yōu)先級高于賦值運算符。如:c>a+b等效于c>(a+b);a>b!=c等效于(a>b)!=c

a=b>c等效于a=(b>c)

(3)、關(guān)系運算符的結(jié)合性為左結(jié)合如:a=4,b=3,c=1,則f=a>b>c,則a>b的值為1,1>c的值為0,故f=0。

(4)、關(guān)系表達式用關(guān)系運算符和將兩個表達式(可以是算術(shù)表達式、關(guān)系表達式、邏輯表達式、字符表達式)連接起來的式子。

(5)、關(guān)系表達式的結(jié)果真和假。C51中用0表示假,1表示真。2021/5/9363邏輯運算符和邏輯表達式及優(yōu)先級(1)、C51提供3種邏輯運算符!邏輯“非”(NOT)

&&邏輯“與”(AND)

||邏輯“或”(OR)“&&”和“||”是雙目運算符,要求有兩個運算對象;而“!”是單目運算符,只要求有一個運算對象。(2)、邏輯運算符的優(yōu)先級在邏輯運算中,邏輯非的優(yōu)先級最高,且高于算術(shù)運算符;邏輯或的優(yōu)先級最低,低于關(guān)系運算符,但高于賦值運算符。(3)、邏輯表達式用邏輯運算符將關(guān)系表達式或邏輯量連接起來的式子稱為邏輯表達式。其值應(yīng)為邏輯量真和假,邏輯表達式和關(guān)系表達式的值相同,以0代表假,1代表真。

(4)、邏輯運算符的結(jié)合性為從左到右。例:如a=4,b=5則:

!a為假。因為a=4(非0)為真,所以!a為假(0)。

a||b為真。因為a,b為真,所以兩者相或為真。

a&&b為真。

!a&&b為假(0)。!優(yōu)先級高于&&,先執(zhí)行!a為假(0),0&&b=0,結(jié)果為假。2021/5/9374C51位操作及其表達式

C51提供6種位運算符:

&位與;

|位或;

^位異或;

~位取反;

<<左移;

>>右移;除按位取反運算符“~”以外,以上位操作運算符都是雙目運算符,及要求運算符兩側(cè)各有一個運算對象。(1)、“按位與”運算符“&”

運算規(guī)則:參與運算的兩個運算對象,若兩者相應(yīng)的位都為1,則該位結(jié)果為1,否則為0,即:0&0=0、0&1=0、1&0=0、1&1=0

如:a=45h=01000101b,b=0deh=11011110b,則表達式c=a&b=44h

按位與的主要用途:

1)清零。用0去和需要清零的位按位與運算。

2)取指定位。2021/5/938

(2)、“按位或”運算符“|”

運算規(guī)則:參與運算的兩個運算對象,若兩者相應(yīng)的位中有一位為1,則該位結(jié)果為1,否則為0,即:0|0=0、0|1=1、1|0=1、1|1=1

如:a=30h=00110000b,b=0fh=00001111b,則表達式c=a|b=3fh

按位或的主要用途是將一個數(shù)的某些位置1,則需要將這些位和1按位或,其余的位和0進行按位或運算則不變。

(3)、“異或”運算符“^”

運算規(guī)則:參與運算的兩個運算對象,若兩者相應(yīng)的位相同,則結(jié)果為0;若兩則相應(yīng)的位相異,結(jié)果為1,即:0^0=0、0^1=1、1^0=1、1^1=0

如:a=0a5h,b=3dh,則表達式c=a^b=98h

按位異或的主要用途:

1)使特定位翻轉(zhuǎn)(0變1,1變0):需要翻轉(zhuǎn)的位和1按位異或運算,不需要翻轉(zhuǎn)的位和0按位異或運算。原數(shù)和自身按位異或后得0。

2)不用臨時變量而交換兩數(shù)的值。(4)、“位取反”運算符“~”“~”是一個單目運算符,用來對一個二進制數(shù)按位取反,即0變1,1變0。(5)、位左移和位右移運算符(<<,>>)位左移、位右移運算符“<<”和“>>”,用來將一個二進制位的全部左移或右移若干位;移位后,空白位補0,而溢出的位舍棄。

如:a=15h,則a=a<<2=54h;a=a>>2=05h2021/5/9396、賦值和復合賦值運算符

符號“=”稱為賦值運算符,其作用是將一個數(shù)據(jù)的值賦予一個變量。賦值表達式的值就是被賦值變量的值。在賦值運算符的前面加上其他運算符就可以構(gòu)成復合賦值運算符。在C51中共有10種復合運算符,這10種賦值運算符均為雙目運算符。即:

+=,-=,*=,/=,%=,<<=,>>=,&=,|=,^=,~=。采用這種復合賦值運算的目的,是為了簡化程序,提高C程序編譯效率。如:

a+=b相當于a=a+ba%=b相當于a=a%ba-=b相當于a=a-ba<<=3相當于a=a<<3a*=b相當于a=a*ba>>=2相當于a=a>>2a/=b相當于a=a/b……等等。

7、其他運算符(共有10個)

[]:數(shù)組的下標。

():括號。

.:結(jié)構(gòu)/聯(lián)合變量指針成員。

&:取內(nèi)容。?:三目運算符。,:逗號運算符。

Sizeof:sizeof運算符用于在程序中測試某一數(shù)據(jù)類型占用多少字節(jié)。2021/5/940五、C51的程序結(jié)構(gòu)

C51語言程序是由函數(shù)組成的。函數(shù)是C51語言的基本模塊。用C51語言設(shè)計程序就是編寫函數(shù)。從來源看,函數(shù)可分為用戶自定義函數(shù)和標準庫函數(shù)兩大類。在一個C51語言程序中有且只能有一個名為main的主函數(shù)。C51語言程序的執(zhí)行部分是由語句組成的。程序的各種主要功能都是由語句實現(xiàn)的。C語言的語句可分為流程控制語句、表達式語句、復合語句、空語句。C51語言中新增了兩種函數(shù)類型——中斷函數(shù)和重入函數(shù)。2021/5/9411、語句與流程控制基本語句:賦值、函數(shù)調(diào)用、復合語句及空語句等分支語句:if-else、switch語句等循環(huán)語句:for、while、do-while語句等輔助控制語句:break、continue語句2021/5/9422、函數(shù)中斷函數(shù)重入函數(shù)標準庫函數(shù)

2021/5/943[return_type]funcname([args])[{small|compact|large}][reentrant][interruptn][usingn]{

局部變量定義 可執(zhí)行語句}C51語言中函數(shù)定義的一般格式:

其中,大括號以外的部分稱為函數(shù)頭;大括號以內(nèi)的部分稱為函數(shù)體。如果函數(shù)體內(nèi)無語句,則稱之為空函數(shù)??蘸瘮?shù)不執(zhí)行任何操作,定義它的目的只是為了以后程序功能的擴充。2021/5/944

從函數(shù)的定義格式可以看出,C51語言在4個方面對標準C語言的函數(shù)進行了擴展:指定函數(shù)的存儲模式;指定函數(shù)是可再入的;指定函數(shù)是一個中斷函數(shù);指定函數(shù)所用的工作寄存器組。

用C51語言設(shè)計程序,就是編寫函數(shù)。在構(gòu)成C51語言設(shè)計程序的若干個函數(shù)中,有且僅有一個是主函數(shù)main()。因為C51語言程序的執(zhí)行都是從main()函數(shù)開始的,也是在main()函數(shù)中結(jié)束整個程序運行的,其他函數(shù)只有在執(zhí)行main()函數(shù)的過程中被調(diào)用才能被執(zhí)行。2021/5/945

同變量一樣,函數(shù)也必須先定義后使用。所有函數(shù)在定義時都是相互獨立的,一個函數(shù)中不能再定義其他函數(shù),但可以相互調(diào)用。函數(shù)調(diào)用的一般規(guī)則是:主函數(shù)可以調(diào)用其他普通函數(shù);普通函數(shù)之間可以相互調(diào)用;普通函數(shù)不能調(diào)用主函數(shù)。

從用戶使用的角度看,函數(shù)可以分成兩大類:標準庫函數(shù)和用戶自定義函數(shù)。下面重點介紹C51語言中新增的中斷函數(shù)、重入函數(shù)和常用的標準庫函數(shù)。2021/5/94651系列單片機通常有5個中斷源,為了方便使用,C51語言對它們進行了編號,見下表:51系列單片機的中斷源及其編號

中斷函數(shù):2021/5/947

當CPU正在執(zhí)行一個特定任務(wù)時,可能有更緊急的事情需要CPU處理,這就涉及中斷優(yōu)先級。高優(yōu)先級中斷可以中斷正在處理的低優(yōu)先級中斷程序,因此最好給每種不同優(yōu)先級程序分配不同的工作寄存器組,以達到壓棧保護的目的。

中斷函數(shù)的定義格式:函數(shù)類型函數(shù)名()interrupt中斷編號using工作寄存器組編號

{

可執(zhí)行語句

}2021/5/948

例如,下列程序片段為定時器/計數(shù)器0的中斷服務(wù)程序,指定使用第2組工作寄存器。

…… unsignedintCNT1; unsignedcharCNT2;

voidTimer()interrupt1using2 { if(++CNT1==1000) //CNT1計數(shù)到1000 { CNT2++; //CNT2開始計數(shù)

CNT1=0; //CNT1清零

} }

……2021/5/949

在編寫中斷函數(shù)時,應(yīng)特別注意以下幾點:(1)中斷函數(shù)為無參函數(shù),即不能在中斷函數(shù)中定義任何變量,否則將導致編譯錯誤。(2)中斷函數(shù)沒有返回值,即應(yīng)將中斷函數(shù)定義為void類型。(3)中斷函數(shù)不能直接被調(diào)用,否則將導致編譯錯誤。(4)中斷函數(shù)使用浮點運算時要保存浮點寄存器的狀態(tài)。(5)如果在中斷函數(shù)中調(diào)用了其他函數(shù),則被調(diào)用函數(shù)所使用的寄存器組必須與中斷函數(shù)相同。(6)由于中斷的產(chǎn)生不可預(yù)測,中斷函數(shù)對其他函數(shù)的調(diào)用可能形成遞歸調(diào)用,必要時可將被中斷函數(shù)調(diào)用的其他函數(shù)定義成再入函數(shù)。2021/5/950重入函數(shù):

在主函數(shù)和中斷函數(shù)中都可調(diào)用的函數(shù)容易產(chǎn)生問題。51系列單片機一般使用寄存器傳遞函數(shù)參數(shù),局部變量一般存放在片內(nèi)RAM中。由于片內(nèi)RAM的容量很小(只有128B),函數(shù)再入時會破壞或覆蓋上次調(diào)用的數(shù)據(jù)。為此,C51語言提供了關(guān)鍵字reentrant,用于將相應(yīng)的函數(shù)指定為可重入函數(shù)。所謂重入函數(shù),是指可以在函數(shù)體內(nèi)間接調(diào)用其自身的函數(shù)。2021/5/951

重入函數(shù)可以被遞歸調(diào)用和多重調(diào)用,而不用擔心變量被覆蓋,因為每次函數(shù)調(diào)用中的局部變量都會被單獨保存起來。

重入函數(shù)的定義格式:

函數(shù)類型函數(shù)名(形參列表)reentrant {

局部變量說明 可執(zhí)行語句

}2021/5/952標準庫函數(shù):

根據(jù)51系列單片機本身的特點,C51語言編譯系統(tǒng)在C語言的基礎(chǔ)上又擴展了以下幾種庫函數(shù):(1)C51S.LIB: Small模式,無浮點運算。(2)C51FPS.LIB: Small模式,有浮點運算。(3)C51C.LIB: Compact模式,無浮點運算。(4)C51FPC.LIB: Compact模式,有浮點運算。(5)C51L.LIB: Large模式,無浮點運算。(6)C51FPL.LIB: Large模式,有浮點運算。

所謂標準庫函數(shù),是指由編譯系統(tǒng)提供的、用戶可以直接調(diào)用的函數(shù)。在程序設(shè)計中,多使用庫函數(shù)使程序代碼簡單,結(jié)構(gòu)清晰,易于調(diào)試和維護。2021/5/953

每個庫函數(shù)都在相應(yīng)的頭文件中給出了函數(shù)原型聲明。在使用庫函數(shù)時,必須在源程序的開頭處用#include命令將有關(guān)的頭文件包含進來,例如:

#include<reg51.h> #include<stdio.h> … voidmain(){…}

值得注意的是,C51語言中的某些庫函數(shù)的參數(shù)和調(diào)用格式與標準C語言有所不同,如isdigit()函數(shù)的返回值類型是bit而不是int。2021/5/954

在C51語言中,調(diào)用標準庫函數(shù)的方式有以下兩種:(1)作為表達式的一部分。例如,求y=|x|+3可以通過調(diào)用abs()函數(shù)來實現(xiàn):y=abs(x)+3;(2)作為獨立的語句完成某種操作。例如:printf("*****\n");可以在標準輸出設(shè)備上輸出一行5個連續(xù)的“*”號。KeilC51提供了相當豐富的標準庫函數(shù),并把它們分門別類地歸屬到不同的頭文件中,標準庫函數(shù)的原型、功能描述、返回值、重入屬性以及應(yīng)用舉例在KeilC51集成開發(fā)環(huán)境提供的幫助文檔中均可以查到。2021/5/955

以數(shù)學類庫函數(shù)abs()為例,查閱標準庫函數(shù)的方法(1)在KeilC51集成開發(fā)環(huán)境下,單擊工程管理器中的Books標簽,即可看到KeilC51提供的幫助文檔,如圖3.15所示。KeilC51的幫助文檔2021/5/956(2)在下圖所示的界面中,雙擊C51庫函數(shù)(C51LibraryFunctions)選項,打開C51庫函數(shù)幫助窗口,如圖所示。KeilC51的庫函數(shù)2021/5/957(3)在圖的左側(cè)窗口找到abs并單擊,則在圖的右側(cè)窗口中可以看到有關(guān)庫函數(shù)abs()的介紹內(nèi)容,包括該函數(shù)所屬的頭文件、函數(shù)原型、功能描述、再入屬性以及應(yīng)用舉例等,如圖所示。庫函數(shù)abs()的幫助文檔2021/5/9581.Keil的編譯環(huán)境μVision3

Keil是德國KeilSoftware公司的51單片機開發(fā)軟件包,包括C編譯器、匯編編譯器、連接器、庫管理及仿真調(diào)試器,通過一個windows下的集成開發(fā)環(huán)境uVisoin3組合起來。六、開發(fā)環(huán)境2021/5/959μVision3的軟件界面包括四大組成部分,即菜單工具欄,工程管理窗

溫馨提示

  • 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

提交評論