24c02简介
24C02是一个2Kbit的串行EEPROM存储芯片,可存储256个字节数据。工作电压范围为1.8V到6.0V,具有低功耗CMOS技术,自定时擦写周期,1000000次编程/擦除周期,可保存数据100年。24C02有一个16字节的页写缓冲器和一个写保护功能。通过I2C总线通讯读写芯片数据,通讯时钟频率可达400KHz。
51型号驱动程序
sbit I2C_SCL = P1^2; //控制24c02的SCL引脚 sbit I2C_SDA = P1^1; //控制24c02的SDA引脚 void I2C_Delay10us()//IIC协议所需:延迟10us函数 { uchar a, b; for(b=1; b >0; b--) { for(a=2; a >0; a--); } } void I2C_Start() //开始启动IIC,IIC协议头 { I2C_SDA = 1; I2C_Delay10us(); I2C_SCL = 1; I2C_Delay10us();//建立时间是I2C_SDA保持时间 >4.7us I2C_SDA = 0; I2C_Delay10us();//保持时间是 >4us I2C_SCL = 0; I2C_Delay10us(); } void I2C_Stop() //停止IIC,IIC协议尾 { I2C_SDA = 0; I2C_Delay10us(); I2C_SCL = 1; I2C_Delay10us();//建立时间大于4.7us I2C_SDA = 1; I2C_Delay10us(); } /******************************************************************************* * 函 数 名 : I2cSendByte(uchar num) * 函数功能 : 通过I2C发送一个字节。在I2C_SCL时钟信号高电平期间, * * 保持发送信号I2C_SDA保持稳定 * 输 入 : num ,ack * 输 出 : 0或1。发送成功返回1,发送失败返回0 * 备 注 : 发送完一个字节I2C_SCL=0, 需要应答则应答设置为1,否则为0 *******************************************************************************/ uchar I2C_SendByte(uchar dat, uchar ack) { uchar a = 0,b = 0;//最大255,一个机器周期为1us,最大延时255us。 for(a=0; a< 8; a++)//要发送8位,从最高位开始 { I2C_SDA = dat > > 7; //起始信号之后I2C_SCL=0,所以可以直接改变I2C_SDA信号 dat = dat < < 1; I2C_Delay10us(); I2C_SCL = 1; I2C_Delay10us();//建立时间 >4.7us I2C_SCL = 0; I2C_Delay10us();//时间大于4us } I2C_SDA = 1; I2C_Delay10us(); I2C_SCL = 1; while(I2C_SDA && (ack == 1))//等待应答,也就是等待从设备把I2C_SDA拉低 { b++; if(b > 200) //如果超过200us没有应答发送失败,或者为非应答,表示接收结束 { I2C_SCL = 0; I2C_Delay10us(); return 0; } } I2C_SCL = 0; I2C_Delay10us(); return 1; } uchar I2C_ReadByte() //IIC协议读取数据 { uchar a = 0,dat = 0; I2C_SDA = 1; //起始和发送一个字节之后I2C_SCL都是0 I2C_Delay10us(); for(a=0; a< 8; a++)//接收8个字节 { I2C_SCL = 1; I2C_Delay10us(); dat < <= 1; dat |= I2C_SDA; I2C_Delay10us(); I2C_SCL = 0; I2C_Delay10us(); } return dat; } /******************************************************************************* * 函 数 名 : void At24c02Write(unsigned char addr,unsigned char dat) * 函数功能 : 写入24c02的一个地址的一个数据 *******************************************************************************/ void At24c02Write(unsigned char addr,unsigned char dat) { I2C_Start(); I2C_SendByte(0xa0, 1);//发送写器件地址 I2C_SendByte(addr, 1);//发送要写入内存地址 I2C_SendByte(dat, 0); //发送数据 I2C_Stop(); } /******************************************************************************* * 函 数 名 : unsigned char At24c02Read(unsigned char addr) * 函数功能 : 读取24c02的一个地址的一个数据 *******************************************************************************/ unsigned char At24c02Read(unsigned char addr) { unsigned char num; I2C_Start(); I2C_SendByte(0xa0, 1); //发送写器件地址 I2C_SendByte(addr, 1); //发送要读取的地址 I2C_Start(); I2C_SendByte(0xa1, 1); //发送读器件地址 num=I2C_ReadByte(); //读取数据 I2C_Stop(); return num; } void main() { TMOD |= 0x01; TH0=0XFC; TL0=0X18; TR0=1; ET0=1; EA=1; while(1) { } }
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !