微控制器乘法的實現

時間 2021-10-30 05:27:15

1樓:帝都小女子

org 0000h

jmp start

start:

mov sp,#60h

mov r2,#20h

mov r3,#34h

mov a,#99h

lcall bhd

lcall hbd

nopnop

;三位元組除以單位元組子程式

;入口條件:被除數在r3、r4、r5中,除數在r7中。

;出口資訊:ov=0 時,雙位元組商在r4、r5中,ov=1 時溢位。

;影響資源:psw、a、b、r2~r7 堆疊需求: 2位元組

dv31:

clr c

mov a,r3

subb a,r7

jc dv30

setb ov ;商溢位

retdv30:

mov r2,#10h;求r3r4r5/r7-→r4r5

dm23:

clr c

mov a,r5

rlc a

mov r5,a

mov a,r4

rlc a

mov r4,a

mov a,r3

rlc a

mov r3,a

mov f0,c

clr c

subb a,r7

anl c,/f0

jc dm24

mov r3,a

inc r5

dm24:

djnz r2,dm23

mov a,r3 ;四捨五入

add a,r3

jc dm25

subb a,r7

jc dm26

dm25:

inc r5

mov a,r5

jnz dm26

inc r4

dm26:

clr ov

ret ;商在r4r5中

;兩位元組除以單位元組子程式

;入口條件:被除數在r4、r5中,除數在r7中。

;出口資訊:ov=0 時,單位元組商在r3中,ov=1 時溢位。

; 餘數在r4中

;影響資源:psw、a、r3~r7 堆疊需求: 2位元組

d457:

clr c

mov a,r4

subb a,r7

jc dv50

setb ov;商溢位

retdv50:

mov r6,#8 ;求平均值(r4r5/r7-→r3)

dv51:

mov a,r5

rlc a

mov r5,a

mov a,r4

rlc a

mov r4,a

mov f0,c

clr c

subb a,r7

anl c,/f0

jc dv52

mov r4,a

dv52:

cpl c

mov a,r3

rlc a

mov r3,a

djnz r6,dv51

mov a,r4 ;四捨五入

add a,r4

jc dv53

subb a,r7

jc dv54

dv53:

inc r3

dv54:

clr ov

ret;四位元組除以單位元組子程式

;入口條件:被除數在r2、r3、r4、r5中,除數在r7中。

;出口資訊:a

; 餘數在r2中

;影響資源:psw、a、r2~r7 堆疊需求:2位元組

;input dat1,dat2,dat3,r5 ;r0(h),:divisor dat2(h) dat3() r5(l):quotient

;dat1(h)dat2(l):residue

f_div:

clr c

mov a,r7

jz fd_over

fd_begin:

mov a,r2

subb a,r7

jc no_overflow

mov a,#0ffh

retno_overflow:

clr a

mov r6,#18h

fdiv0:

lcall rlc4

jc goushang

mov a,r2

subb a,r7

jc fdnext

inc r5

mov r2,a

fdnext:

djnz r6,fdiv0

jmp fdone

goushang:

mov a,r2

subb a,r7

inc a

inc r5

mov r2,a

jmp fdnext

fdone:

clr a

clr ov

retfd_over:

mov a,#0ffh

retrlc4:

clr c

mov a,r5

rlc a

mov r5,a

mov a,r4

rlc a

mov r4,a

mov a,r3

rlc a

mov r3,a

mov a,r2

rlc a

mov r2,a

ret;divd功能:雙位元組二進位制無符號數除法

;入口條件:被除數在r2、r3、r4、r5中,除數在r6、r7中。

;出口資訊:ov=0 時,雙位元組商在r4、r5中,ov=1 時溢位。

; 餘數在r2 r3中

;影響資源:psw、a、b、r1~r7 堆疊需求: 2位元組

divd:

clr c ;比較被除數和除數

mov a,r3

subb a,r7

mov a,r2

subb a,r6

jc ***1

setb ov ;溢位

ret***1:

mov b,#10h ;計算雙位元組商

***2:

clr c ;部分商和餘數同時左移一位

mov a,r5

rlc a

mov r5,a

mov a,r4

rlc a

mov r4,a

mov a,r3

rlc a

mov r3,a

xch a,r2

rlc a

xch a,r2

mov f0,c ;儲存溢位位

clr c

subb a,r7 ;計算(r2r3-r6r7)

mov r1,a

mov a,r2

subb a,r6

anl c,/f0 ;結果判斷

jc ***3

mov r2,a ;夠減,存放新的餘數

mov a,r1

mov r3,a

inc r5 ;商的低位置一

***3:

djnz b,***2;計算完十六位商(r4r5)

; mov a,r4 ;商移到r2r3中

; mov r2,a

; mov a,r5

; mov r3,a

clr ov ;設立成功標誌

ret;雙位元組乘以雙位元組乘法

;入口條件:被乘數在r2、r3中,乘數在r6、r7中。

;出口資訊:乘積在r2、r3、r4、r5中。

;影響資源:psw、a、b、r2~r7 堆疊需求: 2位元組

muld:

mov a,r3 ;計算r3乘r7

mov b,r7

mul ab

mov r4,b ;暫存部分積

mov r5,a

mov a,r3 ;計算r3乘r6

mov b,r6

mul ab

add a,r4 ;累加部分積

mov r4,a

clr a

addc a,b

mov r3,a

mov a,r2 ;計算r2乘r7

mov b,r7

mul ab

add a,r4 ;累加部分積

mov r4,a

mov a,r3

addc a,b

mov r3,a

clr a

rlc a

xch a,r2 ;計算r2乘r6

mov b,r6

