第2章(3)C51程序設計語言_第1頁
第2章(3)C51程序設計語言_第2頁
第2章(3)C51程序設計語言_第3頁
第2章(3)C51程序設計語言_第4頁
第2章(3)C51程序設計語言_第5頁
已閱讀5頁,還剩47頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

KEILC編譯器所支持的數(shù)據(jù)類型數(shù)據(jù)類型長度值域unsignedchar單字節(jié)0~255signedchar單字節(jié)-128~+127unsignedint雙字節(jié)0~65535signedint雙字節(jié)-32768~+32767unsignedlong四字節(jié)0~4294967295signedlong四字節(jié)-2147483648~+2147483647float四字節(jié)±1.175494E-38~±3.402823E+38*1~3字節(jié)對象的地址bit位0或1sfr單字節(jié)0~255sfr16雙字節(jié)0~65535sbit位0或12.3.1.2數(shù)據(jù)類型一.字符型char有signedchar和unsignedchar之分,默認為signedchar。它們的長度均為一個字節(jié),用于存放一個單字節(jié)的數(shù)據(jù)。對于signedchar,它用于定義帶符號字節(jié)數(shù)據(jù),其字節(jié)的最高位為符號位,“0”表示正數(shù),“1”表示負數(shù),補碼表示,所能表示的數(shù)值范圍是-128~+127;對于unsignedchar,它用于定義無符號字節(jié)數(shù)據(jù)或字符,可以存放一個字節(jié)的無符號數(shù),其取值范圍為0~255。unsignedchar可以用來存放無符號數(shù),也可以存放西文字符,一個西文字符占一個字節(jié),在計算機內(nèi)部用ASCII碼存放。二.int整型分singedint和unsignedint。默認為signedint。它們的長度均為兩個字節(jié),用于存放一個雙字節(jié)數(shù)據(jù)。對于signedint,用于存放兩字節(jié)帶符號數(shù),補碼表示,數(shù)的范疇為-32768~+32767。對于unsignedint,用于存放兩字節(jié)無符號數(shù),數(shù)的范圍為0~65535。三.long長整型分singedlong和unsignedlong。默認為signedlong。它們的長度均為四個字節(jié),用于存放一個四字節(jié)數(shù)據(jù)。對于signedlong,用于存放四字節(jié)帶符號數(shù),補碼表示,數(shù)的范疇為-2147483648~+2147483647。對于unsignedlong,用于存放四字節(jié)無符號數(shù),數(shù)的范圍為0~4294967295。四.float浮點型float型數(shù)據(jù)的長度為四個字節(jié),包含指數(shù)和尾數(shù)兩部分,最高位為符號位,“1”表示負數(shù),“0”表示正數(shù),其次的8位為階碼,最后的23位為尾數(shù)的有效數(shù)位。五.*指針型指針型變量中存放的是指向另一個數(shù)據(jù)的地址。這個指針變量要占用一定的內(nèi)存單元,一般為1~3個字節(jié)。六.位類型是C51中擴充的數(shù)據(jù)類型,用于訪問51單片機中的可尋址的位單元。在C51中,支持兩種位類型:bit型和sbit型。它們在內(nèi)存中都只占一個二進制位,其值可以是“1”或“0”。其中用bit定義的位變量在C51編譯器編譯時,在不同的時候位地址是可以變化的,而用sbit定義的位變量必須與51單片機的一個可以位尋址的字節(jié)單元中的某一位聯(lián)系在一起,在C51編譯器編譯時,其對應的位地址是不可變化的。bit位類型符用于定義一般的位變量。它的格式如下:bit位變量名;在格式中可以加上各種修飾,但注意存儲器類型只能是bdata、data、idata。只能是片內(nèi)RAM的可位尋址區(qū),嚴格來說只能是bdata。七.特殊功能寄存器型這是C51擴充的數(shù)據(jù)類型,用于訪問51單片機中的特殊功能寄存器數(shù)據(jù),它分sfr和sfr16兩種類型,其中sfr為字節(jié)型特殊功能寄存器類型,占一個內(nèi)存單元,利用它可以訪問51內(nèi)部的所有特殊功能寄存器;sfr16為雙字節(jié)型特殊功能寄存器類型,占用兩個字節(jié)單元,利用它可以訪問51內(nèi)部的所有兩個字節(jié)的特殊功能寄存器。在C51中對特殊功能寄存器的訪問必須先用sfr或sfr16進行聲明。2.3.1.4變量及其存儲模式變量是在程序運行過程中其值可以改變的量。一個變量由兩部分組成:變量名和變量值。在C51中,變量在使用前必須對變量進行定義,定義的格式如下:

