单片机模拟I2C总线及24C02读写实例(c源代码),24C02 read / write process
关键字:单片机模拟I2C总线及24C02读写实例(c源代码)
单片机模拟I2C总线及24C02(I2C EEPROM)读写实例(c源代码)
/* 51系列单片机在使用时,有时需要模拟I2C总线, */ /* 这里举出一个实例(读写串行EEPROM芯片at2402) */
/************************************************************************/ /* Name:AT24C02存储器的读写程序,用到I2C总线,含相对独立的I2C总线读写函数 */ /* Language: C51单片机编程语言 */ /* Platform: Win98,Intel Celeron 433 Processor,伟福仿真器,仿真8751 */ /* Author: StephenZhu javasdk@163.com */ /* Date: 2003年5月21日,5月22日,5月29日 */ /* Version: 1.1.1 */ /* Others: None */ /************************************************************************/ #include #include #include #define DELAY_TIME 60 /*经实验,不要小于50!否则可能造成时序混乱*/ #define TRUE 1 #define FALSE 0 sbit SCL=P1^7;/*假设由P1.7和P1.6控制*/ sbit SDA=P1^6; /********** Function Definition 函数定义 ************/ void DELAY(unsigned int t) /*延时函数*/ { while(t!=0) t--; } void I2C_Start(void) { /*启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变*/ SDA=1; SCL=1; DELAY(DELAY_TIME); SDA=0; DELAY(DELAY_TIME); SCL=0; DELAY(DELAY_TIME); } void I2C_Stop(void) { /*终止I2C总线,当SCL为高电平时使SDA产生一个正跳变*/ SDA=0; SCL=1; DELAY(DELAY_TIME); SDA=1; DELAY(DELAY_TIME); SCL=0; DELAY(DELAY_TIME); } void SEND_0(void) /* SEND ACK */ { /*发送0,在SCL为高电平时使SDA信号为低*/ SDA=0; SCL=1; DELAY(DELAY_TIME); SCL=0; DELAY(DELAY_TIME); } void SEND_1(void) { /*发送1,在SCL为高电平时使SDA信号为高*/ SDA=1; SCL=1; DELAY(DELAY_TIME); SCL=0; DELAY(DELAY_TIME); } bit Check_AcknowLEDge(void) { /*发送完一个字节后检验设备的应答信号*/ SDA=1; SCL=1; DELAY(DELAY_TIME/2); F0=SDA; DELAY(DELAY_TIME/2); SCL=0; DELAY(DELAY_TIME); if(F0==1) return FALSE; return TRUE; } void WriteI2CByte(char b)reentrant { /*向I2C总线写一个字节*/ char i; for(i=0;i<8;i++) if((b< SEND_1(); else SEND_0(); } char ReadI2CByte(void)reentrant { /*从I2C总线读一个字节*/ char b=0,i; for(i=0;i<8;i++) { SDA=1; /*释放总线*/ SCL=1; /*接受数据*/ DELAY(10); F0=SDA; DELAY(10); SCL=0; if(F0==1) { b=b<<1; b=b|0x01; } else b=b<<1; } return b; }
/**********以下为读写24c02的函数**********/ 见下一页面
|