mul ab

add a,r3 ;累加部分積

mov r3,a

mov a,r2

addc a,b

mov r2,a

ret;雙位元組乘以單位元組乘法

;入口條件:被乘數在r2、r3中,乘數在r7中。

;出口資訊:乘積在r2、r3、r4中。

;影響資源:psw、a、b、r2~r7 堆疊需求: 2位元組

mul21:

mov a,r3

mov b,r7

mul ab

mov r4,a

mov r5,b

mov a,r2

mov b,r7

mul ab

add a,r5

mov r3,a

mov a,b

addc a,#00h

mov r2,a

ret;功能:雙位元組十六進位制整數轉換成雙位元組bcd碼整數

;入口條件:待轉換的雙位元組十六進位制整數在r6、r7中。

;出口資訊:轉換後的三位元組bcd碼整數在r3、r4、r5中。

;影響資源:psw、a、r2~r7 堆疊需求: 2位元組

hb2:

clr a ;bcd碼初始化

mov r3,a

mov r4,a

mov r5,a

mov r2,#10h ;轉換雙位元組十六進位制整數

hb3:

mov a,r7 ;從高階移出待轉換數的一位到cy中

rlc a

mov r7,a

mov a,r6

rlc a

mov r6,a

mov a,r5 ;bcd碼帶進位自身相加,相當於乘2

addc a,r5

da a ;十進位制調整

mov r5,a

mov a,r4

addc a,r4

da a

mov r4,a

mov a,r3

addc a,r3

mov r3,a ;雙位元組十六進位制數的萬位數不超過6,不用調整

djnz r2,hb3 ;處理完16bit

ret;入口條件:待轉換的單位元組bcd碼整數在累加器a中。

;出口資訊:轉換後的單位元組十六進位制整數仍在累加器a中。

;影響資源:psw、a、b、r4 堆疊需求: 2位元組

bcdh:

mov b,#10h ;分離十位和個位

div ab

mov r4,b ;暫存個位

mov b,#10 ;將十位轉換成十六進位制

mul ab

add a,r4 ;按十六進位制加上個位

ret;雙位元組bcd碼整數轉換成雙位元組十六進位制整數

;入口條件:待轉換的雙位元組bcd碼整數在r2、r3中。

;出口資訊:轉換後的雙位元組十六進位制整數仍在r2、r3中。

;影響資源:psw、a、b、r2、r3、r4 堆疊需求:4位元組

bh2:

mov a,r3 ;將低位元組轉換成十六進位制

lcall bcdh

mov r3,a

mov a,r2 ;將高位元組轉換成十六進位制

lcall bcdh

mov b,#100 ;擴大一百倍

mul ab

add a,r3 ;和低位元組按十六進位制相加

mov r3,a

clr a

addc a,b

mov r2,a

ret;標號: bhd功能:單位元組bcd碼小數轉換成單位元組十六進位制小數

;入口條件:待轉換的單位元組bcd碼數在累加器a中。

;出口資訊:轉換後的單位元組十六進位制小數仍在累加器a中。

;影響資源:psw、a、r2、r3 堆疊需求: 2位元組

bhd:

mov r2,#8 ;準備計算一個位元組小數

bhd0: add a,acc ;按十進位制倍增

da a

xch a,r3

rlc a ;將進位標誌移入結果中

xch a,r3

djnz r2,bhd0 ;共計算8bit小數

add a,#0b0h ;剩餘部分達到0.50否?

jnc bhd1 ;四舍

inc r3 ;五入

bhd1:

mov a,r3 ;取結果

ret; 標號: hbd功能:單位元組十六進位制小數轉換成單位元組bcd碼小數

;入口條件:待轉換的單位元組十六進位制小數在累加器a中。

;出口資訊:cy=0時轉換後的bcd碼小數仍在a中。cy=1時原小數接近整數1。

;影響資源:psw、a、b 堆疊需求: 2位元組

hbd:

mov b,#100 ;原小數擴大一百倍

mul ab

rlc a ;餘數部分四捨五入

clr a

addc a,b

mov b,#10 ;分離出十分位和百分位

div ab

swap a

add a,b ;拼裝成單位元組bcd碼小數

da a ;調整後若有進位,原小數接近整數1

retjmp $end

微控制器除法運算,微控制器中C語言如何實現浮點除法運算

如果直接用c程式寫,那就沒必要考慮除法的細節了,比如unsigned int a,b,c a 0x3456 b 0x1040 c a b 如果你想用匯編搞定,那沒辦法,老老實實的寫或者網上 書上 找這樣的程式,肯定能找到的。不過我可以說一下演算法,那就是相減,被除數連續不斷的減去除數,直到差小於除數...

如何實現微控制器中多路AD轉換,什麼是微控制器ad轉換,微控制器ad轉換處理方法

有兩種辦法,一個就是用兩個ad轉換晶片,兩路模擬量分別接一個。用微控制器控制兩個ad晶片同時啟動轉換,這樣基本可以實現採集到同一時刻的兩路模擬量值。另一種辦法就是用兩個取樣保持器 lf398 來暫時儲存模擬量的瞬時值。兩個保持器後面接模擬多路轉換器,模擬多路轉換器後面接一個ad轉換器。過程是這樣的 ...

微控制器實現500KHZ時鐘訊號

500kz的時鐘週期是2us 在12m晶振的情況下,機器週期1us,不能用中斷,因為進中斷就要3個機器週期即3us就已經超出了時鐘週期 另外退中斷和高低電平切換也要花掉若干個機器週期 用程式的話 loop cpl p1.0 1us ajmp loop 2us 週期是6us,超出了!loop setb...