[存儲種類]數(shù)據(jù)類型[存儲器類型]變量名表;一.數(shù)據(jù)類型說明符在定義變量時,必須通過數(shù)據(jù)類型說明符指明變量的數(shù)據(jù)類型,指明變量在存儲器中占用的字節(jié)數(shù)。可以是基本數(shù)據(jù)類型說明符,也可以是組合數(shù)據(jù)類型說明符,還可以是用typedef定義的類型別名。

在C51中,為了增加程序的可讀性,允許用戶為系統(tǒng)固有的數(shù)據(jù)類型說明符用typedef起別名,格式如下:

typedefc51固有的數(shù)據(jù)類型說明符別名;【例3-2】typedef的使用。 typedefunsignedintWORD; typedefunsignedcharBYTE; BYTEa1=0x12; WORDa2=0x1234;三、存儲器類型存儲器類型是用于指明變量所處的單片機的存儲器區(qū)域情況存儲器類型與存儲種類完全不同。C51編譯器能識別的存儲器類型有:存儲器類型說明data直接訪問內(nèi)部數(shù)據(jù)存儲器(128字節(jié)),訪問速度最快bdata可位尋址內(nèi)部數(shù)據(jù)存儲器(16字節(jié)),允許位與字節(jié)混合訪問idata間接訪問內(nèi)部數(shù)據(jù)存儲器(256字節(jié)),對于51子系列,只允許訪問低128B,對于52子系列,允許訪問全部256B地址pdata分頁訪問外部數(shù)據(jù)存儲器(256字節(jié)),相當于用MOVX@Ri指令訪問xdata外部數(shù)據(jù)存儲器(64KB),相當于用MOVX@DPTR指令訪問code程序存儲器(64KB),相當于用MOVC@A+DPTR指令訪問例:數(shù)據(jù)類型存儲器類型變量char data var1;bit bdata flags;unsignedchar xdata vextor;定義變量時如果省略存儲器類型,系統(tǒng)則會按編譯模式SMALL、COMPACT或LARGE所規(guī)定的默認存儲器類型去指定變量的存儲區(qū)域。2.3.1.5C51定義特殊功能寄存器對SFR的操作,只能采用直接尋址方式。為了能直接訪問這些特殊功能寄存器,KeilC51擴充了兩個關鍵字“sfr”、“sfr16”,可以直接對51單片機的特殊寄存器進行定義。一、使用關鍵字sfr、sfr16定義特殊功能寄存器

sfr特殊功能寄存器名=特殊功能寄存器地址常數(shù);如:對于8051片內(nèi)I/O口,定義方法如下:sfrP1=0x90;//定義P1口,地址90Hsfr后面是一個要定義的名字,要符合標識符的命名規(guī)則,名字最好有一定的含義等號后面必須是常數(shù),不允許有帶運算符的表達式,而且該常數(shù)必須在特殊功能寄存器的地址范圍之內(nèi)(80H-FFH)。Sfr16特殊功能寄存器名=特殊功能寄存器地址常數(shù);如:數(shù)據(jù)指針DPTR,可以定義為:sfr16DPTR=0x82;//這里定義數(shù)據(jù)指針DPTR,地址為DPL=82H,DPH=83H用sfr16定義16位特殊功能寄存器時,等號后面是它的低位地址,高位地址一定要位于物理低位地址之上。二、用sbit定義特殊功能寄存器的特殊位1)sbit位變量名=位地址sbitP1_1=0x91;這樣是把位的絕對地址賦給位變量。同sfr一樣,sbit的位地址必須位于80H~FFH之間。2)Sbit位變量名=特殊功能寄存器名^位地址sfrP3=0xB0;sbitP3_1=P3^1;//先定義一個特殊功能寄存器名,再指定位變量名所在的位置。當可尋址位位于特殊功能寄存器中時可采用這種方法。3)sbit位變量名=字節(jié)地址^位地址 sbitP3_1=0xB0^1;

