單片機應(yīng)用技術(shù)基礎(chǔ)(C語言)課件:并行IO口應(yīng)用與C語言基礎(chǔ)_第1頁
單片機應(yīng)用技術(shù)基礎(chǔ)(C語言)課件:并行IO口應(yīng)用與C語言基礎(chǔ)_第2頁
單片機應(yīng)用技術(shù)基礎(chǔ)(C語言)課件:并行IO口應(yīng)用與C語言基礎(chǔ)_第3頁
單片機應(yīng)用技術(shù)基礎(chǔ)(C語言)課件:并行IO口應(yīng)用與C語言基礎(chǔ)_第4頁
單片機應(yīng)用技術(shù)基礎(chǔ)(C語言)課件:并行IO口應(yīng)用與C語言基礎(chǔ)_第5頁
已閱讀5頁,還剩58頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

并行I/O口應(yīng)用與C語言基礎(chǔ)任務(wù)3控制8個LED發(fā)光二極管閃爍任務(wù)4流水燈

任務(wù)3控制8個LED發(fā)光二極管閃爍

1.任務(wù)目的了解51系列單片機4個I/O端口的內(nèi)部結(jié)構(gòu),掌握其使用方法,了解單片機C語言基礎(chǔ)。2.任務(wù)要求控制8個LED發(fā)光二極管以某種頻率閃爍,閃爍頻率可調(diào)。3.任務(wù)分析實現(xiàn)此任務(wù)需要設(shè)計相應(yīng)的硬件電路,然后在硬件基礎(chǔ)上編制軟件。硬件上,除了單片機之外,最主要的元件就是LED發(fā)光二極管了。在幾年前的單片機設(shè)計電路中,LED發(fā)光二極管是不能由單片機的I/O輸出引腳直接進(jìn)行驅(qū)動的,而要使用諸如7405等集電極開路門進(jìn)行驅(qū)動,原因就是單片機的引腳不能夠承受LED導(dǎo)通時的電流輸入。隨著新技術(shù)的應(yīng)用和單片機集成技術(shù)的不斷發(fā)展,現(xiàn)在大部分的單片機端口都集成了集電極開路的輸出電路,具備一定外部驅(qū)動能力。但是這時外接的LED發(fā)光二極管電路也必須使用電阻進(jìn)行限流,否則會損壞單片機的輸出引腳,一般單片機驅(qū)動引腳能夠承受的電流輸入在10~15mA左右。此外,如果沒有限流電阻,LED發(fā)光二極管在工作時也會迅速發(fā)熱,為了防止LED發(fā)光二極管過熱損害,也必須采用限流串聯(lián)電阻對LED發(fā)光二極管的功耗進(jìn)行限制,如表3.1所示為典型的LED發(fā)光二極管功率限制指標(biāo)。LED發(fā)光二極管的發(fā)光功率可以由其兩端的電壓和通過LED的電流進(jìn)行計算得到,公式如下:LED發(fā)光二極管的典型的電壓與電流關(guān)系如圖3.1所示,可以根據(jù)需要的LED發(fā)光亮度選擇合適的電阻R進(jìn)行限流,但為了保護(hù)單片機的驅(qū)動輸出引腳,通過LED發(fā)光二極管的電流一般應(yīng)限制在10mA左右,由圖3.1所示曲線可知,也即是將LED發(fā)光二極管的正向電壓限制在2?V左右。對于采用某些高亮度LED發(fā)光二極管照明場合,需要LED發(fā)光二極管通過較大的電流,此時不能采用單片機的輸出引腳直接驅(qū)動LED發(fā)光二極管,而應(yīng)該使用專用的驅(qū)動芯片,或者如圖3.1中右圖所示,采用一個NPN型的三極管進(jìn)行驅(qū)動??梢岳脠D3.1中所示的曲線計算限流電阻R,計算的方法如下:硬件連接上,每個LED發(fā)光二極管對應(yīng)單片機的一個唯一的輸出引腳,即單片機的一個輸出端口(P0、P1、P2或P3)就能夠控制8個LED發(fā)光二極管。當(dāng)相應(yīng)引腳輸出為低時,電流從VCC流入單片機,LED發(fā)光二極管開始發(fā)光,發(fā)光亮度由匹配的串聯(lián)電阻控制;當(dāng)相應(yīng)引腳輸出為高時,沒有電流通過LED發(fā)光二極管,LED發(fā)光二極管熄滅。4.硬件實現(xiàn)本模塊采用8個LED發(fā)光二極管,由AT89S51的P0口進(jìn)行驅(qū)動操作,具體電路設(shè)計如圖3.2所示,P0口的8個輸出引腳分別接到了8個LED發(fā)光二極管的陰極,LED發(fā)光二極管的另一端由阻值為470?Ω的限流電阻上拉至電源VCC。跑馬燈系統(tǒng)的8個限流電阻可以采用普通電阻也可以采用排阻,使用排阻比較有利于節(jié)省PCB布板的空間。5.程序設(shè)計為了實現(xiàn)LED燈閃爍,程序中通過反轉(zhuǎn)P0口的狀態(tài)來開關(guān)LED燈。每次延時一段時間,改變延時時間可調(diào)整閃爍頻率。#inClude<reg51.h>voiddelay(intms);voidmain(){while(1){P0=~P0;delay(1000);} }///延時,當(dāng)ms=1時,在12?MHz的系統(tǒng)上約延時1?ms。參數(shù)ms,延時長度,毫秒數(shù)voiddelay(intms){inti,j;for(i=0;i<ms;i++)for(j=0;j<120;j++);}程序的第一行?#inClude<reg51.h>包含了51單片機硬件資源的定義,一般單片機程序都會使用硬件資源,因此,程序中總應(yīng)該包含這一行。KeilC環(huán)境下,51系列用到的頭文件都放在KEIL_PATH\C51\INC目錄下面,KEIL_PATH表示KeilC的安裝目錄。main函數(shù)中主要是語句while(1),這是一個無限循環(huán),即只要單片機通電,就會執(zhí)行這個循環(huán)。循環(huán)中通過語句P0=~P0完成P0口狀態(tài)的反轉(zhuǎn),P0代表了P0口,其定義在reg51.h文件中,隨后調(diào)用了延時子程序。重復(fù)此過程,就可以達(dá)到LED燈閃爍的效果。延時子程序delay的實現(xiàn)非常直接,通過一個二重空循環(huán)消耗計算機時間。這種延時實際上是軟件延時方式,實現(xiàn)起來較簡單,缺點是難以精確控制延時時間。改變調(diào)用延時子程序的參數(shù),即可改變閃爍的頻率。程序?qū)懲曛螅话阈枰{(diào)試,這可以通過將程序下載到硬件來完成。然而這樣調(diào)試的效率非常低下,我們可以借助仿真軟件來提高調(diào)試的效率。

