51單片機實戰(zhàn)指南-基本功-C51編程基礎(chǔ)(Ver2)_第1頁
51單片機實戰(zhàn)指南-基本功-C51編程基礎(chǔ)(Ver2)_第2頁
51單片機實戰(zhàn)指南-基本功-C51編程基礎(chǔ)(Ver2)_第3頁
51單片機實戰(zhàn)指南-基本功-C51編程基礎(chǔ)(Ver2)_第4頁
51單片機實戰(zhàn)指南-基本功-C51編程基礎(chǔ)(Ver2)_第5頁
已閱讀5頁,還剩96頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

基本功—C51編程基礎(chǔ)51單片機實戰(zhàn)指南本章內(nèi)容:2C51語言的數(shù)據(jù)123C51語言的數(shù)組、函數(shù)4C51語言對單片機主要資源的控制C51語言的基本運算與流程控制語句單片機C51編程規(guī)范54.1.1數(shù)據(jù)類型4.1C51語言的數(shù)據(jù)4.1.2常量與變量常量

C51語言中的常量是不接受程序修改的固定值,常量可以是任意數(shù)據(jù)類型。

C51中的常量有整型常量、實型常量、字符型常量、字符串常量符號常量等。(1)整型常量

在整型常量后加一個字母“L”或“l(fā)”,表示該數(shù)位長整型。例如23L、0Xfd4l等。如果需要的是負值,則必須將負號“-”放置于常量表達式的最前面,例如-0x56、-9等。(2)實型常量

實型常量又稱浮點常量,是一個十進制表示的符號實數(shù)。實型常量的值包括整數(shù)部分、尾數(shù)部分和指數(shù)部分。實型常量的形式如下:

[digits][.digits][E[+/-]digits]一些實型常量的示例如下:

15.75、1.575E1、1575E-3、

-0.0025、-2.5e-3、25E-4。(3)字符型常量

字符型常量是指用一對單引號括起來的一個字符。如‘a(chǎn)’、‘9’、‘!’等。字符常量中的單引號只起定界作用并不表示字符本身。在C51語言中,字符是按其對應(yīng)的ASCII碼值來存儲的,1個字符占1個字節(jié)(4)字符串常量

字符串常量是指用一對雙引號括起來的一串字符,雙引號只起定界作用,如“China”、“123456”等。字符串常量在內(nèi)存中存儲時,系統(tǒng)自動在字符串的末尾加一個串結(jié)束標(biāo)志,即ASCII碼值中為0的字符NULL,常用\0表示。字符常量與字符串常量的區(qū)別:字符‘A’只占用1個字節(jié)字符串“A”占用2個字節(jié)(5)符號常量C51語言中允許將程序中的常量定義為一個標(biāo)識符,稱為符號常量。符號常量一般使用大寫英文字母表示,以區(qū)別于一般用小寫字母表示的變量。符號常量在使用前必須先定義,定義的形式是:

#define

標(biāo)識符常量

#definePI3.1415926

注:符號常量一般使用大寫英文字母表示,以區(qū)別一般用小寫字母表示的變量。2.變量變量的定義:

數(shù)據(jù)類型變量名; inti,j,k; unsignedcharsi; unsignedintui; doublebalance,profit,loss;C51中常用的:bit、char、int(1)整型變量(int)16位數(shù)據(jù)有符號:

signedint-32768~32767無符號:

unsignedint0~65535C51語言將int型變量的高位存放在低字節(jié)如:0x1234存儲形式(2)長整型變量(longint)

長整型變量長度是32位,占用4個字節(jié)(byte),其他方面和整型變量(int)相似。(3)實型變量分為單精度(float)型和雙精度(double)型。其定義形式為:

floatx,y;//指定x,y為單精度實數(shù)

doublez;//指定z為雙精度實數(shù)在一般系統(tǒng)中,一個float型數(shù)據(jù)在內(nèi)存中占4個字節(jié)(32位),一個double型數(shù)據(jù)占8個字節(jié)(64位)。單精度實數(shù)提供7位有效數(shù)字,雙精度實數(shù)提供15~16位有效數(shù)字。(5)字符變量char字符變量用來存放字符常量。注意只能存放1個字符。字符變量的定義形式如下:

char變量名;

例如:charc1,c2;它表示c1和c2為字符變量,各存放1個字符??梢杂孟旅娴恼Z句對c1、c2賦值:

