AT24C02是由ATMEL公司提供的,IIC總線串行EEPROM(electronic eraser programmer read only memory),其容量為2kbit(256B),工作電壓在2.7v"5.5v之間,生產(chǎn)工藝是CMOS。 一般數(shù)字芯片都在左下角和右上角為GND,VCC。容量的計(jì)算方法:AT24Cxx :01"1024 容量 = xx * 1kbit。 寫入過程: AT24C系列EEPROM芯片的固定部分為1010,A2,A1,A0引腳接高低電平后得到確定的3位編碼,形成7位編碼即為該器件的地址碼。 單片機(jī)進(jìn)行寫操作時(shí),首先發(fā)送該器件的7位地址碼和寫方向位”0”(共8位,即一個(gè)字節(jié)),發(fā)送完后釋放SDA線并在SCL線上產(chǎn)生第9個(gè)時(shí)鐘信號(hào)。被選中的存儲(chǔ)器器件在確認(rèn)是自己的地址后,在SDA線上產(chǎn)生一個(gè)應(yīng)答信號(hào)作為響應(yīng),單片機(jī)收到應(yīng)答后就可以傳送數(shù)據(jù)了。傳送數(shù)據(jù)時(shí),單片機(jī)首先發(fā)送一個(gè)字節(jié)的被寫入存儲(chǔ)器的首地址,收到存儲(chǔ)器器件的應(yīng)答后,單片機(jī)就逐個(gè)發(fā)送數(shù)據(jù)字節(jié),但每發(fā)送一個(gè)字節(jié)后都要等待應(yīng)答。AT24C系列片內(nèi)地址在接收到每一個(gè)數(shù)據(jù)字節(jié)地址后自動(dòng)加1,在芯片的“一次裝載字節(jié)數(shù)”限度內(nèi),只需輸入首地址。裝載字節(jié)數(shù)超過芯片的“一次裝載字節(jié)數(shù)”時(shí),數(shù)據(jù)地址將“上卷”,前面的數(shù)據(jù)將被覆蓋。 字節(jié)寫: 頁寫: 讀入過程: 單片機(jī)先發(fā)送該器件的7位地址碼和寫方向位“0”(“偽寫”),發(fā)送完后釋放SDA線并在SCL線上產(chǎn)生第9個(gè)時(shí)鐘信號(hào)。被選中的存儲(chǔ)器器件在確認(rèn)是自己的地址后,在SDA線上產(chǎn)生一個(gè)應(yīng)答信號(hào)作為回應(yīng)。 然后,再發(fā)一個(gè)字節(jié)的要讀出器件的存儲(chǔ)區(qū)的首地址,收到應(yīng)答后,單片機(jī)要重復(fù)一次起始信號(hào)并發(fā)出器件地址和讀方向位(“1”),收到器件應(yīng)答后就可以讀出數(shù)據(jù)字節(jié),每讀出一個(gè)字節(jié),單片機(jī)都要回復(fù)應(yīng)答信號(hào)。當(dāng)最后一個(gè)字節(jié)數(shù)據(jù)讀完后,單片機(jī)應(yīng)返回以“非應(yīng)答”(高電平),并發(fā)出終止信號(hào)以結(jié)束讀出操作。 當(dāng)前地址讀: 隨機(jī)讀: 有序讀: IIC總線模擬時(shí)序圖: IIC總線應(yīng)答時(shí)序圖: 設(shè)備地址: 寫周期: 兩次寫之間要有一個(gè)10ms的twR間隔 寫入EEPROM一個(gè)2,然后讀出,在數(shù)碼管上顯示出來: #include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit SCL = P3^6; sbit SDA = P3^7; void delay() { ;; } //5us void delay1(uchar x) { uchar a,b; for(a=x;a>0;a--) for(b=100;b>0;b--); } void Init(){ SCL = 1; SDA = 1; } void start(){ SDA = 1; delay(); SCL = 1; delay(); SDA = 0; delay(); } void stop(){ SDA = 0; delay(); SCL = 1; delay(); SDA = 1; delay(); } void write(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(); SDA=1; delay(); } uchar read() { uchar i,k; SCL=0; delay(); SDA=1; delay(); for(i=0;i<8;i++) { SCL=1; delay(); k=(k<<1)|SDA; // 將SDA賦給K的每一位 SCL=0; delay(); } return k; } void response(){ int i; SCL = 1; //在SCL為高電平期間,進(jìn)行應(yīng)答 delay(); while((SDA == 1) && (i < 170))i++; //SCL釋放總線,等待從設(shè)備應(yīng)答,從設(shè)備會(huì)把SDA拉低 SCL = 0; delay(); } void At24c_Write(uchar address, uchar value){ start(); write(0xa0); //寫入設(shè)備地址 response(); write(address); //寫入首地址 response(); write(value); //寫入數(shù)據(jù) response(); stop(); } uchar At24c_Read(uchar address){ uchar value; start(); write(0xa0); //偽寫,先寫入設(shè)備地址 response(); write(address); //再寫入要讀取數(shù)據(jù)的首地址 response(); start(); //再次 write(0xa1); //寫入要讀取數(shù)據(jù)的地址,方向?yàn)? response(); value = read(); //讀取數(shù)據(jù) stop(); return value; } void main(){ P1 = 0x0; // 位選,使最地位數(shù)碼管被選中 Init(); At24c_Write(23,0x5b); // 在EEPROM的23這個(gè)地址上寫數(shù)據(jù)0x5b delay1(100); // 在寫和讀之間要多延時(shí)一會(huì)兒,否則器件處理不完 P2 = At24c_Read(23); // 讀取23地址的數(shù)據(jù),也就是剛才寫入的數(shù)據(jù) while(1); } 掉電后數(shù)據(jù)不丟失,復(fù)位后,仍然從剛才掉電的數(shù)字開始往下顯示。從0"9 #include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit SCL = P3^6; sbit SDA = P3^7; uchar temp, sum; uint flag; unsigned char code duan[]={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F, 0x77,0x7C,0x39,0x5E,0x79,0x71}; void delay() { ;; } //5us void delay1(uchar x) { uchar a,b; for(a=x;a>0;a--) for(b=100;b>0;b--); } void Init(){ SCL = 1; SDA = 1; } void start(){ SDA = 1; delay(); SCL = 1; delay(); SDA = 0; delay(); } void stop(){ SDA = 0; delay(); SCL = 1; delay(); SDA = 1; delay(); } void write(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(); SDA=1; delay(); } uchar read() { uchar i,k; SCL=0; delay(); SDA=1; delay(); for(i=0;i<8;i++) { SCL=1; delay(); k=(k<<1)|SDA; // 將SDA賦給K的每一位 SCL=0; delay(); } return k; } void response(){ int i; SCL = 1; //在SCL為高電平期間,進(jìn)行應(yīng)答 delay(); while((SDA == 1) && (i < 170))i++; //SCL釋放總線,等待從設(shè)備應(yīng)答,從設(shè)備會(huì)把SDA拉低 SCL = 0; delay(); } void At24c_Write(uchar address, uchar value){ start(); write(0xa0); //寫入設(shè)備地址 response(); write(address); //寫入首地址 response(); write(value); //寫入數(shù)據(jù) response(); stop(); } uchar At24c_Read(uchar address){ uchar value; start(); write(0xa0); //偽寫,先寫入設(shè)備地址 response(); write(address); //再寫入要讀取數(shù)據(jù)的首地址 response(); start(); //再次 write(0xa1); //寫入要讀取數(shù)據(jù)的地址,方向?yàn)? response(); value = read(); //讀取數(shù)據(jù) stop(); return value; } void main(){ uint i; flag = 1; P1 = 0x0; // 位選,使最地位數(shù)碼管被選中 EA = 1; ET0 = 1; sum = 0; temp = 0; TMOD = 0x01; TH0 = (65536 - 50000) / 256; TL0 = (65536 - 50000) % 256; TR0 = 1; Init(); P2 = At24c_Read(23); for(i = 0; i < 10; i++) if(duan[ i] == P2){ sum = i; break; flag = 0; } while(1){ if(temp == 20){ temp = 0; if(sum == 10){ sum = 0; } if(flag == 1){ At24c_Write(23,duan[sum]); delay1(100); P2 = duan[sum]; } sum++; } } } void time0() interrupt 1{ TH0 = (65536 - 50000) / 256; TL0 = (65536 - 50000) % 256; temp++; } |