單片機原理、接口及應(yīng)用:第3章 MCS-51單片機匯編語音程序設(shè)計_第1頁
單片機原理、接口及應(yīng)用:第3章 MCS-51單片機匯編語音程序設(shè)計_第2頁
單片機原理、接口及應(yīng)用:第3章 MCS-51單片機匯編語音程序設(shè)計_第3頁
單片機原理、接口及應(yīng)用:第3章 MCS-51單片機匯編語音程序設(shè)計_第4頁
單片機原理、接口及應(yīng)用:第3章 MCS-51單片機匯編語音程序設(shè)計_第5頁
已閱讀5頁,還剩40頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第3章 MCS51單片機匯編語言程序設(shè)計單片機原理、接口及應(yīng)用內(nèi) 容 提 要概述偽指令匯編語言程序設(shè)計步驟順序程序設(shè)計分支程序設(shè)計循環(huán)程序設(shè)計位操作程序設(shè)計子程序小結(jié)3.1 概述 MCS-51單片機的編程語言可以是匯編語言也可以是高級語言(如C語言),高級語言編程快捷,但程序長,占用存儲空間大,執(zhí)行慢;匯編語言產(chǎn)生的目標(biāo)程序簡短,占用存儲空間小,執(zhí)行快,能充分發(fā)揮計算機的硬件功能。無論是高級語言還是匯編語言,源程序都要轉(zhuǎn)換成目標(biāo)程序(機器語言)單片機才能執(zhí)行。連接/定位器L51匯編語言源程序匯編器A51符號轉(zhuǎn)換程序OHS51絕對地址目標(biāo)程序 .BINC語言程序浮動地址目標(biāo)程序編譯器C51 HE

2、X圖 3-1 兩種語言源程序轉(zhuǎn)換成目標(biāo)程序 目前很多公司將編輯器、匯編器、編譯器、連接/定位器、符號轉(zhuǎn)換程序做成集成軟件包,用戶進入該集成環(huán)境,編輯好程序后,只需點擊相應(yīng)菜單就可以完成上述的各步,如WAVE、 KEIL ,WAVE集成軟件的使用見附錄。 匯編:將匯編語言源程序轉(zhuǎn)換成機器語言目標(biāo)程序的過程稱為匯編。 匯編程序:能將匯編語言源程序轉(zhuǎn)換成機器語言目標(biāo)程序的系統(tǒng)軟件稱為匯編程序。匯編的方法:匯編的方法有兩種1.手工匯編: 人工查指令表,查出程序中每條指令對應(yīng)的機器代碼。早期的計算機使用。2.機器匯編: 用計算機中的匯編程序?qū)τ脩粼闯绦蜻M行匯編。 用機器匯編要提供給匯編一些信息,遵循匯編

