版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
項(xiàng)目四單片機(jī)輸入輸出控制
4.1項(xiàng)目基本技能
4.2項(xiàng)目基本知識(shí)4.3技能拓展4.4互動(dòng)環(huán)節(jié)4.5習(xí)題任務(wù)1霓虹燈控制
1.任務(wù)要求單片機(jī)控制8個(gè)LED燈,依次點(diǎn)亮每一個(gè)LED燈,實(shí)現(xiàn)霓虹燈的效果。
2.硬件電路設(shè)計(jì)
1)電路圖電路圖參見(jiàn)項(xiàng)目二任務(wù)3的圖2-41。4.1項(xiàng)目基本技能
2)電路圖說(shuō)明從圖2-41可以看出,當(dāng)P1.0~P1.7中某個(gè)引腳輸出低電平“0”時(shí),則發(fā)光二極管上有電流流過(guò),發(fā)光二極管發(fā)光;當(dāng)對(duì)應(yīng)引腳為高電平“1”時(shí),發(fā)光二極管上無(wú)電流流過(guò),發(fā)光二極管熄滅。
3.軟件設(shè)計(jì)
1)設(shè)計(jì)方法根據(jù)圖2-41,若每次點(diǎn)亮一個(gè)LED燈,則對(duì)應(yīng)的P1口各引腳的狀態(tài)有8種,如表4-1所示。表4-1P1口的狀態(tài)
2)流程圖用流程圖表示指令的執(zhí)行過(guò)程,如圖4-1所示。圖4-1霓虹燈控制流程圖
3)指令代碼
(1)編寫匯編語(yǔ)言代碼。用匯編語(yǔ)言編寫的指令代碼如下:
偽指令ORG、END不是單片機(jī)的可執(zhí)行指令,ORG指定程序存放的位置,END表示程序編寫完成,要放在程序的最后面。匯編指令中的立即數(shù)既可以用二進(jìn)制表示,也可以用十六進(jìn)制、十進(jìn)制表示,如:
MOVP1,#11111011B可寫為
MOVP1,#0FBH或MOVP1,#251子程序是指能完成明確任務(wù)、具有獨(dú)立功能且能被其他程序反復(fù)調(diào)用的程序段。調(diào)用子程序的源程序稱為主程序。子程序的首地址必須要用標(biāo)號(hào),該標(biāo)號(hào)就是這個(gè)子程序的名稱。如DELAY子程序,子程序的最后要設(shè)置一條返回指令RET。(2)編寫C語(yǔ)言代碼。用C語(yǔ)言編寫的指令代碼如下:
單片機(jī)的P0、P1、P2、P3口,在頭文件reg51.h中對(duì)它們進(jìn)行了定義。程序開(kāi)始包含了頭文件reg51.h,所以直接對(duì)P0、P1、P2、P3進(jìn)行操作。語(yǔ)句P1=0xfe;在C語(yǔ)言中表示給變量P1賦值0xfe;P1又是單片機(jī)的輸出端口,但這里是輸出到單片機(jī)的引腳控制燈的亮滅。
C語(yǔ)言中,函數(shù)遵循先聲明后調(diào)用的原則。如果源程序中包括很多函數(shù),通常在主函數(shù)的前面集中聲明,然后再在主函數(shù)后面一一進(jìn)行定義,這樣編寫的C語(yǔ)言源代碼可讀性好,條理清晰,易于理解。例如delay函數(shù)的聲明與調(diào)用。
在delay子函數(shù)中,包含兩重for(?)循環(huán)語(yǔ)句,for(k=0;k<i;k++)為外循環(huán),表達(dá)式1為“k=0”,執(zhí)行一次,當(dāng)滿足表達(dá)式2“k<i”時(shí),執(zhí)行內(nèi)循環(huán)體“for(j=0;j<255;j++);”。內(nèi)循環(huán)體的執(zhí)行過(guò)程是:j=0執(zhí)行一次,然后進(jìn)行判斷是否滿足表達(dá)式2“j<255”,滿足則執(zhí)行空語(yǔ)句“;”,之后執(zhí)行表達(dá)式3“j++”,結(jié)果j=1,重復(fù)執(zhí)行上述過(guò)程,直到不滿足表達(dá)式2,退出內(nèi)循環(huán),這樣空語(yǔ)句執(zhí)行了255次。然后執(zhí)行外循環(huán)語(yǔ)句表達(dá)式3“k++”,結(jié)果k=1,再重新判斷,直到不滿足“k<i”時(shí)結(jié)束循環(huán)。從以上語(yǔ)句執(zhí)行過(guò)程可計(jì)算出空語(yǔ)句執(zhí)行了255×i次,實(shí)現(xiàn)了延時(shí)的作用。在主函數(shù)中,通過(guò)改變實(shí)參的值可調(diào)整延時(shí)時(shí)間的長(zhǎng)短,本程序?qū)崊⑷≈禐?00。
4.電路板制作
1)準(zhǔn)備器件參照項(xiàng)目二任務(wù)3。
2)用面包板連接電路參照項(xiàng)目二任務(wù)3。
3)調(diào)試運(yùn)行在Keil環(huán)境中,對(duì)源程序A4_1.ASM或C4_1.C進(jìn)行編輯、匯編或編譯,生成機(jī)器代碼并下載到芯片里,接通電路板電源,可觀察到霓虹燈的顯示效果。任務(wù)2開(kāi)關(guān)輸入控制
1.任務(wù)要求用8位指撥開(kāi)關(guān)作為輸入設(shè)備,控制輸出端口連接的8個(gè)LED燈。當(dāng)開(kāi)關(guān)為ON時(shí),則相應(yīng)的LED燈就會(huì)被點(diǎn)亮。
2.硬件電路設(shè)計(jì)
1)電路圖開(kāi)關(guān)控制電路如圖4-2所示。圖4-2開(kāi)關(guān)控制電路圖
2)電路圖說(shuō)明單片機(jī)P1口作為輸入端口接有一組8個(gè)撥動(dòng)開(kāi)關(guān),開(kāi)關(guān)的另一端接地。當(dāng)開(kāi)關(guān)向右撥動(dòng)(ON)時(shí),P1端口對(duì)應(yīng)的引腳與地相接,此時(shí)引腳為低電平;當(dāng)開(kāi)關(guān)向左撥動(dòng)(OFF)時(shí),P1端口對(duì)應(yīng)的引腳與地?cái)嚅_(kāi),此時(shí)引腳為高電平。單片機(jī)P2口作為輸出端口接有8個(gè)LED燈,若引腳輸出低電平,與之相連接的LED燈被點(diǎn)亮;若引腳輸出高電平,與之相連接的LED燈熄滅。
3.軟件設(shè)計(jì)
1)設(shè)計(jì)方法
P1口作為輸入端口,它的值就是開(kāi)關(guān)的狀態(tài),它的值與開(kāi)關(guān)狀態(tài)的對(duì)應(yīng)關(guān)系如表4-2所示,P1口的值送給P2,由P2口輸出控制燈。表4-2P1口的值與開(kāi)關(guān)狀態(tài)的對(duì)應(yīng)關(guān)系
2)流程圖指令的執(zhí)行過(guò)程如圖4-3所示。圖4-3開(kāi)關(guān)輸入控制流程圖
3)指令代碼
(1)編寫匯編語(yǔ)言代碼。用匯編語(yǔ)言編寫的指令代碼如下:
匯編語(yǔ)言規(guī)定,當(dāng)立即數(shù)第一位數(shù)為字母時(shí),前面要加0,如指令MOVP1,#0FFH中的立即數(shù)FFH前的“0”。
(2)編寫C語(yǔ)言代碼。用C語(yǔ)言編寫的指令代碼如下:※※※※※※※※※※※※※※※※※※※※※※※※//程序名:C4_2.C//功能:輸入到P1口的狀態(tài)送給P2口輸出顯示#include<reg51.h>voidmain() //主函數(shù){ while(1) //無(wú)限循環(huán)執(zhí)行下面括號(hào)中的語(yǔ)句
{
P1=0xff; //設(shè)置P1為輸入口
P2=P1; //P1值賦給P2
}}※※※※※※※※※※※※※※※※※※※※※※※※
語(yǔ)句While(1){循環(huán)體},表示無(wú)限循環(huán)執(zhí)行花括號(hào)中的循環(huán)體語(yǔ)句。若花括號(hào)中的循環(huán)體為一條空語(yǔ)句,如while(1)表示循環(huán)執(zhí)行空語(yǔ)句,即為死循環(huán),通常把該語(yǔ)句作為停機(jī)語(yǔ)句使用。4.電路板制作(1)準(zhǔn)備器件。按表4-3準(zhǔn)備元器件。表4-3開(kāi)關(guān)輸入控制電路元器件清單
(2)編譯或匯編源程序C4_2.C或A4_2.ASM,生成目標(biāo)代碼文件,將目標(biāo)代碼燒錄到芯片中,參照?qǐng)D4-2,用面包板搭接的電路板如圖4-4所示。
接通電源,將撥碼開(kāi)關(guān)對(duì)應(yīng)位置撥到“ON”位置,相應(yīng)的LED燈點(diǎn)亮。圖4-4開(kāi)關(guān)輸入控制電路板知識(shí)點(diǎn)1單片機(jī)的輸入輸出口
任務(wù)1中,電路板通電后,發(fā)光二極管隨著程序的運(yùn)行,有規(guī)律地閃動(dòng),那么,單片機(jī)是怎樣將程序中運(yùn)行的結(jié)果送給發(fā)光二極管的呢?4.2項(xiàng)目基本知識(shí)原來(lái),單片機(jī)上有4組8位輸入輸出I/O口:P0、P1、P2和P3口,P1、P2和P3為準(zhǔn)雙向口,P0口則為雙向三態(tài)輸入輸出口,它們?cè)趩纹瑱C(jī)中,主要承擔(dān)了和單片機(jī)外部設(shè)備打交道的任務(wù),下面分別來(lái)介紹。
1.P0口
P0口的一位引腳邏輯電路如圖4-5所示。它由一個(gè)輸出鎖存器、兩個(gè)三態(tài)輸入緩沖器和輸出驅(qū)動(dòng)電路及控制電路組成。從圖中可以看出,P0口既可以作為通用I/O用,也可以作為地址/數(shù)據(jù)線用。圖4-5P0口某個(gè)引腳邏輯電路
1)作為通用I/O口使用
(1)作為輸出使用。CPU發(fā)出控制電平“0”封鎖“與”門,將輸出上拉場(chǎng)效應(yīng)管T1截止,同時(shí)使用多路開(kāi)關(guān)MUX把鎖存器與輸出驅(qū)動(dòng)場(chǎng)效應(yīng)管T2的柵極接通,故內(nèi)部總線與P0口同相。由于輸出驅(qū)動(dòng)級(jí)是漏極開(kāi)路電路,若驅(qū)動(dòng)NMOS或其他拉流負(fù)載時(shí),需要外接上拉電阻。P0口的輸出級(jí)可驅(qū)動(dòng)8個(gè)LSTTL負(fù)載。
(2)作為輸入使用。當(dāng)P0口作為輸入數(shù)據(jù)使用時(shí),分讀引腳和讀鎖存器兩種情況,為此在電路中有兩個(gè)用于讀入驅(qū)動(dòng)的三態(tài)緩沖器。所謂讀引腳,就是讀芯片引腳的狀態(tài),這時(shí)使用下方的數(shù)據(jù)緩沖器,由“讀引腳”信號(hào)把緩沖器打開(kāi),把端口引腳上的數(shù)據(jù)從緩沖器通過(guò)內(nèi)部總線讀進(jìn)來(lái)。讀引腳需先向電路中的鎖存器寫入“1”,使輸出級(jí)的FET截止,引腳處于懸浮狀態(tài),變?yōu)楦咦杩馆斎?,這就是所謂的準(zhǔn)雙向口。讀鎖存器是指通過(guò)上面的緩沖器讀鎖存器Q端的狀態(tài)。
2)作為地址/數(shù)據(jù)線使用除了I/O功能以外,在進(jìn)行單片機(jī)系統(tǒng)擴(kuò)展時(shí),P0口是作為單片機(jī)系統(tǒng)的地址/數(shù)據(jù)線使用的,一般稱為地址/數(shù)據(jù)分時(shí)復(fù)用引腳。當(dāng)輸出地址或數(shù)據(jù)時(shí),由內(nèi)部發(fā)出控制信號(hào),使“控制”端為高電平,打開(kāi)與門,并使多路開(kāi)關(guān)MUX處于內(nèi)部地址/數(shù)據(jù)線與驅(qū)動(dòng)場(chǎng)效應(yīng)管柵極反相接通狀態(tài)。此時(shí),輸出驅(qū)動(dòng)電路由于兩個(gè)FET處于反相,形成推拉式電路結(jié)構(gòu),使負(fù)載能力大為提高。輸入數(shù)據(jù)時(shí),數(shù)據(jù)信號(hào)直接從引腳通過(guò)輸入緩沖器進(jìn)入內(nèi)部總線。P0作為地址/數(shù)據(jù)總線是真正的雙向口。
2.P1口
P1口的一位引腳邏輯電路如圖4-6所示。它由一個(gè)輸出鎖存器、兩個(gè)三態(tài)輸入緩沖器和輸出驅(qū)動(dòng)電路組成準(zhǔn)雙向口。圖4-6P1口某個(gè)引腳邏輯電路
P1口作為輸出口使用時(shí),可以向外提供推拉電流負(fù)載,無(wú)需再外接上拉電阻;P1口作為輸入口使用時(shí),同樣也需先向鎖存器寫“1”,使輸出驅(qū)動(dòng)電路的FET截止,處于高阻態(tài),然后通過(guò)緩沖器進(jìn)行輸入操作。
3.P2口
P2口的一位引腳邏輯電路如圖4-7所示。它由一個(gè)輸出鎖存器、兩個(gè)三態(tài)輸入緩沖器、一個(gè)輸出驅(qū)動(dòng)電路和一個(gè)輸出控制電路構(gòu)成。其中,輸出驅(qū)動(dòng)電路與P0不同,上拉電阻代替了P0中的場(chǎng)效應(yīng)管。圖4-7P2口某個(gè)引腳邏輯電路
1)作為通用I/O口
CPU發(fā)出控制電平“0”,使多路開(kāi)關(guān)MUX倒向鎖存器的輸出Q端,構(gòu)成一個(gè)準(zhǔn)雙向口,其功能與P1相同。
2)作為地址總線在系統(tǒng)擴(kuò)展片外程序存儲(chǔ)器擴(kuò)展數(shù)據(jù)存儲(chǔ)器且容量超過(guò)256B時(shí),CPU發(fā)出控制電平“1”,使多路開(kāi)關(guān)MUX倒向內(nèi)部地址線。此時(shí),P2輸出高8位地址。
4.P3口
P3口的一位引腳邏輯電路如圖4-8所示。它由一個(gè)輸出鎖存器、兩個(gè)三態(tài)緩沖器、一個(gè)輸出驅(qū)動(dòng)電路和一個(gè)“與非”門構(gòu)成。圖4-8P3口某個(gè)引腳邏輯電路
1)作為通用I/O口
P3作為通用的輸入輸出并行接口,其功能與P1相同。
2)第二功能
P3口的八個(gè)引腳的第二功能如表4-4所示,需要說(shuō)明的是,當(dāng)P3中的引腳作為第二功能時(shí),就不能再作為輸入輸出口使用了。表4-4P3引腳第二功能
5.輸出口的輸出能力當(dāng)使用P0、P1、P2、P3口作為輸出接口時(shí),需要考慮它的帶載能力。P1、P2、P3口的每一位可以直接驅(qū)動(dòng)4個(gè)LSTTL負(fù)載;P0可以驅(qū)動(dòng)8個(gè)LSTTL負(fù)載,但P0與P1、P2、P3不同,由于在它的內(nèi)部沒(méi)有上拉電阻,所以用它作為輸出接口時(shí)需要外接上拉電阻,上拉電阻R的阻值一般取5.1kΩ左右,上拉電阻的接法如圖4-9所示。圖4-9P0.0作為輸出接口時(shí)上拉電阻的接法知識(shí)點(diǎn)2匯編語(yǔ)言
1.匯編語(yǔ)言程序設(shè)計(jì)的基本步驟匯編語(yǔ)言程序設(shè)計(jì)就是針對(duì)實(shí)際應(yīng)用問(wèn)題,使用MCS-51系列單片機(jī)指令系統(tǒng)中的指令和偽指令,編制程序的過(guò)程。在程序設(shè)計(jì)過(guò)程中,應(yīng)該在保證實(shí)現(xiàn)程序功能的前提下,使程序占用空間小,執(zhí)行速度快。匯編語(yǔ)言程序設(shè)計(jì)的基本步驟如下。
1)分析問(wèn)題明確系統(tǒng)的功能要求與設(shè)計(jì)目標(biāo),確定算法和思路。
2)畫流程圖根據(jù)算法和思路畫出程序流程框圖。流程圖符號(hào)說(shuō)明如圖4-10所示。圖4-10流程圖符號(hào)
3)分配存儲(chǔ)單元確定原始數(shù)據(jù)、中間數(shù)據(jù)、結(jié)果和程序在數(shù)據(jù)存儲(chǔ)器和程序存儲(chǔ)器中存放的位置。
4)編寫源程序使用集成開(kāi)發(fā)環(huán)境(如Keil)在計(jì)算機(jī)上輸入程序,對(duì)程序進(jìn)行匯編和運(yùn)行調(diào)試,找出程序的錯(cuò)誤并進(jìn)行更正,再調(diào)試,直到程序通過(guò)。
2.程序的基本結(jié)構(gòu)匯編語(yǔ)言中的基本結(jié)構(gòu)有順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)和子程序結(jié)構(gòu)。單片機(jī)一個(gè)應(yīng)用系統(tǒng)的匯編語(yǔ)言源程序,無(wú)論其系統(tǒng)功能的要求是簡(jiǎn)單還是復(fù)雜,其程序結(jié)構(gòu)的組成基礎(chǔ)總是由順序程序、分支程序、循環(huán)程序、子程序、查表程序等結(jié)構(gòu)化程序塊組合而成。
1)順序結(jié)構(gòu)程序順序結(jié)構(gòu)程序是指程序按編寫的順序依次往下執(zhí)行每一條指令,直到最后一條,它能夠解決一些簡(jiǎn)單的問(wèn)題或作為復(fù)雜程序的一部分,其程序執(zhí)行流程如圖4-11所示。圖4-11順序結(jié)構(gòu)
2)分支結(jié)構(gòu)程序分支結(jié)構(gòu)是根據(jù)不同的條件轉(zhuǎn)移到不同分支的程序段的結(jié)構(gòu)。具有分支結(jié)構(gòu)的程序一般要使用轉(zhuǎn)移指令進(jìn)行判斷和轉(zhuǎn)移,其程序執(zhí)行流程如圖4-12所示。
圖4-12分支結(jié)構(gòu)
3)循環(huán)結(jié)構(gòu)程序在實(shí)際應(yīng)用中會(huì)遇到需要多次重復(fù)做的事情,如任務(wù)1中的延時(shí),處理這種情況的程序可采用循環(huán)結(jié)構(gòu),其程序執(zhí)行流程如圖4-13所示。循環(huán)結(jié)構(gòu)的程序一般由下面四部分組成。
圖4-13循環(huán)結(jié)構(gòu)
(1)循環(huán)初始化。位于循環(huán)程序開(kāi)頭,用于做好循環(huán)前的準(zhǔn)備工作,如設(shè)置各工作單元的初始值、數(shù)據(jù)指針以及循環(huán)次數(shù)計(jì)數(shù)器的初值。
(2)循環(huán)體。循環(huán)程序的主體,位于循環(huán)體之內(nèi),是循環(huán)程序的工作程序,在執(zhí)行中會(huì)被多次重復(fù)執(zhí)行。要求編寫得盡可能簡(jiǎn)練,以提高程序的執(zhí)行速度。
(3)循環(huán)修改。每執(zhí)行一次循環(huán)進(jìn)行一次計(jì)數(shù)器值的修改,并對(duì)有關(guān)的數(shù)據(jù)及數(shù)據(jù)指針進(jìn)行修改,為下一次循環(huán)做好準(zhǔn)備。
(4)循環(huán)控制。根據(jù)循環(huán)次數(shù)計(jì)數(shù)器的現(xiàn)行值或其他條件來(lái)進(jìn)行判斷,控制循環(huán)的繼續(xù)進(jìn)行或結(jié)束。
具體的循環(huán)結(jié)構(gòu)又分為“先執(zhí)行后判斷”和“先判斷后執(zhí)行”兩種方式,“先執(zhí)行后判斷”方式是先進(jìn)入循環(huán)體進(jìn)行處理和循環(huán)修改,然后再進(jìn)行循環(huán)控制判斷;“先判斷后執(zhí)行”是將循環(huán)控制判斷放在循環(huán)的入口處,如果循環(huán)條件成立則進(jìn)入循環(huán)體進(jìn)行處理和循環(huán)修改,循環(huán)條件不成立則退出循環(huán)。這兩種循環(huán)方式的處理流程如圖4-14所示。圖4-14循環(huán)結(jié)構(gòu)處理流程
4)主子程序
(1)子程序。子程序是指具有一定功能的獨(dú)立程序段,例如延時(shí)子程序。當(dāng)需要時(shí),可以調(diào)用這些獨(dú)立的子程序。調(diào)用程序稱為主程序,被調(diào)用的程序稱為子程序。調(diào)用程序執(zhí)行流程如圖4-15所示,主程序在指令N與指令N+1中間有一條調(diào)用指令A(yù)CALL或LCALL,當(dāng)指令N執(zhí)行后,程序轉(zhuǎn)向執(zhí)行子程序,執(zhí)行完子程序的指令后,返回到主程序執(zhí)行指令N+1接著順序執(zhí)行下去,指令M+1一般為返回指令RET。圖4-15主子結(jié)構(gòu)
使用子程序應(yīng)注意:
子程序的第一條指令地址稱為子程序的入口地址。該指令必須有標(biāo)號(hào),標(biāo)號(hào)應(yīng)以子程序的任務(wù)定名,以便一看就一目了然。
主程序調(diào)用子程序是通過(guò)安排在主程序的調(diào)用指令實(shí)現(xiàn)的,子程序返回主程序需執(zhí)行RET返回指令。
主程序調(diào)用子程序和子程序返回主程序時(shí),計(jì)算機(jī)能自動(dòng)保護(hù)和恢復(fù)主程序的斷點(diǎn)地址(PC值)。但對(duì)于各工作寄存器、特殊功能寄存器和內(nèi)存單元中的內(nèi)容,如果需要保護(hù)和恢復(fù)必須在子程序的開(kāi)頭和末尾(RET指令前)安排一些能夠保護(hù)和恢復(fù)它們的指令。
為使所編子程序可以放在64KB內(nèi)存的任何子域并能為主程序所調(diào)用,子程序內(nèi)部必須使用相對(duì)轉(zhuǎn)移指令而不使用其他指令,以便匯編時(shí)生成浮動(dòng)代碼。
子程序參數(shù)可分入口和出口參數(shù)兩類:入口參數(shù)是指子程序需要的原始參數(shù),由調(diào)用它的主程序通過(guò)約定的工作寄存器R0~R7、特殊功能寄存器SFR、內(nèi)存單元或堆棧等預(yù)先傳給子程序使用;出口參數(shù)是由子程序根據(jù)入口參數(shù)執(zhí)行程序后獲得的結(jié)果參數(shù),應(yīng)由子程序通過(guò)約定的工作寄存器R0~R7、特殊功能寄存器SFR、內(nèi)存單元或堆棧等預(yù)先傳給主程序。例設(shè)R1和R2內(nèi)有兩數(shù)a和b,編寫程序求c?=?a2?+?b2并把c送入R3,a、b為小于10的整數(shù)。解:等式中a、b均求平方,因此將求平方編寫為子程序。
ORG0000HMAIN: MOVA,R1 ;入口參數(shù)a送A ACALLSQR ;求a2 MOVR1,A ;a2送R1 MOVA,R2 ;入口參數(shù)b送A ACALLSQR ;求b2
ADDA,R1 ;a2?+?b2送A
MOVR3,A ;和存入R3
SJMP$SQR: MOVDPTR,#TAB ;設(shè)置查表首地址
MOVCA,@A+DPTR ;查平方表
RET ;返回TAB: DB0,1,4,9,16,25,36,49,64,81
(2)子程序嵌套。子程序嵌套是指在子程序執(zhí)行過(guò)程中,還可以調(diào)用另一個(gè)子程序。程序執(zhí)行過(guò)程如圖4-16所示。圖4-16子程序嵌套
3.延時(shí)程序在單片機(jī)的實(shí)時(shí)控制系統(tǒng)中,常常需要用到延時(shí)操作。一般情況下,通過(guò)編寫一個(gè)延時(shí)子程序來(lái)實(shí)現(xiàn)延時(shí)操作,稱為軟件延時(shí)。延時(shí)子程序就是一個(gè)延時(shí)模塊,不僅可以在一個(gè)程序中多次調(diào)用,也可以在其他程序需要延時(shí)的地方使用,避免重復(fù)勞動(dòng)。
1)延時(shí)的基本原理單片機(jī)的讀、寫操作都需要消耗一定的時(shí)間,一般用機(jī)器周期數(shù)來(lái)表示。所謂機(jī)器周期是指單片機(jī)完成一個(gè)基本操作所用的時(shí)間。機(jī)器周期等于12倍的晶振周期,若晶振頻率為12MHz,一個(gè)機(jī)器周期為12?×(1/12)MHz?=?1μs。例如:NOP空操作指令,執(zhí)行時(shí)間為一個(gè)機(jī)器周期,即1μs,DJNZ執(zhí)行時(shí)間為兩個(gè)機(jī)器周期,即需要2μs。
2)計(jì)算DELAY子程序的延時(shí)時(shí)間首先分析下面的程序段: 源程序機(jī)器周期數(shù)執(zhí)行時(shí)間MOVR0,#250 11μsDE0: NOP 11μs NOP 11μs DJNZR0,DE022μs
如圖4-17所示流程圖,程序采用循環(huán)結(jié)構(gòu)的設(shè)計(jì)方法,R0為計(jì)數(shù)器,循環(huán)體包括NOP指令、DJNZ指令。首先R0賦值250,這條指令需要1μs時(shí)間,接著執(zhí)行空操作,一個(gè)空操作耗時(shí)1μs,兩個(gè)空操作耗時(shí)2μs,接著執(zhí)行DJNZ指令耗時(shí)2μs,其作用是將R0寄存器的值減1,減1以后的值再存放在R0中,若減1之后值不為0,繼續(xù)執(zhí)行空操作,循環(huán)往復(fù),直到R0的值為0,循環(huán)停止,這樣循環(huán)體指令執(zhí)行了250次,可計(jì)算出上述程序段的執(zhí)行時(shí)間為
[1?+?(1?+?1?+?2)?×?250]μs?=?1001μs?≈?1ms圖4-17延時(shí)1ms程序段流程圖
將1ms的程序段作為循環(huán)體,再循環(huán)200次,可實(shí)現(xiàn)延時(shí)200ms,程序流程圖如圖4-18所示,其中R1為計(jì)數(shù)器,計(jì)數(shù)200次。圖4-18DELAY子程序流程圖
DELAY子程序包含兩重循環(huán),這種結(jié)構(gòu)稱為多重循環(huán)程序結(jié)構(gòu),又稱循環(huán)嵌套。多重循環(huán)程序必須注意的是各重循環(huán)不能交叉,不能從外循環(huán)跳入內(nèi)循環(huán)。
知識(shí)點(diǎn)3C語(yǔ)言程序
C語(yǔ)言是一種高級(jí)程序設(shè)計(jì)語(yǔ)言,它提供了十分完備的規(guī)范化流程控制結(jié)構(gòu)。因此采用C51語(yǔ)言設(shè)計(jì)單片機(jī)應(yīng)用系統(tǒng)程序時(shí),首先要盡可能地采用結(jié)構(gòu)化的程序設(shè)計(jì)方法,這樣可使整個(gè)應(yīng)用系統(tǒng)程序結(jié)構(gòu)清晰,易于調(diào)試和維護(hù)。對(duì)于一個(gè)較大的程序,可將整個(gè)程序按功能分成若干個(gè)模塊,不同的模塊完成不同的功能。對(duì)于不同的功能模塊,分別指定相應(yīng)的入口參數(shù)和出口參數(shù),而經(jīng)常使用的一些程序最好編成函數(shù),這樣既不會(huì)引起整個(gè)程序管理的混亂,還可增強(qiáng)可讀性,移植性也好。
1.?C語(yǔ)言的基本結(jié)構(gòu)
C語(yǔ)言程序以函數(shù)形式組織程序結(jié)構(gòu),C程序中的函數(shù)與其他語(yǔ)言中所描述的“子程序”或“過(guò)程”的概念是一樣的。C程序基本結(jié)構(gòu)如圖4-19所示。圖4-19C程序基本結(jié)構(gòu)
一個(gè)C語(yǔ)言源程序是由一個(gè)或若干個(gè)函數(shù)組成,每一個(gè)函數(shù)完成相對(duì)獨(dú)立的功能。每個(gè)C程序都必須有(且僅有)一個(gè)主函數(shù)main(?),程序的執(zhí)行總是從主函數(shù)開(kāi)始,調(diào)用其他函數(shù)后返回主函數(shù)main(),不管函數(shù)的排列順序如何,最后都是在主函數(shù)中結(jié)束整個(gè)程序。C語(yǔ)言程序的執(zhí)行部分由語(yǔ)句組成。C語(yǔ)言提供了豐富的程序控制語(yǔ)句,按照結(jié)構(gòu)化程序設(shè)計(jì)的基本結(jié)構(gòu):順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu),組成各種復(fù)雜程序,如圖4-20所示的這些語(yǔ)句主要包括表達(dá)式語(yǔ)句、復(fù)合語(yǔ)句、選擇語(yǔ)句和循環(huán)語(yǔ)句等。圖4-20C語(yǔ)言程序結(jié)構(gòu)
2.表達(dá)式語(yǔ)句和復(fù)合語(yǔ)句
1)表達(dá)式語(yǔ)句表達(dá)式語(yǔ)句是最基本的C語(yǔ)言語(yǔ)句,它由表達(dá)式加上分號(hào)“;”組成。
2)復(fù)合語(yǔ)句把多個(gè)語(yǔ)句用大括號(hào){}括起來(lái),組合在一起形成具有一定功能的模塊,這種由若干條語(yǔ)句組合而成的語(yǔ)句塊稱為復(fù)合語(yǔ)句。在程序中應(yīng)把復(fù)合語(yǔ)句看成是單條語(yǔ)句,而不是多條語(yǔ)句。復(fù)合語(yǔ)句在程序運(yùn)行時(shí),{}中的各行單語(yǔ)句是依次順序執(zhí)行的。在C語(yǔ)言的函數(shù)中,函數(shù)體就是一個(gè)復(fù)合語(yǔ)句。
復(fù)合語(yǔ)句內(nèi)的各條語(yǔ)句都必須以分號(hào)“;”結(jié)尾,復(fù)合語(yǔ)句之間用{}分隔,在括號(hào)“}”外不能加分號(hào)。復(fù)合語(yǔ)句不僅可由可執(zhí)行語(yǔ)句組成,還可由變量定義語(yǔ)句組成。在復(fù)合語(yǔ)句中所定義的變量,稱為局部變量,也就是指它的有效范圍只在復(fù)合語(yǔ)句中。函數(shù)體是復(fù)合語(yǔ)句,所以函數(shù)體內(nèi)定義的變量,其有效范圍也只在函數(shù)內(nèi)部。
3.選擇語(yǔ)句在C語(yǔ)言中,選擇結(jié)構(gòu)程序設(shè)計(jì)一般用if語(yǔ)句或switch語(yǔ)句來(lái)實(shí)現(xiàn)。if語(yǔ)句又有if、if-else和if-else-if三種不同的形式,下面分別進(jìn)行介紹。
1)基本if語(yǔ)句基本if語(yǔ)句的格式如下:if(表達(dá)式){
語(yǔ)句組;
}
if語(yǔ)句執(zhí)行過(guò)程:當(dāng)“表達(dá)式”的結(jié)果為“真”時(shí),執(zhí)行其后的“語(yǔ)句組”,否則跳過(guò)該語(yǔ)句組,繼續(xù)執(zhí)行下面的語(yǔ)句。如“if(P3_0==0)P1_0=0;”,當(dāng)P3_0等于0時(shí),P1_0就賦值0,執(zhí)行過(guò)程如圖4-21所示。圖4-21if語(yǔ)句執(zhí)行流程圖使用if語(yǔ)句應(yīng)注意:
if語(yǔ)句中的“表達(dá)式”通常為邏輯表達(dá)式或關(guān)系表達(dá)式,也可以是任何其他的表達(dá)式或類型數(shù)據(jù),只要表達(dá)式的值非0即為“真”。以下語(yǔ)句都是合法的:
if(3){……}
if(x=8){……}
if(P3_0){……}
在if語(yǔ)句中,“表達(dá)式”必須用括號(hào)括起來(lái)。
在if語(yǔ)句中,花括號(hào)“{}”里面的語(yǔ)句組如果只有一條語(yǔ)句,可以省略花括號(hào)。如“if(P3_0==0)P1_0=0;”語(yǔ)句,但是為了提高程序的可讀性和防止程序書寫錯(cuò)誤,建議讀者在任何情況下,都加上花括號(hào)。
2)?if-else語(yǔ)句
if-else語(yǔ)句的一般格式如下:
if(表達(dá)式) {
語(yǔ)句組1;
} else{
語(yǔ)句組2;
}
if-else語(yǔ)句執(zhí)行過(guò)程:當(dāng)“表達(dá)式”的結(jié)果為“真”時(shí),執(zhí)行其后的“語(yǔ)句組1”,否則執(zhí)行“語(yǔ)句組2”,執(zhí)行過(guò)程如圖4-22所示。圖4-22if-else語(yǔ)句執(zhí)行流程圖
3)?if-else-if語(yǔ)句
if-else-if語(yǔ)句是由ifelse語(yǔ)句組成的嵌套,用來(lái)實(shí)現(xiàn)多個(gè)條件分支的選擇,其一般格式如下:if(表達(dá)式1) {
語(yǔ)句組1;
} elseif(表達(dá)式2) {
語(yǔ)句組2;
} …
elseif(表達(dá)式n) {
語(yǔ)句組n;
}else {
語(yǔ)句組n+1;
}
執(zhí)行該語(yǔ)句時(shí),依次判斷“表達(dá)式i”的值,當(dāng)“表達(dá)式i”的值為“真”時(shí),執(zhí)行其對(duì)應(yīng)的“語(yǔ)句組i”,跳過(guò)剩余的if語(yǔ)句組,繼續(xù)執(zhí)行該語(yǔ)句下面一個(gè)語(yǔ)句。如果所有表達(dá)式的值均為“假”,則執(zhí)行最后一個(gè)else后的“語(yǔ)句組n+1”,然后再繼續(xù)執(zhí)行其下面一個(gè)語(yǔ)句,執(zhí)行過(guò)程如圖4-23所示。圖4-23if-else-if語(yǔ)句執(zhí)行流程圖
使用if-else-if語(yǔ)句應(yīng)注意:
else語(yǔ)句是if語(yǔ)句的子句,它是if語(yǔ)句的一部分,不能單獨(dú)使用。
else語(yǔ)句總是與在它上面、跟它最近的if語(yǔ)句相配對(duì)。
4)?switch語(yǔ)句
if語(yǔ)句一般用作單一條件或分支數(shù)目較少的場(chǎng)合,如果使用if語(yǔ)句來(lái)編寫超過(guò)三個(gè)以上分支的程序,就會(huì)降低程序的可讀性。C語(yǔ)言提供了一種用于多分支選擇的switch語(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;}
該語(yǔ)句的執(zhí)行過(guò)程是:首先計(jì)算表達(dá)式的值,并逐個(gè)與case后的常量表達(dá)式的值相比較,當(dāng)表達(dá)式的值與某個(gè)常量表達(dá)式的值相等時(shí),則執(zhí)行對(duì)應(yīng)該常量表達(dá)式后的語(yǔ)句組,再執(zhí)行break語(yǔ)句,跳出switch語(yǔ)句的執(zhí)行,繼續(xù)執(zhí)行下一條語(yǔ)句。如果表達(dá)式的值與所有case后的常量表達(dá)式均不相同,則執(zhí)行default后的語(yǔ)句組。
使用switch語(yǔ)句應(yīng)注意:
在case后的各常量表達(dá)式的值不能相同,否則會(huì)出現(xiàn)同一個(gè)條件有多種執(zhí)行方案的矛盾。
在case語(yǔ)句后,允許有多個(gè)語(yǔ)句,可以不用{}括起來(lái)。例如:
case0:P1_0=1;P1_1=0;break;
case和default語(yǔ)句的先后順序可以改變,不會(huì)影響程序執(zhí)行結(jié)果。
“case常量表達(dá)式”只相當(dāng)于一個(gè)語(yǔ)句標(biāo)號(hào),表達(dá)式的值和某標(biāo)號(hào)相等則轉(zhuǎn)向該標(biāo)號(hào)執(zhí)行,但在執(zhí)行完該標(biāo)號(hào)后的語(yǔ)句之后,不會(huì)自動(dòng)跳出整個(gè)switch語(yǔ)句,而是繼續(xù)執(zhí)行后面的case語(yǔ)句。因此,使用switch語(yǔ)句時(shí),要在每一個(gè)case語(yǔ)句之后,加break語(yǔ)句,使得執(zhí)行完該case語(yǔ)句后可以跳出整個(gè)switch語(yǔ)句的執(zhí)行。
default語(yǔ)句是在不滿足case語(yǔ)句情況下的一個(gè)默認(rèn)執(zhí)行語(yǔ)句。如果default語(yǔ)句后面是空語(yǔ)句,表示不做任何處理,可以省略。
4.循環(huán)語(yǔ)句在結(jié)構(gòu)化程序設(shè)計(jì)中,循環(huán)程序結(jié)構(gòu)是一種很重要的程序結(jié)構(gòu),幾乎所有的應(yīng)用程序都包含循環(huán)結(jié)構(gòu)。循環(huán)的作用是對(duì)給定的條件進(jìn)行判斷,當(dāng)給定的條件成立時(shí),重復(fù)執(zhí)行給定程序段,直到條件不成立時(shí)為止。給定的條件稱為循環(huán)條件,需要重復(fù)執(zhí)行的程序段稱為循環(huán)體。
前面介紹的delay()函數(shù)中使用了雙重for循環(huán),其循環(huán)體為空語(yǔ)句,用來(lái)消耗CPU時(shí)間,產(chǎn)生延時(shí)效果,這種延時(shí)方法稱為軟件延時(shí)。軟件延時(shí)的缺點(diǎn)是占用CPU時(shí)間,使得CPU在延時(shí)過(guò)程中不能做其他事情,解決的方法是使用單片機(jī)中的硬件定時(shí)器實(shí)現(xiàn)延時(shí)功能。在C語(yǔ)言中,可以用下面三個(gè)語(yǔ)句來(lái)實(shí)現(xiàn)循環(huán)程序結(jié)構(gòu):while語(yǔ)句、do-while語(yǔ)句和for語(yǔ)句,下面分別對(duì)它們加以介紹。
1)?while語(yǔ)句
while語(yǔ)句用來(lái)實(shí)現(xiàn)“當(dāng)型”循環(huán)結(jié)構(gòu),即當(dāng)條件為“真”時(shí),就執(zhí)行循環(huán)體。while語(yǔ)句的一般形式為:
while(表達(dá)式)
{語(yǔ)句組;//循環(huán)體
}其中,“表達(dá)式”通常是邏輯表達(dá)式或關(guān)系表達(dá)式,為循環(huán)條件,“語(yǔ)句組”是循環(huán)體,即被重復(fù)執(zhí)行的程序段。該語(yǔ)句的執(zhí)行過(guò)程是:首先計(jì)算“表達(dá)式”的值,當(dāng)值為“真”(非0)時(shí),執(zhí)行循環(huán)體“語(yǔ)句組”,流程圖如圖4-24所示。
使用while語(yǔ)句時(shí)要注意:
當(dāng)表達(dá)式的值為“真”時(shí),執(zhí)行循環(huán)體,循環(huán)體執(zhí)行一次完成后,再次回到while,進(jìn)行循環(huán)條件判斷,如果仍然為“真”,則重復(fù)執(zhí)行循環(huán)體,為“假”則退出整個(gè)while循環(huán)語(yǔ)句。
如果循環(huán)條件一開(kāi)始就為假,那么while后面的循環(huán)體一次都不會(huì)被執(zhí)行。如果循環(huán)條件總為真,例如:while(1);表達(dá)式為常量“1”,非0即為“真”,循環(huán)條件永遠(yuǎn)成立,則為無(wú)限循環(huán),即死循環(huán)。在單片機(jī)C語(yǔ)言程序設(shè)計(jì)中,無(wú)限循環(huán)是一個(gè)非常有用的語(yǔ)句。在本章所有程序示例中都使用了該語(yǔ)句。
除非特殊應(yīng)用的情況,在使用while語(yǔ)句進(jìn)行循環(huán)程序設(shè)計(jì)時(shí),通常循環(huán)體內(nèi)包含有修改循環(huán)條件的語(yǔ)句,以使循環(huán)逐漸趨于結(jié)束,避免出現(xiàn)死循環(huán)。
在循環(huán)程序設(shè)計(jì)中,要特別注意循環(huán)的邊界問(wèn)題,即循環(huán)的初值和終值要非常明確。
2)?do-while語(yǔ)句前面所述的while語(yǔ)句是在執(zhí)行循環(huán)體之前判斷循環(huán)條件,如果條件不成立,則該循環(huán)不會(huì)被執(zhí)行。實(shí)際情況往往需要先執(zhí)行一次循環(huán)體后,再進(jìn)行循環(huán)條件的判斷,“直到型”do-while語(yǔ)句可以滿足這種要求。do-while語(yǔ)句一般格式如下:
do {
語(yǔ)句組;//循環(huán)體}while(表達(dá)式);
該語(yǔ)句的執(zhí)行過(guò)程是:先執(zhí)行循環(huán)體“語(yǔ)句組”一次,再計(jì)算“表達(dá)式”的值,如果“表達(dá)式”的值為“真”(非0),繼續(xù)執(zhí)行循環(huán)體“語(yǔ)句組”,直到表達(dá)式為“假”(0)為止。dowhile語(yǔ)句流程圖如圖4-25所示。圖4-25do-while語(yǔ)句執(zhí)行流程圖
同樣一個(gè)問(wèn)題,既可以用while語(yǔ)句,也可以用do-while語(yǔ)句來(lái)實(shí)現(xiàn),二者的循環(huán)體“語(yǔ)句組”部分相同,運(yùn)行結(jié)果也相同。區(qū)別在于:do-while語(yǔ)句是先執(zhí)行后判斷,而while語(yǔ)句是先判斷后執(zhí)行。如果條件一開(kāi)始就不滿足,do-while語(yǔ)句至少要執(zhí)行一次循環(huán)體,而while語(yǔ)句的循環(huán)體則一次也不執(zhí)行。
使用do-while語(yǔ)句時(shí)應(yīng)注意:
在使用if語(yǔ)句、while語(yǔ)句時(shí),表達(dá)式括號(hào)后面都不能加分號(hào)“;”,但在do-while語(yǔ)句的表達(dá)式括號(hào)后面必須加分號(hào)。
do-while語(yǔ)句與while語(yǔ)句相比,更適用于處理不論條件是否成立,都需先執(zhí)行一次循環(huán)體的情況。
3)?for語(yǔ)句在函數(shù)delay()中,使用兩個(gè)for語(yǔ)句,實(shí)現(xiàn)了雙重循環(huán),重復(fù)執(zhí)行若干次空語(yǔ)句循環(huán)體,以達(dá)到延時(shí)的目的。在C語(yǔ)言中,當(dāng)循環(huán)次數(shù)明確的時(shí)候,使用for語(yǔ)句比while和do-while語(yǔ)句更為方便。for語(yǔ)句一般格式如下:
for(循環(huán)變量賦初值;循環(huán)條件;修改循環(huán)變量)
{語(yǔ)句組;//循環(huán)體
}關(guān)鍵字for后面的圓括號(hào)內(nèi)通常包括三個(gè)表達(dá)式:循環(huán)變量賦初值、循環(huán)條件和修改循環(huán)變量,三個(gè)表達(dá)式之間用“;”隔開(kāi)。大括號(hào)內(nèi)是循環(huán)體“語(yǔ)句組”。
for語(yǔ)句的執(zhí)行過(guò)程如下:
(1)先執(zhí)行第一個(gè)表達(dá)式,給循環(huán)變量賦初值,通常這里是一個(gè)賦值表達(dá)式。
(2)利用第二個(gè)表達(dá)式判斷循環(huán)條件是否滿足,通常是關(guān)系表達(dá)式或邏輯表達(dá)式,若其值為“真”(非0),則執(zhí)行循環(huán)體“語(yǔ)句組”一次,再執(zhí)行下面第(3)步;若其值為“假”(0),則轉(zhuǎn)到第(5)步循環(huán)結(jié)束。
(3)計(jì)算第三個(gè)表達(dá)式,修改循環(huán)控制變量,一般也是賦值語(yǔ)句。
(4)跳到上面第(2)步繼續(xù)執(zhí)行。
(5)循環(huán)結(jié)束,執(zhí)行for語(yǔ)句下面的一個(gè)語(yǔ)句。以上過(guò)程用流程圖表示如圖4-26所示。圖4-26for語(yǔ)句執(zhí)行流程圖
進(jìn)行C51單片機(jī)應(yīng)用程序設(shè)計(jì)時(shí),無(wú)限循環(huán)也可以采用如下的for語(yǔ)句實(shí)現(xiàn):for(;;)
{ 循環(huán)體語(yǔ)句組;
}此時(shí),for語(yǔ)句的小括號(hào)內(nèi)只有兩個(gè)分號(hào),三個(gè)表達(dá)式全部為空語(yǔ)句,意味著沒(méi)有設(shè)初值,不判斷循環(huán)的條件,循環(huán)變量不改變,其作用相當(dāng)于while(1),構(gòu)成一個(gè)無(wú)限循環(huán)過(guò)程。
while、do-while和for語(yǔ)句都可以用來(lái)處理相同的問(wèn)題,一般可以互相代替。for語(yǔ)句主要用于給定循環(huán)變量初值、循環(huán)次數(shù)明確的循環(huán)結(jié)構(gòu),而要在循環(huán)過(guò)程中才能確定循環(huán)次數(shù)及循環(huán)控制條件的問(wèn)題用while、do-while語(yǔ)句更加方便。
4)循環(huán)的嵌套循環(huán)嵌套是指一個(gè)循環(huán)(稱為“外循環(huán)”)的循環(huán)體內(nèi)包含另一個(gè)循環(huán)(稱為“內(nèi)循環(huán)”)。內(nèi)循環(huán)的循環(huán)體內(nèi)還可以包含循環(huán),形成多層循環(huán)。while、do-while和for三種循環(huán)結(jié)構(gòu)可以互相嵌套。例如,延時(shí)函數(shù)delay()中使用的雙重for循環(huán)語(yǔ)句,外循環(huán)的循環(huán)變量是k,其循環(huán)體又是以j為循環(huán)變量的for語(yǔ)句,這個(gè)for語(yǔ)句就是內(nèi)循環(huán),內(nèi)循環(huán)體是一條空語(yǔ)句。
5)在循環(huán)體中使用break和continue語(yǔ)句
(1)?break語(yǔ)句。break語(yǔ)句通常用在循環(huán)語(yǔ)句和switch語(yǔ)句中。在switch語(yǔ)句中使用break時(shí),程序跳出switch語(yǔ)句,繼續(xù)執(zhí)行其后面的語(yǔ)句。當(dāng)break語(yǔ)句用于while、do-while、for循環(huán)語(yǔ)句中時(shí),不論循環(huán)條件是否滿足,可使程序立即終止整個(gè)循環(huán)而執(zhí)行后面的語(yǔ)句。通常break語(yǔ)句總是與if語(yǔ)句一起使用,即滿足if語(yǔ)句中給出的條件時(shí)便跳出循環(huán)。例如執(zhí)行如下的程序段:voidmain(){inti=0,sum;sum=0;for(i=1;;i++) //設(shè)置for循環(huán)
{if(i>10)break; //判斷循環(huán)是否結(jié)束,如果滿足則退出循環(huán)sum=sum+i;}}
在循環(huán)結(jié)構(gòu)程序中,既可以通過(guò)循環(huán)語(yǔ)句中的表達(dá)式來(lái)控制循環(huán)程序是否結(jié)束,還可以通過(guò)break語(yǔ)句強(qiáng)行退出循環(huán)結(jié)構(gòu)。在循環(huán)嵌套中,一個(gè)break語(yǔ)句只能向外跳一層。
(2)?continue語(yǔ)句。continue語(yǔ)句的作用是跳過(guò)循環(huán)體中剩余的語(yǔ)句,結(jié)束本次循環(huán),強(qiáng)行執(zhí)行下一次循環(huán)。它與break語(yǔ)句的不同之處是:break語(yǔ)句是直接結(jié)束整個(gè)循環(huán)語(yǔ)句,而continue則是停止當(dāng)前循環(huán)體的執(zhí)行,跳過(guò)循環(huán)體中余下的語(yǔ)句,再次進(jìn)入循環(huán)條件判斷,準(zhǔn)備繼續(xù)開(kāi)始下一次循環(huán)體的執(zhí)行。
continue語(yǔ)句只能用在for、while、do-while等循環(huán)體中,通常與if條件語(yǔ)句一起使用,用來(lái)加速循環(huán)結(jié)束。continue語(yǔ)句與break語(yǔ)句的區(qū)別及其執(zhí)行過(guò)程如圖4-27所示。圖4-27continue和break語(yǔ)句的執(zhí)行過(guò)程比較循環(huán)變量賦初值;while(循環(huán)條件){……
語(yǔ)句組1;修改循環(huán)變量;
if(表達(dá)式)break;
語(yǔ)句組2;}循環(huán)變量賦初值;while(循環(huán)條件){……
語(yǔ)句組1;修改循環(huán)變量;if(表達(dá)式)continue;
語(yǔ)句組2;
下面的程序段將求出1~20之間所有不能被5整除的整數(shù)之和。voidmain(){inti=0,sum;sum=0;for(i=1;i<=20;i++)//設(shè)置for循環(huán)
{
if(i%5==0)continue;//若i對(duì)5取余運(yùn)算,若結(jié)果為0,即i能整除5,
//執(zhí)行continue語(yǔ)句,跳過(guò)下面求和語(yǔ)句,程序繼續(xù)執(zhí)
//行for循環(huán)sum=sum+i;//循環(huán);如果i不能被5整除,則執(zhí)行求和語(yǔ)句。
}}任務(wù)3蜂鳴器的控制
1.任務(wù)要求使用單片機(jī)的輸出口控制蜂鳴器發(fā)聲。
2.硬件電路設(shè)計(jì)
9013是一個(gè)NPN的三極管,如圖4-28所示1管腳為發(fā)射極,2管腳為基極,3管腳為集電極。圖4-29為蜂鳴器實(shí)物圖。
4.3技能拓展
圖4-289013三極管圖4-29蜂鳴器
由圖4-30所示的電路原理可知,蜂鳴器的正極接電源,蜂鳴器的負(fù)極與NPN型三極管的集電極連接,三極管的基極通過(guò)電阻與單片機(jī)的P2.3引腳相連,當(dāng)P2.3輸出高電平時(shí),三極管導(dǎo)通,蜂鳴器中有電流;當(dāng)P2.3輸出低電平時(shí),三極管截止,蜂鳴器中沒(méi)有電流。通過(guò)P2.3反復(fù)輸出高低電平,高低電平之間延時(shí)一段時(shí)間,就能產(chǎn)生一定頻率的方波,使蜂鳴器發(fā)聲。圖4-30蜂鳴器控制電路
3.軟件設(shè)計(jì)
1)流程圖蜂鳴器控制流程圖如圖4-31所示。圖4-31蜂鳴器控制流程圖
2)指令代碼
(1)編寫匯編語(yǔ)言代碼。用匯編語(yǔ)言編寫的指令代碼如下:
人耳可以聽(tīng)到的振動(dòng)頻率是20~20000Hz,頻率不同所產(chǎn)生的音調(diào)也就不同。單片機(jī)通過(guò)I/0端口的引腳產(chǎn)生高低電平變化,推動(dòng)蜂鳴器振動(dòng)發(fā)出聲音,只要改變I/O端口引腳變化的頻率,就可以控制蜂鳴器的振動(dòng)頻率,產(chǎn)生不同的聲音。只需要改變DELAY子程序的延時(shí)時(shí)間,就可以改變引腳高低變化的頻率。
(2)編寫C語(yǔ)言代碼。用C語(yǔ)言編寫的指令代碼如下:
在C語(yǔ)言中,不可以直接寫P2.3,因?yàn)檫@樣的變量名不合法,我們用P2^3代替P2.3。如果要單獨(dú)對(duì)某位進(jìn)行操作,可在程序的開(kāi)頭加上位寄存器定義,例如:
sbitP2.3=P2^3;//定義位變量P2.3為P2口的第3位
sbitP1.0=P1^0;//定義位變量P1.0為P1口的第0位
sbitP2.1=P2^1;//定義位變量P2.1為P2口的第1位
sbita=P3^1; //定義位變量a為P3口的第1位
在隨后的程序中即可對(duì)這些位進(jìn)行訪問(wèn)。例如:
P2.3=1; //P2.3引腳為1 P1.0=1; //P1.0引腳為1 P2.1=0; //P2.1引腳為0 a=1; //P3.1引腳為1假如P0、P1、P2、P3口的某些位是連接到外部電路的指定引腳的,可將這些引腳名作為位名,例:假如打印機(jī)的BUSY引腳和P1.0相連,可以這樣進(jìn)行定義:
sbitBUSY=P1^0;這樣增加了程序的可讀性。
4.電路板制作
(1)準(zhǔn)備器件。按表4-5準(zhǔn)備元器件。表4-5蜂鳴器控制電路元器件清單
(2)編譯或匯編源程序C4_3.C或A4_3.ASM,生成目標(biāo)代碼文件,將目標(biāo)代碼燒錄到芯片,參照?qǐng)D4-30所示,用面包板搭接電路板如圖4-32所示。
接通電源,驗(yàn)證功能,實(shí)現(xiàn)任務(wù)3的要求。圖4-32蜂鳴器控制電路板
問(wèn)1:任務(wù)1的程序代碼寫的很長(zhǎng),有沒(méi)有其他簡(jiǎn)單的方法呢?答:有??刹捎醚h(huán)程序的設(shè)計(jì)方法實(shí)現(xiàn)任務(wù)1的要求,方法如下:
(1)用匯編語(yǔ)言編寫的指令代碼。方法一:4.4互動(dòng)環(huán)節(jié)
分析傳送數(shù)據(jù)排列的規(guī)律可以發(fā)現(xiàn),它們之間存在著后面?zhèn)魉偷臄?shù)據(jù)依次是前面?zhèn)魉蛿?shù)據(jù)左移一位的結(jié)果,因此我們可以用循環(huán)程序來(lái)實(shí)現(xiàn)這一傳送過(guò)程。方法二:
查表程序中的兩個(gè)關(guān)鍵點(diǎn):一是定義表格,二是查表指令的運(yùn)用。定義表格是指在“源程序”中用偽指令定義出一串常數(shù)的起始位置和排列順序,如平方表、字型碼、鍵碼表等。在匯編時(shí)匯編程序?qū)凑諅沃噶疃x的位置和排列順序自動(dòng)將其存放在指定的存儲(chǔ)單元中。所以在上面的查表程序中,用偽指令DB定義顯示模式字的排列順序和起始位置。定義格式為:
[標(biāo)號(hào):]DB字節(jié)數(shù)據(jù)表
字節(jié)數(shù)據(jù)表可以由多個(gè)8位二進(jìn)制字節(jié)數(shù)據(jù)組成,也可以是字符串或表達(dá)式。DB表示將字節(jié)數(shù)據(jù)表中的數(shù)據(jù)從左到右依次存放在由符號(hào)地址TABLE起始的地址單元中。指令表中提供了兩條專門用于查表操作的查表指令
MOVC A,@A+DPTR
MOVC A,@A+PC 其中,DPTR直接用來(lái)存放表首地址,累加器A中的內(nèi)容則用于修訂每次的查表地址;PC中存放該查表指令下一條指令的地址。采用哪條指令可以自行選擇,若采用后者要考慮對(duì)表首地址的修訂。(2)用C語(yǔ)言編寫的指令代碼。方法一:
比較程序C4_1.C和C4_5.C可以看出,順序結(jié)構(gòu)程序思路直觀,簡(jiǎn)單易讀,是初學(xué)者最容易實(shí)現(xiàn)的程序設(shè)計(jì)方法。但程序代碼較長(zhǎng),如下類似的程序段重復(fù)出現(xiàn)了八次:
P1=0xfe; //點(diǎn)亮第1個(gè)發(fā)光二極管
delay(200); //延時(shí)每次重復(fù)時(shí),只是送到P1口的值不同,因此可以考慮采用循環(huán)程序結(jié)構(gòu)來(lái)實(shí)現(xiàn)。方法二:※※※※※※※※※※※※※※※※※※※※※//程序名為:C4_6.C#include<reg51.h> //包含頭文件reg51.h#include<intrins.h> //包含頭文件intrins.hvoiddelay(unsignedchari); //延時(shí)函數(shù)聲明voidmain() //主函數(shù){unsignedchari,led; while(1){led=0xFE; //信號(hào)燈顯示字初值為FEH for(i=0;i<8;i++){ P1=led; //顯示字送P1口delay(200); //延時(shí)
led=_crol_(led,1);
//led循環(huán)左移1位,點(diǎn)亮下一個(gè)LED
} }}voiddelay(uns
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 蘭州校隊(duì)的籃球申請(qǐng)書
- 因疫情暫不離校申請(qǐng)書
- 要求案外人出庭申請(qǐng)書
- 2025年企業(yè)內(nèi)部流程優(yōu)化與再造
- 2026年清明節(jié)的傳統(tǒng)認(rèn)識(shí)
- 2025年環(huán)保生產(chǎn)設(shè)備操作與維護(hù)規(guī)范
- 在職人員綠色出行申請(qǐng)書
- 旅游行業(yè)市場(chǎng)調(diào)研與預(yù)測(cè)指南(標(biāo)準(zhǔn)版)
- 訂閱?wèn)|方今報(bào)報(bào)紙申請(qǐng)書
- 新安醫(yī)院面試題目及答案
- 《2025年ESCEACTS瓣膜性心臟病管理指南》更新要點(diǎn)解讀
- 2025年哈爾濱輔警招聘考試真題附答案詳解(a卷)
- 扁桃體術(shù)后出血的護(hù)理
- 華文慕課 刑法學(xué)總論課后作業(yè)答案
- 康復(fù)科康復(fù)治療計(jì)劃制定流程
- 精神科常見(jiàn)藥物不良反應(yīng)及處理
- 電梯的安裝合同(標(biāo)準(zhǔn)版)
- 光伏電站運(yùn)維管理標(biāo)準(zhǔn)操作規(guī)程
- 鋼筋施工施工方案
- 脊髓電刺激促醒術(shù)課件
- SA8000-2026社會(huì)責(zé)任管理體系新版的主要變化及標(biāo)準(zhǔn)內(nèi)容培訓(xùn)教材
評(píng)論
0/150
提交評(píng)論