找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机I2C通信通信程序(带详细注释)

[复制链接]
跳转到指定楼层
楼主
ID:80436 发表于 2015-5-20 18:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
I2C 总线是一双线串行总线, 它提供一小型网络系统,为总线上的电路共享公共的总线。总线上的器件有单片机、LCD 驱动器以及上E2PROM 器等等。自从菲利普公司提出I2C总 线规范以来,I2C器件得到了广泛的应用。I2C器件的应用大大减少了电路间连线,减小了电路板尺寸,降低了硬件成本,并提高了系统可靠性。


I2C通信的起始程序
void Delay(void)
{
        _nop_; _nop_; _nop_;_nop_;//此函数的头文件为intrins.h
        _nop_; _nop_; _nop_;_nop_;
}

void I2Cstart(void)
{
        SDA =1;
        Delay();        //延时函数
        SCL = 1;   //主要的就是在时钟信号为高电平的时候,
        Delay();        //数字信号有一个从高到底的跳变
        SDA =0;
        Delay();
        SCL = 0;
}
void I2Cstop(void)
{
        SCL = 0;
        Delay();        //延时函数
         SDA =0;  //主要的就是在时钟信号为高电平的时候,
        Delay();        //数字信号有一个从低到高的跳变
        SCL = 1;
        Delay();
        SDA =1;
        Delay();
}
void ack(void)         //主要的是主机给重机发送数据后,检测重机得应答。
{
        uchar i;
        SCL = 1; //将时钟信号拉高准备接受,应答!
        Delay();
        while(SDA == 1&&i<250)//防止时间长时间的等待因此增加i<250
        {
                i++;
        }
        SCL = 0;  //释放时钟总线准备下一次数据的传输
        Delay();
}
void nack(void)    //主要的是主机读取重机得数据,读到最后一个字符的时候
{
        SDA = 0;  //重机回复的非应答
        Delay();
        SCL = 1;
        Delay();
        SCL = 0;
}
void iicwrite(uchar dat)
{
        uchar i;
        for(i=0;i<8;i++)
        {
           SCL = 0;//释放时钟信号  让数据总线变化
           Delay();
           if(dat&&0x80)   //将数据从高位到底位依次的付给SDA
           {
                   SDA = 1;
           }       
           else
           {
                   SDA = 0;
           }
           dat = dat << 1;
           Delay();
           SCL = 1;//将数据从高位到底位依次的发送出去
           Delay();
        }
        SDA = 1;
                 Delay();
}
uchar iicread(void)
{
         uchar i,dat;
         for(i=0;i<8;i++)
         {
                SCL = 0;
                        SDA = 1;
                         Delay();
                  SCL = 1;
                         Delay();
                 dat = dat << 1;
                 if(SDA)
                 {
                          dat++;
                 }
         }
         return dat;
}


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

使用道具 举报

沙发
ID:871014 发表于 2021-1-29 11:00 | 只看该作者
void iicwrite(uchar dat)里
if(dat&&0x80)  //将数据从高位到底位依次的付给SDA
应该是 if(dat&0x80)  吧
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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