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

谁能给我实现乘除法的函数?(我知道用过的人都会有的)。满意再加分... 谁能给我实现乘除法的函数?(我知道用过的人都会有的)。
满意再加分
展开
 我来答
ATF144X
推荐于2017-11-24 · TA获得超过1.2万个赞
知道大有可为答主
回答量:5344
采纳率:77%
帮助的人:4652万
展开全部
如果是整数的乘除法还简单,浮点数的就不行了。

整数的乘法很好理解啊,比如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单片机没有乘法指令,但是有硬件乘法器,将数据写入到乘法器的输入寄存器中,等几个周期后从输出寄存器读取结果即可。
rggld4830
2011-05-12 · TA获得超过193个赞
知道答主
回答量:371
采纳率:0%
帮助的人:220万
展开全部
单片机乘除法要用到ACC与B寄存器
所以在中断程序中:

ACC++;


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


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

C语言编程中,变量最好让编译器自己处理,不要直接用某一个寄存器。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
做而论道
高能答主

2011-05-11 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3万
采纳率:80%
帮助的人:1.2亿
展开全部
使用C语言,不用关心它有什么指令。
使用C语言,用 * 、 / ,即可实现乘除运算。
更多追问追答
追问
如果单片机不支持乘除法,即使用C也不能用*和/吧?
追答
用高级语言编程,优点就是不用考虑硬件的特点,且具有移植性。
C程序移植到其它不同的硬件系统,只要再使用对应的编译软件,重新编译一遍,即可。
编程的时候,完全不用考虑新的硬件系统支持什么功能。只管按照C语言的语法,编写程序就成了。
硬件不具备的计算方法,如乘方、开方、sin(x)......,编译系统自然会采用硬件支持的算法来实现。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
春素装人
2011-05-11 · 超过11用户采纳过TA的回答
知道答主
回答量:115
采纳率:0%
帮助的人:58.6万
展开全部
mul乘法
div除法
追问
大哥,又或是大姐,前提单片机无乘除法指令
追答
?我也在学单片机哦
就是上面的指令
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
monday55026
2011-05-11
知道答主
回答量:8
采纳率:0%
帮助的人:1.3万
展开全部
额。。。不嫌乱,试试位移的算法?
追问
就是不知道怎么试,不太明白原理,所以不知道怎么试
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式