⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 at24c02.c

📁 51单片机示例程序
💻 C
字号:
/*******************************************************************
                                                                              	
                   I2C存储器AT24C02读写实验
                 网址:http://www.kaifaban.com  
                                          
                功能:在AT24C02某一地址写入一个数据
				     再读出显示在P0口
          			                     
********************************************************************/
#include <reg52.h>
#include <intrins.h>
#define  uchar unsigned char
#define  uint unsigned int
sbit SCL=P3^4;//串行时钟线
sbit SDA=P3^5;//串行数据线
sbit DsySelect=P3^7;//控制LED的74HC244所在IO口
//I2C延时程序
void I2cDelay(){
_nop_();_nop_();_nop_();_nop_();_nop_();
}
//I2C起始条件
void I2cStart(){
SDA=1;
_nop_();
SCL=1;
I2cDelay();
SDA=0;
I2cDelay();
SCL=0;//钳住I2C总线,准备发送或接收数据
_nop_();
}
//I2C停止条件
void I2cStop(){
SDA=0;
_nop_();
SCL=1;
I2cDelay();
SDA=1;
I2cDelay();
}
//发ACK应答
void I2cAck(){
SDA=0;
_nop_();
SCL=1;
I2cDelay();
SCL=0;
_nop_();
}
//发NOACK应答
void I2cNoAck(){
SDA=1;
_nop_();
SCL=1;
I2cDelay();
SCL=0;
_nop_();
}
//等待应答
bit WaitAck(){
  uchar Time=255;
  SDA=1;
  _nop_();
  SCL=1;
  I2cDelay();
  while(SDA){
    Time--;
    if(Time==0){
      I2cStop();
      return (0);
    }
  }
  SCL=0;
  _nop_();
  return (1);
}
//I2C写一字节数据
void I2cWriteByte(uchar Data){
  uchar i;
  for(i=0;i<8;i++){
    SCL=0;
    I2cDelay();
    SDA=(bit)(Data&0x80);
    Data<<=1;
    I2cDelay();
    SCL=1;
    I2cDelay();
  }
  SCL=0;
}
//I2C读一字节数据
uchar I2cReadByte(){
  uchar i,TmpData=0;
  SDA=1;
  for(i=0;i<8;i++){
  SCL=0;
  I2cDelay();
  SCL=1;
  I2cDelay();
  TmpData<<=1;
  TmpData|=SDA;
  }
  SCL=0;
  return(TmpData);
}
//I2C写数据到AT24C02
void I2cWrite(uchar Address,uchar Data){
I2cStart();//启动总线
I2cWriteByte(0xA0);//发送器件地址
WaitAck();
I2cWriteByte(Address);//发送器件子地址
WaitAck();
I2cWriteByte(Data);//发送数据
WaitAck();
I2cStop();
}
//I2C从AT24C02读数据
uchar I2cRead(uchar Address){
uchar TmpData;
I2cStart();//启动总线
I2cWriteByte(0xA0);//发送器件地址
WaitAck();
I2cWriteByte(Address);//发送器件子地址
WaitAck();
I2cStart();//启动总线
I2cWriteByte(0xA1);//发送器件地址
I2cAck();
TmpData=I2cReadByte();//读取数据
I2cNoAck();
I2cStop();
return(TmpData);
}
//主函数
main(){
uchar ReadData;
DsySelect=0;//打开LED
I2cWrite(0x00,0x12);//在地址0x00写入数据0x12
while(1){
ReadData=I2cRead(0x00);//读出地址为0x00的数据
P0=~ReadData;
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -