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

📄 实现存储器eeprom at24c02的数据读写操作 采用iic总线读写 c程序.c

📁 c语言编写的用IIC读写EEPROM的51单片机程序
💻 C
字号:
//EEPROM AT24C02的数据读写操作 采用IIC总线读写 C程序


/***************************************************************
功能:11:32 2008-6-27
作者:SG
时间:2004-03-15
版本:V1.0
***************************************************************/

#include "INTRINS.H"
#include "reg52.h"

#define  WriteDeviceAddress 0xa0 //写驱动地址指令
#define  ReadDeviceAddress 0xa1  //读驱动地址指令

sbit AT24C02_SCL = 0xa4;		 //*****相当于sbit AT24C02_SCL = P2^4
sbit AT24C02_SDA = 0xa5;		 //*****相当于sbit AT24C02_SDA = P2^5

/*-------------------------------------------------------------
功能:发起始信号
------------------------------------------------------------*/
void Start_Cond()
{
 AT24C02_SCL = 0;
 _nop_();
 AT24C02_SDA = 1;
 _nop_();
 AT24C02_SCL = 1;
 _nop_();
 AT24C02_SDA = 0;
 _nop_();
}

/*-------------------------------------------------------------
功能:发停止信号
------------------------------------------------------------*/
void Stop_Cond()
{
 AT24C02_SCL = 0;
 _nop_();
 AT24C02_SDA = 0;
 _nop_();
 AT24C02_SCL = 1;
 _nop_();
 AT24C02_SDA = 1;
 _nop_();
}

/*-------------------------------------------------------------
功能:发确认信号
------------------------------------------------------------*/
void Ack()
{
 AT24C02_SCL = 0;
 _nop_();
 AT24C02_SDA = 0;
 AT24C02_SCL = 1;
 _nop_();
 AT24C02_SCL = 0;
 _nop_();
 AT24C02_SDA = 1;
}

/*-------------------------------------------------------------
功能:发无确认信号
------------------------------------------------------------*/
void NoAck()
{
 AT24C02_SCL = 0;
 _nop_();
 AT24C02_SDA = 1;
 _nop_();
 AT24C02_SCL = 1;
 _nop_();
 AT24C02_SCL = 0;
 _nop_();
}

/*-------------------------------------------------------------
功能:写一个字节数据
------------------------------------------------------------*/
bit Write8Bit(unsigned char input)
{
 unsigned char i;
 for (i=0;i<8;i++)
 { 
  AT24C02_SCL = 0;
  input <<= 1;
  AT24C02_SDA = CY;			   //*************左移位后,移出的哪一位进入了CY中
  AT24C02_SCL = 1;
 
 }
 AT24C02_SCL = 0;			   //****以下为"接受确认信号"程序
 _nop_();
 AT24C02_SDA = 1;			   		//*****拉高管脚,准备读该管脚电平
 AT24C02_SCL = 1;
 _nop_();
 CY = AT24C02_SDA;			   //读"确认信息",如果返回1则表明写入失败
 return(CY) ;
}

/*-------------------------------------------------------------
功能:读一个字节数据
------------------------------------------------------------*/
unsigned char Read8Bit()
 {
 unsigned char temp,rbyte=0;
 for (temp = 8;temp != 0;temp--)
 {
  AT24C02_SCL = 0;
  _nop_();
  rbyte = (rbyte << 1) | AT24C02_SDA;				  //*****这样也可以按位并吗?AT24C02_SDA是不是代表着某个字节的最低位,其余位都为0
  AT24C02_SCL = 1;
  _nop_();
 }
 return rbyte;
}

/*-------------------------------------------------------------
功能:从EEPROM中给定一个地址连续读NLEN个字节数据存放在以指针
nContent开头的往下内容。
------------------------------------------------------------*/
bit Read_Flash ( unsigned char *nContent, unsigned char nAddr, unsigned char nLen )
{
 unsigned char Addr;
 Addr = nAddr;
 Start_Cond();    //写开始信号
 Write8Bit(WriteDeviceAddress);  //写驱动地址
 Write8Bit(Addr);   //写从EEPROM中读的开始地址
 Start_Cond();    //写开始信号
 Write8Bit(ReadDeviceAddress);  //写读数据指令
 while(--nLen)
 {

  *nContent=Read8Bit();  //读出内容
  nContent++;   //指针加1
  Ack();    //发确认信号,让24WC02继续发送数据
 }
 *nContent=Read8Bit();   //读一字节
 NoAck();    //发无确认信号,让24WC02停止发送数据
 Stop_Cond();    //发终止信号
 return(0);    //返回
}

/*-------------------------------------------------------------
功能:初始化EEPROM子程序内容为FF
------------------------------------------------------------*/
bit Init_Flash ( unsigned int nPage ) //    8 Byte/1Page init 0xFF 
{
 unsigned char nLen;
 unsigned char Addr;
 nLen=8;
 Addr=8 *nPage;
 Start_Cond();
 Write8Bit(WriteDeviceAddress);
 Write8Bit(Addr);
 for(;nLen!=0;nLen--)
 {
     if(Write8Bit(0xff)) break;  //if Write8Bit() Return 1 Write Flase
 }
 Stop_Cond();
 return(CY);
}

/*-------------------------------------------------------------
功能:从EEPROM中给定一个地址连续写NLEN个字节数据存放在以指针
nContent开头的往下内容。
------------------------------------------------------------*/
bit Write_Flash ( unsigned char *nContent, unsigned char nAddr,unsigned char nLen)
{
 unsigned char i,temp;
 unsigned char Addr;
 Addr = nAddr;
 Start_Cond();     //写开始信号
 Write8Bit(WriteDeviceAddress);   //写驱动地址
 Write8Bit(Addr);    //写从EEPROM中写的开始地址 
 for(i = 0;i < nLen;i++)
 {
  if(Addr%8==0)   //每页8字节  //换页			  //*****为什么读EEPROM时不用换页呢?
  {
   Stop_Cond();
   _nop_();
   Start_Cond();
   Write8Bit(WriteDeviceAddress);
   Write8Bit(Addr);
  }
  temp = *nContent;
  if(Write8Bit(temp)) 	
  	break;  //如果失败则跳出循环
  nContent++;
  Addr++;
 }
 Stop_Cond();     //发停止信号
 return(CY);					   //*****CY来自Write8Bit(temp)
}

/*-------------------------------------------------------------
主程序
功能:实现存储器EEPROM AT24C02的数据读写操作
------------------------------------------------------------*/
void main()
{
	unsigned char dat[16],i;

    Read_Flash(dat,0,16);  //读出AT24C02中从地址0开始依次往后16个字节放入dat数组中  
    Init_Flash(0);    //将AT24C02的第0页初始化为FF
    Read_Flash(dat,0,16);  //读出AT24C02中从地址0开始依次往后16个字节放入dat数组中

    for(i = 0;i < 16;i++ )
    {
         dat[i] = i;   //对数组dat初始化为0---F
    }     
    Write_Flash(dat,0,16);  //将dat数组中的数据写入AT24C02中地址从0开始
    Read_Flash(dat,1,16);  //读出AT24C02中从地址1开始依次往后16个字节放入dat数组中
    while(1)
    {
         i = 9;
    }
}



//http://www.picavr.com/news/2008-06/6666.htm

⌨️ 快捷键说明

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