c1='a';c2='b';字符變量的長度是1字節(jié)(byte)即8位。這很適合于8051單片機,因為8051單片機每次可以處理8位數(shù)據(jù)。(6)位變量(bit)變量的類型是位,位變量的值可以是1(true)或0(false)與8051硬件特性操作有關(guān)的位變量必須定位在8051單片機片內(nèi)存儲區(qū)(RAM)的可位尋址空間中。注意:在編程時必須慎重地進行變量和數(shù)據(jù)類型的選擇

3.有符號/無符號問題說明(1)盡量使用無符號變量,且盡可能地使用無符號字符變量、位變量(能被單片機更好地接受)(2)在編程時,為了書寫方便,經(jīng)常使用簡化的縮寫形式來定義變量的數(shù)據(jù)類型:

#defineucharunsignedchar#defineuintunsignedint4.1.3數(shù)據(jù)存儲類型與51單片機的存儲關(guān)系

數(shù)據(jù)時存放在51單片機的存儲器中的,因此要規(guī)定數(shù)據(jù)的存儲類型。

常用:data、pdata、code

另外:bdata1.數(shù)據(jù)存儲類型徹底搞清STC89C52RC的存儲器內(nèi)部ROM8k(code)外部ROM最多64K(code)工作寄存器組位尋址區(qū)(bdata)普通RAM(data)SFRRAM高128B(idata)內(nèi)部擴展RAM256B(pdata)外部RAM最多64Kxdata(1)data區(qū)data區(qū)的尋址是最快的,所以應(yīng)該把經(jīng)常使用的變量放在data區(qū),但是data區(qū)的空間是有限的,data區(qū)除了包含程序變量外,還包含了堆棧和寄存器組。data區(qū)聲明中的存儲類型標(biāo)式符為data,通常指片內(nèi)RAM的低128字節(jié)的內(nèi)部數(shù)據(jù)存儲的變量,可直接尋址。聲明舉例如下:

unsignedchardatasystem_status=0;unsignedintdataunit_id[2];chardatainp_string[16];(2)bdatabdata實際是data中的位尋址區(qū),在這個區(qū)中聲明變量就可以進行位尋址。位變量的聲明對狀態(tài)寄存器來說是十分有用的,因為它可能僅僅需要某一位,而不是整個字節(jié)。bdata區(qū)聲明中的存儲類型標(biāo)識符為bdata,指內(nèi)部可位尋址的16字節(jié)存儲區(qū)(20H到2FH),數(shù)據(jù)類型是可位尋址變量的數(shù)據(jù)類型。以下是在bdata區(qū)中聲明的位變量和使用位變量的例子:

unsignedcharbdatastatus_byte;unsignedintbdatastatus_word;unsignedlongbdatastatus_dword;sbitstat_flag=status_byte^4;

if(status_word^15){ … }stat_flag=1;(3)idata區(qū)idata區(qū)也可以存放使用比較頻繁的變量,使用寄存器作為指針進行尋址。idata區(qū)聲明中的存儲類型標(biāo)識符為idata,指內(nèi)部的256字節(jié)的存儲區(qū),但是只能間接尋址,速度比直接尋址慢。聲明舉例如下:

unsignedcharidatasystem_status=0;unsignedintidataunit_id[2];charidatainp_string[16];floatidataout_value;(4)pdata區(qū)和xdata區(qū)pdata區(qū)和xdata區(qū)屬于外部數(shù)據(jù)存儲區(qū),外部數(shù)據(jù)區(qū)是可讀可寫的存儲區(qū),最多可以有64KB。在這兩個區(qū),變量的聲明與在其他區(qū)的語法是一樣的,但pdata區(qū)只有256字節(jié)而xdata區(qū)可達65536字節(jié)。對于STC89C52RC來說,pdata訪問的也是片內(nèi)拓展的存儲器。聲明舉例如下:unsignedcharxdatasystem_status=0;unsignedintpdataunit_id[2];charxdatainp_string[16];floatpdataout_value;外部地址段中除了包含存儲器地址外,還包含I/O器件的地址。對外部器件尋址可以通過指針或C51提供的宏,使用宏對外部器件I/O口進行尋址更具可讀性。(5)程序存儲區(qū)code程序存儲區(qū)的數(shù)據(jù)是不可改變的,跳轉(zhuǎn)向量和狀態(tài)表對code段訪問和對xdata區(qū)訪問的時間是一樣的。編譯的時候要對程序存儲區(qū)中的對象進行初始化,否則就會產(chǎn)生錯誤。程序存儲區(qū)code聲明的標(biāo)識符為code,在C51語言編譯器中可以用code存儲區(qū)類型標(biāo)識符來訪問程序存儲區(qū)。下面是程序存儲區(qū)聲明的例子:

