数码之家

 找回密码
 立即注册
搜索
查看: 1941|回复: 5

[C51] 请高手解释数字电压表的汇编程序

[复制链接]
发表于 2019-5-24 10:33:52 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 chjtxys 于 2019-5-24 10:40 编辑

我是刚学习51单片机的一位新手。最近看了有关数字电压表的汇编程序,对其中的有些指令的作用不甚理解,期盼高手不吝赐教。
                    ;将0~255转换为0.00~5.00 
                  MOV  R0,#70H
                  MOV  A,P0
                  MOV  @R0,A
                  MOV   A,@R0     ;把R0内存储的数值所指向RAM单元的内容(模拟电压转换成的二进制数值)传给累加器A
                  MOV   B,#51      ;把十进制数51(代表1伏电压值)传给寄存器B
                  DIV    AB           ;相除得到模拟电压的整数部分和小数部分的二进制值
                  MOV   78H,A    ;把整数部分的二进制值放入RAM的78H存储单元
                  MOV  A,B          ;把小数部分的二进制值传入累加器A
                  CLR F0               ;用户标志位清零
                  SUBB  A,#1AH   ; 把小数部分的二进制值与0.5伏电压的二进制值(十六进制为1AH)相减
                  MOV  F0,C         ;把借位标志传送给用户标志位
                  MOV  A,#10       ;把十进制数10传给累加器A
                  MUL  AB             ;把小数部分的二进制值乘以10(是把所得积的低字节传给累加器A,高字节传给寄存器 B 吗?)
                  MOV  B,#51       ;把十进制数51传给寄存器B
                  DIV   AB             ;把小数部分的二进制值乘以10所的积的低字节除以51(积的低字节除以51得到的商不可能是十分位的小数值吧?)
                  JB  F0,LOOP1     ;判断小数部分的二进制值是否低于0.5伏电压的二进制值
                  ADD  A,#5         ;如果小数部分的二进制值大于0.5伏电压的二进制值,则把乘积的低字节除以51得到的商加5
                                            (这样怎么会是四舍五入,如果是,为什么首先就在十分位小数值上四舍五入呢?算术上不是先从小数的百分位上四舍五入,后在小数的十分位上四舍五入吗?)
LOOP1:    MOV  79H,A        ;如果小数部分的二进制值小于0.5伏电压的二进制值,则把乘10以后除以51得到十分位小数值传给RAM的79H存储单元
                 MOV  A,B
                 CLR   F0
               SUBB A,#1AH
               MOV  F0,C 
                MOV  A,#10 
                MUL  AB 
                MOV  B,#51 
                DIV  AB 
                JB   F0,LOOP2 
                ADD  A,#5
                 LOOP2: MOV  7AH,A   

请高手指点了上面我用红色字体所标注的疑问,谢谢!!!
发表于 2019-5-25 00:49:50 | 显示全部楼层
玩c不好吗?废什么老大劲折腾汇编
回复 支持 反对

使用道具 举报

发表于 2019-5-25 00:54:55 | 显示全部楼层
本帖最后由 2545889167 于 2019-5-25 00:58 编辑

乘法指令
       MUL AB
      此指令的功能是将A和B中的两个8位无符号数相乘,两数相乘结果一般比较大,因此最终结果用1个16位数来表达,其中高8位放在B中,低8位放在A中。在乘积大于FFFFFH(65535)时,0V置1(溢出),否则OV为0,而CY总是0。
      例:(A)=4EH,(B)=5DH,执行指令
      MUL AB后,乘积是1C56H,所以在B中放的是1CH,而A中放的则是56H。

除法指令
       DIV AB
       此指令的功能是将A中的8位无符号数除以B中的8位无符号数(A/B)。除法一般会出现小数,但计算机中可没法直接表达小数,它用的是我们小学生还没接触到小数时用的商和余数的概念,如13 /5,其商是2,余数是3。除了以后,商放在A中,余数放在B中。CY和OV都是0。如果在做除法前B中的值是00H,也就是除数为0,那么0V=1。




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

发表于 2019-5-25 00:56:26 | 显示全部楼层
单片机里面 你没搞浮点运算 是没有小数的 ,全是定点运算。别老想着小数好吧。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-26 09:15:00 | 显示全部楼层
2545889167 发表于 2019-5-25 00:56
单片机里面 你没搞浮点运算 是没有小数的 ,全是定点运算。别老想着小数好吧。。
...

谢谢老师指点。ADD  A,#5这个指令在此程序中的四舍五入中的五入,请问,为什么首先有小数位的十分位开始进行五入,算术中的四舍五入的顺序不是按小位的千分位、百分位、十分位的顺序进行四舍五入的,而此程序中一开始就从小数位的十分位四舍五入,其次是在小数的百分位进行四舍五入,请问这其中有什么理论论据?谢谢!!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-26 12:50:25 来自手机浏览器 | 显示全部楼层
2545889167 发表于 2019-5-25 00:56
单片机里面 你没搞浮点运算 是没有小数的 ,全是定点运算。别老想着小数好吧。。
...

谢谢老师在百忙中给予指点。程序中ADD  A,#5这条指令是四舍五入中的五入(当余数大于除数51的一半26时,商肯定大于0.5,需要进行五入),我还有一点疑问是,日常算术运算中,对小数部分四舍五入是按照小数的千分位、百分位、十分位的顺序依次进行四舍五入的,而上面的程序却按照小数十分位、百分位的顺序进行四舍五入,请问老师,程序中这种顺序的四舍五入有什么依据?谢谢!!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-8 03:24 , Processed in 0.202801 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表