|
|
|
|
 |
AT24C01/02/04/08/16/32系列EEPROM读写程序
|
|
|
|
文章编号: |
081207214703 |
文章分类: |
单片机 > 51系列 |
|
点 击: |
|
关 键 词: |
AT24C01,AT24C02,AT24C04,AT24C08,AT24C16,AT24C32,EEPROM |
|
文章来源: |
网路 |
|
摘 要: |
|
|
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- #include "reg51.h"
- #include "intrins.h"
-
- sbit SCL= P2^7;
- sbit SDA= P2^6;
-
- enum EEPROMTYPE {IIC24C01,IIC24C01A,IIC24C02,IIC24C04,IIC24C08,IIC24C16,IIC24C32,IIC24C64,IIC24C128,IIC24C256};
- enum EEPROMTYPE eepromtype;
- delay()
- {
- unsigned int i=1200;
- while(i--);
- }
-
-
-
-
- void write_8bit(unsigned char ch)
- {
- unsigned char i=8;
- SCL=0;
- _nop_();_nop_();_nop_();_nop_();_nop_();
- while (i--)
- {
- SDA=(bit)(ch&0x80);
- _nop_();_nop_();_nop_();_nop_();_nop_();
- ch<<=1;
- SCL=1;
- _nop_();_nop_();_nop_();_nop_();_nop_();
- SCL=0;
- _nop_();_nop_();_nop_();_nop_();_nop_();
- }
- _nop_();_nop_();_nop_();_nop_();_nop_();
- _nop_();_nop_();_nop_();_nop_();_nop_();
- }
-
-
-
-
- void ACK(void)
- {
- unsigned char time_1;
- SDA=1;
- SCL=0;
- _nop_();_nop_();_nop_();_nop_();_nop_();
- SCL=1;
- time_1=5;
- while(SDA) {if (!time_1) break;}
- SCL=0;
- _nop_();_nop_();_nop_();_nop_();_nop_();
- }
- void WriteIIC_24C01(unsigned char address,unsigned char ddata)
- {SCL=1;
- _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
- SDA=0;
- _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
- SCL=0;
- write_8bit( (address<<1) & 0xfe);
- ACK();
- write_8bit(ddata);
- ACK();
- SDA=0;
- _nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
- SDA=1;
- delay();
- }
-
-
-
-
- void WriteIIC_24CXX(enum EEPROMTYPE eepromtype,unsigned int address,unsigned char ddata)
- { unsigned char page,address_in_page;
-
- if(eepromtype==IIC24C01)
- {
- WriteIIC_24C01(address,ddata);
- return;
- }
- page=(unsigned char)(address>>8) & 0x07;
- page=page<<1;
- address_in_page=(unsigned char)(address);
- SCL=1;
- _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
- SDA=0;
- _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
- SCL=0;
- write_8bit(0xa0 | page);
- ACK();
- if(eepromtype>IIC24C16)
- {
- write_8bit(address>>8);
- ACK();
- }
- write_8bit(address_in_page);
- ACK();
- write_8bit(ddata);
- ACK();
- SDA=0;
- _nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
- SDA=1;
- delay();
- }
- unsigned char ReadIIC_24C01(unsigned char address)
- {
- unsigned char ddata=0;
- unsigned char i=8;
- SCL=1;
- _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
- SDA=0;
- _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
- SCL=0;
- write_8bit( (address<<1) | 0x01);
- ACK();
- while (i--)
- {
- SDA=1;
- ddata<<=1;
- SCL=0;
- _nop_();_nop_();_nop_();_nop_();_nop_();
- SCL=1;
- if (SDA) ddata|=0x01;
- }
- SCL=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
- SDA=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
- SDA=1;
- delay();
- return ddata;
- }
-
-
-
-
- unsigned char ReadIIC_24CXX(enum EEPROMTYPE eepromtype,unsigned int address)
- { unsigned char page,address_in_page;
- unsigned char ddata=0;
- unsigned char i=8;
- if(eepromtype==IIC24C01)
- {
- return( ReadIIC_24C01(address) );
- }
- page=(unsigned char)(address>>8) & 0x07;
- page=page<<1;
- address_in_page=(unsigned char)(address);
- SDA=0;_nop_();SCL=0;
- write_8bit(0xa0 | page);
- ACK();
- if(eepromtype>IIC24C16)
- {
- write_8bit(address>>8);
- ACK();
- }
-
- write_8bit(address_in_page);
- ACK();
- SCL=1;
- _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
- SDA=0;
- _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
- SCL=0;
- write_8bit(0xa1);
- ACK();
- while (i--)
- {
- SDA=1;
- ddata<<=1;
- SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();SCL=1;
- if (SDA) ddata|=0x01;
- }
- SCL=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
- SDA=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
- SDA=1;
- delay();
- return ddata;
- }
-
-
-
-
- main()
- {
- unsigned int i;
- unsigned char kk,j[32];
- delay();
- kk=ReadIIC_24C01( 12 );
- WriteIIC_24C01(12,0x67);
- kk=ReadIIC_24C01(12);
- for(i=0;i<32;i++) j[i]=ReadIIC_24CXX(IIC24C01,i);
- for(i=0;i<32;i++) j[i]=i*2;
-
- for(i=0;i<32;i++) WriteIIC_24CXX(IIC24C01,i,0x55);
- for(i=0;i<32;i++) j[i]=0;
- for(i=0;i<32;i++) j[i]=ReadIIC_24CXX(IIC24C02,i);
- }
-
-
|
|
|
|
|
|
|
|
|
|
|