三、通過頭文件訪問SFR編譯器給出的頭文件已經(jīng)給出了常用51單片機中的SFR及其可位尋址位的定義。比如KeilC將這些頭文件按單片機的不同生產(chǎn)公司、不同型號分別存在KeilC的INC子目錄下,在程序中只需直接引用這些頭文件即可實現(xiàn)對SFR的訪問和控制?!纠?-3】頭文件引用實例。#include<AT89X51.h>//單片機為atmel公司的AT89C51main(){TL0=0xb0;//訪問定時器0,設置時間常數(shù)TH0=0x3c;TR0=1;//啟動定時器0??}C51包含的頭文件reg51.h,reg52.h,Reg51.h定義51子系列單片機的特殊功能寄存器和部分位寄存器Reg52.h定義52子系列單片機的特殊功能寄存器和部分位寄存器在程序開始部分使用語句#include<reg51.h>即可直接使用特殊功能寄存器及其部分位單元,不需要再作定義。2.3.1.5指針一.指針的概念在C語言中,數(shù)據(jù)通常是以變量的形式進行存放和訪問的。變量在使用時分清兩個概念:變量名和變量的值。變量名是數(shù)據(jù)的標識符,相當于內(nèi)存單元的地址變量的值是數(shù)據(jù)的內(nèi)容,變量的值相當于內(nèi)存單元的內(nèi)容。對于變量有兩種訪問方式:直接訪問方式和間接訪問方式。直接訪問方式。對于變量的訪問,我們大多數(shù)時候是直接給出變量名。間接訪問方式。例如要存取變量a中的值時,可以先將變量a的地址放在另一個變量b中,訪問時先找到變量b,從變量b中取出變量a的地址,然后根據(jù)這個地址從內(nèi)存單元中取出變量a的值。這就是間接訪問。在這里,從變量b中取出的不是所訪問的數(shù)據(jù),而是訪問的數(shù)據(jù)(變量a的值)的地址,這就是指針,變量b稱為指針變量。

變量的指針和指向變量的指針變量。變量的指針就是變量的地址。對于變量a,如果它所對應的內(nèi)存單元地址為2000H,它的指針就是2000H。指針變量是指一個專門用來存放另一個變量地址的變量,它的值是指針。上面變量b中存放的是變量a的地址,變量b中的值是變量a的指針,變量b就是一個指向變量a的指針變量。二.指針變量的定義指針變量的定義與一般變量的定義類似,定義的一般形式為:數(shù)據(jù)類型說明符[存儲器類型1]*【存儲器類型2