unsignedcharcodea[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15};單片機訪問片內(nèi)RAM比訪問片外RAM相對快一些,

(1)應(yīng)當(dāng)將使用頻繁的變量置于片內(nèi)數(shù)據(jù)存儲器,即采用data、bdata或idata存儲類型;

(2)將容量較大的或使用不怎么頻繁的變量置于片外RAM,即采用pdata或xdata存儲類型。

(3)常量只能采用code存儲類型。變量存儲類型定義舉例:

chardatavar1;bitbdataflags;floatidatax,y,z; unsignedintpdatadimension;unsignedcharxdatavector[10][4][4];SMALL模式所有變量都默認位于51單片機的內(nèi)部的數(shù)據(jù)存儲器,這與使用data指定存儲器類型的方式一樣。COMPACT模式所有變量都默認位于外部數(shù)據(jù)存儲器的1頁內(nèi),這與使用pdata指定存儲器類型的方式一樣。該存儲器類型適用于變量不超過256字切的情況。與SMALL模式相比,該存儲器模式的效率比較低,對變量訪問的速度也慢一些,但比LARGE模式快。LARGE模式所有變量都默認位于外部數(shù)據(jù)存儲器,并使用數(shù)據(jù)指針DPTR進行尋址,該模式要比SMALL和COMPACT模式產(chǎn)生更多的代碼。2、存儲模式4.2.1特殊功能寄存器及其C51定義方法21個特殊功能寄存器。兩種方式:(1)使用關(guān)鍵字sfr定義

sfr特功器名字=特殊功能寄存器地址;

sfrSCON=0x98;

/*串口控制寄存器地址98H*/

sfrTMOD=0X89;

/*定時器/計數(shù)器方式控制寄存器地址89H*/4.2C51語言對單片機主要資源的控制(2)通過頭文件訪問SFR#include<reg52.h>

//使用的單片機為STC公司的STC89C52

voidmain(void){ TL0=0xb0; TH0=0x3c; TR0=1; //啟動定時器0 ...}(3)SFR中位定義—3種方式(a)第1種方法

sbit位名=特殊功能寄存器名^位置;(b)第2種方法

sbit位名=字節(jié)地址^位置;(c)第3種方法

sbit位名=位地址;例:sfrPSW=0xD0;sbitOV=PSW^2;sbitOV=0xD0^2;sbitOV=0xD2;unsignedcharbdataflag;sbitflag0=flag^0;sfrP1=0x90;sbitP1_0=P1^0;sbitP1_1=P1^1;sbitP1_6=P1^6;sbitP1_7=P1^7;4.2.2絕對地址的訪問包括:片內(nèi)RAM、片外RAM及I/O口用#include<absacc.h>可使用其中聲明的宏來訪問絕對地址,

DBYTE以字節(jié)形式對data區(qū)尋址;

DWORD以字形式對data區(qū)尋址;

XBYTE以字節(jié)形式對xdata區(qū)尋址;XWORD以字形式對xdata區(qū)尋址;

CBYTE以字節(jié)形式對code區(qū)尋址;

CWORD以字形式對code區(qū)尋址;

PBYTE以字節(jié)形式對pdata區(qū)尋址;

PWORD以字形式對pdata區(qū)尋址。如:#include<absacc.h>#definePORTAXBYTE[0xFFC0]/*將PORT定義為外部I/O口,地址為0xFFC0,長度為8位*/#defineNRAMDBYTE[0x40]

/*將NRAM定義為片內(nèi)RAM,地址為40H,長度為8位*/#include<absacc.h> #definePAXBYTE[0xffec]

//將PA定義為外部I/O口,地址為0xffec#defineNRAMDBYTE[0x40]

/*將NRAM定義為片內(nèi)RAM,地址為40H,長度為8位*/voidmain(){ PA=0x3A; NRAM=0x01; }4.2.3位變量的C51語言定義1位變量的C51語言定義

C51通過“bit”關(guān)鍵字來定義位變量,一般格式為:bitbitName;例如:bitsFlag; /*將sFlag定義為位變量*/2C51程序函數(shù)的參數(shù)及返回值C51程序函數(shù)可包含類型為“bit”的參數(shù),也可以將其作為返回值。例如:

bitfunc(bitb0,bitb1) /*位變量b0、b1作為函數(shù)的參數(shù)*/

{…… return(b1); /*變量b1作為函數(shù)的返回值*/

}4.2.3位變量的C51語言定義3.對位變量的限制

1)位變量不能說明為指針和數(shù)組。例如:bit*ptr; /*用位變量定義指針,錯誤*/

