关于51单片机双字节(带有小数)无符号除法的问题

来源:本站
导读:目前正在解读《关于51单片机双字节(带有小数)无符号除法的问题》的相关信息,《关于51单片机双字节(带有小数)无符号除法的问题》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《关于51单片机双字节(带有小数)无符号除法的问题》的详细说明。
简介:两个关于51单片机的数值计算的问题与解答。

题目:在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 中。

;==================================

提醒:《关于51单片机双字节(带有小数)无符号除法的问题》最后刷新时间 2024-03-14 00:57:38,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《关于51单片机双字节(带有小数)无符号除法的问题》该内容的真实性请自行鉴别。