】指針變量名;其中:“數(shù)據(jù)類型說明符”說明了該指針變量所指向的變量的類型?!按鎯ζ黝愋汀笔强蛇x項,如果帶有此選項,指針被定義為基于存儲器的指針。無此選項時,被定義為一般指針。下面是幾個指針變量定義的例子:int*p1;/*定義一個指向整型變量的指針變量p1*/chardata*p3;/*定義一個指向字符變量的指針變量p3,該指針訪問的數(shù)據(jù)在片內(nèi)數(shù)據(jù)存儲器中,該指針在內(nèi)存中占一個字節(jié)*/floatxdata*p4;/*定義一個指向浮點型變量的指針變量p4,該指針訪問的數(shù)據(jù)在片外數(shù)據(jù)存儲器中,該指針在內(nèi)存中占兩個字節(jié)*/Float*xdatap4;/*定義一個指向浮點型變量的指針變量p4,該指針存放在片外數(shù)據(jù)存儲器中,該指針在內(nèi)存中占三個字節(jié)*/三.指針變量的引用指針變量是存放另一變量地址的特殊變量,指針變量只能存放地址。指針變量使用時注意兩個運算符:&和*。&”是取地址運算符,“*”是指針運算符。通過“&”取地址運算符可以把一個變量的地址送給指針變量,使指針變量指向該變量;通過“*”指針運算符可以實現(xiàn)通過指針變量訪問它所指向的變量的值。例如:intx,*px,*py;/*變量及指針變量定義*/px=&x;/*將變量x的地址賦給指針變量px,使px指向變量x*/*px=5;/*等價于x=5*/py=px;/*將指針變量px中的地址賦給指針變量py,使指針變量py也指向x*/2.3.2C51的運算符及表達式1賦值運算符賦值運算符“=”,在C51中,它的功能是將一個數(shù)據(jù)的值賦給一個變量,如x=10。一個賦值語句的格式如下:

