展开全部
更多追问追答
追问
这个我也明白,但是执行效率非常低,想用移位的方式实现,你帮帮忙吗?
还有一个问题就是如果单片机不支持乘除法,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单片机没有乘法指令,但是有硬件乘法器,将数据写入到乘法器的输入寄存器中,等几个周期后从输出寄存器读取结果即可。
展开全部
单片机乘除法要用到ACC与B寄存器
所以在中断程序中:
{
ACC++;
,
,
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}
最后的两个除法把ACC的值改变了。把变量ACC改为一个其它的全局变量就好了。(比如定义一个全局变量unsigned char n;把ACC改为n;)
C语言编程中,变量最好让编译器自己处理,不要直接用某一个寄存器。
所以在中断程序中:
{
ACC++;
,
,
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}
最后的两个除法把ACC的值改变了。把变量ACC改为一个其它的全局变量就好了。(比如定义一个全局变量unsigned char n;把ACC改为n;)
C语言编程中,变量最好让编译器自己处理,不要直接用某一个寄存器。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
使用C语言,不用关心它有什么指令。
使用C语言,用 * 、 / ,即可实现乘除运算。
使用C语言,用 * 、 / ,即可实现乘除运算。
更多追问追答
追问
如果单片机不支持乘除法,即使用C也不能用*和/吧?
追答
用高级语言编程,优点就是不用考虑硬件的特点,且具有移植性。
C程序移植到其它不同的硬件系统,只要再使用对应的编译软件,重新编译一遍,即可。
编程的时候,完全不用考虑新的硬件系统支持什么功能。只管按照C语言的语法,编写程序就成了。
硬件不具备的计算方法,如乘方、开方、sin(x)......,编译系统自然会采用硬件支持的算法来实现。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
mul乘法
div除法
div除法
追问
大哥,又或是大姐,前提单片机无乘除法指令
追答
?我也在学单片机哦
就是上面的指令
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
额。。。不嫌乱,试试位移的算法?
追问
就是不知道怎么试,不太明白原理,所以不知道怎么试
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询