单片机模拟I2C总线通信

sbit sda=P2^0; 
sbit scl=P2^1;//用单片机的两个I/O口模拟I2C接口 
uchar a; 
 
void delay()//简单延时函数 
{ ;; } 
 
void start()  //开始信号 SCL在高电平期间,SDA一个下降沿则表示启动信号 
{    
    sda=1; //释放SDA总线 
    delay(); 
    scl=1; 
    delay(); 
    sda=0; 
    delay(); 

 
void stop()   //停止 SCL在高电平期间,SDA一个上升沿则表示停止信号 

    sda=0; 
    delay(); 
    scl=1; 
    delay(); 
    sda=1; 
    delay(); 
}
void respons()  //应答 SCL在高电平期间,SDA被从设备拉为低电平表示应答 

    uchar i; 
    scl=1; 
    delay(); 
    while((sda==1)&&(i<250))i++; 
    scl=0; 
    delay(); 

 
void init()//总线初始化 将总线都拉高一释放总线  发送启动信号前,要先初始化总线。即总有检测到总线空闲才开始发送启动信号 

    sda=1; 
    delay(); 
    scl=1; 
    delay(); 

 
void write_byte(uchar date) //写一个字节 

    uchar i,temp; 
    temp=date; 
 
 
    for(i=0;i<8;i++) 
    { 
        temp=temp<<1; 
        scl=0;//拉低SCL,因为只有在时钟信号为低电平期间按数据线上的高低电平状态才允许变化 
        delay(); 
        sda=CY; 
        delay(); 
        scl=1;//拉高SCL,此时SDA上的数据以稳定 
        delay(); 
    } 
    scl=0;//拉高SCL,为下次数据传输做好准备 
    delay(); 
    sda=1;//释放SDA总线,接下来由从设备控制,比如从设备接收完数据后,在SCL为低时,拉低SDA作为应答信号 
    delay(); 

 
uchar read_byte()//读一个字节 

    uchar i,k; 
    scl=0; 
    delay(); 
    sda=1; 
    delay(); 
    for(i=0;i<8;i++) 
    { 
        scl=1;//数据已经稳定,可以接收啦 
        delay();     
        k=(k<<1)|sda; 
        scl=0;//拉低SCL,使发送端可以把数据放在SDA上 
        delay();     
    } 
    return k; 

 
void write_add(uchar address,uchar date)//任意地址写一个字节 

    start();//启动 
    write_byte(0xa0);//发送从设备地址 
    respons();//等待从设备的响应 
    write_byte(address);//发出芯片内地址 
    respons();//等待从设备的响应 
    write_byte(date);//发送数据 
    respons();//等待从设备的响应 
    stop();//停止 

 
uchar read_add(uchar address)

    uchar date; 
    start();//启动 
    write_byte(0xa0);//发送发送从设备地址 写操作 
    respons();//等待从设备的响应 
    write_byte(address);//发送芯片内地址 
    respons();//等待从设备的响应 
    start();//启动 
    write_byte(0xa1);//发送发送从设备地址 读操作 
    respons();//等待从设备的响应 
    date=read_byte();//获取数据 
    stop();//停止 
    return date;//返回数据 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值