變量=表達式;執(zhí)行時先計算出右邊表達式的值,然后賦給左邊的變量。例如:x=8+9;/*將8+9的值賦紿變量x*/x=y=5;/*將常數(shù)5同時賦給變量x和y*注意:在賦值運算中,當“=”兩側(cè)的類型不一致時,要將數(shù)據(jù)轉(zhuǎn)換成同一數(shù)據(jù)類型,轉(zhuǎn)換的方式有兩種。1.系統(tǒng)自動轉(zhuǎn)換編譯時,將右邊表達式的值轉(zhuǎn)換成左側(cè)變量的類型,再賦給該變量。2.強制轉(zhuǎn)換使用強制類型轉(zhuǎn)換運算符轉(zhuǎn)換:(類型名)(表達式),將表達式的數(shù)據(jù)類型轉(zhuǎn)換為前面要求的類型名?!纠?-8】類型轉(zhuǎn)換應用。unsignedcharx,y;unsignedintz,a;x=(float)a;

y=(int)(x+y);z=x+(unsignedint)y;2算術運算符

+加或取正值運算符 -減或取負值運算符*乘運算符 /除運算符 %取余運算符加、減、乘運算相對比較簡單,而對于除運算,如相除的兩個數(shù)為浮點數(shù),則運算的結(jié)果也為浮點數(shù),如相除的兩個數(shù)為整數(shù),則運算的結(jié)果也為整數(shù),即為整除。如25.0/20.0結(jié)果為1.25,而25/20結(jié)果為1。對于取余運算,則要求參加運算的兩個數(shù)必須為整數(shù),運算結(jié)果為它們的余數(shù)。例如:x=5%3,結(jié)果x的值為2。3關系運算符C51中有6種關系運算符: >大于 <小于 >=大于等于 <=小于等于 ==等于 !=不等于關系表達式通常用來作為判別條件構(gòu)造分支或循環(huán)程序。關系表達式的一般形式如下:表達式1關系運算符表達式2關系運算的結(jié)果為邏輯量,成立為真(1),不成立為假(0)。其結(jié)果可以作為一個邏輯量參與邏輯運算。例如:5>3,結(jié)果為真(1),而10==100,結(jié)果為假(0)。

4邏輯運算符C51有3種邏輯運算符:

||邏輯或 &&邏輯與 !邏輯非邏輯運算符用于求條件式的邏輯值,用邏輯運算符將關系表達式或邏輯量連接起來的式子就是邏輯表達式。邏輯與,格式:條件式1&&條件式2當條件式1與條件式2都為真時結(jié)果為真(非0),否則為假(0)邏輯或,格式:條件式1||條件式2當條件式1與條件式2都為假時結(jié)果為假(0),否則為真(非0)邏輯非,格式:!條件式當條件式原來為真(非0),邏輯非后結(jié)果為假(0)。當條件式原來為假(0),邏輯非后結(jié)果為真(非0)。例如:若a=8,b=3,c=0,則!a為假,a&&b為真,b&&c為假。5位運算符位運算是按位對變量進行運算,但并不改變參與運算的變量的值。C51中位運算符只能對整數(shù)進行操作,不能對浮點數(shù)進行操作。C51中的位運算符有:&按位與|按位或^按位異或~按位取反<<左移>>右移【例】設a=0x45=01000101B,b=0x3b=00111011B,則a&b、a|b、a^b、~a、a<<2、b>>2分別為多少?a&b=00000001b=0x01。a|b=01111111B=0x7f。a^b=01111110B=0x7e。~a=10111010B=0xba。a<<2=00010100B=0x14。b>>2=00001110B=0x0e。6復合賦值運算符C51中支持的復合賦值運算符:+=加法賦值-=減法賦值*=乘法賦值/=除法賦值%=取模賦值&=邏輯與賦值|=邏輯或賦值^=邏輯異或賦值~=邏輯非賦值>>=右移位賦值<<=左移位賦值復合賦值運算的一般格式如下:變量復合運算賦值符表達式它的處理過程:先把變量與后面的表達式進行某種運算,然后將運算的結(jié)果賦給前面的變量。7逗號運算符在C51語言中,逗號“,”是一個特殊的運算符,可以用它將兩個或兩個以上的表達式連接起來,稱為逗號表達式。逗號表達式的一般格式為:

表達式1,表達式2,……,表達式n程序執(zhí)行時對逗號表達式的處理:按從左至右的順序依次計算出各個表達式的值,而整個逗號表達式的值是最右邊的表達式(表達式n)的值。例如:x=(a=3,6*3)結(jié)果x的值為18。8條件運算符條件運算符“?:”是C51語言中唯一的一個三目運算符,它要求有三個運算對象,用它可以將三個表達式連接在一起構(gòu)成一個條件表達式。條件表達式的一般格式為:

邏輯表達式?表達式1:表達式2功能是先計算邏輯表達式的值,當邏輯表達式的值為真(非0值)時,將計算的表達式1的值作為整個條件表達式的值;當邏輯表達式的值為假(0值)時,將計算的表達式2的值作為整個條件表達式的值。例如:條件表達式max=(a>b)?a:b的執(zhí)行結(jié)果是將a和b中較大的數(shù)賦值給變量max。9指針與地址運算符

*指針運算符 &取地址運算符指針運算符“*”放在指針變量前面,通過它實現(xiàn)訪問以指針變量的內(nèi)容為地址所指向的存儲單元。例如:指針變量p中的地址為2000H,則*p所訪問的是地址為2000H的存儲單元,x=*p,實現(xiàn)把地址為2000H的存儲單元的內(nèi)容送給變量x。取地址運算符“&”放在變量的前面,通過它取得變量的地址,變量的地址通常送給指針變量。例如:設變量x的內(nèi)容為12H,地址為2000H,則&x的值為2000H,如有一指針變量p,則通常用p=&x,實現(xiàn)將x變量的地址送給指針變量p,指針變量p指向變量x,以后可以通過*p訪問變量x。2.3.3.2選擇控制語句一、if語句if語句是C51中的一個基本條件選擇語句,它通常有三種格式:(1)if(表達式){語句;}(2)if(表達式){語句1;}else{語句2;}(3)if(表達式1){語句1;}elseif(表達式2){語句2;}elseif(表達式3){語句3;}……elseif(表達式n-1){語句n-1;}else{語句n}二、switch/case語句if語句通過嵌套可以實現(xiàn)多分支結(jié)構(gòu),但結(jié)構(gòu)復雜。switch是C51中提供的專門處理多分支結(jié)構(gòu)的多分支選擇語句。它的格式如下:switch(表達式){case常量表達式1:{語句1;}break;case常量表達式2:{語句2;}break;……case常量表達式n:{語句n;}break;default:{語句n+1;}}【例2-12】STC89C51單片機的P1.0和P1.1引腳接有兩只按鍵,其4種邏輯組合分別點亮由P2.0~P2.3控制的4只LED(高電平點亮),試編程實現(xiàn)此功能。解:#include<at89x51.h>voidmain(){ dataunsignedchara; do { a=P1; a=a&0x03;//,讀低2位 P2=P2&0xf0; switch(a) { case0:P2=P2|0x01;break; case1:P2=P2|0x02;break; case2:P2=P2|0x04;break; case3:P2=P2|0x08; } }while(1);}2.3.3.3循環(huán)語句一、基于if和goto構(gòu)成的循環(huán)采用if和goto可以構(gòu)成“當型”循環(huán)程序,其格式如下:loop:if(表達式){語句;gotoloop;}采用if和goto也可以構(gòu)成“直到型”循環(huán)程序,其格式如下:loop:{語句;if(表達式)gotoloop;}goto語句為無條件轉(zhuǎn)向語句,它的一般形式是:goto語句標號;二、while語句while語句在C51中用于實現(xiàn)當型循環(huán)結(jié)構(gòu),它的格式如下:while(表達式){語句;}/*循環(huán)體*/當表達式為非0(真)時,就重復執(zhí)行循環(huán)體內(nèi)的語句;當表達式為0(假),則中止while循環(huán),程序?qū)?zhí)行循環(huán)結(jié)構(gòu)之外的下一條語句。三、基于do-while語句構(gòu)成的循環(huán)do-while語句只能用來實現(xiàn)“直到型”循環(huán),其一般格式是:do{語句;//可以是復合語句}while(表達式);do-while語句的特點是先執(zhí)行內(nèi)嵌的語句;再計算表達式,如果表達式的值為非0,則繼續(xù)執(zhí)行內(nèi)嵌的語句,直到表達式的值為0時結(jié)束循環(huán)。四、基于for語句構(gòu)成的循環(huán)for語句的一般形式為:for(表達式1;表達式2;表達式3){語句;}它的執(zhí)行過程是:首先求解初始化表達式1;其次求解表達式2,判斷是否滿足循環(huán)條件,若其值非0,則執(zhí)行內(nèi)嵌語句;否則退出循環(huán);最后求解尺度增量表達式3,并回到第2步。在for語句中,可以沒有表達式1、表達式2或表達式3,若三個表達式都沒有,則相當于一個死循環(huán)。如果其后緊跟一個“;”,則為空循環(huán),常用于延時;1.break語句使用break語句可以從循環(huán)體中跳出循環(huán),提前結(jié)束循環(huán)而接著執(zhí)行循環(huán)結(jié)構(gòu)下面的語句。它不能用在除了循環(huán)語句和switch語句之外的任何其它語句中【例】下面一段程序用于計算圓的面積,當計算到面積大于100時,由break語句跳出循環(huán)。for(r=1;r<=10;r++){area=pi*r*r;if(area>100)break;}五、break和continue語句continue語句用在循環(huán)結(jié)構(gòu)中,用于結(jié)束本次循環(huán),跳過循環(huán)體中continue下面尚未執(zhí)行的語句,直接進行下一次是否執(zhí)行循環(huán)的判定。【例】輸出100~200間不能被3整除的數(shù)。for(i=100;i<=200;i++){if(i%3==0)continue;printf(“%d”;i);}

2.continue語句return語句一般放在函數(shù)的最后位置,用于終止函數(shù)的執(zhí)行,并控制程序返回調(diào)用該函數(shù)時所處的位置。返回時還可以通過return語句帶回返回值。return語句格式有兩種:(1)return;(2)return(表達式);

六、return語句2.3.4函數(shù)2.3.4.1函數(shù)的分類與定義一、函數(shù)的分類C語言函數(shù)分為主函數(shù)main()和普通函數(shù)兩種,而對于普通函數(shù),又可以分為標準庫函數(shù)和用戶自定義函數(shù)。1)標準庫函數(shù)標準庫函數(shù)是由C編譯系統(tǒng)提供的,在C編譯系統(tǒng)中將一些獨立的功能模塊編寫成公用函數(shù),并將它們集中存放在系統(tǒng)的函數(shù)庫中,供程序設計時使用,稱之為標準庫函數(shù)。①字符串操作函數(shù)位于“string.h”中。包括拷貝、比較、移動等函數(shù)如memcpy、memcmp、memmove、memset,這些函數(shù)對緩沖區(qū)進行處理很方便。②流函數(shù)輸入輸出,位于“stdio.h”中。流函數(shù)缺省為8051串口。2)用戶自定義函數(shù)用戶自定義函數(shù)是用戶根據(jù)自己的需要而編寫的函數(shù)。從函數(shù)定義的形式上可以將其劃分無參數(shù)函數(shù)、有參數(shù)函數(shù)和空函數(shù)。二、函數(shù)的定義函數(shù)定義的完整形式如下:返回數(shù)據(jù)類型函數(shù)名(形式參數(shù)列表)[reentrant][interruptn][usingm]

