0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

I2C总线驱动的C语言源程序详细说明

Wildesbeast 来源:单片机教程网 作者:单片机教程网 2020-09-26 11:07 次阅读

i2c 总线上单片机系统中常用到的总线技术这里给大家介绍一个I2C总线驱动的C51语言源程序。

//#pragma ot(6,SIZE)

#i nclude 《AT89X52.H》

#i nclude 《intrins.h》

#define ERRORCOUNT 10

#define readI2C 0xa1

#define writeI2C 0xa0

sbit SDA=P1^6;

sbit SCL=P1^5;

enum eepromtype {M2401,M2402,M2404,M2408,M2416,M2432,M2464,M24128,M24256};

enum eepromtype EepromType;

//DataBuff为读写数据输入/输出缓冲区的首址

//ByteQuantity 为要读写数据的字节数量

//Address 为EEPROM的片内地址

//ControlByte 为EEPROM的控制字节,具体形式为(1)(0)(1)(0)(A2)(A1)(A0)(R/W),其中R/W=1,

//表示读操作,R/W=0为写操作,A2,A1,A0为EEPROM的页选或片选地址;

//EepromType为枚举变量,需为M2401至M24256中的一种,分别对应24C01至24C256;

//函数返回值为一个位变量,若返回1表示此次操作失效,0表示操作成功;

//ERRORCOUNT为允许最大次数,若出现ERRORCOUNT次操作失效后,则函数中止操作,并返回1

//SDA和SCL由用户自定义,这里暂定义为P0^0和P0^1;

//其余的用户不用管,只要把只子程序放在你的程序中并调用它就可以了;

/*******************************I2C总线驱动(C51语言源程序)**********************************************/

bit RW24XX(unsigned char *DataBuff,unsigned char ByteQuantity,unsigned int Address,

unsigned char ControlByte,enum eepromtype EepromType)

{

void Delay(unsigned char DelayCount);

void I2CStart(void);

void I2CStop(void);

bit I2CRecAck(void);

void I2CNoAck(void);

void I2CAck(void);

unsigned char I2CReceiveByte(void);

void I2CSendByte(unsigned char sendbyte);

unsigned char data j,i=ERRORCOUNT;

bit errorflag=1;

while(i--)

{

I2CStart();

I2CSendByte(ControlByte&0xfe);

if(I2CRecAck())

continue;

if(EepromType》M2416)

{

I2CSendByte((unsigned char)(Address》》8));

if(I2CRecAck())

continue;

}

I2CSendByte((unsigned char)Address);

if(I2CRecAck())

continue;

if(!(ControlByte&0x01))

{

j=ByteQuantity;

errorflag=0; //********clr errorflag

while(j--)

{

I2CSendByte(*DataBuff++);

if(!I2CRecAck())

continue;

errorflag=1;

break;

}

if(errorflag==1)

continue;

break;

}

else

{

I2CStart();

I2CSendByte(ControlByte);

if(I2CRecAck())

continue;

while(--ByteQuantity)

{

*DataBuff++=I2CReceiveByte();

I2CAck();

}

*DataBuff=I2CReceiveByte(); //read last byte data

I2CNoAck();

errorflag=0;

break;

}

}

I2CStop();

if(!(ControlByte&0x01))

{

Delay(255);

Delay(255);

Delay(255);

Delay(255);

}

return(errorflag);

}

/*****************以下是对I2C总线的操作子程序***/

/*****************启动总线**********************/

void I2CStart(void)

{

SCL=0; //

SDA=1;

SCL=1;

_nop_();

_nop_();

_nop_();

SDA=0;

_nop_();

_nop_();

_nop_();

_nop_();

SCL=0;

SDA=1; //

}

/*****************停止I2C总线****************/

void I2CStop(void)

{

SCL=0;

SDA=0;

SCL=1;

_nop_();

_nop_();

_nop_();

SDA=1;

_nop_();

_nop_();

_nop_();

SCL=0;

}

/**************检查应答位*******************/

bit I2CRecAck(void)

{

SCL=0;

SDA=1;

SCL=1;

_nop_();

_nop_();

_nop_();

_nop_();

CY=SDA; //因为返回值总是放在CY中的

SCL=0;

return(CY);

}

/***************对I2C总线产生应答*******************/

void I2CACK(void)

{

SDA=0;

SCL=1;

_nop_();

_nop_();

_nop_();

_nop_();

SCL=0;

_nop_();

SDA=1;

}

/*****************不对I2C总线产生应答***************/

void I2CNoAck(void)

{

SDA=1;

SCL=1;

_nop_();

_nop_();

_nop_();

_nop_();

SCL=0;

}

/*******************向I2C总线写数据*********************/

void I2CSendByte(unsigned char sendbyte)

{

unsigned char data j=8;

for(;j》0;j--)

{

SCL=0;

sendbyte《《=1; //无论C51怎样实现这个操作,始终会使CY=sendbyte^7;

SDA=CY;

SCL=1;

}

SCL=0;

}

/**********************从I2C总线上读数据子程序**********/

unsigned char I2CReceiveByte(void)

