社区导航

 

搜索
查看: 526|回复: 2

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

[复制链接]

3

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2019-5-24 16:48 | 显示全部楼层 |阅读模式
本帖最后由 许老二 于 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   

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


此帖出自单片机论坛


回复

使用道具 举报

1775

TA的帖子

0

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

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




回复

使用道具 举报

3

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

 楼主| 发表于 2019-5-26 09:42 | 显示全部楼层
gmchen 发表于 2019-5-25 07:21
MUL  AB             ;把小数部分的二进制值乘以10(是把所得积的低字节传给累加器A,高字节 ...

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


回复

使用道具 举报

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

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-6-24 21:12 , Processed in 0.132767 second(s), 16 queries , Gzip On, MemCache On.

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