{局部變量定義;函數(shù)體;}1)函數(shù)返回值與數(shù)據(jù)類型如果返回數(shù)據(jù),進行說明;如果不返回,一般用void說明,也可以不說明。函數(shù)返回值通過returnx返回,返回值是通過函數(shù)名帶回的,一個函數(shù)只能有一個返回值。2)reentrant修飾符這個修飾符用于把函數(shù)定義為可重入函數(shù)。所謂可重入函數(shù)就是允許被遞歸調(diào)用的函數(shù)。函數(shù)的遞歸調(diào)用是指當一個函數(shù)正被調(diào)用尚未返回時,又直接或間接調(diào)用函數(shù)本身。3)interruptm修飾符在C51程序設計中,當函數(shù)定義時用了interruptm修飾符,系統(tǒng)編譯時把對應函數(shù)轉(zhuǎn)化為中斷函數(shù),按MCS-51系統(tǒng)中斷的處理方式自動把它安排在程序存儲器中的相應位置。在該修飾符中,m的取值為0~31,對應的中斷情況如下:0——外部中斷01——定時/計數(shù)器T02——外部中斷13——定時/計數(shù)器T14——串行口中斷5——定時/計數(shù)器T2其它值預留。4)usingn修飾符修飾符usingn用于指定本函數(shù)內(nèi)部使用的工作寄存器組,其中n的取值為0~3,表示寄存器組號。對于usingn修飾符的使用,注意以下幾點:(1)加入usingn后,C51在編譯時自動的在函數(shù)的開始處和結(jié)束處加入以下指令。{PUSHPSW;標志寄存器入棧MOVPSW,#與寄存器組號相關的常量……POPPSW;標志寄存器出棧}(2)usingn修飾符不能用于有返回值的函數(shù),因為C51函數(shù)的返回值是放在寄存器中的。如寄存器組改變了,返回值就會出錯。3.5絕對地址的訪問一.使用C51運行庫中預定義宏C51編譯器提供了一組宏定義來對51系列單片機的code、data、pdata和xdata空間進行絕對尋址。這些函數(shù)原型放在absacc.h文件中。使用時須用預處理命令把該頭文件包含到文件中,形式為:#include<absacc.h>CBYTE以字節(jié)形式對code區(qū)尋址,DBYTE以字節(jié)形式對data區(qū)尋址,PBYTE以字節(jié)形式對pdata區(qū)尋址,XBYTE以字節(jié)形式對xdata區(qū)尋址,CWORD以字形式對code區(qū)尋址,DWORD以字形式對data區(qū)尋址,PWORD以字形式對pdata區(qū)尋址,XWORD以字形式對xdata區(qū)尋址。

宏名[地址]地址為存儲單元的絕對地址,一般用十六進制形式表示。【例】絕對地址對存儲單元的訪問#include<absacc.h>/*將絕對地址頭文件包含在文件中*/#include<reg52.h>/*將寄

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 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

提交評論