用AD0809测量电压,电压范围是0--+5V,程序中把测得的数据进行了以下处理,就得到了电压值的BCD码,假设测得数据为200
(再此用十进制表示)
org 0000h
main:
mov a,#200
mov b,#51
p ab; a=3,b=47
mov r1,a; 个位数放入R1(3)
mov a,b; a=47,b=47
clr f0
subb a,#26;余数大于25,F0为1,乘法益出,结果加5 (a=21)
mov f0,c
mov a,#10
mul ab; ,c=1,a=214,[a=470(1d6h)]
mov b,#51;b=51
p ab;a=4,b=10
jb f0,loop4
add a,#5;益出结果加5
loop4: mov r2,a;小数后第一位放入R2=9
mov a,b;a=10
clr f0
subb a,#26
mov f0,c
mov a,#10
mul ab
mov b,#51
p ab
jb f0,loop5
add a,#5
loop5: mov r3,a;小数后第二位放R3
end
我不理解,为什么要把测得的数据除以51?而得到的余数为什么又要减26?(26+25=51),我如果选参考电压为+10伏,
有应该如何处理呢?
请各位大虾不吝赐教,谢谢!!!
请讲的详细些,不胜感激!!!
首先,将采集过来的16进制的数值转换成10进制,再将此10进制数值除以255,然后才乘以5,最后得出最终的实际电压值。
但是考虑到在单片机中实现浮点数的计算比较困难,所以采用了下面的方法来实现:
(X)16 = (Y)10
FF 255
Z1=(X)16 *5/FF = X/33H
Z=(5*Y)/255
这里可以得出个位的数值
(X)16 = (Z2)10
33H 10 Z2=(X)16*0AH/33H
=(X)16/5H
这里可以得出小数点后一位的值。
Z3 = (X)16*2H
这里可以得出小数点后第二位的值。
说明的是在程序中,只使用到小数点后一位的值,但是可以根据具体的要求再对程序进行修改,使程序能够达到实际的要求。
上面一段跟你说的程序的原理应该差不多,毕竟33H=55