句子大全

句子大全 > 句子大全

24C01

句子大全 2015-11-22 17:05:50

24C01--24C256读写操作C语言程序

#pragma ot(6,SIZE)

#i nclude reg52.h

#i nclude intrins.h

#define ERRORCOUNT 10

sbit SDA=P0^0;

sbit SCL=P0^1;

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;

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

/**********************************************************************

*************/

bit RW24XX(unsigned char *DataBuff,unsigned char

ByteQuantity,unsigned int Address,

unsigned char ControlByte,enum eepromtype

EepromType)

void Delay(unsigned char DelayCount);

void IICStart(void);

void IICStop(void);

bit IICRecAck(void);

void IICNoAck(void);

void IICAck(void);

unsigned char IICReceiveByte(void);

void IICSendByte(unsigned char sendbyte);

unsigned char data j,i=ERRORCOUNT;

bit errorflag=1;

while(i--)

IICStart();

IICSendByte(ControlByte 0xfe);

if(IICRecAck())

continue;

if(EepromType M2416)

IICSendByte((unsigned char)(Address 8));

if(IICRecAck())

continue;

IICSendByte((unsigned char)Address);

if(IICRecAck())

continue;

if(!(ControlByte 0x01))

j=ByteQuantity;

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

while(j--)

IICSendByte(*DataBuff++);

if(!IICRecAck())

continue;

errorflag=1;

break;

if(errorflag==1)

continue;

break;

else

IICStart();

IICSendByte(ControlByte);

if(IICRecAck())

continue;

while(--ByteQuantity)

*DataBuff++=IICReceiveByte();

IICAck();

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

IICNoAck();

errorflag=0;

break;

IICStop();

if(!(ControlByte 0x01))

Delay(255);

Delay(255);

Delay(255);

Delay(255);

return(errorflag);

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

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

void IICStart(void)

SCL=0; //

SDA=1;

SCL=1;

_nop_();

_nop_();

_nop_();

SDA=0;

_nop_();

_nop_();

_nop_();

_nop_();

SCL=0;

SDA=1; //

/*****************停止IIC总线****************/

void IICStop(void)

SCL=0;

SDA=0;

SCL=1;

_nop_();

_nop_();

_nop_();

SDA=1;

_nop_();

_nop_();

_nop_();

SCL=0;

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

bit IICRecAck(void)

SCL=0;

SDA=1;

SCL=1;

_nop_();

_nop_();

_nop_();

_nop_();

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

SCL=0;

return(CY);

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

void IICACK(void)

SDA=0;

SCL=1;

_nop_();

_nop_();

_nop_();

_nop_();

SCL=0;

_nop_();

SDA=1;

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

void IICNoAck(void)

SDA=1;

SCL=1;

_nop_();

_nop_();

_nop_();

_nop_();

SCL=0;

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

void IICSendByte(unsigned char sendbyte)

unsigned char data j=8;

for(;j j--)

SCL=0;

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

SDA=CY;

SCL=1;

SCL=0;

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

unsigned char IICReceiveByte(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--);

阅读剩余内容
网友评论
相关内容
拓展阅读
最近更新