题目:在51单片机里,有两个16位(每个16位数是由两个字节组成)无符号数相除,结果放在30H、31H。
例如:由R0、R1组成被除数,R2、R3组成除数,被除数的数值为500,除数的数值为1300,即“500/1300=0.3846”。
在计算结果中,小数点后面最少要有3位数(最好是4位),由于是刚入门,最好能给个汇编程序例子,小妹万分感谢!
;==================================
最佳答案:
关于带有小数的运算,最简单的方法是:把它们都变换成整数来进行。
就是先把“R0、R1组成被除数”,乘以10000,即为:500*10000;
再用它除以“R2、R3组成除数”,得到:3846,显示的时候,再加上小数点即可。
四个字节除以三个字节的程序,在我的空间里面有。
比较麻烦的方法是:先学习C语言,再......。
-----------------------------
问题补充:谢谢!我试了一下,相乘的结果在65536以内是没有问题的,但500*10000结果已经超出65536,结果出错,再次请教您一下,如何计算出3846这个结果呢?谢谢!
回答补充提问:
500*10000,应该采用16位数乘以16位数、等于32位数(4个字节)的乘法程序。
这样,乘积虽然超过了65536,但是不会超过4个字节,所以不会出错。
除以“R2、R3组成除数”,可以采用“四个字节除以三个字节的程序”,正确得出3846,肯定是没有问题的。
这样的问题,我做过多次,都是成功的。
;==================================
************************************************************************
下面是另外一个问题。
************************************************************************
关于51单片机的数值计算问题
帮忙编写程序计算这个式子:X/20.9 = U/100000000。
其中“X”为未知数,“U”代表51单片机即时采集的二进制数据变量,“100000000”为二进制常数,“20.9”为十进制常数。
要求计算结果为三位十进制数(两位整数,一位小数),程序采用51单片机汇编语言设计。谢谢!
;==================================
最佳答案:
U,是多少位二进制数字?
问题补充:U是八位二进制数。
-------------------------
U是八位二进制数,就简单了。程序如下:
MOV A, U
MOV B, #209
MUL AB ;乘以209,可以方便以后的计算.
;乘积为16位。再除以256(即100000000),右移8位即可.
;商就是剩下在B中的8位数了.
MOV A, B
MOV B, #10
DIV AB ;除以10,余数就是“一位小数”.
MOV R2, B ;保存小数.
MOV B, #10
DIV AB ;再除以10,余数就是“个位数”.
MOV R1, B ;保存个位数.
MOV R0, A ;保存十位数.
;完
结果的“两位整数,一位小数”,分别存在 R0, R1, R2 中。
;==================================