×
单片机 > 单片机程序设计 > 详情

PIC单片机模拟读写24C01 EEPROM

发布时间:2020-06-16 发布时间:
|

//************************************************** 
//实验目的: 
//熟悉使用单片机模拟读写24C01 EEPROM 
//1、首先向24C01 EEPROM写入数据 
//2、在从24C01 EEPROM中读取数据,并用LED显示 
//************************************************** 

//************************************************** 
//硬件设置: 
//1、SW4开关全部闭合 
//2、SW2开关1闭合,其它断开 
//3、SW3开关7和8闭合,其它断开 
//************************************************** 

//************************************************** 
//*****************定义头文件********************** 
//************************************************** 
#include 

//************************************************** 
//******************定义配置位********************* 
//************************************************** 
__CONFIG(0x3545);        
//FLASH代码不保护,RB6和RB7为调试模式,FLASH不写保护,数据代码不保护 
//RB3为数字IO口,低电压复位使能,上电延时开,看门狗开,4M晶体XT振荡器 

//************************************************** 
//******************定义常量*********************** 
//************************************************** 
#define uchar unsigned char 
#define uint  unsigned int  
#define SCL  TRISC3  
#define SDA  TRISC4  

//************************************************** 
//****************定义写入EEPROM数据**************** 
//************************************************** 
uchar code[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};  

//************************************************** 
//**************定义读取EEPROM数据变量************* 
//************************************************** 
uchar ack,data[8];  

//*********************************************** 
//函 数 名:delayus(uchar time); 
//入口参数:time 
//出口参数:无 
//函数作用:微妙延时 
//说    明: 
//*********************************************** 
void delayus(uchar time) 

  while(time--) 
  { 
    asm("nop"); 
  } 


//*********************************************** 
//函 数 名:delayms(uchar time); 
//入口参数:time 
//出口参数:无 
//函数作用:延时 
//说    明: 
//*********************************************** 
void delayms(uchar time) 

  uint i; 
  while(time--) 
  { 
    for(i=93;i>0;i--){;} 
  } 


//*********************************************** 
//函 数 名:i2c_start(void); 
//入口参数:无 
//出口参数:无 
//函数作用:产生启动信号 
//说    明: 
//*********************************************** 
void i2c_start(void)  
{  
  SDA=1;       //当SCL为高电平时使SDA产生一个负跳变  
  delayus(1);  
  SCL=1;  
  delayus(5); 
  SDA=0; 
  delayus(2);  
  SCL=0;       //钳住I2C总线,准备发送数据或接收数据  
  delayus(2);  
}  

//*********************************************** 
//函 数 名:i2c_stop(void); 
//入口参数:无 
//出口参数:无 
//函数作用:产生停止信号 
//说    明: 
//*********************************************** 
void i2c_stop(void)  
{  
  SDA=0;       //当SCL为高电平时使SDA产生一个正跳变  
  delayus(1);  
  SCL=1;  
  delayus(5);  
  SDA=1;  
  delayus(4); 
}  

//*********************************************** 
//函 数 名:i2c_writebyte(uchar data); 
//入口参数:data 
//出口参数:无 
//函数作用:写一个字节函数 
//说    明: 
//*********************************************** 
void i2c_writebyte(uchar data)  
{  
  uchar i;  
  for(i=0;i<8;i++)        //写8位数据 
  {  
    if(data&0x80){SDA=1;} //先写高位 
    else {SDA=0;}  
    delayus(1);  
    SCL=1;  
    delayus(5);  
    SCL=0;  
    data=data<<1;         //写下一位 
  }  
  delayus(2); 
  SDA=1;  
  delayus(2); 
  SCL=1;  
  delayus(3); 
  while(RC4){;}          //等待应答信号,RC4=0则有应答 
  SCL=0;  
  delayus(2);  
}  

//*********************************************** 
//函 数 名:i2c_writedata(uchar addr,uchar *ptt); 
//入口参数:addr,*ptt 
//出口参数:无 
//函数作用:按地址向EEPROM写数据块 
//说    明: 
//*********************************************** 
void i2c_writedata(uchar addr,uchar *ptt)  
{  
  uchar i;  
  i2c_start();            //产生启动信号 
  i2c_writebyte(0XA0);    //I2C写指令和IC地址 
  i2c_writebyte(addr);    //写EEPROM地址 
  for(i=0;i<8;i++,ptt++)  //写8个数据 
  {  
    i2c_writebyte(*ptt);    
  }  
  i2c_stop();             //产生停止信号 


//*********************************************** 
//函 数 名:i2c_readbyte(void); 
//入口参数:无 
//出口参数:SSPBUF 
//函数作用:从EEPROM读取一个字节数据 
//说    明: 
//*********************************************** 
unsigned char i2c_readbyte(void)  
{  
  uchar data,i;  
  data=0;  
  SDA=1;  
  for(i=0;i<8;i++)     //读8位数据 
  {  
    delayus(1);  
    SCL=0;  
    delayus(5); 
    SCL=1;  
    delayus(2); 
    data=data<<1;  
    if(RC4)           //判断读取数据是否为1 
    { 
      data=data|0x01; 
    }  
    delayus(2);  
  }  
  SCL=0;  
  delayus(2);  
  return (data);      //返回读取的数据 
}  

//*********************************************** 
//函 数 名:i2c_readdata(uchar addr); 
//入口参数:addr 
//出口参数:data[8] 
//函数作用:按地址从EEPROM读取数据块 
//说    明: 
//*********************************************** 
void i2c_readdata(uchar addr) 

  uchar i; 
  for(i=0;i<8;i++,addr++) 
  { 
    i2c_start();            //产生启动信号 
    i2c_writebyte(0xA0);    //I2C写指令和IC地址  
    i2c_writebyte(addr);    //读EEPROM数据的地址  
    i2c_start();            //重新产生启动信号  
    i2c_writebyte(0xA1);    //I2C读指令和IC地址  
    data[i]=i2c_readbyte(); //读取数据 
    i2c_stop();             //产生停止信号 
  } 


//*********************************************** 
//函 数 名:main(void); 
//入口参数:无 
//出口参数:无 
//函数作用:MAIN函数 
//说    明: 
//*********************************************** 
void main(void)  
{  
  uchar i;  
  TRISA=0X00;               //设置RA口为输出口 
  PORTA=0X00;               //RA口输出低电平 
  ADCON1=0X07;              //设置RA口和RE口为普通IO口 
  TRISC=0Xff;               //RC3和RC4为输入,RC3为SCL线,RC4为SDA线。  
  TRISD=0X00;               //RD口为输出 
  OPTION=0X8F;              //分频给WDT,分频比为128 
  PORTC=0X00;        
  PORTD=0X00;      
  i2c_writedata(0x00,code); //调用写数据函数,写EEPROM地址,要写的数据  
  delayms(250); 
  CLRWDT();                 //清看门狗 
  i2c_readdata(0x00);       //调用读数据函数,读EEPROM数据地址 
  while(1)  
  {  
    for(i=0;i<8;i++)  
    {   
      CLRWDT();             //清看门狗 
      PORTD=data[i];        //输出指示 
      delayms(250); 
    }  
  }  
}

关键字:PIC单片机  模拟读写  24C01  EEPROM 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
C51 特殊功能寄存器SFR的名称和地址