3.1并行I/O端口電路結(jié)構(gòu)及功能

80C51有4組8位I/O口:P0、P1、P2和P3口,其中P1、P2和P3為準(zhǔn)雙向口,P0則為雙向三態(tài)輸入輸出口,這4個口除了按字節(jié)尋址之外,還可以按位尋址。3.1.1P0口P0口的字節(jié)地址為80H,位地址為80H~87H。P0口的各位口線具有完全相同但僅相互獨立的邏輯電路,P0口的結(jié)構(gòu)電路原理圖如圖3.4所示。1.P0口的組成P0口邏輯電路主要由以下幾部分組成:(1)?2個三態(tài)輸入緩沖器。2個三態(tài)輸入緩沖器分別用于鎖存器數(shù)據(jù)和引腳數(shù)據(jù)的輸入緩沖。(2)?1個多路轉(zhuǎn)接開關(guān)MUX。多路轉(zhuǎn)接開關(guān)MUX的一個輸入來自鎖存器,另一個輸入為“地址/數(shù)據(jù)”。輸入轉(zhuǎn)接由“控制”信號控制。之所以設(shè)置多路轉(zhuǎn)接開關(guān),是因為P0口既可以作為通用的I/O口進(jìn)行數(shù)據(jù)的輸入輸出,又可以作為單片機系統(tǒng)的地址/數(shù)據(jù)線使用。即在控制信號的作用下,由MUX實現(xiàn)鎖存器輸出和地址/數(shù)據(jù)線之間的接通轉(zhuǎn)接。(3)?1個數(shù)據(jù)輸出鎖存器。數(shù)據(jù)輸出鎖存器用于進(jìn)行數(shù)據(jù)位的鎖存。在不同時刻,不同的部件需要不同的信號。比如某一時刻P0.0要求輸出高電平且保持若干時間,在這段時間里,CPU不能停在那里,它還需要與其他部件聯(lián)絡(luò),因此這個數(shù)據(jù)線上的電平未必能保持原來的值不變,這樣輸出將會發(fā)生變化。為了解決這一問題,在每一個輸出端加一個鎖存器。若要某個I/O口輸出數(shù)據(jù),只要將待輸出的數(shù)據(jù)寫入相應(yīng)的I/O口即可,然后CPU就可以去做其他事情,不必再考慮輸出的狀態(tài)。鎖存器會把數(shù)據(jù)“鎖”住,直到CPU下一次改寫數(shù)據(jù)為止。(4)數(shù)據(jù)輸出的驅(qū)動和控制電路。數(shù)據(jù)輸出的驅(qū)動和控制電路由兩只場效應(yīng)管V1、V2組成。2.P0口的使用(1)作為I/O端口使用時的工作原理。當(dāng)P0口作為通用的I/O口使用時,CPU發(fā)出的控制信號為低電平,多路開關(guān)的控制信號為0(低電平)時,P0口作為I/O端口使用,多路開關(guān)的控制信號同時和與門的一個輸入端相連接,此時與門輸出的也是一個0(低電平),V1管截止。P0口用作I/O口線,經(jīng)由數(shù)據(jù)總線向引腳輸出的工作過程:當(dāng)寫鎖存器信號CP有效時,數(shù)據(jù)總線的信號送到鎖存器的輸入端D,通過鎖存器的反向輸出端送到多路開關(guān),經(jīng)由V2,最后到輸出端P0.X。當(dāng)多路開關(guān)的控制信號為低電平0時,與門輸出為低電平,V1管是截止的,所以作為輸出口時,P0是漏極開路輸出,類似于OC門,當(dāng)驅(qū)動上接電流負(fù)載時,需要外接上拉電阻。P0口用作I/O口線,向內(nèi)部數(shù)據(jù)總線輸入的工作過程又分為兩種情況:一種是讀引腳,另一種是讀鎖存器。讀芯片引腳上的數(shù)據(jù),也就是直接讀取外部數(shù)據(jù)。這時使用鎖存器下方的緩沖器,由“讀引腳”信號把緩沖器打開,引腳上的數(shù)據(jù)經(jīng)緩沖器通過內(nèi)部總線讀進(jìn)來。需要說明的是,在P0口作為輸入口讀引腳使用時,應(yīng)先向鎖存器寫“1”(一般用傳送指令),使輸出級的V1、V2截止(系統(tǒng)復(fù)位時P0?=?FFH),如下圖3.5虛線所示。讀鎖存器:通過打開讀鎖存器三態(tài)緩沖器讀取鎖存器輸出端Q的狀態(tài),如圖3.6虛線所示。在輸入狀態(tài)下,從鎖存器和從引腳上讀來的信號一般是一致的,但也有例外。例如,當(dāng)從內(nèi)部總線輸出低電平后,鎖存器Q?=?0,=?1,場效應(yīng)管V2開通,端口線呈低電平狀態(tài)。此時無論端口線上外接的信號是低電平還是高電平,從引腳讀入單片機的信號都是低電平,因而不能正確地讀入端口引腳上的信號。又如,當(dāng)從內(nèi)部總線輸出高電平后,鎖存器Q?=?1,=?0,場效應(yīng)管V2截止。如外接引腳信號為低電平,從引腳上讀入的信號就與從鎖存器讀入的信號不同。為此,51單片機在對端口P0~P3的輸入操作上,有如下約定:凡屬于“讀—修改—寫”方式的指令,從鎖存器讀入信號,其它指令則從端口引腳線上讀入信號。(2)作為地址/數(shù)據(jù)復(fù)用口使用時的工作原理。在訪問外部存儲器時,P0口作為地址/數(shù)據(jù)復(fù)用口使用。此時多路開關(guān)控制信號為1,與門解鎖,與門輸出信號電平由“地址/數(shù)據(jù)”信號決定。多路開關(guān)與反相器的輸出端相連,地址信號經(jīng)“地址/數(shù)據(jù)”線送到反相器,再送至V2場效應(yīng)管柵極,到V2漏極輸出。例如,多路開關(guān)控制信號為1,地址信號為0時,與門輸出低電平,V1管截止;反相器輸出高電平,V2管導(dǎo)通,輸出引腳的地址信號為低電平。反之,多路開關(guān)控制信號為1,地址信號為1,與門輸出為高電平,V1管導(dǎo)通;反相器輸出低電平,V2管截止,輸出引腳的地址信號為高電平??梢?,在輸出“地址/數(shù)據(jù)”信息時,V1、V2管是交替導(dǎo)通的,負(fù)載能力很強,可以直接與外設(shè)存儲器相連,無須增加總線驅(qū)動器。P0口又作為數(shù)據(jù)總線使用。在訪問外部程序存儲器時,P0口輸出低8位地址信息后,將變?yōu)閿?shù)據(jù)總線,以便讀指令碼(輸入)。當(dāng)P0作為地址/數(shù)據(jù)總線使用時,在讀指令碼或輸入數(shù)據(jù)前,CPU自動向P0口鎖存器寫入0FFH,破壞了P0口原來的狀態(tài)。因此,一般情況下不能再作為通用的I/O端口,即程序中不應(yīng)該再含有以P0口作為操作數(shù)(包含源操作數(shù)和目的操作數(shù))的指令。3.1.2P1口P1口的字節(jié)地址為90H,位地址為90H~97H。P1口邏輯電路如圖3.7所示。P1口只能作為通用I/O口使用,所以在電路結(jié)構(gòu)上與P0口有些不同。首先,因為它只傳送數(shù)據(jù),所以不再需要多路轉(zhuǎn)接開關(guān)MUX;其次,由于只用來傳送數(shù)據(jù),因此輸出電路上有上拉電阻,上拉電阻與場效應(yīng)管共同組成輸出驅(qū)動電路。因此這樣電路的輸出不是三態(tài)的,所以P1口是準(zhǔn)雙向口。3.1.3P2口P2口的字節(jié)地址為0A0H,位地址為0A0H~0A7H。P2口的邏輯電路如圖3.8所示。因為在實際應(yīng)用中P2口用于為系統(tǒng)提供高位地址,因此同P0口一樣,在P2口電路中有一個多路轉(zhuǎn)接開關(guān)MUX。但MUX的一個輸入端不再是“地址/數(shù)據(jù)”,而是單一的“地址”,這是因為P2口只作為地址線使用而不作為數(shù)據(jù)線使用。當(dāng)P2口作為高位地址線使用時,多路轉(zhuǎn)接開關(guān)應(yīng)倒向“地址”端。正因為只作為地址使用,P2口的輸出用不著是三態(tài)的,所以P2口也是一個準(zhǔn)雙向口。如果應(yīng)用電路擴(kuò)展了外部存儲器,P2端口就是用來周期性地輸出從外存中取指令的地址(高8位地址),因此,P2端口的多路轉(zhuǎn)換開關(guān)總是在進(jìn)行切換,分時地輸出從內(nèi)部總線來的數(shù)據(jù)和從地址信號線上來的地址。輸出數(shù)據(jù)雖被鎖存,但不是穩(wěn)定地出現(xiàn)在端口線上。其實,這里輸出的數(shù)據(jù)往往也是一種地址,只不過是外部RAM的高8位地址。3.1.4P3口P3口的字節(jié)地址為B0H,位地址為B0H~B7H。P3口是一個多功能口,它除了可以作為I/O口外,還具有第二功能,P3端口的一位結(jié)構(gòu)如圖3.9所示。P3端口和P1端口的結(jié)構(gòu)相似,區(qū)別僅在于P3端口的各端口線有兩種功能選擇。當(dāng)處于第一功能時,第二功能輸出線為1,此時,內(nèi)部總線信號經(jīng)鎖存器和場效應(yīng)管輸入/輸出,其作用與P1端口作用相同,也是準(zhǔn)雙向I/O端口。當(dāng)處于第二功能時,鎖存器輸出1,通過第二輸出功能線輸出特定的內(nèi)含信號。在輸入方面,既可以通過緩沖器讀入引腳信號,還可以通過替代輸入功能讀入片內(nèi)的特定第二功能信號。由于輸出信號鎖存并且有雙重功能,故P3端口為靜態(tài)雙功能端口。在應(yīng)用中,如不設(shè)定P3端口各位的第二功能,則P3端口線自動處于第一功能狀態(tài),也就是靜態(tài)I/O端口的工作狀態(tài)。在更多的場合下是根據(jù)應(yīng)用的需要,把幾條端口線設(shè)置為第二功能,而另外幾條端口線處于第一功能運行狀態(tài)。在這種情況下,不宜對P3端口做字節(jié)操作,需采用位操作的形式。3.1.5P0~P3端口電路小結(jié)P0~P3端口都是并行I/O口,都可用于數(shù)據(jù)的輸入和輸出,但P0口和P2口除了可進(jìn)行數(shù)據(jù)的輸入和輸出外,通常用來構(gòu)建系統(tǒng)的數(shù)據(jù)總線和地址總線,所以在電路中有一個多路轉(zhuǎn)接開關(guān)MUX,以便進(jìn)行兩種用途的轉(zhuǎn)換。而P1口和P3口沒有構(gòu)建系統(tǒng)的數(shù)據(jù)總線和地址總線的功能,因此在電路中沒有多路轉(zhuǎn)接開關(guān)MUX。由于P0口可作為地址/數(shù)據(jù)復(fù)用線使用,需傳送系統(tǒng)的低8位地址或8位數(shù)據(jù),因此MUX的一段為“地址/數(shù)據(jù)”信號。而P2口僅作為高地址線使用,不涉及數(shù)據(jù),所以MUX的一個輸入信號為“地址”。在4個口中只有P0口是一個真正的雙向口,P1~P3口都是準(zhǔn)雙向口。原因是在應(yīng)用系統(tǒng)中,P0口作為系統(tǒng)的數(shù)據(jù)總線使用時,為保證數(shù)據(jù)的正確傳送,需要解決芯片內(nèi)外的隔離問題,即只有在數(shù)據(jù)傳送時芯片才接通,不進(jìn)行數(shù)據(jù)傳送時,芯片內(nèi)外處于隔離狀態(tài)。為此,要求P0的輸出緩沖器是一個三態(tài)門。在P0口輸出三態(tài)門是由兩只場效應(yīng)管組成,所以說它是一個真正的雙向口。而其他的三個口中,上拉電阻代替P0口中的場效應(yīng)管,輸出緩沖器不是三態(tài)的,因此不是真正的雙向口,只能稱其為準(zhǔn)雙向口。P3口的口線具有第二功能,為系統(tǒng)提供一些控制信號。因此在P3口電路中增加了第二功能控制邏輯,這是P3口與其他口的不同之處。3.1.6單片機并行口的應(yīng)用在沒有外擴(kuò)任何芯片時,MCS-51單片機內(nèi)部并行口可以作為輸出口,直接與輸出外設(shè)連接,常用的輸出外設(shè)是發(fā)光二極管;MCS-51單片機內(nèi)部并行口也可以作為輸入口,直接與輸入外設(shè)連接,常用的輸入外設(shè)是開關(guān)。用P1~P3端口驅(qū)動LED發(fā)光二極管,P1~P3端口每一位的驅(qū)動能力,只有P0的一半。當(dāng)端口的某一位為高電平時,可提供較小的電流;當(dāng)端口的某位為低電平(0.45V)時,可提供較大的灌電流,如低電平允許提高,灌電流可相應(yīng)加大。所以,任一個端口想獲得加大的驅(qū)動能力,只能用低電平輸出。例如,使用單片機的并行端口P1~P3直接驅(qū)動發(fā)光二極管,電路如圖3.10所示。P0端口在“讀—修改—寫”指令時,從端口輸入(讀)信號,在單片機內(nèi)加以運算(修改)后,再輸出(寫)到該端口上。下面是幾條“讀—修改—寫”指令的例子。P0=P0&0x3f; ;P0與立即數(shù)3Fh相與后結(jié)果送P0P0=P0|ACC; ;P0與累加器A相或后結(jié)果送P0P0=P0+1; ;P0增一P0=P0-1; ;P0減一這樣安排的原因在于“讀—修改—寫”指令需要得到端口原輸出的狀態(tài),修改后再輸出,讀鎖存器而不是讀引腳,可以避免因外部電路的原因而使原端口的狀態(tài)被讀錯。

