導航:首頁 > 操作系統 > 單片機乘除法

單片機乘除法

發布時間:2023-04-09 14:32:34

1. 51單片機乘除法 ,求教

200*100*5/255/100
=20000*5/兆櫻255/族高叢100
=100000/念手255/100
=392/100
=3

2. 求C語言代碼:單片機沒有乘除法,如何實現乘除法運算

單片機乘除法要用到ACC與B寄存器
所以在中斷程序中:

ACC++;


TH0=(65536-50000)/256;
TL0=(65536-50000)%256;

最後的兩個除法把ACC的值改變了。把變數ACC改為一個其它的全局變數就好了。(比如定義一個全局變數unsigned
char
n;把ACC改為n;)
C語言編程中,變數最好讓編譯器自己處理,不要直接用某一個寄存器。

3. 單片機 怎麼用位移的方法實現乘除法

因為在寄存器里的數都是二進制的,所以乘以2:左移一位;乘以4左移兩位;乘以8左移三位……依此類推(但要注意寄存器總共有多少位,防止溢出),除法用右移。
直接移位只能計算乘數(或除數)為2的n次方的乘(除)運算,對於一般的乘做春除法,還要配合加(減)法運算,比如a?9=a??3+a
實際上二進制數的基本運算即加,取反,移位等,通過變換來計算減,乘,除。
可以驗證,用單片機C語言編程計算乘數為2的歷胡胡n次方的乘法運算比乘數為一般數的乘法運算要快得多,就肢攔是因為前者只需直接移位,後者還需配合加法或經多步運算

4. 51單片機帶小數的多位元組乘除運算

