51单片机,pcf8591编程问题,发送一个字节程序中,if((temp&0x80)==0x80的含义??

51单片机IIC总线问题,PCF8591编程
if((temp&0x80)==0x80)//如果表达式为真,说明 temp 高位为 1, 则是双字节字符?这是网友给的解释,怎么就是双字节了,即使 temp 高位为 1,不还是8位二进制数吗,不还是一个字节吗?
if((temp&0x80)==0x80)的作用到底是什么??、?望大神指教,

没懂你的意思,你就拿这么一个if判断语句出来,实在没法给你解释,或许是理解有误。
不得不说两句,你问的问题,提供的内容要全面,要明确你想知道的是什么?疑问在什么地方?
像你前面说得双字节字符,貌似就一点关系都没有。

上面的那位仁兄说得很不错了(还不懂的话,建议你去看I2C协议,和硬件配置吧)
void Send(unsigned char Data)
{
unsigned char BitCounter = 8;
unsigned char temp;

do
{
temp = Data;
//I2C的时钟线SCL先清零,这是I2C协议决定的,数据传输SDA只能在SCL=0时才能改变。
scl = 0;
nop();
//下面就要判断在I2C数据线上要发送的数据,
//从最高位开始,判断结果是1,SDA就要置1,判断结果为0,SDA就要清零。
//没有什么像你说的输不输出数据,输出0是数据,输出1也是数据。
if((temp&0x80) == 0x80)
sda = 1;
else
sda = 0;
//下面一个SCL上升沿,把数据线SDA上的数据发送出去
scl = 1;
//因为前面始终判断的temp最高位,
//第(2,3,4...8)次循环,要依次把数据的第(7,6,5..1)位移到temp的最高位。
//满足这个要求,每次循环移动一位就可以了
temp = Data << 1;
Data = temp;
//BitCounter是用来统计循环次数的,
BitCounter --;
}while(BitCounter);
scl = 0;
}
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-11-26
就是检查temp变量的最高位是不是为1,没多大的意思。
如果为1,就让SDA=1,否则SDA=0,完成1bit的输出。
接着是temp=temp<<1,是吧?追问

追答

如果高位是1,就让SDA引脚输出1,否则就输出0,这有什么问题?

追问

我能看懂你说的这个,但是我不太明白原理,为啥写出这样的程序,???高位是1就不读了,是0就读取数据,原理是什么啊??

追答

这里没有读取数据啊,是让sda输出数据。

追问

那为什么是0就让sda输出数据???,是1就不让sda输出数据???,望赐教啊

追答

你别搞错了,这里sda=1就表示让sda输出1,sda=0就表示让sda输出0。

本回答被提问者采纳
第2个回答  2013-12-20
作用就是判断SDA为高或者为低。
哪来的双字节还是什么字节。

你把完整的代码弄上来看看。
第3个回答  2018-04-04
变量temp左移位,每次移动一位然后判断最高位是否为1,实际上是通过这样的操作把变量temp每一位的高低情况用SDA的高低反应出来,同时一位一位的在SH_CP上升沿是传入595的移位寄存器。为什么不能把变量temp直接传入595的14脚?因为temp是个变量,某个时刻是个具体的数,比如0x01,0x05,需要变成时序才能有效的受控的按位传递到14脚。这样才能和7段码对应起来,加以控制。

51单片机,pcf8591编程问题,发送一个字节程序中,if((temp&0x80)==0x8...
if((temp&0x80) == 0x80)sda = 1;else sda = 0;\/\/下面一个SCL上升沿,把数据线SDA上的数据发送出去 scl = 1;\/\/因为前面始终判断的temp最高位,\/\/第(2,3,4...8)次循环,要依次把数据的第(7,6,5..1)位移到temp的最高位。\/\/满足这个要求,每次循环移动一位就可以了 temp = Dat...

pcf8591的程序如何写,用51单片机
bit ack; \/\/应答标志位 define DataPort P0 \/\/定义数据端口 程序中遇到DataPort 则用P0 替换 define CtrlPort P1 sbit SDA=P2^5;sbit SCL=P2^4;unsigned char code DuanMa[10]={0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8,0x80,0x90};\/\/ 显示段码值0~9 unsigned char code WeiM...

谁知道pcf8591是怎么采集的,程序怎么写啊
PCF8591是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件。PCF8591具有4个模拟输入、1个模拟输出和1个串行I2C总线接口。PCF8591的3个地址引脚A0, A1和A2可用于硬件地址编程,允许在同个I2C总线上接入8个PCF8591器件,而无需额外的硬件。在PCF8591器件上输入输出的地址、控制和数据信号都是通过双...

51单片机可以对mcp4725操作吗
sprintf(temp,"V0 %3.2f ",Voltage);\/\/格式输出电压值,%3.2f 表示浮点输出,共3位数,小数点后2位 LCD_Write_String(0,0,temp);for(i=0;i<5;i++)num=ReadADC(1);Voltage=(float)num*5\/256;sprintf(temp,"V1 %3.2f ",Voltage);LCD_Write_String(8,0,temp);for(i=0;i<5;...

...利用串口显示电压电流? 求大神告解,急用! 最好给出做法和程序...
首先需要通信协议,然后通过串口发送命令,或者接收数据。流行的串口软件,如格西烽火、串口调试助手等,都不错。

...发送一个字节程序中,if((temp&0x80)==0x80的含义?
if((temp&0x80) == 0x80)sda = 1;else sda = 0;\/\/下面一个SCL上升沿,把数据线SDA上的数据发送出去 scl = 1;\/\/因为前面始终判断的temp最高位,\/\/第(2,3,4...8)次循环,要依次把数据的第(7,6,5..1)位移到temp的最高位。\/\/满足这个要求,每次循环移动一位就可以了 temp = ...

相似回答