3.2C語言基礎(chǔ)知識

3.2.1C語言簡介產(chǎn)生于20世紀(jì)70年代的C語言是一個通用的高級編程語言,它有靈活的語法,提供了結(jié)構(gòu)化的編程手段和豐富的操作符。使用C語言我們可以編寫出高效的代碼。C語言不是為任何特殊應(yīng)用領(lǐng)域而設(shè)計的,一般來說限制較少,可以為各種軟件任務(wù)提供方便和有效的編程。在許多應(yīng)用中,使用C語言比其他語言編程更方便和有效。盡管如此,由于計算機語言的發(fā)展,C語言目前主要應(yīng)用于嵌入式領(lǐng)域的開發(fā)。3.2.2C51簡介本書中的許多代碼是用KeilC51語言寫的,本模塊要介紹的是KeilC51語言,它是美國KeilSoftware公司出品的51系列兼容單片機C語言軟件開發(fā)系統(tǒng),。KeilC51完全支持標(biāo)準(zhǔn)C語言指令,并且在標(biāo)準(zhǔn)C語言基礎(chǔ)之上做了擴(kuò)展,增加了很多用來優(yōu)化8051指令結(jié)構(gòu)的C的擴(kuò)展指令。C51不是一個通用的C語言編譯器,它首先的目標(biāo)是生成針對8051的最快和最緊湊的代碼。C51具有C語言編程的彈性和高效的代碼。Keil提供了包括C編譯器、宏匯編、連接器、庫管理和一個功能強大的仿真調(diào)試器等在內(nèi)的完整開發(fā)方案,通過一個集成開發(fā)環(huán)境將這些部分組合在一起。運行Keil軟件需要Win98、NT、Win2000、WinXP等操作系統(tǒng)。如果使用C語言編程,那么Keil幾乎就是不二之選,即使不使用C語言而僅用匯編語言編程,其方便易用的集成環(huán)境、強大的軟件仿真調(diào)試工具也會令我們事半功倍。深入理解并應(yīng)用C51對標(biāo)準(zhǔn)ANSIC的擴(kuò)展是學(xué)習(xí)C51的關(guān)鍵之一。因為大多數(shù)擴(kuò)展功能都是直接針對8051系列CPU硬件的。這些擴(kuò)展有:(1)?8051存儲類型及存儲區(qū)域。(2)存儲模式。(3)存儲類型聲明。(4)變量類型聲明。(5)位變量與位尋址。(6)特殊功能寄存器(SFR)。(7)?C51指針。(8)函數(shù)屬性。下面是KeilC51擴(kuò)展的關(guān)鍵字:_at_idatasfr16alieninterruptsmallbdatalarge_task_CodebitpdatausingreentrantxdataCompaCtsbitdatasfr

