问一段单片机的c语言程序。

sbit Dout = P2^8; // Dout 是外部输入给单片机的数据,AD芯片转换的结果24位串行
sbit CLK = P2^7; //clk是单片机发给AD芯片的时钟,25个时钟为一次转换周期
unsigned long ReadCount(void){
unsigned long Count;
unsigned char i;
Dout=1; //非51 类MCU,略去此行
CLK=0;
Count=0;
while(Dout); //如果输出数据为高电平,则发25个转换脉冲
for (i=0;i<24;i++)
{
CLK=1; //高电平
Count=Count<<1; //每个高电平到低电平的下降沿来时,变量count左移一位,右侧补零
CLK=0; //低电平
if(Dout) Count++; // 如果输出仍为高电平,那么count加1.
}
CLK=1;
Count=Count^0x800000; //第25个脉冲下降沿来时,转化数据。Count与0x800000按位做xor运算。
CLK=0;
return(Count);
}
-------------------
上面程序的if(Dout) Count++; 看不懂;
Count=Count^0x800000; 也看不懂;
请帮我分析一下,谢谢了先。
感谢yrp88;第一句你的解释很在理,第二句里不是与运算,是异或运算。

我也接触到了这段代码。是HX711ad转换读数函数用到的
我来解释两点:
1、Count=Count^0x800000,最高位取反。把正负方向的电压转换ad全部变成正的数值。例如24位2进制可以表示的数值为-8388608~8388607,没有负载时为0;
最高位取反后表示数值为0~16777215,没有负载时候显示为8388608,这样做的目的是避免出现负数,方便计算。如果你做电子秤的话,我建议就不要这句了。一般不会有负数的。
2、有的代码后面还跟了一段
/* if((Count & 0x800000) == 0x800000)
{
Count = ~(Count - 1);
} */
表示负数补码还原成正值
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-02-14
任何一位二进制数同 1 异或都会取反
任何一位二进制数同 0 异或都保持不变
Count=Count^0x800000;
把24位数据最高位取反
至于 你为什么要最高位取反的话 要 看你的AD芯片手册了 算法我模拟了一下 之前的那一段就是取得了24位有效数据位了 第二十五的时种 取了个 反 !日本回答被提问者采纳
第2个回答  2011-02-12
第一句是明白的,因为在上面FOR循环读25位数据,每循环一次首先左移一位补0不管高低电平,然后判断,如果DOUT是低电平说明数据是零补的零正好,如果是高电平则为1.所以要加1把补的0变成1,这样才完成数据读。数据转换用得是与我怀疑是错了,应该是或命令才对
第3个回答  2011-02-13
第一句是dout不为零,执行count++,count的值为count与800000异或
第4个回答  2011-02-12
坐等高手
相似回答