1.什么是EEPROM
EEPROM (Electrically Erasable Programmable Read-Only Memory),带电可擦可编程只读存储器,一种掉电后数据不丢失的存储芯片。
2.AT24C08介绍及引脚接口
A0、A1、NC悬空
3.什么叫主从机?
单片机和24C08通信,我的单片机就叫主机,24C02叫从机
4.芯片从地址
AT24C设备地址为如下,前四位固定为1010,A2~A0为由管脚电平。AT24CXX EEPROM Board模块中默认为接地。A2~A0为000,最后一位表示读写操作。所以AT24Cxx的读地址为0xA1,写地址为0xA0。
实例:
利用定时器产生秒表,每过一秒把变化的数字写入AT24C02内部,然后从AT24C02内部读取储存的数据,并显示在数码管上。
- 数码管显示
oid display(uchar shi,uchar ge)
{
dula=1;
P0=table[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delayms(5);
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delayms(5);
}
- 1ms延时
void delayms(uchar x)
{
uchar a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
完整代码如下:
#include#define uchar unsigned char sbit sda=P2^0; sbit scl=P2^1; bit write=0; sbit dula=P2^6; sbit wela=P2^7; uchar temp; uchar num,num_sec,address_point; uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7b,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; void display(uchar,uchar); void delay() { ;; } void start() //开始信号 { sda=1; delay(); scl=1; delay(); sda=0; delay(); } void stop() //停止 { sda=0; delay(); scl=1; delay(); sda=1; delay(); } void respons() //应答 { uchar i; scl=1; delay(); while((sda==1)&&(i<250))i++; scl=0; delay(); } void init() { sda=1; delay(); scl=1; delay(); } void write_byte(uchar date) { uchar i,temp; temp=date; for(i=0;i<8;i++) { temp=temp<<1; scl=0; delay(); sda=CY; delay(); scl=1; delay(); // scl=0; // delay(); } scl=0;//传输完毕需要释放SDA线,如果不释放的话如果下次读写方向改变,数据线不空闲 delay(); sda=1; delay(); } uchar read_byte() { uchar i,k; scl=0; delay(); sda=1; delay(); for(i=0;i<8;i++) { scl=1; delay(); k=(k<<1)|sda; scl=0; delay(); } return k; } void delayms(uchar x) { uchar a,b; for(a=x;a>0;a--) for(b=100;b>0;b--); } void write_add(uchar address,uchar date) //把某数据写进EEPROM的某地址,参数地址和参数数据可以是任意进制的数字, //因为写入的时候都转成了16进制 { start(); write_byte(0xa0); respons(); write_byte(address); respons(); write_byte(date); respons(); stop(); } uchar read_add(uchar address) { uchar date; start(); write_byte(0xa0); respons(); write_byte(address); respons(); start(); write_byte(0xa1); respons(); date=read_byte(); stop(); return date; } void main() { uchar shi,ge; init(); TH1=(65535-45872)/256; TL1=(65535-45872)%256; TMOD=0x10; EA=1; ET1=1; TR1=1; while(1) { write_add(address_point,num_sec); delayms(100); P1=read_add(address_point); temp=P1; shi=temp/10; ge=temp%10; display(shi,ge); } } void display(uchar shi,uchar ge) { dula=1; P0=table[shi]; dula=0; P0=0xff; wela=1; P0=0xfe; wela=0; delayms(5); dula=1; P0=table[ge]; dula=0; P0=0xff; wela=1; P0=0xfd; wela=0; delayms(5); } void T1_time()interrupt 3 { TH1=(65535-45872)/256; TL1=(65535-45872)%256; num++; if(num==20) { num=0; num_sec++; address_point++; } }