3.3C語言數(shù)據(jù)與運算

3.3.1存儲區(qū)域KeilC51存儲區(qū)域分為程序存儲區(qū)和數(shù)據(jù)存儲區(qū)兩大類型。1.程序存儲區(qū)程序存儲區(qū)是只讀的,不能寫。在C51編譯器中,可用Code存儲類型標(biāo)識符來定義程序存儲區(qū)中的數(shù)據(jù)。編譯器會將其定義在程序存儲器(ROM或者EPPROM)中。該Code存儲區(qū)使用16位尋址,尋址空間可達(dá)到64KB。一般用來存放可執(zhí)行的代碼段,也可以存放數(shù)據(jù)。將變量設(shè)置為Code存儲類型的一般形式如下:標(biāo)識符Code變量名其中,標(biāo)識符為變量的類型,Code為關(guān)鍵字,表示存儲類型為Code。在單片機的Code存儲區(qū),還可以存放代碼的存儲查詢表,通過數(shù)據(jù)指針DPTR和程序計數(shù)器加上累加器的偏移量進(jìn)行尋址。首先,將查詢表首地址裝入指針DPTR中,將表中的尋址偏移量裝入累加器。然后,在執(zhí)行程序的過程中,將這兩者相加,便查詢指定的數(shù)據(jù)。這樣可以大大縮短指令周期,提高程序運行速度。2.數(shù)據(jù)存儲區(qū)數(shù)據(jù)存儲區(qū)域分為內(nèi)部數(shù)據(jù)存儲區(qū)、外部數(shù)據(jù)存儲區(qū)和特殊功能寄存器尋址區(qū)。

(1)內(nèi)部數(shù)據(jù)存儲區(qū)(InternalDataMemory):可以使用關(guān)鍵字“data、iadta、bdata”做相應(yīng)說明。

bdata:可位尋址區(qū),尋址范圍為0X20~0X2F。data:直接尋址區(qū),聲明的數(shù)據(jù)存儲范圍為內(nèi)部RAM低128字節(jié)

0X00~0X7F。

idata:間接尋址區(qū),聲明的數(shù)據(jù)存儲范圍為整個內(nèi)部RAM區(qū)

0X00~0XFF。

