51单片机怎样处理偏移二进制编码?
AD转换是双极性的,-Vr~+Vr,24位的AD转换,输出的数据是24位的,当电压是-Vr时对应的编码是0x000000(最高位是符号位),电压是零的时候对应的编码是0x...
AD转换是双极性的,-Vr ~ +Vr ,24位的AD转换,输出的数据是24位的,当电压是-Vr时对应的编码是0x00 00 00(最高位是符号位) ,电压是零 的时候对应的编码是0x800000,当电压是+Vr 的时候对应的编码是0xffffff,请问单片机怎么处理这样的编码啊?
因为我现在的传感器在没受力的情况下是负值,我想以这个负值点作为零点,而实际上他的零点是0x800000这个点,我想实现把零点下移 展开
因为我现在的传感器在没受力的情况下是负值,我想以这个负值点作为零点,而实际上他的零点是0x800000这个点,我想实现把零点下移 展开
6个回答
迪凯特科技(北京)有限公司
2023-07-28 广告
2023-07-28 广告
单片机串口通信数据丢失的原因可能如下:1. 按键通过串口发送对应命令,第一次按按键串口发送的指令正确且能把数据正确的显示出来,在第二次按按键串口发送的指令出现丢失的状况,可能是因为串口通信的波特率设置不正确。2. 如果单片机和外部设备的波特...
点击进入详情页
本回答由迪凯特科技(北京)有限公司提供
展开全部
乘除法的时候可以不考虑进制的,比如说 #0FFH这个十六进制数 存放于A中,#100这个十进制数放于B中 然后DIV AB 这时 A等于#02H B等于#37H等于55
在然后
假设A中的数为 FFH
BINBCD:
MOV B, #100 (B=100,十进制100,)
DIV AB (A等于#02H,B等于#37H等于55)
MOV R3, A (A=02H)
MOV A, #10 (A=10=0AH,B=55=37H)
XCH A,B (A=55=37H, B=10=0AH)
DIV AB (A=05H=5 , B=5=05H)
SWAP A (A=50H,B=05H)
ADD A,B (A=55H,这时十位各位的BCD吗已经求出来了,将
37H=55转换为55H
END
1 请问这个程序求解的思路是什么?
思路就是对一个数求模和求于来分离百位十位和个位
例如168
168/100=1余68
68/10=6余8
8/1=8余0
这样就分离了百位十位和个位
2 该程序的第二句"DIV AB"的解释是十六进制数除以100,可是A中应该存放的是一个八位的二进制数,这是怎么回事?
这个是你没理解cpu存数据的方式,A中存放的其实归根结底说是二进制数,机器只认识二进制数,对这段程序编译之后我们输入的十进制100也变成二进制数了,我们通常说十六进制数是因为十六进制数和二进制数有位上的对应关系,比如1100 0110B=C6H 也就是说二进制数每4位一段各自写成十六进制数就把二进制转换成十六进制了,
3 最后为什么要十位数与个位数相加,不是要分离十位数与个位数吗?
我想如果你清楚BCD码的含义你就明白了
BCD码就是用十六进制数来表示十进制的数
例如:45H是等于十进制的69的,但如果你说他是BCD码他就代表十进制数45
这样你就会发现不是每个十六进制数都是BCD码的,例如AAH就不是BCD码,因为没有AA这样的十进制数
我最后总结一下,就是我们所说的十进制数也好十六进制数也好,归根到底机器都是要把他变为二进制数的,机器也只认识二进制数,这样你就好理解了,我们不会处理不同进制数之间的运算,运算时必须要把他转换同进制的数,机器也是这样,只不过我们擅长的是十进制的运算,而机器擅长的是二进制运算,二进制数位数多不方便我们就找了一个帮手十六进制数
左移,最低位为0.
CLR C
MOV A,D1
RLC A
MOV D1,A
MOV A,D2
RLC A
MOV D2,A
在然后
假设A中的数为 FFH
BINBCD:
MOV B, #100 (B=100,十进制100,)
DIV AB (A等于#02H,B等于#37H等于55)
MOV R3, A (A=02H)
MOV A, #10 (A=10=0AH,B=55=37H)
XCH A,B (A=55=37H, B=10=0AH)
DIV AB (A=05H=5 , B=5=05H)
SWAP A (A=50H,B=05H)
ADD A,B (A=55H,这时十位各位的BCD吗已经求出来了,将
37H=55转换为55H
END
1 请问这个程序求解的思路是什么?
思路就是对一个数求模和求于来分离百位十位和个位
例如168
168/100=1余68
68/10=6余8
8/1=8余0
这样就分离了百位十位和个位
2 该程序的第二句"DIV AB"的解释是十六进制数除以100,可是A中应该存放的是一个八位的二进制数,这是怎么回事?
这个是你没理解cpu存数据的方式,A中存放的其实归根结底说是二进制数,机器只认识二进制数,对这段程序编译之后我们输入的十进制100也变成二进制数了,我们通常说十六进制数是因为十六进制数和二进制数有位上的对应关系,比如1100 0110B=C6H 也就是说二进制数每4位一段各自写成十六进制数就把二进制转换成十六进制了,
3 最后为什么要十位数与个位数相加,不是要分离十位数与个位数吗?
我想如果你清楚BCD码的含义你就明白了
BCD码就是用十六进制数来表示十进制的数
例如:45H是等于十进制的69的,但如果你说他是BCD码他就代表十进制数45
这样你就会发现不是每个十六进制数都是BCD码的,例如AAH就不是BCD码,因为没有AA这样的十进制数
我最后总结一下,就是我们所说的十进制数也好十六进制数也好,归根到底机器都是要把他变为二进制数的,机器也只认识二进制数,这样你就好理解了,我们不会处理不同进制数之间的运算,运算时必须要把他转换同进制的数,机器也是这样,只不过我们擅长的是十进制的运算,而机器擅长的是二进制运算,二进制数位数多不方便我们就找了一个帮手十六进制数
左移,最低位为0.
CLR C
MOV A,D1
RLC A
MOV D1,A
MOV A,D2
RLC A
MOV D2,A
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你用转换出来的数据减去0x800000,得出来的数再除以相应的倍数就是你真正测量的电压值了,比如你+Vr=5V,你测量得到的数据为Data,真正的电压值为(Data-0x800000)/(0x800000/5)。也就是(Data-0x800000)/0x199999.
我知道你的意思,你只要把测量值减去0x800000,负值你就按照负数来计算,正值你就按照正值来计算就可以了。不过也看你是什么语言编程,要是C语言这样是最好的了。
我知道你的意思,你只要把测量值减去0x800000,负值你就按照负数来计算,正值你就按照正值来计算就可以了。不过也看你是什么语言编程,要是C语言这样是最好的了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你像得到什么啊?如果就想要0V以上就用AD值减去0x800000
如果0V以下就用AD值取反加一(就是求补)
以上计算不包括符号位
如果0V以下就用AD值取反加一(就是求补)
以上计算不包括符号位
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询