bitbArray[]; /*用位變量定義數(shù)組,錯誤*/

2)在定義位變量時,允許定義存儲類型,位變量都被放入一個位段,此段總位于51系列單片機片內(nèi)RAM中,因此其存儲類型限制為data或bdata,如果將其定義成其他類型都將在編譯時出錯。4可位尋址對象對位變量的操作也可以采用先定義變量的數(shù)據(jù)類型和存儲類型,其存儲類型只能為bdata,然后采用“sbit”關(guān)鍵字來定義可獨立尋址訪問的對象位。例如:bdataintibase/*定義ibase為bdata存儲類型的整型變量*/

bdatacharbary[4];/*定義bary[4]為bdata存儲類型的字符型變量*/sbitibase0=ibase^0;/*定義ibase0為ibase變量的第0位*/

sbitibase15=ibase^15;/*定義ibase15為ibase變量的第15位*/4.2.3位變量的C51語言定義4.2.3位變量的C51語言定義sbitbary07=bary[0]^7;/*定義bary07為bary[0]數(shù)據(jù)元素的第7位*/sbitbary36=bary[3]^6;/*定義bary36為bary[3]數(shù)據(jù)元素的第6位*/對采用這種方式定義的位變量既可以位尋址又可以字節(jié)尋址。例如:bary36=1; /*位尋址,給bary[3]數(shù)據(jù)元素的第6位賦值為1*/

bary[3]=a;/*字節(jié)尋址,給bary[3]數(shù)據(jù)元素賦值為a*/ sbit定義要求基址對象的存儲類型為bdata,只有這樣其特殊位定義(sbit)是合法的。位置('^'操作符)后的最大值依賴于指定的基類型,對于char/uchar而言是0~7,對于int/uint而言是0~15,對于long/ulong而言是0~31。4.2.3位變量的C51語言定義4.3.1基本運算運算符是表示特定的算術(shù)或邏輯運算的符號,也稱操作符。在C51語言中把需要進行運算的各個量通過運算符連接起來,便構(gòu)成表達式。算術(shù)運算符、關(guān)系運算符、邏輯運算符、位運算符、賦值運算符、特殊運算符4.3C51語言的基本運算與流程控制語句算術(shù)運算算術(shù)運算的操作符:+(加法運算符)、-

(減法運算符)*(乘法運算符)、/(除法運算符)%(模運算或取余運算符)++為自增運算符--為自減運算符注意:/:結(jié)果的整數(shù)部分%:結(jié)果的余數(shù)部分-:除進行減法外,還可以進行取負操作。++:自增。表示操作數(shù)加1。X++等同于X=X+1。

++X表示先加1,再取值

X++表示先取值,再加1。關(guān)系運算—成立或不成立主要用于比較操作數(shù)的大小關(guān)系。包括:<(小于)、<=

(小于等于)、>

(大于)、>=

(大于等于)、==

(等于)、!=

(不等于)看關(guān)系是否成立。結(jié)果:0或1邏輯運算—結(jié)果是真或假進行邏輯運算的操作符。包括:&&(邏輯與)、||(邏輯或)、?。ㄟ壿嫹牵┛唇Y(jié)果是否為真。結(jié)果:0或1。位運算將兩個操作數(shù)按二進制數(shù)展開,然后對應(yīng)位進行邏輯運算。包括:&(按位與)、|(按位或)、^(按位異或)、

~(按位取反)、<<(位左移)、>>(位右移)位運算的操作對象只能是整型和字符型數(shù)據(jù)。這些位運算和匯編語言中的位操作指令十分類似。位操作指令是單片機的重要特點,所以位運算在C51語言控制類程序設(shè)計中的應(yīng)用比較普遍。賦值運算變量名=表達式;例如:a=(b=4)+(c=6);該表達式的值為10,變量a的值為10。復(fù)合賦值運算符:賦值符號前加上其他運算符構(gòu)成復(fù)合運算符。C51語言提供以下10種復(fù)合運算符:+=,-=,*=,/=,%=,﹠=,︱=,^=,<<=,>>=例如:a+=b; //等價于a=(a+b)x*=a+b;//等價于x=(x*(a+b))a&=b; //等價于a=(a&b)a<<=4; //等價于a=(a<<4)算術(shù)運算符、邏輯運算符、關(guān)系運算符、賦值運算符的優(yōu)先級4.3.2選擇結(jié)構(gòu)——if、switch語句