對於多位元組數,估計你不會直接保存成數值而是要保存成字元串了吧,當然如果你保存成數值的話通過連續乘10直到結果為整數的方法計算小數點後的位數,對於小數相乘來說,兩個數的小數點位數相加就是結果的小數點位數。數值計算可以全當整數,按大數乘法計算。而除法可以通過同時向後移位小數位到全部都是整數,用大數除法的演算法解決。如果存的是數值,直接連續乘10.
附,大數計算,這個是在電腦上編的,不過都是C語言,可以參考,有不懂可以問我。
#include <stdio.h>#include <string.h>
//-----------------------------------------------//將字元串轉化為整形數組void str2int(char *a,char *b,int ia[1024],int ib[1024],int ir[1024]){ int i,len; //對數組初始化 for (i=0;i<1024;i++) { ia[i]=0; ib[i]=0; ir[i]=0; } //將a翻轉後輸入到數組 i=strlen(a); len=strlen(a); while(i) { i--; ia[len-i-1]=*(a+i)-48; } //將b翻轉後輸入到數組 i=strlen(b); len=strlen(b); while(i) { i--; ib[len-i-1]=*(b+i)-48; }}//-----------------------------------------------//比較大小int cmp(char *a,char *b){ int i,sg; if (strlen(a)>strlen(b)) { sg=0; } else if (strlen(a)<strlen(b)) { sg=1; } else { for (i=0;i<(int)strlen(a);i++) { if (*(a+i)>*(b+i)) { sg=0; break; } else if (*(a+i)<*(b+i)) { sg=1; break; } else sg=0; } } return sg;}//-----------------------------------------------//加法函數char *add(char *a,char *b){ int len,i,c; int ia[1024],ib[1024],ir[1024]; str2int(a,b,ia,ib,ir); if (strlen(a)>strlen(b)) len=strlen(a); else len=strlen(b); c=0; //加法運算 for (i=0;i<len;i++) { ir[i]=(ia[i]+ib[i]+c)%10; c=(ia[i]+ib[i]+c)/10; } if (c==1) { ir[len]=1; len++; } for (i=0;i<len;i++) { *(a+i)=ir[len-i-1]+48;//翻轉輸出 } *(a+len)='\0'; return a;}//-----------------------------------------------//減法函數char *sub(char *a,char *b){ int len,i,c,sg; int ia[1024],ib[1024],ir[1024]; char str[1024]; char *strrt; str2int(a,b,ia,ib,ir); //符號判斷 sg=cmp(a,b); if (sg==0) len=strlen(a); else len=strlen(b); c=0; //減法運算 for (i=0;i<len;i++) { if (sg==0) { if ((ia[i]-ib[i]-c)>=0) { ir[i]=ia[i]-ib[i]-c; c=0; } else { ir[i]=10+ia[i]-ib[i]-c; c=1; } } else { if ((ib[i]-ia[i]-c)>=0) { ir[i]=ib[i]-ia[i]-c; c=0; } else { ir[i]=10+ib[i]-ia[i]-c; c=1; } } } if (sg==1) str[0]='-'; for (i=0;i<len;i++) { str[i+sg]=ir[len-i-1]+48;//翻轉輸出 } str[len+sg]='\0'; strrt=str; //去零處理 if (sg==0) { while(len>1&&*strrt=='0') { strrt++; len--; } } if (sg==1) { strrt++; while(len>1&&*strrt=='0') { *strrt='-'; strrt++; len--; } strrt--; } strcpy(a,strrt); return a;}
//-----------------------------------------------//乘法函數char *mul(char *a,char *b){ int len,lena,lenb,i,j,c,jin; int ma[1024],mb[1024],mr[1024]; char stra[1024],strb[1024]; char *strrta,*strrtb; stra[0]='0'; stra[1]='\0'; strrta=stra; str2int(a,b,ma,mb,mr); //乘法運算 lena=strlen(a); lenb=strlen(b); for (j=0;j<lena;j++) { c=0; jin=0; for (i=0;i<lenb;i++) { mr[i]=(ma[j]*mb[i]+c)%10; c=(ma[j]*mb[i]+c)/10; } len=lenb; if (c>0) { strb[0]=c+48; jin=1; } for (i=0;i<len;i++) { strb[i+jin]=mr[len-i-1]+48; } for (i=len;i<len+j;i++) strb[i+jin]='0'; strb[len+j+jin]='\0'; strrtb=strb; add(strrta,strrtb); } strcpy(a,strrta); return a;}//--------------------------------------------------//除法函數char *div(char *a,char *b){ int len,lena,i,j; char stra[1024],strb[1024],strc[1024],strd[1024]; char *strbp; strbp=strc; strcpy(stra,a); strcpy(strb,b); strcpy(strd,a); if (cmp(stra,strb)==1) { //被除數小於除數 *a='0'; *(a+1)='\0'; strcpy(b,stra); } else { //被除數大於除數 mul(strb,"10"); len=strlen(a)-strlen(b); if (len==0||(len==1&&cmp(stra,strb)==1)) { strcpy(stra,a); strcpy(strb,b); i=1; strc[0]='1'; strc[1]='\0'; while(cmp(stra,strc)==0) { strc[0]=i+48; strc[1]='\0'; mul(strc,strb); i++; } *a=i+46; *(a+1)='\0'; strcpy(strc,a); mul(strc,strb); sub(stra,strc); strcpy(b,stra); } else { len=strlen(a)-strlen(b); for (j=0;j<=len;j++) { for (i=0;i<=(int)strlen(b);i++) { if ((i+j-1)<0) stra[i]='0'; else stra[i]=*(a+i+j-1); } stra[strlen(b)+1]='\0'; strcpy(strb,b); strbp=stra; lena=strlen(strbp); while(lena>1&&*strbp=='0') { strbp++; lena--; } div(strbp,strb); strc[j]=*strbp; strbp=strb; for (i=0;i<(int)(strlen(b)-strlen(strb));i++) { strbp--; *strbp='0'; } for (i=strlen(b)-1;i>=0;i--) { *(a+i+j)=*(strbp+i); } } strc[len+1]='\0'; strbp=strc; lena=strlen(strbp); while(lena>1&&*strbp=='0') { strbp++; lena--; } strcpy(a,strbp); mul(strbp,b); sub(strd,strbp); strcpy(b,strd); } } return a;}
void main(){ char a[1024],b[1024],c; c='0'; while(c!='q') { printf(">>請輸入命令\n>>+ 加\n>>- 減\n>>* 乘\n>>/ 除\n>>q 退出\n>>"); c=getchar(); getchar(); switch(c) { case 'q':break; case '+': printf(">>請輸入第一個加數\n>>"); gets(a); printf(">>請輸入第二個加數\n>>"); gets(b); printf(">>和為%s",add(a,b)); getchar(); break; case '-': printf(">>請輸入被減數\n>>"); gets(a); printf(">>請輸入減數\n>>"); gets(b); printf(">>差為%s",sub(a,b)); getchar(); break; case '*': printf(">>請輸入第一個乘數\n>>"); gets(a); printf(">>請輸入第二個乘數\n>>"); gets(b); printf(">>積為%s",mul(a,b)); getchar(); break; case '/': printf(">>請輸入被除數\n>>"); gets(a); printf(">>請輸入除數\n>>"); gets(b); div(a,b); printf(">>商為%s余數為%s",a,b); getchar(); break; default:break; } }}

