51proteus仿真:I2c总线和EEPROM2404的读写

mac2022-06-30  83

51proteus仿真:I2c总线和EEPROM2404的读写

 

仿真电路图:

 

仿真程序:

 

#include<reg52.h>#include<INTRINS.H>

#define uchar unsigned char#define uint  unsigned int

sbit SCL=P1^0;sbit SDA=P1^1;

void delay(void){ _nop_(); _nop_(); _nop_(); _nop_();

}

void InitI2C(void){  SDA = 1;  SCL = 1;}

void I2CStart(void){ SDA=1; delay(); SCL=1; delay(); SDA=0; delay(); SCL=0;}

  void I2CStop(void)  { SCL=0; delay(); SDA=0; delay(); SCL=1; delay(); SDA=1; delay();   

  }

  void I2CSend(uchar byte)  { uchar mask; uchar i,j;

 mask=0x80;

 for(i=0;i<8;i++) {  SCL=0;  delay();  if((mask & byte)==0)  {        SDA=0;   }   else   {        SDA=1;    }   mask>>=1;   delay();   SCL=1;   delay();

 } SCL=0; SDA=1; delay(); SCL=1; j=SDA; delay(); SCL=0;

 

 }

   void write_eeprom(uchar addr, uchar databyte)   {     I2CStart();  I2CSend(0xa0);  I2CSend(addr);  I2CSend(databyte);  I2CStop();  }

  uchar I2CRead(void){ uchar byte; uchar i;

 byte = 0; for(i = 0; i < 8; i++) {  SCL = 0;  SDA = 1;  delay();  SCL = 1;  delay();  byte <<= 1;    if(SDA == 1)  {   byte |= 0x01;  }  delay(); }  SCL = 0; SDA = 1; delay(); SCL = 1; delay(); SCL = 0;  return byte;

}

  uchar read_eeprom(uchar addr){ uchar databyte;

 I2CStart(); I2CSend(0xa0); I2CSend(addr); I2CStart(); I2CSend(0xa1); databyte = I2CRead(); I2CStop();

 return databyte; }

 

   main()   { uchar addr=0x00,databyte=0xaa; uchar c=0; uint i;       InitI2C();

  while(1)  {

  write_eeprom(addr,databyte);  for(i = 0; i < 1000; i++)  {   delay();  }

 c = read_eeprom(addr);

 P2=c;

  }

 

 

   }

 

转载于:https://www.cnblogs.com/proteus/archive/2011/10/27/2227088.html

相关资源:AVR单片机EEPROM的读写程序和Protues仿真
最新回复(0)