3、程序的一些約定。這些由偽指令指定。1)確定程序中每條匯編語言指令的指令機器碼2)確定每條指令在存儲器中的存放地址3)提供錯誤信息4)提供目標(biāo)執(zhí)行文件(*.OBJ/*.HEX)和列表文件(*.LST) 地址 機器碼源程序 ORG 2000H 2000H 78 30 MAIN:MOV R0,#30H 2002H E6 MOV A,R0 1. 機器指令:指令系統(tǒng)中的全部指令。每條機器指令都有對應(yīng)的機器代碼,可以被CPU執(zhí)行。2. 偽指令: 匯編控制指令,沒有指令代碼,只用于匯編過程,為匯編程序提供匯編信息。一、匯編語言指令類型 宏匯編功能:將需要反復(fù)多次執(zhí)行的程序段定義成一個宏指令名(宏定義)。編程

4、時,可在程序中使用宏指令名來替代被定義的程序段(宏調(diào)用)。3.2偽指令宏定義過程:宏調(diào)用過程: 宏指令名 實際參數(shù) 宏指令名 實際參數(shù)宏指令名 MACRO 形式參數(shù) ;被定義的程序段 ENDM二偽指令 常用偽指令及功能:1.起始指令 ORG nn功能:定義程序或數(shù)據(jù)塊的起始地址。指示此語句后面的程序或數(shù)據(jù)塊以nn為起始地址,連續(xù)存放在程序存儲器中。 指令地址 機器碼源程序 ORG 2000H 2000H 78 30 MAIN:MOV R0,#30H 2002H E6 MOV A,R0 ORG 3000H 3000H 23 TAB: DB 23H,100,A 3001H 64 3002H 412

5、.字節(jié)定義 標(biāo)號: DB(字節(jié)常數(shù),或字符或表達式)功能:指示在程序存儲器中以標(biāo)號為起始地址的單元里存放的數(shù)為字節(jié)數(shù)據(jù)(八位二進制數(shù))。例如 LN:DB 32,C,25H,-1;LNLN+2 地址單元依次存放20H , 43H , 25H ,F(xiàn)FH地址 數(shù)據(jù)LN20LN+143LN+225LN+3FF3. 字定義 標(biāo)號:DW (字常數(shù)或表達式)作用: 指示在程序存儲器中以標(biāo)號為起始地址的單元里存放的數(shù)為字數(shù)據(jù)(即16位的二進制數(shù)),例如:GH :DW 1234H,5678H,08GH1234GH+25678GH+40008 5. 等值指令 標(biāo)號 EQU(數(shù)值表達式) 表示EQU兩邊的量等值,用

6、于為標(biāo)號或標(biāo)識符賦值。例如: X1 EQU 2000H X2 EQU 0FH MAIN: MOV DPTR,#X1 ; DPTR=2000H ADD A,#X2 ; A=A+0FH4保留字節(jié) 標(biāo)號:DS (數(shù)值表達式)作用: 指示在程序存儲器中保留以標(biāo)號為起始地址的若干字節(jié)單元,其單元個數(shù)由數(shù)值表達式指定。例如 L1:DS 32 ; 從L1地址開始保留32個存儲單元。6. 位定義 標(biāo)號 BIT 位地址作用: 同EQU指令,不過定義的是位操作地址。例如 AIC BIT P1.1。7.匯編結(jié)束 END作用: 指示源程序段結(jié)束。 END指令放在程序的最后。A51匯編程序還有一些其它的偽指令,列在教材

7、表3-1中,以備查閱。匯編語言程序設(shè)計步驟一.確定方案和計算方法二.了解應(yīng)用系統(tǒng)的硬件配置、性能指標(biāo)三.建立系統(tǒng)數(shù)學(xué)模型,確定控制算法和操作步驟四.合理分配存儲器單元和了解I/O接口地址五. 編制源程序1.按功能設(shè)計程序,明確各程序之間的相互關(guān)系2. 用流程圖表示程序結(jié)構(gòu)和功能開始1 YN?3.程序中用注釋說明指令在程序中的作用,方便閱讀、調(diào)試和修改 順序程序設(shè)計例3-1 編程將外部數(shù)據(jù)存儲器的000EH和000FH單元的內(nèi)容相換。 常用程序結(jié)構(gòu) 順序程序、分支程序、循環(huán)程序、子程序000EH000FH000EH000FH000EH000FH000EH000FH分析: 外部數(shù)據(jù)存儲器的數(shù)據(jù)操作

8、只能用MOVX指令,且只能和A之間傳送,因此必須用一個中間環(huán)節(jié)作暫存,設(shè)用20H單元。用R0、R1指示兩單元的低八位地址,高八位地址由P2指示。編程過程如下:000EH000FH000EH000FH000EH000FH ORG 0000H MOV P2, #0H ;送地址高八位至P2口 MOV R0, #0EH ;R0= 0EH MOV R1, #0FH ;R1=OFH MOVX A, R0 ;A=(000EH) MOV 20H, A ;(20H)=(000EH) MOVX A, R1 ;A=(000FH) XCH A, 20H ; A=(000EH),(20H)=(000FH) MOVX R

9、1, A MOV A, 20H MOVX R0, A ;交換后的數(shù)送各單元 SJMP $ END 3.3 順序程序設(shè)計順序程序(簡單程序),程序走向只有一條路徑例3-2:將R4R5雙字節(jié)符號數(shù)求補程序。 ORG 0000H MOV A,R5 ;取低字節(jié) CPL A ADD A,#1 ;低字節(jié)變補 MOV R5,A MOV A,R4 ;取高字節(jié) CPL A ADDC A,#0 ;高字節(jié)變補 ORL A, #80H; 恢復(fù)負號 MOV R4,A END例3-3 分解壓縮式BCD碼,使其成為非壓縮式BCD碼。ORG 0000HMOV R0,#40H;設(shè)指針MOV A,R0;取一個字節(jié)MOV R2,A

10、;暫存ANL A,#0FH;清0高半字節(jié)INC R0MOV R0,A ;保存數(shù)據(jù)個位片內(nèi)RAM42H41H40H65MOV A,R2SWAP A ;十位換到低半字節(jié)ANL A,#0FHINC R0MOV R0,A;保存數(shù)據(jù)十位END0506地址數(shù)據(jù)TAB0TAB+11TAB+24TAB+39TAB+416HTAB+525H例3-4 設(shè)變量放在片內(nèi)RAM的20H單元,其值為00H05H之間,要求編查表程序,查出變量的平方值, 并放入片內(nèi)RAM的21H單元。 ORG 0000H MOV DPTR,#TAB MOV A,20H MOVC A,A+DPTR ;查表 MOV 21H,A SJMP $TA

11、B2: DB 00H,01H,04H,09H,16H,25H END分析 :在程序存儲器安排一張平方表,首地址為TAB,以DPTR指向表首址,A存放變量值,利用查表指令MOVC A,A+DPTR,即可求得。表中數(shù)據(jù)用BCD碼存放合乎人們的習(xí)慣. 如果平方值為兩個字節(jié),程序應(yīng)如何編。DPTRA ORG 0000H MOV A,R2 JNB ACC.7,N ;為正數(shù)? CPL A ;負數(shù)變補 INC A MOV R2,AN: SJMP $ ;結(jié)束 3.4 分支程序的設(shè)計 由條件轉(zhuǎn)移指令構(gòu)成程序判斷框部分,形成分支結(jié)構(gòu)3.5.1 單分支程序一個判斷決策框,兩種分支結(jié)構(gòu)圖。條件滿足?N影響條件Y處理段

12、條件滿足?N影響條件Y處理1處理2例1 求8位有符號數(shù)的絕對值。方法:正數(shù)不變,負數(shù)變補 例2 用單片機加重力傳感器作磅秤,秤出重量后算出行李運費價格,其秤出的重量以10kg為1個計價單位G , G已存入40H單元。計價方法為50kg以內(nèi)按3元, 50kg以上分段計價: 50kg按3元計價,超過部分按2元計價。 由此列出算式: G3 + (G-5)2; 當(dāng)G5M=G3 ;當(dāng)G5 3G因重復(fù)使用,先暫存在R2。流程見左, 程序如下: ORG 0100HFRT: MOV A,40H;取行李重量計價單位G MOV R3,A MOV B,#03H;運費M=G3 MUL AB MOV R2,A;暫存3G

13、 MOV A,R3;取回G CJNE A,#05H,L1;G 5 ? SJMP WETCL1: JC WETC;是,轉(zhuǎn)至WETC SUBB A,#05H;否則 M=3G+2(G-5) RLC A ADD A,R2 MOV R2 ,AWETC:MOV 41H,R2 ;存運費 M RET 多分支散轉(zhuǎn)程序的設(shè)計 有一類分支程序,它根據(jù)不同的輸入條件或不同的運算結(jié)果,轉(zhuǎn)向不同的處理程序,稱之為散轉(zhuǎn)程序。這類程序通常利用JMPA+DPTR間接轉(zhuǎn)移指令實現(xiàn)轉(zhuǎn)移。有如下兩種設(shè)計方法: 1. 查轉(zhuǎn)移地址表: 將轉(zhuǎn)移地址列成表格,將表格的內(nèi)容作轉(zhuǎn)移的目標(biāo)地址。 2. 查轉(zhuǎn)移指令表: 將轉(zhuǎn)移到不同程序的轉(zhuǎn)移指令列

14、成表格,判斷條件后查表,轉(zhuǎn)到表中指令執(zhí)行,下面用兩個例子說明。1. 利用轉(zhuǎn)移地址表實現(xiàn)轉(zhuǎn)移 例3-7 根據(jù)R3的內(nèi)容轉(zhuǎn)向?qū)?yīng)的程序,R3的內(nèi)容為0n,處理程序的入口符號地址分別為PR0PRn (n128)。分析:將PR0PRn入口地址列在表格中,每一項占兩個單元,PRn在表中的偏移量為2n,因此將R3的內(nèi)容乘2即得PRn在表中的偏移地址,從偏移地址2n和2n+1兩個單元分別取出PRn的高八位地址和低八位地址送DPTR寄存器,用JMP A+DPTR指令(A先清零)即轉(zhuǎn)移到PRn入口執(zhí)行。ORG 0000HMOV A,R3 ;R3AADD A,ACC ;A*2MOV DPTR,#TABPUSH A

15、CCMOVC A,A+DPTR ;取地址表中高字節(jié)MOV B,A ;暫存于BINC DPLPOP ACCMOVC A,A+DPTR ;取地址表中低字節(jié)MOV DPL,AMOV DPH,B ;DPTR為表中地址CLR A ;A=0JMP A+DPTR ;轉(zhuǎn)移TAB:DW PR0,PR1,PR2,.,PRn ;轉(zhuǎn)移地址表END01100220.TABTAB+2DPH DPL例如 R3=1的操作02202. 利用轉(zhuǎn)移指令表實現(xiàn)轉(zhuǎn)移 例3-8 設(shè)有五個按鍵 0、1、2、3、4其編碼分別為3AH、47H、65H、70H、8BH,要求根據(jù)按下的鍵轉(zhuǎn)向不同的處理程序,分別為PR0 、PR1 /PR2、PR3

16、、PR4,設(shè)按鍵的編碼已在B寄存器中,編出程序。分析: 將鍵碼排成表,將鍵碼表中的值和B中的鍵編碼比對,記下在鍵碼表中和B中的鍵編碼相等的序號,另安排一個轉(zhuǎn)移表,安排AJMP指令(機器碼),因每條AJMP指令占二字節(jié),將剛才記下的序號乘2即為轉(zhuǎn)移表的偏移地址,利用JMP A+DPTR執(zhí)行表內(nèi)的AJMP指令,從而實現(xiàn)多分支轉(zhuǎn)移, 設(shè)JPT的地址為001AH、PR0入口地址為0110H、 ,參考2.4.2節(jié),求AJMP PR0的機器碼0000 0001 0001 0000 001 00001 0000 (2110h )a10a9a8a7a6a5a4a3a2a1a0 AJMP PR0的機器碼為211

17、0H, PR1入口地址為0220H AJMP PR1的機器碼為4120H, 轉(zhuǎn)移指令表JPT的內(nèi)容如下所示。設(shè)B=65H,鍵值為2:2041 JPT+42002 JPT+21021 JPTAJMP PR0AJMP PR1AJMP PR2TAB3AHTAB+147HTAB+265HTAB+370H轉(zhuǎn)移指令表JPT鍵碼表TAB65HAB2AA=1A=2A=065H65H ORG 0000H MOV DPTR,#TAB ;置鍵碼表首址 MOV A,#0 ;表的起始位的偏移量為0 NEXT: PUSH ACC MOVC A,A+DPTR ;A=鍵碼表的編碼 CJNE A,B,AGAN ;將B中值和鍵碼

18、表的值比較 POP ACC RL A ;如相等,序號乘2得分支表內(nèi)偏移量 MOV DPTR,#JPT ;置分支表首址 JMP A+DPTR AGAN: POP ACC ;不相等比較下一個 INC A ;序號加1 CJNE A,#5,NEXT SJMP $ ;鍵碼查完還沒有B中按鍵編碼程序結(jié)束 JPT: AJMP PR0 ;分支轉(zhuǎn)移表 AJMP PR1 AJMP PR2 AJMP PR3 AJMP PR4 TAB: DB 3AH,47H,65H,70H,8BH ;鍵碼表 END 當(dāng)程序中的某些指令需要反復(fù)執(zhí)行多次時,采用循環(huán)程序的方式,這樣會使程序縮短,節(jié)省存儲單元(并不節(jié)省執(zhí)行時間)。 循環(huán)次

19、數(shù)的控制,有兩種控制方式:第一種方法先判斷再處理即先判斷滿不滿足循環(huán)條件,如不滿足,就不循環(huán),多以循環(huán)條件控制。第二種方法先處理再判斷,即循環(huán)執(zhí)行一遍后,下一輪還需不需要進行,多以計循環(huán)次數(shù)控制。循環(huán)可以有單重循環(huán)和多重循環(huán),在多重循環(huán)中,內(nèi)外循環(huán)不能交叉,也不允許外循環(huán)跳入內(nèi)循環(huán)。下面通過幾個實例說明循環(huán)程序的設(shè)計方法。3.5 循 環(huán) 程 序 設(shè) 計例 3-9 設(shè)計一個延時10ms的延時子程序,已知單片機使用的晶振為6MHz。分析 : 延時時間與兩個因素有關(guān):晶振頻率和循環(huán)次數(shù)。由于晶振采用6MHz,一個機器周期是2s,用單循環(huán)可以實現(xiàn)1ms延時,外循環(huán)10次即可達10ms延時。 內(nèi)循環(huán)如何

20、實現(xiàn)1ms延時呢,程序中可先以未知數(shù)MT代替,從附錄A查每條指令機器周期計算程序的執(zhí)行時間。 ORG 0020H MOV R0,#0AH ;外循環(huán)10次 DL2: MOV R1,#MT ;內(nèi)循環(huán)MT次 DL1: NOP NOP ;空操作指令 DJNZ R1,DL1 DJNZ R0,DL2 RET內(nèi)循環(huán)DL1到指令DJNZ R1,DL1的計算: (1+1+2)2SMT=1000S MT=125=7DH 102S =10062S=10.062mS若需要延時更長時間,可以采用多重循環(huán)。內(nèi)外例3-10 編寫多字節(jié)數(shù)10程序。 內(nèi)部RAM以20H為首址的一片單元中存放著一個多字節(jié)符號數(shù),字節(jié)數(shù)存放在R7

21、中,存放方式為低位字節(jié)在低地址,高位字節(jié)在高地址,要求乘10后的積仍存放在這一片單元中。 分析 用R1作該多字節(jié)的地址指針,部分積的低位仍存放于本單元,部分積的高位存放于R2,以便和下一位的部分積的低位相加。以R7作字節(jié)數(shù)計數(shù)。 編程如下: 345 H * 0A H 32 H+ 28 H 2B H+ 1E H 20B H ORG 0000H CLR C ;清進位位C MOV R1,#20H ;R1指示地址 MOV R2,#00H ;存積的高八位寄存器R2清0S10:MOV A, R1 ;取一字節(jié)送A MOV B,#0AH ;10送B PUSH PSW MUL AB ;字節(jié)乘10 POP PSW

22、 ADDC A,R2 ;上次積高八位加本次積低八位 MOV R1,A ;送原存儲單元 MOV R2,B ;積的高八位送R2 INC R1 ;指向下一字節(jié) DJNZ R7,S10 ;未乘完去SH10,否則向下執(zhí)行 MOV R1,B ;存最高字節(jié)積的高位 SJMP $例如 12 23 65 09 89 比較大小不交換(0)12 23 65 09 1912 23 65 09 19交換(1)12 23 09 65 19不交換(0)交換(1) 12 23 65 09 1912 23 09 19 65最大交換(1)不交換(0)12 23 09 19 65 12 09 23 19 65 交換(1)12 09

23、 19 23 65不交換(0)交換(1)12 23 09 19 6512 09 19 23 65最大12 09 19 23 6509 12 19 23 6509 12 19 23 6509 12 19 23 6509 12 19 23 65 MCS-51單片機有著優(yōu)異的位邏輯功能,可以方便的實現(xiàn)各種復(fù)雜的邏輯運算.這種用軟件替代硬件的方法,可以大大簡化甚至完全不用硬件,但比硬件要多花運算時間。例3-17 編寫一程序,以實現(xiàn)圖3-4中的邏輯運算電路.3.6 位操作程序設(shè)計 其中P1.1和P2.2分別是端口線上的信息,TF0和IE1分別是定時器定時溢出標(biāo)志和外部中請求標(biāo)志, 25H和26H分別是兩

24、個位地址, 運算結(jié)果由端口線P1.3輸出。 圖3-4 硬件邏輯運算電路程序如下:START:MOV C,P2.2 ORL C,TF0 ANL C,P1.1 MOV F0,C MOV C,IE1 ORL C,/25H ANL C,F0 ANL C,/26H MOV P1.3,C SJMP $例3-18 設(shè)累加器A的各位ACC.0ACC.7分別記為X0X7,編制程序用軟件實現(xiàn)下式: Y=X0X1X2+X0 X1 X2+X0X1X2X3+X4 X5 X6X7 X0 BIT ACC.0 X1 BIT ACC.1 X2 BIT ACC.2 X3 BIT ACC.3 X4 BIT ACC.4 X5 BIT

25、 ACC.5 X6 BIT ACC.6 X7 BIT ACC.7 ORG 0000H MOV C,X0ANL C,X1ANL C,X2MOV 00H,C ;X0X1X2MOV C,X0ANL C,/X1 MOV 01H,C ;X0X1ANL C,/X2ORL C,00HMOV 00H,C MOV C,X2ANL C,01H ANL C,X3 ;X0X1X2X3 ORL C,/00H MOV 00H,C MOV C,X7ANL C,/X6ANL C,/X5ANL C,/X4 ; X4 X5 X6 X7ORL C,00H ; 最終結(jié)果 YC SJMP $ 子程序是構(gòu)成單片機應(yīng)用程序必不可少的部分,通過ACALL和LCALL兩條子程序調(diào)用指令,可以十分方便地用來調(diào)用任何地址處的子程序。 子程序節(jié)省占用的存儲單元,使程序簡短、清晰,善于靈活的使用子程序,是程序設(shè)計的重要技巧之一。 子程序必須以RET指令結(jié)尾. 在調(diào)用子程序時,有以下幾點應(yīng)注意:3.7 子程序 當(dāng)一段程序需多次應(yīng)用,或為多人應(yīng)用時,這段程序編為子程序. 1)保護現(xiàn)場。 如果在調(diào)用

溫馨提示

  • 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. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論