5. 求C語言代碼:單片機沒有乘除法,如何實現乘除法運算

單片機乘除法要用到ACC與B寄存器
所以在中斷程序中:

ACC++;


TH0=(65536-50000)/256;
TL0=(65536-50000)%256;


最後的兩個除法把ACC的值改變了。把變數ACC改為一個其它的全局變數就好了。(比如定義一個全局變數unsigned char n;把ACC改為n;)

C語言編程中,變數最好讓編譯器自己處理,不要直接用某一個寄存器。

6. 單片機一次加減乘除運算要多少時間

單片機有硬體乘除法的極少。51系列中的也只有一個八位的乘除法指命「MUL AB或DIV AB」。它們是基本指命周期時間的四倍。就是在12M晶振下它們運行一次是4微秒。如果用軟體來做就看你所需處理位數和編法了,一般要數毫秒。

7. 單片機中怎麼計算除法

可通過單片機除法運算程」DIV AB「,進行計算。

」DIV AB「表示:(A)÷(B)→(A)和(B),把累加器A的8位無符號整數除以寄存器B中的8位無符號整數,所得到的商存在累加器A,而余數存在寄存器B中。

例如,使用DIV指令計算16÷5,運行如下3個指令:

MOV A,#16;

MOV B,#5;

DIV AB;

得到A為3,表示商;B為1,表示余數。

8. 單片機 怎麼用位移的方法實現乘除法

因為在寄存器里的數都是二進制的,所以乘以2:左移一位;乘以4左移兩位;乘以8左移三位……依此類推(但要注意寄存器總共有多少位,防止溢出),除法用右移。
直接移位只能計算乘數(或除數)為2的n次方的乘(除)運算,對於一般的乘除法,還要配合加(減)法運算,比如a?9=a??3+a
實際上二進制數的基本運算即加,取反,移位等,通過變換來計算減,乘,除。
可以驗證,用單片機C語言編程計算乘數為2的n次方的乘法運算比乘數為一般數的乘法運算要快得多,就是因為前者只需直接移位,後者還需配合加法或經多步運算

9. 單片機 機械周期 加減乘除

以51單片機為例:
加法:ADD 1個機器周期(12個時鍾周期)
減法:SUBB 1個機器周期(12個時鍾周期)
乘法:MUL 4個機器周期(48個時鍾周期)
除法:DIV 4個機器周期(48個時鍾周期)

閱讀全文

與單片機乘除法相關的資料

熱點內容
pdf閱讀器刪除 瀏覽:975
考研人如何緩解壓力 瀏覽:822
買電暖壺哪個app便宜 瀏覽:505
洛克王國忘記伺服器了怎麼辦 瀏覽:782
為什麼cf登錄伺服器沒反應 瀏覽:695
伺服器如何獲取文件列表 瀏覽:672
creo五軸編程光碟 瀏覽:14
蘋果app網路驗證在哪裡 瀏覽:14
博科清空命令 瀏覽:384
簡愛英文pdf 瀏覽:376
cnc編程有前途嗎 瀏覽:586
聯想app怎麼聯網 瀏覽:722
linuxftp命令登錄 瀏覽:1000
android獲取圖片縮略圖 瀏覽:646
神戶制鋼螺桿壓縮機 瀏覽:29
差分演化演算法 瀏覽:567
中山市加密軟體 瀏覽:446
mc反編譯源碼 瀏覽:141
企業商城網站源碼 瀏覽:411
shell腳本編程是什麼 瀏覽:762