5708|2

2

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请高手解释数字电压表的汇编程序 [复制链接]

本帖最后由 许老二 于 2019-5-24 16:50 编辑

我是刚学习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   

请高手指点了上面我用红色字体所标注的疑问,谢谢!!!


此帖出自单片机论坛

最新回复

MUL  AB             ;把小数部分的二进制值乘以10(是把所得积的低字节传给累加器A,高字节传给寄存器 B 吗?)   不是。注意B里面是原来的小数部分,乘10相当于小数点右移一位。这一点清楚了,后面的都可以理解。   详情 回复 发表于 2019-5-25 07:21
点赞 关注(1)
 

回复
举报

2928

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 
MUL  AB             ;把小数部分的二进制值乘以10(是把所得积的低字节传给累加器A,高字节传给寄存器 B 吗?
  不是。注意B里面是原来的小数部分,乘10相当于小数点右移一位。这一点清楚了,后面的都可以理解。


此帖出自单片机论坛
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
gmchen 发表于 2019-5-25 07:21
MUL  AB             ;把小数部分的二进制值乘以10(是把所得积的低字节传给累加器A,高字节 ...

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

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表