求C语言代码:单片机没有乘除法,如何实现乘除法运算?

谁能给我实现乘除法的函数?(我知道用过的人都会有的)。
满意再加分

如果是整数的乘除法还简单,浮点数的就不行了。

整数的乘法很好理解啊,比如A×B,就是A重复累加B次,比如要求C=A×B:
int A,B,C,i;
C=0;
for(i=0;i<B;i++)
{C+=A;}

整数的除法和乘法相反,比如A÷B,那就是让A反复减去B,直到差的数值小于B为止,这时差是余数,减去B的次数就是商,比如计算A÷B=C……D:
int A,B,C,D;
C=0;
while(A>B)
{
C++;
A-=B;
}
D=A;
计算完成之后C就是商,D就是余数。追问

这个我也明白,但是执行效率非常低,想用移位的方式实现,你帮帮忙吗?
还有一个问题就是如果单片机不支持乘除法,C语言还可以用*和/吗?

追答

如果是除以2、4、8、16等数字,可以使用算数右移的方法,这样效率比较高。要是除以3,5,7,9这样的数值时怎么办呢?所以我给出的是通用的编程方法。

同样乘法中乘以2、4、8、16等数值时,可以用算数左移来解决问题,但是要乘以一个13这样数字又怎么办呢?

C语言中是有*和/符号,但要是单片机无法用硬件实现乘除法,也只能用和我写的那方法一样去解决问题,当然这是通过调用库函数来完成的,你可以查看C编译后得到的汇编程序是怎么样的。比如51单片机有DIV指令去完成8位的除法,比如253÷15可以用DIV指令来完成,但要是换成16位的除法就不行了,比如1267÷38这样的,只能用减法。

当然现在有的单片机本身不支持乘除法,但是有专用的处理单元来调用,使用时把运算的数据送进去,然后等一定时间后读取结果即可,像MSP430单片机没有乘法指令,但是有硬件乘法器,将数据写入到乘法器的输入寄存器中,等几个周期后从输出寄存器读取结果即可。

追问

能告诉我你QQ吗?
我Q:29361537
还有一点点不明白的地方想问问你。。。

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-05-12
单片机乘除法要用到ACC与B寄存器
所以在中断程序中:

ACC++;


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


最后的两个除法把ACC的值改变了。把变量ACC改为一个其它的全局变量就好了。(比如定义一个全局变量unsigned char n;把ACC改为n;)

C语言编程中,变量最好让编译器自己处理,不要直接用某一个寄存器。
第2个回答  2011-05-11
使用C语言,不用关心它有什么指令。
使用C语言,用 * 、 / ,即可实现乘除运算。追问

如果单片机不支持乘除法,即使用C也不能用*和/吧?

追答

用高级语言编程,优点就是不用考虑硬件的特点,且具有移植性。
C程序移植到其它不同的硬件系统,只要再使用对应的编译软件,重新编译一遍,即可。
编程的时候,完全不用考虑新的硬件系统支持什么功能。只管按照C语言的语法,编写程序就成了。
硬件不具备的计算方法,如乘方、开方、sin(x)......,编译系统自然会采用硬件支持的算法来实现。

追问

能告诉我你QQ吗?
我Q:29361537
还有一点点不明白的地方想问问你。。。

追答

可以到我的百度空间去找。

第3个回答  2011-05-11
mul乘法
div除法追问

大哥,又或是大姐,前提单片机无乘除法指令

追答

?我也在学单片机哦
就是上面的指令

第4个回答  2011-05-11
额。。。不嫌乱,试试位移的算法?追问

就是不知道怎么试,不太明白原理,所以不知道怎么试

求C语言代码:单片机没有乘除法,如何实现乘除法运算?
整数的除法和乘法相反,比如A÷B,那就是让A反复减去B,直到差的数值小于B为止,这时差是余数,减去B的次数就是商,比如计算A÷B=C……D:int A,B,C,D;C=0;while(A>B){ C++;A-=B;} D=A;计算完成之后C就是商,D就是余数。

在单片机汇编语言中怎样做除法运算?(不用DIV指令)初步发现右移一次相...
可用移位、比较的方法实现任意位除法。右移一次相当于除于2,前提条件是原数必须是偶数。

单片机c语言的最小二乘法怎么实现,求代码
b=(p*m-n*l)\/(num*p-l*l);printf("最小二乘法所算得的斜率和截距分别为%f和%f\\n",a,b);} else printf("mun"输入有误!);}

单片机串行口程序如何进行加减乘除运算
加:ADD或者ADDC 减:SUBB 乘:MUL 除:DIV

C语言怎么实现数学中的乘方?
C语言中除了使用函数pow实现乘方运算,没有其他的运算符号可以用来直接表示乘方,就算自己实现也只能是以函数的形式体现出来。1、C语言中计算一个数的N次方可以用库函数pow来实现,还可以直接使用2^3就可以算出结果。pow函数原型:double pow(double x,double y)。其中x值是底数,y值是幂。举例:double...

8051 单片机的乘除怎么运算
如果是C语言,直接用*代表乘,\/代表除就型了,如果是汇编语言,你看一下指令怎么运行的就行了,很简单.

51单片机中执行一条乘法指令或者一条除法指令需要多少个机器周期_百 ...
嘿嘿 俺知道 1 51单片机中执行一条乘法指令或者一条除法指令需要时间: 是4个机器周期 可以查看指令表 这二条指令时51单片机执行时间最长的指令 2 单片机最短的指令执行时间是1个机器周期 也有2个机器周期的 3个机器周期的是没有的 呵呵 满意就选满意回答 ...

51单片机,c语言写程序,什么数学运算都可以吗?加减乘除,对数,指数,三...
KEIL C51 有个数学函数库(和C语言的 数学函数库类似)指数,三角函数,平方,开方,立方都有的。具体可以看 相关的资料。数学函数库 需要看头文件MATH.H 例如:1.指数函数 float exp(float x)2.对数函数 float log(float x) ,float log10(float x)3.平方根:float sqrt(float x)3.三角函数...

单片机做乘除法运算与浮点运算相比耗时吗?
是的,对于没有浮点运算单元FPU的单片机,一般就是采用这种方式来计算。例如原本要计算的数据是个电压值,在0~3.3V之间,通过12位采样之后得到0~4095的采样值AD_value。按照AD_value*2\/5计算之后得到的就是0~1638内的结果,再反向换算为电压0~1.32V。

c语言小学生混合运算怎么实现,就是随机加减乘除法。
\/\/小学生四则运算 #include #include #include \/\/产生 [a,b] 区间的随机数 #define RANDOM(a,b) (rand()%((b+1)-(a)) + (a)) \/\/产生 1-20 的整数,如要改变算术范围,则修改这个宏的参数即可 #define GEN_VALUE() RANDOM(1, 20) void main() { i...

相似回答