通過選擇結(jié)構(gòu),可以使計算機具有決策能力,從而使計算機能夠按照我們的意志在某個特定條件下完成相應(yīng)的操作,能夠“隨機應(yīng)變”。包括:

if語句、switch語句if語句

if語句用來判定所給定的條件是否滿足,根據(jù)判定結(jié)果決定執(zhí)行給出的兩種操作之一。

if語句的基本結(jié)構(gòu)如下:

if(表達式){語句;}

括號中的表達式成立時,程序執(zhí)行大括號內(nèi)的語句,否則程序跳過大括號中的語句部分而直接執(zhí)行下面其他語句。C51語言提供3種形式的if語句:形式一:if(表達式){語句;}if(x>y){max=x;min=y;}形式二:if(表達式){語句1;}

else{語句2;}if(x>y){max=x;}else{min=y;}形式三:if(表達式1){語句1;}elseif(表達式2){語句2;}elseif(表達式3){語句3;}...elseif(表達式m){語句m;}else{語句n;}switch語句switch語句是多分支選擇語句一般形式如下:switch(表達式){ case常量表達式1:{語句1;}break; case常量表達式2:{語句2;}break; ... case常量表達式n:{語句n;}break; default:{語句n+1;}}while

while(表達式){語句; }注意:先判斷,后執(zhí)行;如果循環(huán)體內(nèi)只有一個語句,可以不用{}While循環(huán)體{}后無分號;4.3.3循環(huán)控制——while、for語句for語句for(表達式1;表達式2;表達式3){ 語句;}for(y=0;y<=99;y=y+3){ delay(33);px=~px;}注意:3個表達式都是可選項,可以任意省略,但“;”不能省。省1是不對循環(huán)變量賦初值;省2是不判斷循環(huán)條件的真假;省3是不對循環(huán)變量操作。for(;;)表示無限循環(huán)。時間延時程序舉例:voidmsec(unsignedintx){unsignedcharj; while(x--){for(j=0;j<125;j++);}}無限循環(huán)的實現(xiàn):(1)for(;;){代碼段;}

(2)while(1){代碼段;}

(3)do{代碼段;}while(1);4.3.4break語句、continue語句、return語句在循環(huán)語句執(zhí)行過程中,如果需要在滿足循環(huán)判定條件的情況下跳出代碼段,可以使用break或continue語句;如果要從任意地方跳轉(zhuǎn)到代碼的某個地方,可以使用goto語句。1、breakbreak語句用于從循環(huán)代碼中退出,然后執(zhí)行循環(huán)語句之后的語句,不再進入循環(huán)。形式:

break;注意:一個break只能跳出一層循環(huán)2、continuecontinue語句用于退出當(dāng)前循環(huán),不再執(zhí)行本輪循環(huán),程序代碼從下一輪循環(huán)開始執(zhí)行,直到判斷條件不滿足為止。與break的區(qū)別是該語句不是退出整個循環(huán)。形式:

continue;3.return語句return語句一般放在函數(shù)的最后位置,用于終止函數(shù)的執(zhí)行,并控制程序返回調(diào)用該函數(shù)時所處的位置。返回時還可以通過return語句帶回返回值。return語句形式:return;return(表達式);如果return語句后面帶有表達式,則要計算表達式的值,并將表達式的值作為函數(shù)的返回值。若不帶表達式,則函數(shù)返回時將返回一個不確定的值。通常,我們用return語句把調(diào)用函數(shù)取得的值返回給主調(diào)函數(shù)。4.4C51語言的數(shù)組、函數(shù)數(shù)組

數(shù)組是同類型變量的一個有序集合。數(shù)組用一個名字來標(biāo)識,稱為數(shù)組名。

數(shù)組中的每個變量稱為數(shù)組元素。

數(shù)組有一維、二維、三維和多維數(shù)組之分。C51語言中常用的一維、二維數(shù)組和字符數(shù)組。數(shù)組中各元素的順序用下標(biāo)表示,下標(biāo)為n的元素可以表示為數(shù)組名[n]。改變[]中的下標(biāo)就可以訪問數(shù)組中所有的元素。1.一維數(shù)組類型說明符數(shù)組名[元素個數(shù)];intdemo1[10];初始化:

