技術摘記

1999-07-09 單晶片8085與8051的比較

建立於 2010-12-06, 週一

五 程式比較

以下我們以常用的時間延遲為例子,分別以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就有一些差異,當然這也是它們指令語法的特色。

Sunday the 16th. ISUAL. All rights reserved.