(2)外部數(shù)據(jù)存儲區(qū)(External

Data

Memory):可以使用關(guān)鍵字“pdata、xdata”進(jìn)行說明。pdata:主要用于緊湊模式,能訪問1頁(256字節(jié))的外部RAM,即在訪問時使用,pdata定義數(shù)據(jù)時,不會影響P2口的輸出電平(在訪問某些自身內(nèi)部擴(kuò)展的外部RAM時本身就不會影響I/O端口)。

Xdata:可訪問64K的外部數(shù)據(jù)存儲區(qū),地址范圍0X0000~0XFFFF,同pdata一樣在訪問芯片自身內(nèi)部擴(kuò)展的RAM時也不會影響I/O端口。(3)特殊功能寄存器尋址區(qū)域(SpeCiaC

FunCtion

Register

Memory)-SFR:8051提供128字節(jié)的SFR尋址區(qū),該區(qū)域可以字節(jié)尋址、字尋址,能被8整除的地址單元還可以位尋址。該區(qū)域用于控制定時器、計數(shù)器、串口等外圍接口。使用時可用關(guān)鍵字“sfr、sfr16、sbit”做相應(yīng)的聲明。3.3.2存儲模式存儲模式定義缺省的存儲類型,用在函數(shù)參數(shù)、自動變量和沒有直接聲明存儲類型的變量上。在C51編譯器命令行中用small、CompaCt和large控制命令指定存儲模式,共三種。1.?small模式在small模式中,所有的變量缺省的情況下位于8051系統(tǒng)的內(nèi)部數(shù)據(jù)區(qū)(128字節(jié)),這和用data存儲類型標(biāo)識符明確聲明的一樣。在small模式中,變量訪問非常有效。然而,所有的東西包括堆棧必須放在內(nèi)部RAM中,堆棧大小是不確定的,它取決于函數(shù)嵌套的深度。small模式是最好的模式,應(yīng)該盡量使用此模式。small模式的優(yōu)點是訪問速度快,缺點是空間有限,只適用于小程序。2.CompaCt模式在CompaCt模式中,所有變量缺省的都放在外部數(shù)據(jù)區(qū)的某一頁中,這就像用pdata聲明的一樣。這種存儲模式最多可以提供256字節(jié)的變量空間。變量通過寄存器R0和R1間接尋址。CompaCt模式不如small模式有效,因此變量訪問不是很快。當(dāng)用CompaCt模式時,C51編譯器用@R0和@R1作為操作數(shù)的指令訪問外部存儲區(qū)。R0和R1是字節(jié)寄存器,只提供地址的低字節(jié)。如果CompaCt模式使用多于256字節(jié)的外部存儲區(qū),高字節(jié)地址(頁號)由8051的P2口提供。在這種情況下,必須初始化P2口以使用正確的外部存儲頁,這可在起始代碼中實現(xiàn),同時必須為連接器指定pdata的起始地址。CompaCt模式空間較small寬裕,速度較small慢,較large要快,是一種中間狀態(tài)。3.large模式在large模式中,所有變量缺省放在外部數(shù)據(jù)存儲區(qū),可到64KB,這和用xdata存儲類型標(biāo)識符明確聲明的一樣,數(shù)據(jù)指針DPTR用做尋址。通過數(shù)據(jù)指針訪問存儲區(qū)是低效的,這種訪問機制比small或CompaCt模式產(chǎn)生更多的代碼。large模式的優(yōu)點是空間大,可存變量多,缺點是速度較慢。3.3.3數(shù)據(jù)類型KeilC有ANSIC的所有標(biāo)準(zhǔn)數(shù)據(jù)類型。除此之外,為了更加有利地利用8051的結(jié)構(gòu),還加入了一些特殊的數(shù)據(jù)類型,如表3.3所示。1.標(biāo)準(zhǔn)C語言中的基本數(shù)據(jù)類型在標(biāo)準(zhǔn)C語言中基本的數(shù)據(jù)類型為Char、int、short、long、float和double、Char、int、short、long又分為有符號(signed,通常省略不寫)和無符號(unsigned)兩類,在此不做詳細(xì)敘述。2.C51擴(kuò)展的數(shù)據(jù)類型KeilC中的指針類型與標(biāo)準(zhǔn)C有所不同,C51編譯器提供兩個類型的指針:通用指針和指定存儲區(qū)指針。通用指針用三個字節(jié)保存,第一個字節(jié)是存儲類型,第二個是偏移的高字節(jié),第三是偏移的低字節(jié)。通用指針可訪問8051存儲空間內(nèi)的任何變量,許多C51庫函數(shù)因而用了這些指針類型。通過這些通用指針,函數(shù)可以訪問存儲區(qū)中的所有數(shù)據(jù)。指定存儲區(qū)的指針在指針的聲明中包含一個存儲類型標(biāo)識符,指向一個確定的存儲區(qū)。此外,C51擴(kuò)展了4種類型。下面分別介紹。(1)?bit。51系列單片機具有很強的位處理能力,相應(yīng)地,C51提供了bit類型。bit類型定義一個可直接位操作的二進(jìn)制位,可用在變量聲明、參數(shù)列表和函數(shù)返回值中。所有的bit變量放在8051內(nèi)部存儲區(qū)的位段(即bdata區(qū)),因為這區(qū)域只有16字節(jié)長,所以在某個范圍內(nèi)只能聲明最多128個位變量。bitflag; /*bit變量*/statiCbitdone=0;/*靜態(tài)bit變量(2)?sbit??捎胹bit類型的變量尋址在bdata區(qū)定義的變量的二進(jìn)制位。用bdata存儲類型定義的變量必須是全局的,必須如下定義變量:intbdataibase;/*可位尋址的int變量*/Charbdatabary[4];/*可位尋址的數(shù)組*/變量ibase和bary是位可尋址的,因此這些變量的每個位是可直接訪問和修改的。用sbit關(guān)鍵字定義新的變量,以訪問用bdata定義的變量的位。聲明中包含的sbit類型,要求基目標(biāo)用存儲類型bdata定義,唯一的例外是特殊功能寄存器變量,用sfr定義。(3)?sfr特殊功能寄存器。sfr也是C51擴(kuò)充的數(shù)據(jù)類型,占用一個內(nèi)存單元,值域為0~255,利用它可以訪問51單片機內(nèi)部的所有特殊功能寄存器。定義方法如下:sfr特殊功能寄存器名=地址常數(shù)(4)?sfr1616位特殊功能寄存器在新一代的8051單片機中,特殊功能寄存器經(jīng)常組合成16位來使用。采用關(guān)鍵字sfr16可以定義這種16位的特殊功能寄存器。sfr16也是C51擴(kuò)充的數(shù)據(jù)類型,占用兩個內(nèi)存單元,值域為0~65535。下面是reg51.h文件的內(nèi)容(類型sfr、sbit的說明請參見3.3.5數(shù)據(jù)類型部分):/*------------------------------------------------------------------------REG51.HHeaderfileforgeneriC80C51and80C31miCroController.Copyright(C)1988-2002KeilElektronikGmbHandKeilSoftware,InC.Allrightsreserved.-------------------------------------------------------------------------*/#ifndef__REG51_H__#define__REG51_H__/*BYTERegister*/sfrP0=0x80;sfrP1=0x90;sfrP2=0xA0;sfrP3=0xB0;sfrPSW=0xD0;sfrACC=0xE0;sfrB=0xF0;sfrSP=0x81;sfrDPL=0x82;sfrDPH=0x83;sfrPCON=0x87;sfrTCON=0x88;sfrTMOD=0x89;sfrTL0=0x8A;sfrTL1=0x8B;sfrTH0=0x8C;sfrTH1=0x8D;sfrIE=0xA8;sfrIP=0xB8;sfrSCON=0x98;sfrSBUF=0x99;/*BITRegister*//*PSW*/sbitCY=0xD7;sbitAC=0xD6;sbitF0=0xD5;sbitRS1=0xD4;sbitRS0=0xD3;sbitOV=0xD2;sbitP=0xD0;/*TCON*/sbitTF1=0x8F;sbitTR1=0x8E;sbitTF0=0x8D;sbitTR0=0x8C;sbitIE1=0x8B;sbitIT1=0x8A;sbitIE0=0x89;sbitIT0=0x88;/*IE*/sbitEA=0xAF;sbitES=0xAC;sbitET1=0xAB;sbitEX1=0xAA;sbitET0=0xA9;sbitEX0=0xA8;/*IP*/sbitPS=0xBC;sbitPT1=0xBB;sbitPX1=0xBA;sbitPT0=0xB9;sbitPX0=0xB8;/*P3*/sbitRD=0xB7;sbitWR=0xB6;sbitT1=0xB5;sbitT0=0xB4;sbitINT1=0xB3;sbitINT0=0xB2;sbitTXD=0xB1;sbitRXD=0xB0;/*SCON*/sbitSM0=0x9F;sbitSM1=0x9E;sbitSM2=0x9D;sbitREN=0x9C;sbitTB8=0x9B;sbitRB8=0x9A;sbitTI=0x99;sbitRI=0x98;#endif從上面代碼中可以看出,該頭文件中定義了單片機內(nèi)部所有的功能寄存器,包括前面所講的sfr和sbit這兩個關(guān)鍵字,在程序中可以直接操作P0~P3口。3.3.4常量與變量1.常量在程序運行過程中,其值不能被改變的量稱為常量。根據(jù)數(shù)據(jù)類型來劃分,常量分為整型常量、浮點型常量、字符型常量,還有字符串常量。(1)整型常量。整型常量可以是長整型、短整型、有符號型、無符號型,其取值范圍取決于類型的大小??梢灾付ㄒ粋€整型常量為十進(jìn)制、八進(jìn)制或十六進(jìn)制。常量的前面有符號0x,這個符號表示該常量是十六進(jìn)制表示。如果前面的符號只有一個數(shù)字0,那么表示該常量是八進(jìn)制。有時我們在常量的后面加上符號L或者U,來表示該常量是長整型或者無符號整型。后綴可以是大寫,也可以是小寫。(2)浮點型常量。一個浮點型常量由整數(shù)和小數(shù)兩部分構(gòu)成,中間用十進(jìn)制的小數(shù)點隔開。有些浮點數(shù)非常大或者非常小,用普通方法不容易表示,可以用指數(shù)方法表示。比如:3.14159是小數(shù)形式,而1.2345E-12和2.2323E+101都是指數(shù)形式(如同數(shù)學(xué)里面的科學(xué)計數(shù)法)。浮點常數(shù)只有一種進(jìn)制(十進(jìn)制),絕對值小于1的浮點數(shù),其小數(shù)點前面的零可以省略。(3)字符型常量。字符型常量所表示的值是字符型變量所能包含的值,我們可以ASCII表達(dá)式來表示一個字符型常量,或者用轉(zhuǎn)義字符來表示一個字符型常量。單引號內(nèi)加反斜杠表示轉(zhuǎn)義字符,\x表示字符ASCII編碼的十六進(jìn)制形式,\0表示字符ASCII編碼的八進(jìn)制數(shù)形式。如表3.4所示。(4)字符串常量。字符串常量就是一串字符,用雙引號括起來表示。字符串常量是一對用雙引號括起來的若干字符序列。字符串中字符的個數(shù)稱為字符的長度,長度為0的字符串稱為空串。

