技術摘記
1999-07-09 單晶片8085與8051的比較
五 程式比較
以下我們以常用的時間延遲為例子,分別以8051與8085來設計0.2秒時間延遲的副程式。
(I). 設8085使用2MHz的時脈頻率,其時脈週期為0.5微秒。我們先暫時將副程式寫為
DELAY: MVI E,NUMRQ1 ;將需要的數字載入暫存器D與E內
MVI D,NUMRQ2 ;
WAIT: DCR E ;先遞減E
JNE WAIT ;若不為0,繼續遞減
DCR D ;若E降為0,則遞減D
JNZ WAIT ;若D不為0,再去遞減E
RET ;時間延遲0.2秒後回轉
WAIT迴圈中DCR指令執行需要5個時脈週期,JNZ需要10個時脈週期。每遞減一次D,DCR E指令會執行16×16=256次。所以我們可以利用下面的計算式來計算NUMRQ2和NUMRQ1:
0.2秒=0.2×106微秒
=0.5微秒×[(5+10)+256×(5+10)]×NUMRQ2
+0.5微秒×(5+10)×NUMRQ1方程式中的兩個未知數應該都是整數,我們可先忽略NUMRQ1項,先求得NUMRQ2最接近的整數值,將此值代入NUMRQ2再求得NUMRQ1值,如此可以得到:
NUMRQ1=103=67H
NUMRQ2≒196=C4H
(II). 設8051的石英振盪頻率為12MHz,所以一個機械週期(=12個石英振盪週期)為1微秒,我們將副程式寫為:
;------------------------------------------------------------------------------------------------
;delay time=R5*(20ms) fXTAL=12MHz
;------------------------------------------------------------------------------------------------
DELAY:
MOV R6,#40 ;共執行(R5)次
DEL:
MOV R7,#249 ;共執行(R6)*(R5)次
$1:
DJNZ R7,$1 ;共執行[(R7)*(R6)]*(R5)次
DJNZ R6,DEL ;共執行(R6)*(R5)次
DJNZ R5,DELAY ;共執行(R5)次
RET ;共執行一次
;------------------------------------------------------------------------------------------------
8051 MOV指令需要1個機械週期,DJNZ指令需要2個機械週期,RET指令需要2個機械週期,所以可算出上面這個副程式的總延遲時間:
T= (R5)*1微秒
+(R6)*(R5)*1微秒
+(R7)*(R6)*(R5)*2微秒
+(R6)*(R5)*2微秒
+(R5)*2微秒
=20043*(R5)微秒+2微秒現在要求延遲200毫秒,所以可令R5=10,再呼叫DELAY副程式,此時實際的延遲時間為:T=200.432毫秒。
從 時間延遲的程式例子來看,8051與8085的程式迴圈結構類似,但在暫存器的使用上,8085的寫法習慣使用暫存器對來處理,好處是在處理某些資料時可 同時處理16位元的資料;而8051除了能處理16位元的資料,在暫存器的使用上彈性較大,沒有因為特別的目的而需使用暫存器對的設計。
但在算術運算方面,8051的指令比8085實用很多,最明顯的是8051有乘法與除法的指令,而8085卻需要寫一個副程式來執行乘法與除法,以下我們以乘法6AH×5CH=2618H為例,比較8051與8085:
;----------------------------------------------------------------
;8051的乘法指令寫法
;----------------------------------------------------------------
MOV A,#6AH ;A=6AH
MOV B,#5CH ;B=5CH
MUL AB ;6AH×5CH=2618H,故B=26H, A=18H
;----------------------------------------------------------------
;----------------------------------------------------------------
;8085的乘法副程式;當剛始執行MULT1時,各暫存器的內容為:
; A=00000000, B=00000000, C=01011100=5CH, D=01101010=6AH,
; E=00001000, 進位旗標=0
;----------------------------------------------------------------
MULTR: MVI B,00H ;清除代表最後結果的高位部組元為0
MVI E,08H ;裝載計數器(兩個不帶號8位元二進位數相乘)
XRA A ;清除進位旗標和累加器A為0
MULT1: MOV A,C ;將乘數載入累加器中
RAR ;把A位元值向右移一位,最低位元值旋入進位旗標
MOV C,A ;將右旋後的A值存回C
MOV A,B ;將結果的高位部組元轉移到A中
JNC MULT2 ;乘數的位元值等於0,則跳至MULT2
ADD D ;若乘數的位元值等於1,加上被乘數
MULT2: RAR 位部組元值向右移一位 ;將結果的高
MOV B,A ;存回B
DCR E ;降算計數器
RNZ MULT1 ;若不等於0,則跳至MULT1繼續運算
MOV A,C ;若等於0,將C的值載入累加器中
RAR ;還需要最後一次旋轉的結果
MOV C,A ;將A的值存回C中
RET ;此時低位部組元值才符合正確的乘積
;----------------------------------------------------------------
很 顯然的可看出在算術運算上,指令的撰寫8051比8085好很多。而當指令需要做輸入/輸出的動作時,會因為所搭配的輔助晶片的不同而有不同的程式寫 法,8051有32隻I/O接腳,8085只有27隻I/O接腳,而且8051的輸入/輸出埠暫存器比8085多,且可視這些輸入/輸出埠暫存器為資料轉 移運算的位元組,例如在輸入按鈕狀態資料時:
;-----------------------------------------------------------------
(8085) IN 00H ;由輸入/輸出埠00輸入按鈕狀態資料
;-----------------------------------------------------------------
(8051) WAIT: JB P3.0下,WAIT ;檢查在P3.0接腳上的開關是否被按
;-----------------------------------------------------------------
關於硬體接腳上的指令應用8051與8085就有一些差異,當然這也是它們指令語法的特色。