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程式寫,那就沒必要考慮除法的細節了,比如unsigned int a,b,c a 0x3456 b 0x1040 c a b 如果你想用匯編搞定,那沒辦法,老老實實的寫或者網上 書上 找這樣的程式,肯定能找到的。不過我可以說一下演算法,那就是相減,被除數連續不斷的減去除數,直到差小於除數... 有兩種辦法,一個就是用兩個ad轉換晶片,兩路模擬量分別接一個。用微控制器控制兩個ad晶片同時啟動轉換,這樣基本可以實現採集到同一時刻的兩路模擬量值。另一種辦法就是用兩個取樣保持器 lf398 來暫時儲存模擬量的瞬時值。兩個保持器後面接模擬多路轉換器,模擬多路轉換器後面接一個ad轉換器。過程是這樣的 ... 500kz的時鐘週期是2us 在12m晶振的情況下,機器週期1us,不能用中斷,因為進中斷就要3個機器週期即3us就已經超出了時鐘週期 另外退中斷和高低電平切換也要花掉若干個機器週期 用程式的話 loop cpl p1.0 1us ajmp loop 2us 週期是6us,超出了!loop setb...微控制器除法運算,微控制器中C語言如何實現浮點除法運算
如何實現微控制器中多路AD轉換,什麼是微控制器ad轉換,微控制器ad轉換處理方法
微控制器實現500KHZ時鐘訊號