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

下載本文檔

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

文檔簡(jiǎn)介

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

[存儲(chǔ)種類(lèi)]數(shù)據(jù)類(lèi)型[存儲(chǔ)器類(lèi)型]變量名表;一.?dāng)?shù)據(jù)類(lèi)型說(shuō)明符在定義變量時(shí),必須通過(guò)數(shù)據(jù)類(lèi)型說(shuō)明符指明變量的數(shù)據(jù)類(lèi)型,指明變量在存儲(chǔ)器中占用的字節(jié)數(shù)。可以是基本數(shù)據(jù)類(lèi)型說(shuō)明符,也可以是組合數(shù)據(jù)類(lèi)型說(shuō)明符,還可以是用typedef定義的類(lèi)型別名。

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

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

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

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

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

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

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

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

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

4邏輯運(yùn)算符C51有3種邏輯運(yùn)算符:

||邏輯或 &&邏輯與 !邏輯非邏輯運(yùn)算符用于求條件式的邏輯值,用邏輯運(yùn)算符將關(guān)系表達(dá)式或邏輯量連接起來(lái)的式子就是邏輯表達(dá)式。邏輯與,格式:條件式1&&條件式2當(dāng)條件式1與條件式2都為真時(shí)結(jié)果為真(非0),否則為假(0)邏輯或,格式:條件式1||條件式2當(dāng)條件式1與條件式2都為假時(shí)結(jié)果為假(0),否則為真(非0)邏輯非,格式:!條件式當(dāng)條件式原來(lái)為真(非0),邏輯非后結(jié)果為假(0)。當(dāng)條件式原來(lái)為假(0),邏輯非后結(jié)果為真(非0)。例如:若a=8,b=3,c=0,則!a為假,a&&b為真,b&&c為假。5位運(yùn)算符位運(yùn)算是按位對(duì)變量進(jìn)行運(yùn)算,但并不改變參與運(yùn)算的變量的值。C51中位運(yùn)算符只能對(duì)整數(shù)進(jìn)行操作,不能對(duì)浮點(diǎn)數(shù)進(jìn)行操作。C51中的位運(yùn)算符有:&按位與|按位或^按位異或~按位取反<<左移>>右移【例】設(shè)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復(fù)合賦值運(yùn)算符C51中支持的復(fù)合賦值運(yùn)算符:+=加法賦值-=減法賦值*=乘法賦值/=除法賦值%=取模賦值&=邏輯與賦值|=邏輯或賦值^=邏輯異或賦值~=邏輯非賦值>>=右移位賦值<<=左移位賦值復(fù)合賦值運(yùn)算的一般格式如下:變量復(fù)合運(yùn)算賦值符表達(dá)式它的處理過(guò)程:先把變量與后面的表達(dá)式進(jìn)行某種運(yùn)算,然后將運(yùn)算的結(jié)果賦給前面的變量。7逗號(hào)運(yùn)算符在C51語(yǔ)言中,逗號(hào)“,”是一個(gè)特殊的運(yùn)算符,可以用它將兩個(gè)或兩個(gè)以上的表達(dá)式連接起來(lái),稱(chēng)為逗號(hào)表達(dá)式。逗號(hào)表達(dá)式的一般格式為:

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

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

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

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

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

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

宏名[地址]地址為存儲(chǔ)單元的絕對(duì)地址,一般用十六進(jìn)制形式表示?!纠拷^對(duì)地址對(duì)存儲(chǔ)單元的訪(fǎng)問(wèn)#include<absacc.h>/*將絕對(duì)地址頭文件包含在文件中*/#include<reg52.h>/*將寄

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論