章4 80C51的匯編語言程序設計
1.80C51單片機匯編語言有何特點?
答:
匯編語言結構緊湊、靈活,匯編成的目標程序效率高,具有占存儲空間少、運行速度快、實時性強等優點。它是面向機器的語言,對于單片機硬件的操作直接、方便,有利于初學者對單片機結構的認知。
但它與高級語言相比移植性不好、編程復雜、對編程人員的基礎要求高。
2.利用80C51單片機匯編語言進行程序設計的步驟如何?
答:
一、任務分析
首先,要對單片機應用系統的設計目標進行深入分析,明確系統設計任務:功能要求和技術指標。然后對系統的運行環境進行調研。這是應用系統程序設計的基礎和條件。
二、算法設計
經過任務分析和環境調研后,已經明確的功能要求和技術指標可以用數學方法(或模型)來描述,進而把一個實際的系統要求轉化成由計算機進行處理的算法。并對各種算法進行分析比較,并進行合理的優化。
三、流程描述
程序的總體構建。先要確定程序結構和數據形式,資源分配和參數計算等。然后根據程序運行的過程,規劃程序執行的邏輯順序,用圖形符號將程序流程繪制在平面圖上。應用程序的功能通常可以分為若干部分,用流程圖將具有一定功能的各部分有機地聯系起來。
流程圖可以分為總流程圖和局部流程圖。總流程圖側重反映程序的邏輯結構和各程序模塊之間的相互關系;局部流程圖反映程序模塊的具體實施細節。
3.常用的程序結構有哪幾種?特點如何?
答:
順序程序:無分支、無循環結構的程序,其執行流程是依指令在存儲器中的存放順序進行的;
分支程序:可以改變程序的執行順序;
循環程序:按某種控制規律重復執行的程序,控制一部分指令重復執行若干次,以便用簡短的程序完成大量的處理任務。
4.子程序調用時,參數的傳遞方法有哪幾種?
答:
利用累加器或寄存器;
利用存儲器;
利用堆棧。
5.什么是偽指令?常用的偽指令功能如何?
答:
偽指令是匯編程序能夠識別并對匯編過程進行某種控制的匯編命令。常用的偽指令包括:
ORG,功能是向匯編程序說明下面緊接的程序段或數據段存放的起始地址;
END,功能是結束匯編;
DB,功能是從標號指定的地址單元開始,在程序存儲器中定義字節數據;
DW,功能是從標號指定的地址單元開始,在程序存儲器中定義字數據空間;
EQU,功能是將表達式的值或特定的某個匯編符號定義為一個指定的符號名;
BIT,功能是將位地址賦給指定的符號名。
6.設被加數存放在內部RAM的20H、21H單元,加數存放在22H、23H單元,若要求和存放在24H、25H中,試編寫出16位無符號數相加的程序(采用大端模式存儲)。
答:程序如下:
ORG 0000H
MOV R0,#21H
MOV R1,#23H
MOV A,@R0
ADD A,@R1
MOV 25H,A
DEC R0
DEC R1
MOV A,@R0
ADDC A,@R1
MOV 24H,A
SJMP $
END
7.編寫程序,把外部RAM中1000H~101FH的內容傳送到內部RAM的30H~4FH中。
答:
ORG 0000H
MOV DPTR,#1000H
MOV R0,#30H
MOV R7,#32
LOOP:MOVX A,@DPTR
MOV @R0,A
INC R0
INC DPTR
DJNZ R7,LOOP
RET
8.編寫程序,實現雙字節無符號數加法運算,要求 (R0R1)+(R6R7)→(60H61H)。
答:
ORG 0000H
MOV A,R1
ADD A,R7
MOV 61H,A
MOV A,R0
ADDC A,R6
MOV 60H,A
SJMP $
END
9.若80C51的晶振頻率為6MHz,試計算延時子程序的延時時間。
DELAY:MOV R7,#0F6H
LP:MOV R6,#0FAH
DJNZ R6,$
DJNZ R7,LP
RET
答:延時時間: 2μs*{[1+((1+2*250+2)*246)+2]+2}=0.247486秒(含調用指令2個機器周期)
10.在內部RAM 的30H~37H單元存有一組單字節無符號數。要求找出最大數存入BIG單元。試編寫程序實現。
答:
ORG 0000H
BIG DATA 2FH
ONE DATA 2AH
TWO DATA 2BH
START:MOV R7,#7 ;比較次數
MOV R0,#30H
LOOP:MOV A,@R0
MOV ONE,A
INC R0
MOV TWO,@R0
CLR C
SUBB A,@R0
JC NEXT ;ONE小,TWO大繼續比下一對數
MOV @R0,ONE ;ONE大放后面(交換)
DEC R0
MOV @R0,TWO ;TWO小放前面
INC R0 ;
NEXT:DJNZ R7,LOOP
MOV BIG,37H
SJMP $
END
11.編寫程序,把累加器A中的二進制數變換成3位BCD碼,并將百、十、個位數分別存放在內部RAM的50H、51H、52H中。
答:單字節二進制數轉換為壓縮的BCD碼僅需要2個字節;在將壓縮的BCD碼拆分存于3個單元。
org 0
MOV 52H,#0
MOV 51H,#0
MOV 50H,#0
MOV A,#0FDh
LCALL DCDTH
SJMP $
DCDTH:MOV R7,#8
MOV R0,A ;暫存于R0
LOOP:CLR C
MOV A,R0
RLC A
MOV R0,A
MOV R1,#51H;
MOV A,@R1 ;
ADDC A,@R1 ;
DA A ;
MOV @R1,A ;
DEC R1
MOV A,@R1
ADDC A,@R1
DA A
MOV @R1,A
DJNZ R7,LOOP
INC R1 ;50H已是結果,R1指向51H,51H單元需拆分
MOV A,#00H
XCHD A,@R1
MOV 52H,A
MOV A,@R1
SWAP A
MOV @R1,A
RET
END
12.編寫子程序,將R1中的2個十六進制數轉換為ASCII碼后存放在R3和R4中。
答:
ORG 0
MOV R1,#5BH
MOV A,R1
ANL A,#0F0H
SWAP A
ACALL ASCII
MOV R3,A
MOV A,R1
ANL A, #0FH
ACALL ASCII
MOV R4, A
SJMP $
ASCII:PUSH ACC
CLR C
SUBB A, #0AH
POP ACC
JC LOOP
ADD A, #07H
LOOP: ADD A, #30H
RET
END
13.編寫程序,求內部RAM中50H~59H十個單元內容的平均值,并存放在5AH單元。
答:
ORG 0000H
MOV R7,#10
MOV R0,#50H
MOV B,#10
CLR C
CLR A
LOOP:ADDC A,@R0
INC R0
DJNZ R7,LOOP
DIV AB
MOV 5AH,A
SJMP $
END
14.如圖4.10所示,編制程序實現:上電后顯示“P”,有鍵按下時顯示相應的鍵號“0”~“7”。
答:
實現程序如下:
TEMP EQU 30H
ORG 0000H
JMP START
ORG 0100H
START:MOV SP,#5FH
MOV P0,#8CH ;正序顯示"P"
MOV P3,#0FFH ;輸入方式
CLR CY
NOKEY:MOV A,P3
CPL A
JZ NOKEY ;無鍵按下
MOV TEMP,P3 ;有鍵按下
CALL D10ms
MOV A,P3
CJNE A,TEMP,NOKEY ;去抖動
MOV R2,#0 ;鍵號計數器復位
MOV A,TEMP
LP:RRC A
JNC DONE
INC R2
SJMP LP
DONE:MOV A,R2
MOV DPTR,#CODE_P0
MOVC A,@A+DPTR
MOV P0,A
JMP NOKEY
D10ms:MOV R5,#10 ;10MS
D1ms:MOV R4,#249
DL:NOP
NOP
DJNZ R4,DL
DJNZ R5,D1ms
RET
CODE_P0:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H
DB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH
END