




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、1第第3 3章章 程序設(shè)計的基本技術(shù)程序設(shè)計的基本技術(shù) (二)(二)23.3 循環(huán)程序設(shè)計 v3.3.1 循環(huán)程序設(shè)計方法 v3.3.2 循環(huán)程序設(shè)計實例 33.3.1 循環(huán)程序設(shè)計方法 v循環(huán)程序的結(jié)構(gòu)一般包括以下幾部分。循環(huán)程序的結(jié)構(gòu)一般包括以下幾部分。l循環(huán)初始化循環(huán)初始化是進入循環(huán)處理前必須要有的一個環(huán)節(jié),是進入循環(huán)處理前必須要有的一個環(huán)節(jié),用于完成循環(huán)前的準備工作。循環(huán)初始化包括給工作寄存用于完成循環(huán)前的準備工作。循環(huán)初始化包括給工作寄存器器(或其他存儲單元或其他存儲單元)設(shè)置計數(shù)初值、地址指針、數(shù)據(jù)塊長度設(shè)置計數(shù)初值、地址指針、數(shù)據(jù)塊長度等。等。l循環(huán)處理循環(huán)處理是需要多次重復(fù)執(zhí)行
2、的程序段。循環(huán)處理是是需要多次重復(fù)執(zhí)行的程序段。循環(huán)處理是循環(huán)程序的核心,用于完成主要的計算和操作任務(wù)。循環(huán)程序的核心,用于完成主要的計算和操作任務(wù)。 l循環(huán)控制循環(huán)控制是用條件轉(zhuǎn)移指令控制循環(huán)是否繼續(xù)。每循是用條件轉(zhuǎn)移指令控制循環(huán)是否繼續(xù)。每循環(huán)一次,根據(jù)循環(huán)結(jié)束條件進行一次判斷;當(dāng)滿足條件時,環(huán)一次,根據(jù)循環(huán)結(jié)束條件進行一次判斷;當(dāng)滿足條件時,停止循環(huán),繼續(xù)執(zhí)行其他程序;否則,再作循環(huán)。停止循環(huán),繼續(xù)執(zhí)行其他程序;否則,再作循環(huán)。l循環(huán)結(jié)束循環(huán)結(jié)束用于存放循環(huán)程序的執(zhí)行結(jié)果,同時恢復(fù)相用于存放循環(huán)程序的執(zhí)行結(jié)果,同時恢復(fù)相關(guān)工作單元的初值。關(guān)工作單元的初值。 43.3.1 循環(huán)程序設(shè)計方法
3、 v循環(huán)程序一般有兩種編寫方法。循環(huán)程序一般有兩種編寫方法。l先循環(huán)處理后循環(huán)控制先循環(huán)處理后循環(huán)控制(即先處理后判斷即先處理后判斷),其流程如下圖所,其流程如下圖所示。示。l先循環(huán)控制后循環(huán)處理先循環(huán)控制后循環(huán)處理(即先判斷后處理即先判斷后處理),其流程如下圖所,其流程如下圖所示。示。v循環(huán)處理和循環(huán)控制構(gòu)成循環(huán)體,若循環(huán)程序的循環(huán)體內(nèi)循環(huán)處理和循環(huán)控制構(gòu)成循環(huán)體,若循環(huán)程序的循環(huán)體內(nèi)不再包含其他循環(huán)程序,則稱為不再包含其他循環(huán)程序,則稱為單重循環(huán)單重循環(huán)程序。若循環(huán)程程序。若循環(huán)程序的循環(huán)體內(nèi)包含有其他循環(huán)程序,則稱為序的循環(huán)體內(nèi)包含有其他循環(huán)程序,則稱為多重循環(huán)多重循環(huán)程序,程序,又稱為
4、又稱為循環(huán)嵌套循環(huán)嵌套。v多重循環(huán)程序中的各重循環(huán)不能有交叉,不能從外循環(huán)跳多重循環(huán)程序中的各重循環(huán)不能有交叉,不能從外循環(huán)跳入內(nèi)循環(huán),只能外循環(huán)內(nèi)嵌套內(nèi)循環(huán)。兩重循環(huán)程序流程入內(nèi)循環(huán),只能外循環(huán)內(nèi)嵌套內(nèi)循環(huán)。兩重循環(huán)程序流程如下圖所示。如下圖所示。 5 先判斷后處理 先處理后判斷 兩重循環(huán)循環(huán)程序流程圖 循環(huán)程序流程圖 程序流程圖 63.3.1 循環(huán)程序設(shè)計方法 v循環(huán)程序的特點和設(shè)計方法。循環(huán)程序的特點和設(shè)計方法。l程序結(jié)構(gòu)緊湊,占用存儲單元較少,程序中間有分支,循程序結(jié)構(gòu)緊湊,占用存儲單元較少,程序中間有分支,循環(huán)程序本質(zhì)上是分支程序的一種特殊形式。環(huán)程序本質(zhì)上是分支程序的一種特殊形式。
5、lDJNZ指令使用得較多,凡是分支程序中可以使用的控制轉(zhuǎn)指令使用得較多,凡是分支程序中可以使用的控制轉(zhuǎn)移類指令,循環(huán)程序一般都可以使用。移類指令,循環(huán)程序一般都可以使用。l循環(huán)控制的形式有多種。計數(shù)循環(huán)是最常用的一種,它先循環(huán)控制的形式有多種。計數(shù)循環(huán)是最常用的一種,它先預(yù)置計數(shù)初值,再用預(yù)置計數(shù)初值,再用 DJNZ指令控制循環(huán)次數(shù);條件循環(huán)指令控制循環(huán)次數(shù);條件循環(huán)也是較常用的一種,它先預(yù)置結(jié)束循環(huán)的條件,再用也是較常用的一種,它先預(yù)置結(jié)束循環(huán)的條件,再用CJNE指令、指令、JZ指令或指令或JB指令控制循環(huán)的結(jié)束。指令控制循環(huán)的結(jié)束。 73.3.2 循環(huán)程序設(shè)計實例【例例1】 片內(nèi)片內(nèi)RAM
6、中存放有中存放有10個數(shù)據(jù),個數(shù)據(jù),首地址為首地址為30H,編程將數(shù)據(jù)塊傳送到,編程將數(shù)據(jù)塊傳送到片外片外RAM以以1000H為首地址的存儲為首地址的存儲單元中。單元中。 解:該程序是單重循環(huán)程序,片內(nèi)解:該程序是單重循環(huán)程序,片內(nèi)RAM首地址首地址30H、片外、片外RAM首地址首地址1000H和數(shù)據(jù)塊長度和數(shù)據(jù)塊長度10都是循環(huán)初都是循環(huán)初始化的內(nèi)容。始化的內(nèi)容。 循環(huán)控制是對數(shù)據(jù)塊長度進行判斷,循環(huán)控制是對數(shù)據(jù)塊長度進行判斷,每傳送一個數(shù)據(jù),存放數(shù)據(jù)塊長度的每傳送一個數(shù)據(jù),存放數(shù)據(jù)塊長度的寄存器減寄存器減1;10個數(shù)據(jù)傳送完,存放個數(shù)據(jù)傳送完,存放數(shù)據(jù)塊長度的寄存器內(nèi)容正好為零,數(shù)據(jù)塊長度
7、的寄存器內(nèi)容正好為零,退出循環(huán)。退出循環(huán)。 開始R1賦30H、DPTR賦1000HR1給A給DPTRR1和DPTR加1結(jié)束R2-1=00H?YNR2=108ENDSJMP $80 FE010DH;循環(huán)次數(shù)未到循環(huán)次數(shù)未到10次次,轉(zhuǎn)移轉(zhuǎn)移DJNZ R2,LOOPDA FA010BH;修改片外修改片外RAM地址指針地址指針I(yè)NC DPTRA3010AH;修改片內(nèi)修改片內(nèi)RAM地址指針地址指針I(yè)NC R1090109H;數(shù)據(jù)傳送到片外數(shù)據(jù)傳送到片外RAM MOVX DPTR,AF00108H;從片內(nèi)從片內(nèi)RAM取數(shù)據(jù)取數(shù)據(jù)LOOP:MOV A,R1E70107H;數(shù)據(jù)塊的長度數(shù)據(jù)塊的長度MOV R
8、2,#107A 0A0105H;置片外置片外RAM地址指針地址指針1000HMOV DPTR,#1000H90 10 000102H;置片內(nèi)置片內(nèi)RAM地址指針地址指針30HMAIN:MOV R1,#30H79 300100HORG 0100HLJMP MAIN02 01 000000HORG 0000H注釋注釋程序程序機器碼機器碼地址地址93.3.2 循環(huán)程序設(shè)計實例【例例2】將內(nèi)部將內(nèi)部RAM中起始地址為中起始地址為data的數(shù)據(jù)串送到外部的數(shù)據(jù)串送到外部RAM中起始地址為中起始地址為buffer的存儲區(qū)域中,直到發(fā)現(xiàn)的存儲區(qū)域中,直到發(fā)現(xiàn)$字符,傳字符,傳送停止送停止-循環(huán)次數(shù)事先不知道
9、先判斷,后執(zhí)行。循環(huán)次數(shù)事先不知道先判斷,后執(zhí)行。開始給R0賦dataDPTR賦bufferDPTR加1R0加1結(jié)束A=24H?YNR1給AA 給DPTR10 MOV R0,#data MOV DPTR,#bufferLOOP1:MOV A,R0 CJNE A,#24H,LOOP2 ;判斷是否為字符 SJMP LOOP3 ;是,轉(zhuǎn)結(jié)束LOOP2:MOVX DPTR,A ;不是,傳送數(shù)據(jù) INC R0 INC DPTR SJMP LOOP1 ;傳送下一數(shù)據(jù)LOOP3:END113.3.2 循環(huán)程序設(shè)計實例【例例3】片內(nèi)片內(nèi)RAM中存放一批數(shù)據(jù),查找出最大值并存放于首中存放一批數(shù)據(jù),查找出最大值并
10、存放于首地址中。設(shè)地址中。設(shè)R0中存首地址,中存首地址,R2中存放字節(jié)數(shù)。中存放字節(jié)數(shù)。12 MOV R2 MOV R2,n n ;n n為要比較的數(shù)據(jù)字節(jié)數(shù)為要比較的數(shù)據(jù)字節(jié)數(shù) MOV AMOV A,R0R0 ;存首地址指針;存首地址指針 MOV R1MOV R1,A ADEC R2DEC R2; MOV AMOV A,R1 R1 LOOP:LOOP:MOV R3MOV R3, A A;將數(shù)據(jù)暫存;將數(shù)據(jù)暫存R3R3 DEC R1DEC R1 CLR CCLR C SUBB ASUBB A,R1R1;兩個數(shù)比較;兩個數(shù)比較 JNC LOOP1JNC LOOP1;C=0C=0,A A中的數(shù)大,
11、跳中的數(shù)大,跳LOOP1LOOP1 MOV AMOV A,R1R1;C=1C=1,則大數(shù)送,則大數(shù)送A A SJMP LOOP2SJMP LOOP2LOOP1:LOOP1:MOV AMOV A,R3 R3 LOOP2:LOOP2:DJNZ R2, LOOPDJNZ R2, LOOP;是否比較結(jié)束?;是否比較結(jié)束? MOV R0MOV R0, A A;存最大數(shù);存最大數(shù) RET RET 133.3.2 循環(huán)程序設(shè)計實例【例例4】一批單字節(jié)無符號數(shù),以一批單字節(jié)無符號數(shù),以R0為首地址指針,為首地址指針,R2中為字中為字節(jié)數(shù),將這批數(shù)進行升序排列。節(jié)數(shù),將這批數(shù)進行升序排列。冒泡法:相鄰數(shù)互換的排
12、序方法,類似水中氣泡上浮冒泡法:相鄰數(shù)互換的排序方法,類似水中氣泡上浮 。排。排序時從前向后進行相鄰兩個數(shù)的比較,次序與要求的順序序時從前向后進行相鄰兩個數(shù)的比較,次序與要求的順序不符時,就將兩個數(shù)互換;順序符合要求不互換。不符時,就將兩個數(shù)互換;順序符合要求不互換。 。14SORTSORT:MOV AMOV A,R0 R0 ;MOV R1MOV R1,A AMOV AMOV A,R2R2;字節(jié)數(shù)送入;字節(jié)數(shù)送入R5R5MOV R5MOV R5,A ACLR F0CLR F0;互換標志位;互換標志位F0F0清零清零DEC R5DEC R5;MOV AMOV A,R1R1;LOOP:LOOP:M
13、OV R3MOV R3,A A;INC R1INC R1;CLR CCLR C; 15MOV AMOV A,R1R1;A A為后一個數(shù)為后一個數(shù)SUBB ASUBB A,R3R3 ;比較大小;比較大小JNC LOOP1JNC LOOP1 ;C=0,AR3C=0,AR3轉(zhuǎn)移轉(zhuǎn)移SETB F0SETB F0;互換標志位;互換標志位F0F0置置1 1MOV AMOV A,R3R3;XCH AXCH A,R1R1;兩個數(shù)互換;兩個數(shù)互換DEC R1DEC R1;XCH AXCH A,R1R1;INC R1INC R1LOOP1LOOP1:MOV AMOV A,R1 R1 DJNZ R5DJNZ R5,
14、LOOP LOOP JB F0JB F0,SORT SORT RETRET163.3.2 循環(huán)程序設(shè)計實例【例例5】 P1口做為輸出口控制步進電動機的四相繞組,編寫程口做為輸出口控制步進電動機的四相繞組,編寫程序,控制步進電動機每序,控制步進電動機每2s正向轉(zhuǎn)動一步。晶振頻率正向轉(zhuǎn)動一步。晶振頻率6MHz。解:步距角:解:步距角:b=360/mZ () 電機轉(zhuǎn)速:電機轉(zhuǎn)速:n=60f/mZ (r/min)上式中:上式中:f 為脈沖頻率,單位:為脈沖頻率,單位:Hz或步或步/s。 m 為拍數(shù),本例中為為拍數(shù),本例中為4。 Z 為轉(zhuǎn)子齒數(shù),本例中取為轉(zhuǎn)子齒數(shù),本例中取5。 拍數(shù)拍數(shù)m=4,若使用的
15、步進電動機轉(zhuǎn)子齒數(shù),若使用的步進電動機轉(zhuǎn)子齒數(shù)Z為為5,則步距角,則步距角b=18。題目要求步進電動機每。題目要求步進電動機每2s正向轉(zhuǎn)動一步,即正向轉(zhuǎn)動一步,即T=2s,則,則f=0.5Hz,電機轉(zhuǎn)速,電機轉(zhuǎn)速n=1.5r/min。 用三重循環(huán)設(shè)計用三重循環(huán)設(shè)計2s的循環(huán)程序。晶振頻率為的循環(huán)程序。晶振頻率為6MHz時,機時,機器周期為器周期為2 s,延時程序的延時時間計算方法如下:,延時程序的延時時間計算方法如下: 1+1+(1+1+21+1+(1+1+2123+2)123+2)200+2200+220+220+22 2 s s =2000126 =2000126 s=2.000126s
16、s=2.000126s 17 P1.0P1.3口作為輸出口分別控制步進電動機的四相繞組,步進電動機的控制狀態(tài)與P1口的控制碼的對應(yīng)關(guān)系如下表所示。1001000009HD相、相、A相繞組通電相繞組通電001100000CHC相、相、D相繞組通電相繞組通電0110000006HB相、相、C相繞組通電相繞組通電1100000003HA相、相、B相繞組通電相繞組通電A相相B相相C相相D相相P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7P1口口控制碼控制碼控制狀態(tài)控制狀態(tài)18;重復(fù)循環(huán)重復(fù)循環(huán) SJMP MAIN80 E60048H LCALL DELAY12 01 000045H;
17、DA相通電相通電 MOV P1, #09H75 90 090042H LCALL DELAY12 01 00003FH;CD相通電相通電 MOV P1, #0CH75 90 0C 003CH LCALL DELAY12 01 000039H;BC相通電相通電 MOV P1, #06H75 90 060036H LCALL DELAY12 01 000033H;AB相通電相通電 MAIN: MOV P1,#03H75 90 030030H ORG 0030H LJMP MAIN02 00 300000H ORG 0000H注釋注釋程序程序機器碼機器碼地址地址主程序:19;程序結(jié)束程序結(jié)束 END
18、 RET22010DH DJNZ R3,LP1DB F5010BH DJNZ R7,LP2DF F90109H LP3: DJNZ R6,LP3DE FE0107H NOP000106H;延時延時0.5ms的循環(huán)次數(shù)的循環(huán)次數(shù) LP2: MOV R6,#1237E 7B0104H;延時延時100ms的循環(huán)次數(shù)的循環(huán)次數(shù) LP1: MOV R7,#2007F C80102H;延時延時2s的循環(huán)次數(shù)的循環(huán)次數(shù)DELAY: MOV R3,#207B 140100H ORG 0100H注釋注釋程序程序機器碼機器碼地址地址延時子程序:203.4 分支程序設(shè)計 v3.4.1 分支程序設(shè)計方法 v3.4.2
19、 分支程序設(shè)計實例 213.4.1 分支程序設(shè)計方法v分支程序是根據(jù)程序的要求改變程序的執(zhí)行順序,并根據(jù)條分支程序是根據(jù)程序的要求改變程序的執(zhí)行順序,并根據(jù)條件對程序的流向進行判斷的程序結(jié)構(gòu)。件對程序的流向進行判斷的程序結(jié)構(gòu)。v分支程序一般有兩個或兩個以上的出口。分支程序一般有兩個或兩個以上的出口。v分支程序又分為分支程序又分為單分支單分支和和多分支多分支結(jié)構(gòu)。結(jié)構(gòu)。223.4.1 分支程序設(shè)計方法v分支程序的特點和設(shè)計方法。分支程序的特點和設(shè)計方法。l程序中有轉(zhuǎn)移指令包括程序中有轉(zhuǎn)移指令包括無條件轉(zhuǎn)移無條件轉(zhuǎn)移、條件轉(zhuǎn)移條件轉(zhuǎn)移和和散轉(zhuǎn)指令散轉(zhuǎn)指令。l單分支程序單分支程序一般有一般有一個入口
20、一個入口、兩個出口兩個出口,一般用無條件轉(zhuǎn)移,一般用無條件轉(zhuǎn)移和條件轉(zhuǎn)移指令來實現(xiàn),結(jié)構(gòu)形式有兩種。和條件轉(zhuǎn)移指令來實現(xiàn),結(jié)構(gòu)形式有兩種。 一種是當(dāng)條件滿足時,執(zhí)行處理程序一種是當(dāng)條件滿足時,執(zhí)行處理程序2,否則執(zhí)行處理程序,否則執(zhí)行處理程序3。分支程序流程圖如下圖分支程序流程圖如下圖(a)所示。所示。 另一種是當(dāng)條件滿足時,跳過處理程序另一種是當(dāng)條件滿足時,跳過處理程序2,直接執(zhí)行處理程,直接執(zhí)行處理程序序3,否則順序執(zhí)行處理程序,否則順序執(zhí)行處理程序2和處理程序和處理程序3。分支程序流程圖。分支程序流程圖如下圖如下圖(b)所示。所示。233.4.1 分支程序設(shè)計方法 開始 處理 2 處理
21、3 處理 1 初始化 結(jié)束 Y N 條件滿足? (a) 分支程序流程圖 (b) 分支程序流程圖 243.4.1 分支程序設(shè)計方法l分支程序允許分支程序允許嵌套,即一個嵌套,即一個分支接一個分分支接一個分支,形成樹狀支,形成樹狀多分支多分支結(jié)構(gòu)。結(jié)構(gòu)。多分支程序流多分支程序流程圖如右圖所程圖如右圖所示。示。多分支程序流程圖25【例例1】按下面公式編寫程序,按下面公式編寫程序,x為無符號數(shù),存在為無符號數(shù),存在20h單元,單元,y存放在存放在21h單元。單元。204020240 xxxxxxy3.4.2 分支程序設(shè)計實例26 ORG 0030H MOV A, 20H CJNE A, #21, LO
22、OP1LOOP1: JC NEXT1 CJNE A, #40, LOOP2LOOP2: JNC NEXT2 MOV B, #2 MUL AB AJMP NEXT2NEXT1: CPL ANEXT2: MOV 21H, A END最終結(jié)果存在最終結(jié)果存在 21h中中27 【例例2】行李計價:行李計價: 當(dāng)當(dāng)G5,M=G3; 當(dāng)當(dāng)G5,M=G3+(G-5)(5-3)3.4.2 分支程序設(shè)計實例FRT: MOV A,40H ;取行李重量取行李重量G放在放在40H MOV R3,A MOV B,#03H;M=G3 MUL AB MOV R2,A;暫存暫存3 G在在R2 MOV A,R3;取回;取回G
23、CJNE A,#06H,L1 ;G5 ?L1: JC WETC;是,轉(zhuǎn)至;是,轉(zhuǎn)至WETC SUBB A,#05H;否則;否則M=3G+2(G-5) RLC A ADD A,R2 MOV R2,AWETC:MOV 41H,R2 ;最后結(jié)果最后結(jié)果M存存41H end283.4.2 分支程序設(shè)計實例【例例3】 設(shè)計一個水塔水位控制系統(tǒng),晶振頻率設(shè)計一個水塔水位控制系統(tǒng),晶振頻率6MHz。設(shè)計要設(shè)計要求如下:求如下:(1) 在水塔內(nèi)三個不同的高度分別安裝了一根在水塔內(nèi)三個不同的高度分別安裝了一根固定不動的金屬棒,正常情況下,塔內(nèi)固定不動的金屬棒,正常情況下,塔內(nèi)水位應(yīng)保持在虛線之內(nèi),水位控制原理水
24、位應(yīng)保持在虛線之內(nèi),水位控制原理如下圖所示。如下圖所示。 (2) A棒處于水位上限,棒處于水位上限,B棒處于水位下限。當(dāng)棒處于水位下限。當(dāng)水位低于水位下限時,自動啟動水泵電水位低于水位下限時,自動啟動水泵電機給水塔供水;直到塔內(nèi)水位達到水位機給水塔供水;直到塔內(nèi)水位達到水位上限,自動停止水泵電機動轉(zhuǎn)。上限,自動停止水泵電機動轉(zhuǎn)。(3) 塔內(nèi)水位從水位上限下降到水位下限的過塔內(nèi)水位從水位上限下降到水位下限的過程中,水泵電機不會自動啟動。程中,水泵電機不會自動啟動。(4) 水塔進水時,要有信號燈指示;水位檢測水塔進水時,要有信號燈指示;水位檢測發(fā)生故障時,要有故障燈指示并使水塔發(fā)生故障時,要有故障
25、燈指示并使水塔水位控制系統(tǒng)停止工作。水位控制系統(tǒng)停止工作。 293.4.2 分支程序設(shè)計實例 由于水的導(dǎo)電作用,當(dāng)塔內(nèi)水位由于水的導(dǎo)電作用,當(dāng)塔內(nèi)水位達到水位下限時,達到水位下限時,B棒接通棒接通+5V;當(dāng)塔內(nèi)水位達到水位上限時,當(dāng)塔內(nèi)水位達到水位上限時,A棒也接通棒也接通+5V。 水位上限信號水位上限信號輸入至輸入至P1.0,水位水位下限信號下限信號輸入至輸入至P1.1,P1.2輸出輸出控制信號以控制控制信號以控制水泵電機水泵電機的啟動的啟動(P1.2=0)和停止和停止(P1.2=1),P1.3輸出顯示信號以指示輸出顯示信號以指示水泵電機的水泵電機的運行狀態(tài)運行狀態(tài)(P1.3=0時點亮?xí)r點亮
26、),P1.4輸出故障信號以指示輸出故障信號以指示水位檢測系水位檢測系統(tǒng)故障狀態(tài)統(tǒng)故障狀態(tài)(P1.4=0時點亮?xí)r點亮)。 解:當(dāng)塔內(nèi)水位處于水位下限以下時,當(dāng)塔內(nèi)水位處于水位下限以下時,A、B棒通過電阻接地。棒通過電阻接地。 304.4.2 分支程序設(shè)計實例 水位控制信號與水泵電機控制狀態(tài)的對應(yīng)關(guān)系水位控制信號與水泵電機控制狀態(tài)的對應(yīng)關(guān)系 為了防止電機頻繁啟停,在啟動或停止電機后最少要維持這為了防止電機頻繁啟停,在啟動或停止電機后最少要維持這一狀態(tài)一狀態(tài)20s20s,這可以采用延時程序來實現(xiàn)。,這可以采用延時程序來實現(xiàn)。 111水泵電機停止水泵電機停止111維持原來狀態(tài)維持原來狀態(tài)01011故障
27、報警故障報警10100水泵電機啟動水泵電機啟動00P1.4P1.3P1.2控制狀態(tài)控制狀態(tài)P1.0P1.131 SJMP YS80 E40055H SETB P1.3D2 930053H;停止電機停止電機 TZDJ: SETB P1.2D2 920051H SJMP YS80 EA004FH;打開電機運行指示打開電機運行指示 CLR P1.3C2 93004DH;啟動電機啟動電機 QDDJ: CLR P1.2C2 92004BH SJMP $80 FE0049H;打開水位檢測故障指示打開水位檢測故障指示 CLR P1.4C2 940047H;關(guān)閉電機運行指示關(guān)閉電機運行指示 SETB P1.3
28、D2 930045H;停止電機停止電機 SETB P1.2D2 920043H;P1.0=0,轉(zhuǎn)移至啟動電機轉(zhuǎn)移至啟動電機 QDZB: JNB ACC.0,QDDJ30 E0 080040H SJMP MAIN80 F0003EH;延時延時20s YS: LCALL DELAY12 01 00003BH;P1.0=1,轉(zhuǎn)移至停止電機轉(zhuǎn)移至停止電機 JB ACC.0,TZDJ20 E0 160038H;P1.1=0,轉(zhuǎn)移至啟動準備轉(zhuǎn)移至啟動準備 JNB ACC.1,QDZB30 E1 080035H;讀入水位檢測信號讀入水位檢測信號 MOV A,P1F5 90 0033H;水位信號輸入端做讀入準
29、備水位信號輸入端做讀入準備 MAIN: ORL P1,#03H43 90 030030H ORG 0030H LJMP MAIN02 00 300000H ORG 0000H主程序:32;程序結(jié)束程序結(jié)束 END RET22010DH DJNZ R3,LP1DB F5010BH DJNZ R7,LP2DF F90109H LP3: DJNZ R6,LP3DE FE0107H NOP000106H;延時延時0.5ms的循環(huán)次數(shù)的循環(huán)次數(shù) LP2: MOV R6,#1237E 7B0104H;延時延時100ms的循環(huán)次數(shù)的循環(huán)次數(shù) LP1: MOV R7,#2007F C80102H;延時延時20
30、s的循環(huán)次數(shù)的循環(huán)次數(shù)DELAY: MOV R3,#2007B C80100H ORG 0100H注釋注釋程序程序機器碼機器碼地址地址延時子程序:333.5 子程序設(shè)計 v3.5.1 子程序設(shè)計方法 v3.5.2 子程序設(shè)計實例 343.5.1 子程序設(shè)計方法v子程序是指完成某一專門任務(wù)并能被其他程序反復(fù)調(diào)用的子程序是指完成某一專門任務(wù)并能被其他程序反復(fù)調(diào)用的程序段。調(diào)用子程序的程序稱為主程序或程序段。調(diào)用子程序的程序稱為主程序或調(diào)用程序調(diào)用程序。使用。使用子程序的過程稱為子程序的過程稱為調(diào)用子程序調(diào)用子程序。子程序執(zhí)行完后返回主程。子程序執(zhí)行完后返回主程序的過程稱為序的過程稱為子程序返回子程
31、序返回。v主程序和子程序是相對的,同一程序既可以作為另一程序主程序和子程序是相對的,同一程序既可以作為另一程序的子程序,也可以有自己的子程序。也就是說,子程序是的子程序,也可以有自己的子程序。也就是說,子程序是允許允許嵌套嵌套的,嵌套深度和堆棧區(qū)的大小有關(guān)。的,嵌套深度和堆棧區(qū)的大小有關(guān)。v采用子程序能使整個程序結(jié)構(gòu)簡單,縮短程序設(shè)計時間,采用子程序能使整個程序結(jié)構(gòu)簡單,縮短程序設(shè)計時間,減少對存儲空間的占用。減少對存儲空間的占用。 353.5.1 子程序設(shè)計方法v子程序的特點和設(shè)計方法子程序的特點和設(shè)計方法l子程序具有通用性和獨立性,以滿足所有調(diào)用程序?qū)崿F(xiàn)資源子程序具有通用性和獨立性,以滿足
32、所有調(diào)用程序?qū)崿F(xiàn)資源共享。共享。l子程序的第一條指令的地址稱為子程序的第一條指令的地址稱為子程序的入口地址子程序的入口地址,該指令,該指令前應(yīng)有標號。前應(yīng)有標號。l合理地確定子程序的參數(shù)傳遞方式:合理地確定子程序的參數(shù)傳遞方式:入口參數(shù)入口參數(shù)是子程序需要是子程序需要的原始參數(shù),由主程序通過相關(guān)的工作寄存器、特殊功能寄的原始參數(shù),由主程序通過相關(guān)的工作寄存器、特殊功能寄存器、片內(nèi)存器、片內(nèi)RAMRAM或堆棧等傳送給子程序;或堆棧等傳送給子程序;出口參數(shù)出口參數(shù)是根據(jù)入口是根據(jù)入口參數(shù)執(zhí)行子程序后獲得的結(jié)果,由子程序通過相關(guān)的工作寄參數(shù)執(zhí)行子程序后獲得的結(jié)果,由子程序通過相關(guān)的工作寄存器、特殊功
33、能寄存器、片內(nèi)存器、特殊功能寄存器、片內(nèi)RAMRAM或堆棧等傳遞給主程序。或堆棧等傳遞給主程序。l在主程序中可以用調(diào)用指令調(diào)用子程序,在子程序末尾用在主程序中可以用調(diào)用指令調(diào)用子程序,在子程序末尾用RETRET返回指令從子程序返回主程序。返回指令從子程序返回主程序。363.5.1 子程序設(shè)計方法l根據(jù)需要保護現(xiàn)場和恢復(fù)現(xiàn)場。在子程序的開始,使用壓根據(jù)需要保護現(xiàn)場和恢復(fù)現(xiàn)場。在子程序的開始,使用壓棧指令把需要保護的內(nèi)容壓入堆棧;在返回主程序前,使棧指令把需要保護的內(nèi)容壓入堆棧;在返回主程序前,使用彈出指令把堆棧中保護的內(nèi)容送回原來的存儲單元中。用彈出指令把堆棧中保護的內(nèi)容送回原來的存儲單元中。
34、子程序中有可能要使用累加器子程序中有可能要使用累加器A或工作寄存器,在子程序或工作寄存器,在子程序使用它們之前,把它們中可能存有的主程序的中間結(jié)果保使用它們之前,把它們中可能存有的主程序的中間結(jié)果保存起來,這一過程稱為存起來,這一過程稱為保護現(xiàn)場保護現(xiàn)場。在子程序執(zhí)行完并將返。在子程序執(zhí)行完并將返回主程序之前,再將這些中間結(jié)果取出,送回到累加器回主程序之前,再將這些中間結(jié)果取出,送回到累加器A或原來的工作寄存器中,這一過程稱為或原來的工作寄存器中,這一過程稱為恢復(fù)現(xiàn)場恢復(fù)現(xiàn)場。l子程序中應(yīng)盡量使用相對轉(zhuǎn)移指令而不使用其他轉(zhuǎn)移指令,子程序中應(yīng)盡量使用相對轉(zhuǎn)移指令而不使用其他轉(zhuǎn)移指令,以便子程序放
35、在內(nèi)存的任何區(qū)域都能被主程序調(diào)用。以便子程序放在內(nèi)存的任何區(qū)域都能被主程序調(diào)用。l要正確地設(shè)置要正確地設(shè)置堆棧指針堆棧指針,以避免堆棧區(qū)與工作寄存器或其,以避免堆棧區(qū)與工作寄存器或其他存儲單元發(fā)生沖突。他存儲單元發(fā)生沖突。373.5.1 子程序設(shè)計方法v傳送子程序參數(shù)的方法。傳送子程序參數(shù)的方法。l利用寄存器或片內(nèi)利用寄存器或片內(nèi)RAM傳送參數(shù)傳送參數(shù)。可以把入口參數(shù)存放到。可以把入口參數(shù)存放到寄存器或片內(nèi)寄存器或片內(nèi)RAM中傳送給子程序,也可以把出口參數(shù)存中傳送給子程序,也可以把出口參數(shù)存放到寄存器或片內(nèi)放到寄存器或片內(nèi)RAM中傳送給主程序。中傳送給主程序。l利用寄存器傳送參數(shù)的地址利用寄存
36、器傳送參數(shù)的地址。把存放入口參數(shù)的地址通過。把存放入口參數(shù)的地址通過寄存器傳送給子程序,子程序根據(jù)寄存器中存放入口參數(shù)寄存器傳送給子程序,子程序根據(jù)寄存器中存放入口參數(shù)的地址便可找到入口參數(shù)并對它們進行相應(yīng)操作;出口參的地址便可找到入口參數(shù)并對它們進行相應(yīng)操作;出口參數(shù)的地址也可通過寄存器傳送給主程序。數(shù)的地址也可通過寄存器傳送給主程序。l利用堆棧傳送參數(shù)利用堆棧傳送參數(shù)。可以用壓棧指令。可以用壓棧指令PUSH把入口參數(shù)壓入把入口參數(shù)壓入堆棧傳送給子程序,也可以使用壓棧指令堆棧傳送給子程序,也可以使用壓棧指令PUSH把出口參數(shù)把出口參數(shù)壓入堆棧傳送給主程序。壓入堆棧傳送給主程序。 383.5.
37、2 子程序設(shè)計實例【例例1】 將片內(nèi)將片內(nèi)RAM區(qū)區(qū)20H24H單元中的一位十六進制數(shù)轉(zhuǎn)單元中的一位十六進制數(shù)轉(zhuǎn)換成換成ASCII碼,并分別存放到片內(nèi)碼,并分別存放到片內(nèi)RAM區(qū)區(qū)30H34H單元中單元中。解:解:ASCII碼是有一定規(guī)律的編碼,如十六進制數(shù)的碼是有一定規(guī)律的編碼,如十六進制數(shù)的09的的ASCII碼為該數(shù)值加上碼為該數(shù)值加上30H,分別為,分別為30H39H;十六進制;十六進制數(shù)的數(shù)的AF的的ASCII碼為該數(shù)值加上碼為該數(shù)值加上37H,分別為,分別為41H46H。39SJMP $80 FE010FHDJNZ R4,LP1DC F7010DHINC R109010CHINC R
38、008010BH;存放存放ASCII碼碼MOV R1,AF7010AH;調(diào)用代碼轉(zhuǎn)換程序調(diào)用代碼轉(zhuǎn)換程序LCALL HAC12 01 500107H;取十六進制數(shù)取十六進制數(shù)MOV A,R0LP1:E60106H;存放存放ASCII碼首地址碼首地址MOV R1,#30H79 300104H;存放十六進制數(shù)首地址存放十六進制數(shù)首地址MOV R0,#20H78 200102H;數(shù)據(jù)塊的長度數(shù)據(jù)塊的長度MOV R4,#05HMAIN:7C 050100HORG 0100HLJMP MAIN02 01 000000HORG 0000H注釋注釋程序程序機器碼機器碼地址地址主程序:40END;子程序返回子
39、程序返回RET220163H;恢復(fù)現(xiàn)場恢復(fù)現(xiàn)場POP PSWD0 D00161HADD A,#30HLP2:24 30015FHADD A,#07H24 07015DH;(A)10時時,轉(zhuǎn)移轉(zhuǎn)移JC LP240 02015BHPOP ACCD0 E00159H;比較比較A中內(nèi)容的大小中內(nèi)容的大小SUBB A,#0AH94 0A0157H;CLR CC30156H;PUSH ACCC0 E00154H;屏蔽掉高屏蔽掉高4位位ANL A,#0FH54 0F0152H;保護現(xiàn)場保護現(xiàn)場PUSH PSWHAC:C0 D00150H;子程序從地址子程序從地址0150H開始存放開始存放ORG 0150H;
40、占用資源占用資源:PSW;出口參數(shù)出口參數(shù):A存放轉(zhuǎn)換后的存放轉(zhuǎn)換后的ASCII碼碼;入口參數(shù)入口參數(shù):A存放要轉(zhuǎn)換的十六進制數(shù)存放要轉(zhuǎn)換的十六進制數(shù);功能:功能:十六進制數(shù)轉(zhuǎn)換成十六進制數(shù)轉(zhuǎn)換成ASCII碼碼;程序名:程序名:HAC注釋注釋程序程序機器碼機器碼地址地址子程序:413.6 查表程序設(shè)計 v3.6.1 查表程序設(shè)計方法 v3.6.2 查表程序設(shè)計實例423.6.1 查表程序設(shè)計方法v在單片機的實際應(yīng)用中,經(jīng)常要對一些數(shù)據(jù)進行在單片機的實際應(yīng)用中,經(jīng)常要對一些數(shù)據(jù)進行函數(shù)運算函數(shù)運算,例如求平方、正弦函數(shù)等,為了提高單片機執(zhí)行程序的速例如求平方、正弦函數(shù)等,為了提高單片機執(zhí)行程序的
41、速度,一般將某函數(shù)的全部函數(shù)值按一定的規(guī)律編成表格存度,一般將某函數(shù)的全部函數(shù)值按一定的規(guī)律編成表格存放到程序存儲器中。放到程序存儲器中。v查表程序查表程序就是根據(jù)某數(shù)據(jù)的函數(shù)運算要求,按索引號從程就是根據(jù)某數(shù)據(jù)的函數(shù)運算要求,按索引號從程序存儲器中查找與之相對應(yīng)的函數(shù)值的程序結(jié)構(gòu)。序存儲器中查找與之相對應(yīng)的函數(shù)值的程序結(jié)構(gòu)。v設(shè)計查表程序時,主要通過兩條設(shè)計查表程序時,主要通過兩條查表指令查表指令實現(xiàn)查表功能。實現(xiàn)查表功能。433.6.1 查表程序設(shè)計方法v查表程序的特點和設(shè)計方法。查表程序的特點和設(shè)計方法。l查表指令查表指令“MOVC A,A+DPTR”的查表過程比較簡單。的查表過程比較簡
42、單。查表時首先需要把數(shù)據(jù)表格起始地址存入查表時首先需要把數(shù)據(jù)表格起始地址存入DPTR,然后把所,然后把所查數(shù)據(jù)的索引值送入累加器查數(shù)據(jù)的索引值送入累加器A中,最后使用查表指令中,最后使用查表指令“MOVC A,A+DPTR”完成查表。完成查表。l查表指令查表指令“MOVC A,A+PC”的查表過程相對復(fù)雜一些。的查表過程相對復(fù)雜一些。查表時首先使用傳送指令把所查數(shù)據(jù)的索引值送入累加器查表時首先使用傳送指令把所查數(shù)據(jù)的索引值送入累加器A,然后用然后用“ADD A,#data”指令對累加器指令對累加器A進行修正。進行修正。data值由該式確定:值由該式確定:PC+data=數(shù)據(jù)表格的首地址。其中,數(shù)據(jù)表格的首地址。其中,PC是是“MOVC A,A+PC”的下一條指令的地址。因此,的下一條指令的地址。因此,data值實際等于查表指令和數(shù)據(jù)表格之間的字節(jié)數(shù)。最后值實際等于查表指令和數(shù)據(jù)表格之間的字節(jié)數(shù)。最后使用查表指令使用查表指令“MOVC A,A+PC”完成查表。完成查表。443.6.2 查表程序設(shè)計實例【例例14】 變量變量a、b均為小于均為小于10的正整數(shù),編程計算的正整數(shù),編程計算c=a2+b2,其中變量其中變量a、b分別存放在片內(nèi)分
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 四年級信息技術(shù)上冊 回收站(一)教學(xué)設(shè)計 教科版
- 全國電子工業(yè)版初中信息技術(shù)第二冊第2單元2.3活動1《認識網(wǎng)絡(luò)新媒體》教學(xué)設(shè)計
- 北師大版數(shù)學(xué)二年級下冊《測量》單元整體教學(xué)設(shè)計
- 2025至2030年中國低邊拼密鋁扣板數(shù)據(jù)監(jiān)測研究報告
- 內(nèi)江2025年四川內(nèi)江市東興區(qū)招募特聘動物防疫專員12人筆試歷年參考題庫附帶答案詳解
- 八上第二單元大單元教學(xué)設(shè)計
- Module5 Unit2 They were young(教學(xué)設(shè)計)2023-2024學(xué)年外研版(三起)英語四年級下冊
- 佛山2025年廣東佛山市技師學(xué)院招聘坐班制聘用人員(第五批)筆試歷年參考題庫附帶答案詳解
- 人教版八年級下冊歷史與社會教案
- 2022年中小學(xué)體育課堂教學(xué)規(guī)范
- 新人教版八年級下冊英語全冊教案(教學(xué)設(shè)計)
- 2022年河南省鄭州市中考二模語文試卷
- 東莞市衛(wèi)生與健康十三五規(guī)劃
- 土壤分析技術(shù)規(guī)范(第二版)
- 3力浮力答案第1講難題型密度計
- 地下車庫交通標志標線及地坪漆工程施工組織設(shè)計
- 專題一電磁感應(yīng)與電路ppt課件
- GDFJ005修改個人信息申請表
- JJF 1363-2019硫化氫氣體檢測儀型式評價大綱(高清版)
- 氟喹諾酮類抗菌藥物的不良反應(yīng)和臨床應(yīng)用概要
評論
0/150
提交評論