|
本帖最后由 许老二 于 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
请高手指点了上面我用红色字体所标注的疑问,谢谢!!!
|
|