{

register receivebyte,i=8;

SCL=0;

while(i--)

{

SCL=1;

receivebyte=(receivebyte《《1)|SDA;

SCL=0;

}

return(receivebyte);

}

/***************一个简单延时程序************************/

void Delay(unsigned char DelayCount)

{

while(DelayCount--);

}

void main()

{

// unsigned int i;

//unsigned char j[32];

unsigned char *pa,*pb,temp=0;

unsigned char a[8]={5,6,7,8,9,10,11,12};

unsigned char b[8]={0,0,0,0,0,0,0,0};

pa=&a[0];

pb=&b[0];

P2_7=0;

RW24XX(pa,8,0x0,writeI2C,M2401);

RW24XX(pa,8,0x20,writeI2C,M2401);

RW24XX(pb,8,0x20,readI2C,M2401);

RW24XX(pb,8,0x30,writeI2C,M2401);

// RW24XX(unsigned char *DataBuff,unsigned char ByteQuantity,unsigned int Address,

// unsigned char ControlByte,enum eepromtype EepromType)

while(1)

{

P2_7=1;

}

}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7602

    浏览量

    136358
  • 总线
    +关注

    关注

    10

    文章

    2871

    浏览量

    88010
  • I2C
    I2C
    +关注

    关注

    28

    文章

    1482

    浏览量

    123430
收藏 人收藏

    评论

    相关推荐

    I2C总线驱动程序

    1 /**————————————————————2说明I2C总线驱动程序(用两个普通IO模拟I2
    发表于 08-13 17:04 64次下载

    i2c总线ppt(I2C总线器件应用)

    I2C总线器件应用第一节 I2C总线器件应用概述I2C总线工作原理
    发表于 08-13 17:34 0次下载

    I2C总线器件的C51读写程序

    I2C总线规范与I2C器件C51读写程序 本文简要介绍了I2C
    发表于 03-25 09:21 62次下载

    基于S3C44B0X的I2C总线设计

    文章介绍了S3C44B0X 的I2C 总线接口,与EEPROM 的连接方法。重点分析了I2C 总线的配置方法,主器件模式下发送数据和接收数据
    发表于 08-19 10:30 30次下载

    I2C总线规范与I2C器件C51读写程序

    I2C总线规范与I2C器件C51读写程序:本文简要介绍了I2C
    发表于 08-22 17:51 93次下载

    基于I2C总线的EEPROM驱动程序

     I2C总线是由Philips公司开发的用于器件之间连接的2线式双向同步串行总线。Linux内核中针对I2C
    发表于 12-07 13:58 55次下载

    I2C总线驱动程序的实现

    I2C总线驱动程序的实现 I2C 驱动程序的简介本驱动程序为标准的51 系列CPU 编写,让C
    发表于 09-26 17:25 5728次阅读
    <b class='flag-5'>I2C</b><b class='flag-5'>总线</b><b class='flag-5'>驱动程序</b>的实现

    HOLTEK 主I2C源程序代码

    HOLTEK 主I2C源程序代码 调用的代码             case C_READ+C_I2C
    发表于 01-14 23:37 1543次阅读

    I2C总线的单片机C语言实现及其应用

    I2C总线的单片机C语言实现及其应用 本文介绍了I2C总线的概念、接口特性和传输时序,提出了一
    发表于 10-17 08:36 2958次阅读
    <b class='flag-5'>I2C</b><b class='flag-5'>总线</b>的单片机<b class='flag-5'>C</b><b class='flag-5'>语言</b>实现及其应用

    i2c总线规范

    1 序言 1.1 版本1.0-1992 1992 I2C 总线规范的这个版本有以下的修正 删除了用软件编程从机地址的内容因为实现这个功能相当复杂而且不被使用 删除了低速模式实际上这个模式是整个I2C
    发表于 01-19 16:34 484次下载
    <b class='flag-5'>i2c</b><b class='flag-5'>总线</b>规范

    基于51的I2c总线

    I2c总线,基于51的I2c总线程序学习。快来下载学习吧
    发表于 01-13 11:49 34次下载

    I2C总线驱动程序

    I2C总线驱动程序
    发表于 05-20 11:16 15次下载

    详细说明I2C库文件的使用,对于理解I2C有帮助

    详细说明I2C库文件的使用,对于理解I2C有帮助
    发表于 10-13 10:02 28次下载

    使用C语言模拟51单片机的I2C总线的资料和程序免费下载

    本文档的主要内容详细介绍的是使用C语言模拟51单片机的I2C总线的资料和程序免费下载。
    发表于 08-06 17:34 11次下载
    使用<b class='flag-5'>C</b><b class='flag-5'>语言</b>模拟51单片机的<b class='flag-5'>I2C</b><b class='flag-5'>总线</b>的资料和<b class='flag-5'>程序</b>免费下载

    I2C总线的规范详细说明

    本文档的主要内容详细介绍的是I2C总线的规范详细说明
    发表于 09-30 17:29 18次下载
    <b class='flag-5'>I2C</b><b class='flag-5'>总线</b>的规范<b class='flag-5'>详细说明</b>