inta[5]={1,2,3,4,5};intb[6]={1,2,6};2.二維數(shù)組或多維數(shù)組類型說明符數(shù)組名[行數(shù)][列數(shù)];floatdemo2[3][4];//demo2數(shù)組有3行4列共12個實型元素

inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};//全部初始化3.字符數(shù)組若一個數(shù)組的元素是字符型的,則該數(shù)組就是一個字符數(shù)組。例如:

chara[12]={"ChongQing"}; //字符數(shù)組

charadd[3][6]={"weight","height","width"}; //字符串?dāng)?shù)組4.查表#defineucharunsignedcharucharcodetempt[]={32,34,36,37,39,41}; /*數(shù)組,設(shè)置在EPROM中,長度為實際輸入的數(shù)值數(shù)*/ucharftoc(uchardegc){ returntempt[degc];} voidmain(){ ucharx;x=ftoc(5);/*得到與5℃相應(yīng)的華氏溫度值*/}共陰極LED的顯示字符段碼表

charcodeSEG[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};4.4.2函數(shù)的簡單介紹函數(shù)是C51語言的重要組成部分,是從標(biāo)準(zhǔn)C語言中繼承下來的。C51有一般函數(shù)、庫函數(shù)和中斷函數(shù)。1.函數(shù)的定義函數(shù)一般定義形式如下:返回值類型標(biāo)志符函數(shù)名(形式參數(shù)列表){

函數(shù)體;}2.中斷函數(shù)KeilC51編譯器支持直接編寫中斷服務(wù)函數(shù)程序,從而減輕了采用匯編語言編寫中斷服務(wù)程序的繁瑣程度。為了在C語言源程序中直接編寫中斷服務(wù)函數(shù)的需要,C51編譯器對函數(shù)的定義進行了擴展,增加了一個擴展關(guān)鍵字interrupt,使用關(guān)鍵字interrupt可以將一個函數(shù)定義成中斷服務(wù)函數(shù)。定義中斷服務(wù)函數(shù)的一般形式為:void函數(shù)名(void)interruptn[usingn]

4.4.2函數(shù)的簡單介紹4.4.2函數(shù)的簡單介紹3.庫函數(shù)C51語言的庫函數(shù)包括:I/O庫函數(shù)、標(biāo)準(zhǔn)函數(shù)庫、字符函數(shù)庫、字符串函數(shù)庫、內(nèi)部函數(shù)庫、數(shù)學(xué)函數(shù)庫、絕對地址訪問函數(shù)庫、變量參數(shù)函數(shù)庫、全程跳轉(zhuǎn)函數(shù)庫、偏移量函數(shù)庫等。在C51程序設(shè)計時常用的函數(shù)庫進1)輸入輸出庫函數(shù)4.4.2函數(shù)的簡單介紹2)內(nèi)部函數(shù)庫4.4.2函數(shù)的簡單介紹4.4.2函數(shù)的簡單介紹3)絕對地址訪問函數(shù)庫4.5C51語言的預(yù)處理命令及匯編語句的嵌入

4.5.1文件包含、宏定義、條件編譯1、文件包含

文件包含指令,即#include命令。文件包含是指一個程序文件將另一個指定的文件的全部內(nèi)容包含進去。例如#include<stdio.h>就是將C51語言編譯器提供的輸入/輸出庫函數(shù)的說明文件stdio.h包含到自己的程序中。

