❶ 单片机中怎么计算除法

可通过单片机除法运算程”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位单片机怎么进行十六位除十六位,最好有程序
二进制除法运算
多字节二进制除法
被除数为3个字节,在wr2_wr1_wr0单元中,wr2.7为最高位,wr0.0为最低位.
除数为2个字节,在wr9_wr8中。
算法:EM78单片机没有除法指令,而且本例中除法为多字节除法,可采用如下算法.
将被除数扩充一个字节0X23_0X22清0.被除数左移1位,0X23_0X22中数据减去0X31_0X30中数据.够减则减且0X20.0置1,减出结果存入0X23_0X22
不够减则0X23_0X22保持不变,0X20.0清0。
然后被除数再左移1位,重复上述过程。共循环16次,最后0X23_0X22中得相减余数,0X21_0X20中得商。
注意,若被除数左移后C标志为1,则不比较0X23_0X22与0X31_0X30数据大小关系而直接相减。
main: mov a,@0x55 ;被除数赋值
mov wr0,a
mov wr1,a
mov wr2,a
mov a,@0x0 ;被除数扩充1字节并清0
mov wr3,a
mov a,@0x12 ;除数赋值
mov wr8,a
mov wr9,a
mov a,@0x10 ;循环次数为16
mov wr7,a
again: call rt_sub ;调移位除法子程
djz wr7 ;16次循环完成则结束
jmp again ;未完成则继续
self: jmp self
rt_sub:
bc 0x03,0 ;c标志清0
rlc wr0 ;被除数左移1位
rlc wr1
rlc wr2
rlc wr3
jbc 0x03,0
jmp rt3 ;c标志为1则直接相减
mov a,wr3 ;c标志为0则先比较大小
mov wr5,a
mov a,wr2
mov wr4,a
mov a,wr9 ;先比较高位
sub wr5,a
jbc 0x03,2
jmp rt1 ;高位相等跳rt1比较低位
jmp rt2 ;高位不等跳rt2
rt1: mov a,wr8 ;比较低位
sub wr4,a
jbc 0x03,2
jmp rt3 ;低位也相等则跳rt3,相减,上1
rt2: jbs 0x03,0
ret ;减数大则返回,减数小则相减,上1
rt3: bs wr0,0 ;上1
call sub_2b ;调2字节减法子程
ret
sub_2b:
mov a,wr9 ;高字节相减
sub wr3,a
mov a,wr8 ;低字节相减
sub wr2,a
jbc 0x03,2
ret ;低字节相等,无借位,返回
jbc 0x03,0
ret ;无借位,返回
dec wr3 ;低字节相减有借位,高字节结果减1
ret
eop
❸ 8051单片机用汇编循环移位指令实现除法,被除数为2的倍数,怎么编啊
很简单呀,比如一个数除以4
MOV A,DAT
CLR C
RRC A
CLR C
RRC A
被除数是2的几次方,就用一次右移指令。
❹ 在单片机汇编语言中怎样做除法运算(不用DIV指令)初步发现右移一次相当于除于2TKS!
可用移位、比较的方法实现任意位除法。右移一次相当于除于2,前提条件是原数必须是偶数。
❺ 关于C51单片机的小数点四舍五入处理
将你需保留的那一位的低一位加5之后舍掉即可
单片机内一般采用整数计算,如果要保留两位小数,需将原数据扩大100倍,小数点该向左移2位
18754/100=187·54 但单片机只能算整数,因此结果只能是187
因此计算时我们我们将被除数扩大100倍 相当于小数点向右移2位,1875400/ 100=18754
然后我们将计算结果的小数点再向左移回来2 位,即变成了 187.54 这就是定点小数的算法
如果18754/100我们只保留一位小数
我们可以这样处理 (18754*100+500)=1875900
1875900/100=18759
小数点左移2位,结果187.59 最后一位不考虑取187.5
但如果18755/100我们只保留一位小数
(18755*100+500)=1876000
1876000/100=18760
小数点左移2位,结果187.60 最后一位不考虑取187.6
看到了吧,4舍去了 5就入上去了
所以要保留三位小数,需将原来数据扩大1000倍,再除1000
所以要保留4位小数,需将原来数据扩大10000倍,再除10000
.......
扩大100倍或1000倍操作要放在除法之前,因除法才会导致小数丢失
需4舍5 入,将要保留的那一位数的低一位加5即可
当然这是低级算法,用C语言编程直接可以用浮点数,结果输出 时会自动四舍5 入
你所要做的是将浮点数转换为字符(用sprint函数)并控制输出数据的位数,格式控制类似于printf函数
❻ 51单片机怎样从一个非常大的数字里面提取个十百千万位等......
下面举例说明万千百十个的表示方法。其实很简单,用除法取余就行。
i=a/b ;//取商
i=a%b;//取余
方法很多,以下是一例:
unsigned int wan,qian,,shi ,ge,
wan=i/10000;//除一万取商,是万位。
qian=(i/1000)%10;//先除1000,取商,商的个位是千位,所以再除10 取余。
=(i%100)/10%10;//先除100,取商,商的个位是百位,所以再除10 取余。
shi=(i%100)/10;//先除100,取余,商再除10 取余。
ge==(i%10;//除10取余。
不过阁下要知道整形量最大是65535,假如你的数据达到999999,你就要定义长整形量了。
unsigned long int i=999999;
如当I<10的时候 P0=table[i/10]; 个位
这样的算法 我写的不行 ,请高手写下 ,我看下我的出错在什么地方
i/10是取商啊,怎么可能是个位呢?是十位。I<10的话,一定是0了。
移位的方法不行,移位是2进制运算。你这个是十进制。