标题: 请问51单片机IIC发送程序怎么理解 [打印本页]

作者: xxx1949    时间: 2021-3-30 17:23
标题: 请问51单片机IIC发送程序怎么理解
程序片段如下:
unsigned char I2cSendByte(unsigned char dat)
{
unsigned char a=0,b=0;//最大255,一个机器周期为1us,最大延时
255us。
for(a=0;a<8;a++)//要发送8 位,从最高位开始
{
SDA=dat>>7; //起始信号之后SCL=0,所以可以直接改变SDA 信

dat=dat<<1;
Delay10us();
SCL=1;
Delay10us();//建立时间>4.7us
SCL=0;
Delay10us();//时间大于4us
}
SDA=1;
Delay10us();
SCL=1;
while(SDA)//等待应答,也就是等待从设备把SDA 拉低
{
b++;
if(b>200) //如果超过2000us 没有应答发送失败,或者为非应答,
表示接收结束
{
SCL=0;
Delay10us();
return 0;
}
}
SCL=0;
Delay10us();
return 1;
}



void At24c02Write(unsigned char addr,unsigned char dat)
{
I2cStart();
I2cSendByte(0xa0);//发送写器件地址
I2cSendByte(addr);//发送要写入内存地址
I2cSendByte(dat); //发送数据
I2cStop();
}


请问unsigned char I2cSendByte(unsigned char dat)函数中黄色背景标注的return,整个程序中都没有对此返回值做什么操作,加此返回值显得没什么意义,请问此返回值有什么作用?

先谢了

作者: lwh999995    时间: 2021-3-30 17:53
下面都解释了:
while(SDA)//死等回应
if(b>200) //如果超过2000us 没有应答发送失败,或者为非应答,
return 0  失败
return 1  成功
作者: 人人学会单片机    时间: 2021-3-30 18:34
http://www.51hei.com/bbs/dpj-204282-1.html
http://www.51hei.com/bbs/dpj-204281-1.html
我i这两个贴子 都是IIC的 你可以看看

作者: 请使劲儿飞    时间: 2021-3-30 19:43
应该是返回发送状态的  就是发送成功还是失败,这个步骤倒不是必要的,不写也无所谓。不过程序看起来似乎也不完整 ,if之后配套应该还有个else没写

可以参考以下
/***********************************
功能:向外部设备发送8bit数据-----
************************************/
void IIC_SendByte(uint8_t Byte)
{
        uint8_t i = 0;
       
        for(i=0; i<8; i++)
        {
                if(Byte & 0x80)                //先从高位开始发送(&0x80是为了单独提取出最高位的那个值 也就是要发送的数据,因为数据一次只能发送一位0或1)
                {
                        IIC_SDA_1();        //SDA置高  (IO引脚不能像51那般直接以等于0或1来进行输出控制)
                }
                else
                {
                        IIC_SDA_0();        //SDA置低
                }
                Byte <<= 1;                        //数据左移
                IIC_Delay();                //延时
               
                IIC_SCL_1();
                IIC_Delay();
                IIC_SCL_0();               
                IIC_Delay();
        }
        IIC_SDA_1();                        //释放总线
        IIC_Delay();
}
作者: cheney03    时间: 2021-3-30 20:09
调试时有用,可以通过返回值查看结果:没有应答发送失败,或者为非应答,返回0,else有应答发送成功,返回1

作者: 花心的刘备    时间: 2021-3-30 21:26
这里是判断iic设备是否应答的




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1