文件包含的一般形式第1種形式:#include<文件名> 第2種形式:#include"文件名" /*系統(tǒng)會先在源程序當(dāng)前目錄下尋找,若找不到,再到操作系統(tǒng)的path路徑中查找,最后才到C語言庫函數(shù)頭文件所在目錄中查找*/4.5C51語言的預(yù)處理命令及匯編語句的嵌入2.宏定義指令不帶參數(shù)的宏定義:#define宏替換名宏替換體帶參數(shù)的宏定義:define宏替換名(形參)帶形參的宏替換體注意:帶參數(shù)的宏定義形參一定要帶括號,因為實參可能是任何表達式,不加括號很可能導(dǎo)致意想不到的錯誤。3.條件編譯1)#if型#if條件1代碼1;#else代碼2;#endif2)#ifdef型格式如下:#ifdef標(biāo)識符代碼1;#else代碼2;#endif3)#ifndef型格式如下:#ifndef標(biāo)識符代碼1;#else代碼2;#endif4.5C51語言的預(yù)處理命令及匯編語句的嵌入4.5.2C51中匯編語句的嵌入在C51源程序中調(diào)用匯編程序有兩種方式:一種是嵌入式匯編,即在C51語言程序中嵌入一段匯編語言程序;另一種是匯編語言程序部分和C51程序部分為不同的模塊或不同的文件,通常由C51程序調(diào)用匯編程序模塊的變量和函數(shù)(也可稱為子程序或過程)。4.5C51語言的預(yù)處理命令及匯編語句的嵌入對函數(shù)名等定義使用C語言,但是在函數(shù)的內(nèi)部通過編譯命令控制asm/endasm在C51源程序中插入?yún)R編語言模塊,具體結(jié)構(gòu)如下:#pragmaasm匯編語句#pragmaendasm4.5C51語言的預(yù)處理命令及匯編語句的嵌入在項目(Project)窗口中包含匯編代碼的C文件上右鍵,選擇“Optionsfor...”,點擊右邊的“GenerateAssemblerSRCFile”和“AssembleSRCFile”,使檢查框由灰色變成黑色(有效)狀態(tài);根據(jù)選擇的編譯模式,把相應(yīng)的庫文件(如Small模式時,是Keil\C51\Lib\C51S.Lib)加入工程中,該文件必須作為工程的最后文件;最后進行編譯,即可生成目標(biāo)代碼。4.5C51語言的預(yù)處理命令及匯編語句的嵌入4.6.1單片機C51編程規(guī)范-總則單片機C51編程規(guī)范總則為:(1)格式清晰;(2)注釋簡明扼要;(3)命名規(guī)范易懂;(4)函數(shù)模塊化設(shè)計;(5)程序易讀易維護;(6)功能準(zhǔn)確實現(xiàn);(7)代碼空間效率和時間效率高;(8)適度的可擴展性。4.6單片機C51編程規(guī)范編程時統(tǒng)一采用下述新類型名的方式定義數(shù)據(jù)類型。建立一個datatype.h文件,在該文件中進行如下定義:4.6.2數(shù)據(jù)類型定義1.命名基本原則命名要清晰明了,有明確含義,使用完整單詞或約定俗成的縮寫。通常,較短的單詞可通過去掉元音字母形成縮寫;較長的單詞可取單詞的頭幾個字母形成縮寫,即“見名知意”。命名風(fēng)格要自始至終保持一致。命名中若使用特殊約定或縮寫,要有注釋說明。除了編譯開關(guān)/頭文件等特殊應(yīng)用,應(yīng)避免使用以下劃線開始或結(jié)尾的定義,如_EXAMPLE_TEST_之類。(P111)同一軟件產(chǎn)品內(nèi)模塊之間接口部分的標(biāo)識符名稱之前加上模塊標(biāo)識。(看情況)4.6.3標(biāo)識符命名2.宏和常量命名宏和常量用全部大寫字母來命名,詞與詞之間用下劃線分隔。對程序中用到的數(shù)字均應(yīng)用有意義的枚舉或宏來代替。3.變量命名變量名采用camel命名法,即駱駝式命名法,首字母小寫,采用該命名法的名稱看起來就像駱駝的駝峰一樣高低起伏。如runningFlag。局部變量應(yīng)簡明扼要。局部循環(huán)體控制變量優(yōu)先使用i、j、k等;局部長度變量優(yōu)先使用len、num等;臨時中間變量優(yōu)先使用temp、tmp等。

4.6.3標(biāo)識符命名4.函數(shù)命名函數(shù)名用Pascal命名法:首字母大寫,與Camel命名法類似,每個詞的第一個字母大寫。

5.文件命名一個文件包含一類功能或一個模塊的所有函數(shù),文件名稱應(yīng)清楚表明其功能或性質(zhì)。每個.c文件應(yīng)該有一個同名的.h文件作為頭文件。4.6.3標(biāo)識符命名1.注釋基本原則注釋有助于對程序的閱讀理解,說明程序在“做什么”,解釋代碼的目的、功能和采用的方法。一般情況源程序有效注釋量在30%左右。注釋語言必須準(zhǔn)確、易懂、簡潔。邊寫代碼邊注釋,修改代碼同時修改相應(yīng)的注釋,不再有用的注釋要刪除。

