找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1402|回复: 5
打印 上一主题 下一主题
收起左侧

请问51单片机IIC发送程序怎么理解

[复制链接]
跳转到指定楼层
楼主
ID:891939 发表于 2021-3-30 17:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序片段如下:
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,整个程序中都没有对此返回值做什么操作,加此返回值显得没什么意义,请问此返回值有什么作用?

先谢了
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:207421 发表于 2021-3-30 17:53 | 只看该作者
下面都解释了:
while(SDA)//死等回应
if(b>200) //如果超过2000us 没有应答发送失败,或者为非应答,
return 0  失败
return 1  成功
回复

使用道具 举报

板凳
ID:390416 发表于 2021-3-30 18:34 | 只看该作者
回复

使用道具 举报

地板
ID:898699 发表于 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();
}
回复

使用道具 举报

5#
ID:743654 发表于 2021-3-30 20:09 | 只看该作者
调试时有用,可以通过返回值查看结果:没有应答发送失败,或者为非应答,返回0,else有应答发送成功,返回1
回复

使用道具 举报

6#
ID:684049 发表于 2021-3-30 21:26 | 只看该作者
这里是判断iic设备是否应答的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表