C語言中存儲字符串常量時,系統(tǒng)會在字符串的末尾自動加一個‘\0’作為字符串結(jié)束的標(biāo)志。(5)位類型。位類型的值是一個二進(jìn)制。2.變量變量代表內(nèi)存中具有特定屬性的一個存儲單元,它用來存放數(shù)據(jù),這就是變量的值,在程序運行期間,這些值是可以改變的。變量名實際上是以一個名字對應(yīng)代表一個地址,在對程序編譯連接時由編譯系統(tǒng)給每一個變量名分配對應(yīng)的內(nèi)存地址。從變量中取值,實際上是通過變量名找到相應(yīng)的內(nèi)存地址,從該存儲單元中讀取數(shù)據(jù)。C語言規(guī)定變量名(標(biāo)識符)只能由字母、數(shù)字和下劃線三種字符組成,且第一個字符必須為字母或下劃線。變量必須先定義后使用。C語言區(qū)分大小寫,也就是說,ABC和abC是2個不同的變量。C語言中的變量分為全局變量和局部變量。

(1)局部變量。main(){inti=10;/*局部變量i,其有效范圍只main函數(shù)內(nèi)*/i=i+1;┇}局部變量的默認(rèn)類型為auto,存放在動態(tài)存儲區(qū)的棧中,隨著函數(shù)調(diào)用的結(jié)束而彈出釋放,生命周期為定義該變量的函數(shù)的生命周期。而靜態(tài)變量(statiC)