2.文件注釋文件注釋必須說明文件名、函數(shù)功能、創(chuàng)建人、創(chuàng)建日期、版本信息等相關(guān)信息。修改文件代碼時,應(yīng)在文件注釋中記錄修改日期、修改人員,并簡要說明此次修改的目的。所有修改記錄必須保持完整。4.6.4注釋文件注釋放在文件頂端,用"/*……*/"格式包含。注釋文本每行縮進4個空格;每個注釋文本分項名稱應(yīng)對齊。/*********************************************************文件名稱:作者:版本:說明:修改記錄:*********************************************************/

4.6.4注釋3.函數(shù)注釋(1)函數(shù)頭部注釋函數(shù)頭部注釋應(yīng)包括函數(shù)名稱、函數(shù)功能、入口參數(shù)、出口參數(shù)等內(nèi)容。如有必要還可增加作者、創(chuàng)建日期、修改記錄(備注)等相關(guān)項目。函數(shù)頭部注釋放在每個函數(shù)的頂端,用"/*……*/"的格式包含。其中函數(shù)名稱應(yīng)簡寫為FunctionName(),不加入、出口參數(shù)等信息。/*********************************************函數(shù)名稱:函數(shù)功能:入口參數(shù):出口參數(shù):備注:*********************************************/(2)代碼注釋代碼注釋應(yīng)與被注釋的代碼緊鄰,放在其上方或右方,不可放在下面。如放于上方則需與其上面的代碼用空行隔開。一般少量注釋應(yīng)該添加在被注釋語句的行尾,一個函數(shù)內(nèi)的多個注釋左對齊;較多注釋則應(yīng)加在上方且注釋行與被注釋的語句左對齊。函數(shù)代碼注釋用"http://…"的格式。4.變量、常量、宏的注釋同一類型的標(biāo)識符應(yīng)集中定義,并在定義之前一行對其共性加以統(tǒng)一注釋。對單個標(biāo)識符的注釋加在定義語句的行尾。全局變量一定要有詳細的注釋,包括其功能、取值范圍、哪些函數(shù)或過程存取它以及存取時的注意事項等。注釋用"http://…"的格式。4.6.4注釋1.設(shè)計原則(1)函數(shù)的基本要求:正確性:程序要實現(xiàn)設(shè)計要求的功能。穩(wěn)定性和安全性:程序運行穩(wěn)定、可靠、安全??蓽y試性:程序便于測試和評價。規(guī)范/可讀性:程序書寫風(fēng)格、命名規(guī)則等符合規(guī)范。擴展性:代碼為下一次升級擴展留有空間和接口。全局效率:軟件系統(tǒng)的整體效率高。局部效率:某個模塊/子模塊/函數(shù)的本身效率高。4.6.5函數(shù)(2)編制函數(shù)的基本原則:

單個函數(shù)的規(guī)模盡量限制在200行以內(nèi)(不包括注釋和空行)。一個函數(shù)只完成一個功能。函數(shù)局部變量的數(shù)目一般不超過5~10個。函數(shù)內(nèi)部局部變量定義區(qū)和功能實現(xiàn)區(qū)(包含變量初始化)之間空一行。函數(shù)名應(yīng)準(zhǔn)確描述函數(shù)的功能。通常使用動賓詞組為執(zhí)行某操作的函數(shù)命名。函數(shù)的返回值要清楚明了,尤其是出錯返回值的意義要準(zhǔn)確無誤。不要把與函數(shù)返回值類型不同的變量,以編譯系統(tǒng)默認的轉(zhuǎn)換方式或強制的轉(zhuǎn)換方式作為返回值返回。減少函數(shù)本身或函數(shù)間的遞歸調(diào)用。盡量不要將函數(shù)的參數(shù)作為工作變量。4.6.5函數(shù)2.函數(shù)定義函數(shù)若沒有入口參數(shù)或者出口參數(shù),應(yīng)用void明確申明。函數(shù)名稱與出口參數(shù)類型定義間應(yīng)該空一格且只空一格。函數(shù)名稱與括號()之間無空格。函數(shù)形參必須給出明確的類型定義。多個形參的函數(shù),后一個形參與前一個形參的逗號分割符之間添加一個空格。函數(shù)體的前后花括號"{}"各獨占一行。4.6.5函數(shù)3.局部變量定義同一行內(nèi)不要定義過多變量。同一類的變量在同一行內(nèi)定義,或者在相鄰行定義。先定義data型變量,再定義idtata型變量,再定義xdata型變量.數(shù)組、指針等復(fù)雜類型的定義放在定義區(qū)的最后。變量定義區(qū)不做較復(fù)雜的變量賦值。4.6.5函數(shù)4.功能實現(xiàn)區(qū)規(guī)范

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論