存放在靜態(tài)存儲區(qū)內(nèi),某個特定函數(shù)的局部變量,只能在該函數(shù)中使用,但它與自動變量不同的是,不管其所在函數(shù)是否被調(diào)用,它都一直存在,而不像自動變量那樣,隨著所在函數(shù)的被調(diào)用和退出而存在和消失。一般用于不丟失、不重復(fù)的計數(shù)。(2)全局變量。全局變量聲明在函數(shù)之外,默認(rèn)為extern類型,全局變量(extern)對全局可見,不僅可以在文件內(nèi)調(diào)用,還可以在文件外使用。而內(nèi)部變量則只可以在定義該變量的文件內(nèi)使用,因此不會和同一程序其他文件中相同名字的變量沖突。全局變量一般存放在系統(tǒng)的靜態(tài)存儲區(qū)里。3.3.5運算符和表達(dá)式1.運算符運算符就是完成某種特定的運算的符號。運算符按其表達(dá)式中與運算符的關(guān)系可分為單目運算符、雙目運算符和三目運算符。單目就是指需要有一個運算對象,雙目就要求有兩個運算對象,三目則要三個運算對象。C語言的內(nèi)部運算符很豐富,運算符代表計算機執(zhí)行的某種操作。C語言運算符的運算優(yōu)先級共分為15級,1級最高,15級最低。在表達(dá)式中,優(yōu)先級較高的先于優(yōu)先級較低的進(jìn)行運算。在一個操作數(shù)兩側(cè)的運算符優(yōu)先級相同時,則按運算符的結(jié)合性所規(guī)定的結(jié)合方向處理。C語言中各運算符的結(jié)合性分為兩種,即左結(jié)合性(自左至右)和右結(jié)合性(自右至左)。最典型的右結(jié)合性運算符是賦值運算符,如x=y=z,由于賦值運算的右結(jié)合性,應(yīng)先執(zhí)行y=z,再執(zhí)行x=(y=z)運算。C語言運算符中有不少為右結(jié)合性,應(yīng)注意區(qū)別,以避免理解錯誤。一般而言,C51針對硬件編程,很多時候需要直接操作某些二進(jìn)制位,所以如果在C51中靈活地使用位運算,可以有效地提高程序的運行效率。C語言提供了六種位運算符:&、|、^、~、<<、>>。下面介紹這些位運算符的用法。(1)按位與運算。按位與運算符“&”是雙目運算符,其功能是參與運算的兩數(shù)各對應(yīng)的二進(jìn)位相與。只有對應(yīng)的兩個二進(jìn)位均為1時,結(jié)果位才為1,否則為0。參與運算的數(shù)以補碼方式出現(xiàn)。按位與運算通常用來對某些位清0或保留某些位。(2)按位或運算。按位或運算符“|”是雙目運算符,其功能是參與運算的兩數(shù)各對應(yīng)的二進(jìn)位相或。只要對應(yīng)的二個二進(jìn)位有一個為1時,結(jié)果位就為1。參與運算的兩個數(shù)均以補碼出現(xiàn)。(3)按位異或運算。按位異或運算符“^”是雙目運算符,其功能是參與運算的兩數(shù)各對應(yīng)的二進(jìn)位相異或,當(dāng)兩對應(yīng)的二進(jìn)位相異時,結(jié)果為1。參與運算數(shù)仍以補碼出現(xiàn)。(4)求反運算。求反運算符~為單目運算符,具有右結(jié)合性,其功能是對參與運算的數(shù)的各二進(jìn)位按位求反。(5)左移運算。左移運算符“<<”是雙目運算符,其功能是把“<<”左邊的運算數(shù)的各二進(jìn)位全部左移若干位,由“<<”右邊的數(shù)指定移動的位數(shù),高位丟棄,低位補0。(6)右移運算。右移運算符“>>”是雙目運算符,其功能是把“>>”左邊的運算數(shù)的各二進(jìn)位全部右移若干位,“>>”右邊的數(shù)指定移動的位數(shù)。2)個性一個品牌有一種個性,即品牌要有性格,如果我們用人的形象來描述品牌,那么我們會逐漸形成談?wù)撛摦a(chǎn)品或服務(wù)的擬人化的印象。自1970年個性成了品牌的中心,許多美國廣告公司都將其作為所有傳播活動的前提。TedBates創(chuàng)立了新的USP(獨特銷售個性),而Grey廣告公司將個性作為他們對品牌的定義,Ewn-RSLG廣告公司將體格和個性作為所有品牌傳播的兩大支柱,并認(rèn)為這是傳播風(fēng)格的源泉。這種情況解釋了為什么品牌性格會盛行,以及企業(yè)為什么會大量使用發(fā)言人、明星或動物賦予品牌個性的簡單方法。3)文化品牌從各產(chǎn)品中提煉出自己的文化。產(chǎn)品是物質(zhì)的體現(xiàn)和文化的指向。文化包含了價值觀系統(tǒng)、靈感的來源和品牌力量。文化與統(tǒng)領(lǐng)品牌對外標(biāo)記的基本準(zhǔn)則相關(guān)聯(lián)。文化是識別固有的一面,它是品牌的主要動力。4)關(guān)系品牌也體現(xiàn)出一種關(guān)系。它經(jīng)常為人們之間的無形溝通提供機會,這會在服務(wù)業(yè)中尤甚。2.表達(dá)式表達(dá)式則是由運算及運算對象所組成的具有特定含義的式子。C語言是一種表達(dá)式語言,表達(dá)式后面加“;”號就構(gòu)成一個表達(dá)式語句。表達(dá)式由常量、變量、運算符組合而成。任何表達(dá)式都返回結(jié)果值,表達(dá)式返回的結(jié)果值是有類型的。表達(dá)式隱含的數(shù)據(jù)類型取決于組成表達(dá)式的變量和常量的類型。

任務(wù)4流水燈

有了前面控制8個LED發(fā)光二極管閃爍的基礎(chǔ),我們進(jìn)一步做一個流水燈的效果。1.任務(wù)目的進(jìn)一步熟悉單片機并行口的操作,了解單片機C語言循環(huán)語句的使用。2.任務(wù)要求控制8個LED發(fā)光二極管循環(huán)依次點亮。3.硬件電路本實驗的硬件電路設(shè)計與任務(wù)3完全相同(如圖3.2所示),通過P0口控制8個LED燈,低電平亮,高電平滅。4.程序設(shè)計#include<reg51.h>voiddelay(intms);voidmain(){while(1){if(P0==0xff)P0=0xfe;delay(400);P0<<=1;P0|=1;} }voiddelay(intms){inti,j;for(i=0;i<ms;i++)for(j=0;j<120;j++);}單片機復(fù)位后,P0口的值為0xff,語句if(P0==0xff)P0=0xfe;將P0設(shè)定為初始點亮一盞LED燈。延時之后,改變P0的值,熄滅當(dāng)前點亮的燈,同時點亮下一盞燈,這是通過將P0口循環(huán)移位來實現(xiàn)的。第1次是機器復(fù)位時的狀態(tài),第10次又回到此狀態(tài)。重復(fù)這個過程,依次點亮8個LED燈。完成一輪8個燈的流水之后,P0口會變成0xff,再一次通過if語句改變P0口的值,程序?qū)⒅貜?fù)后面的邏輯。本程序中使用2條語句實現(xiàn)P0口的循環(huán)移位,我們也可以包含intrins.h頭文件,此文件包含一些移位函數(shù),使用這些函數(shù)可以簡化代碼,修改后的程序如下:#include<reg51.h>#include<intrins.h>voiddelay(intms);voidmain(){P0=0xfe;while(1){delay(400);P0=_crol_(P0,1); } }voiddelay(intms){inti,j;for(i=0;i<ms;i++)for(j=0;j<120;j++);}函數(shù)_crol_在內(nèi)部函數(shù)庫intrins.h中,_crol_表示循環(huán)左移,(P0,1)中“P0”表示要移位的對象為P0,“1”表示移動的位數(shù)為一位。函數(shù)_crol_(P0,1)表示將P0口循環(huán)左移一位。

3.4C語言的基本語句

3.4.1表達(dá)式語句和復(fù)合語句1.表達(dá)式語句C語言的表達(dá)式由運算符、常量及變量構(gòu)成。通常C語言表達(dá)式的運算基本遵循一般數(shù)學(xué)規(guī)則。同一表達(dá)式中允許出現(xiàn)不同類型常量及變量,C語言將它們變換為同一類型的量,C語言的編譯程序?qū)⑺胁僮鲾?shù)變換為與最大類型操作數(shù)同類型,變換以一次一個運算的方式進(jìn)行。在51單片機的C語言中,則是加入分號“;”構(gòu)成表達(dá)式語句。2.復(fù)合語句復(fù)合語句是用花括號括起來的語句序列。C語言中的語句簡單地劃分為單條語句和復(fù)合語句兩類。單條語句是指只有一條語句,而復(fù)合語句是指多條語句的總稱。但是,多條語句用花括號括起來才稱復(fù)合語句,沒有用花括號括起的若干條單條語句只能稱為語句序列。所以,復(fù)合語句是一種特殊的語句序列,它被一對花括號括起來,它在程序中被看做是一條語句。一般地說,凡是可以出現(xiàn)一條語句的地方都可以出現(xiàn)復(fù)合語句。復(fù)合語句是C語言程序中常用的語句形式之一。在復(fù)合語句內(nèi)部還可以包含有復(fù)合語句,即復(fù)合語句可以嵌套。復(fù)合語句常用作if語句的if體、else體和elseif體以及循環(huán)語句的循環(huán)體等。3.4.2選擇語句現(xiàn)代高級語言提供了三種結(jié)構(gòu)用于程序設(shè)計:順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。選擇結(jié)構(gòu)又稱為分支結(jié)構(gòu),在選擇結(jié)構(gòu)程序設(shè)計中,根據(jù)條件的判斷情況需要選擇不同的語句組執(zhí)行。C語言提供了if語句和switch語句實現(xiàn)選擇結(jié)構(gòu)。if語句根據(jù)給定的條件表達(dá)式進(jìn)行判斷,決定執(zhí)行某個分支中的程序段。switch語句根據(jù)給定的整型表達(dá)式的值進(jìn)行判斷,然后決定執(zhí)行多個分支中的某一個分支。1.?if語句if語句有兩種形式。第一種形式:if(表達(dá)式)語句塊1;else語句塊2;其語義是:如果表達(dá)式的值為真,則執(zhí)行語句塊1,否則執(zhí)行語句塊2,其流程如圖3.11所示。第二種形式:if(表達(dá)式)語句塊其語義是:如果表達(dá)式的值為真,則執(zhí)行其后的語句,否則不執(zhí)行該語句,其過程可表示如圖3.12所示。單個if語句只能用于兩個分支的情況。當(dāng)有多個分支選擇時,可采用嵌套的if語句。如果嵌套的if語句的else分支僅包含一條if語句,則可以寫成多條件分支形式:if(表達(dá)式1)語句1;elseif(表達(dá)式2)語句2;elseif(表達(dá)式3)語句3;…elseif(表達(dá)式m)語句m;else語句n;其語義是:依次判斷表達(dá)式的值,當(dāng)出現(xiàn)某個值為真時,則執(zhí)行其對應(yīng)的語句。然后跳到整個if語句之外繼續(xù)執(zhí)行程序。如果所有的表達(dá)式均為假,則執(zhí)行語句n。然后繼續(xù)執(zhí)行后續(xù)程序。if-else-if語句的執(zhí)行過程如圖3.13所示。2.switch語句前面學(xué)習(xí)了if語句,用多個if語句可以實現(xiàn)多方向條件分支,但是可以發(fā)現(xiàn),使用過多的if語句實現(xiàn)多方向分支會使條件語句嵌套過多,程序冗長,很不好讀。這時如果使用開關(guān)語句,不但可以達(dá)到處理多分支選擇的目的,而且還可以使程序結(jié)構(gòu)清晰。開關(guān)語句的語法如下:switch(表達(dá)式){case常量表達(dá)式1:語句塊1;break;case常量表達(dá)式2:語句塊2;break;…case常量表達(dá)式n:語句塊n;break;default:語句塊n+1;break;}其語義是:計算表達(dá)式的值,并逐個與其后的常量表達(dá)式值相比較,當(dāng)表達(dá)式的值與某個常量表達(dá)式的值相等時,即執(zhí)行其后的語句,然后不再進(jìn)行判斷,也就不再繼續(xù)執(zhí)行后面所有case后的語句。如表達(dá)式的值與所有case后的常量表達(dá)式均不相同時,則執(zhí)行default后的語句。在使用switch語句時還應(yīng)注意以下幾點:(1)在case后的各常量表達(dá)式的值不能相同,否則會出現(xiàn)錯誤。(2)在case后,允許有多個語句,可以不用{}括起來。(3)各case和default子句的先后順序可以變動,而不會影響程序執(zhí)行結(jié)果。(4)?default子句可以省略不用。(5)?break用于結(jié)束switch語句,可根據(jù)實際情況決定是否使用。3.4.3循環(huán)語句在許多實際問題中,需要進(jìn)行具有規(guī)律性的重復(fù)操作,如求累加和、數(shù)據(jù)塊的搬移等。而計算機的基本特征之一就是具有重復(fù)執(zhí)行一組語句的能

溫馨提示

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

評論

0/150

提交評論