當前位置:首頁 » 服務存儲 » at2402存儲電路設計
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

at2402存儲電路設計

發布時間: 2022-05-24 15:11:51

① AT24C02的結構與定址

AT24C02的存儲容量為2Kb,內容分成32頁,每頁8B,共256B,操作時有兩種定址方式:晶元定址和片內子地址定址。
(1)晶元定址:AT24C02的晶元地址為1010,其地址控制字格式為1010A2A1A0R/W。其中A2,A1,A0可編程地址選擇位。A2,A1,A0引腳接高、低電平後得到確定的三位編碼,與1010形成7位編碼,即為該器件的地址碼。R/W為晶元讀寫控制位,該位為0,表示晶元進行寫操作。
(2)片內子地址定址:晶元定址可對內部256B中的任一個進行讀/寫操作,其定址范圍為00~FF,共256個定址單位。

② 單片機AT24C02存儲電路的介紹,主要就是介紹2402晶元及引腳功能。

2Kbit e2prom存儲器,1-A0,2-A1,3-A2 地址管腳;4-Vss 電源地;5-SDA 串列數據;6-SCL 串列時鍾;7-WP 防寫;8-Vcc 電源

③ 存儲器AT24C02與單片機如何連接要引腳連接圖

EESDAEESCL接單片機的引腳。EEVCC接電源。不同的24C02的電源范圍略有區別。一般3V-5V都可以。

④ AT24C02,573問題

電能?如果要是測量電能的話,問題比你想像的更復雜,直流電能需要用電壓×電流×時間,這需要進行兩組AD變換,而交流電能是電壓×電流×時間×cosφ,那個cosφ是相位角的餘弦,非常不好測量。
我估計你想要做的是某個電參數(比如電壓)吧?那樣進行一個AD變換就可以了,電壓是一個模擬量,51單片機不支持直接輸入模擬量,需要進行AD變換將其轉換為數字量後單片機才能處理,現在51里常用的AD變換器是PCF8591,也是通過I2C匯流排通訊的,I2C可以共用,與24C02接在一起,因為51單片機默認不支持I2C,需要用軟體模擬出I2C,所以連哪兩個IO口都一樣,不一定非要P3.0、P3.1;1602液晶屏本身除了8根並行數據線外,還有3根控制線,那三根線非常重要不能不接。
你的整個項目完全用不到573(8位三態鎖存器),一個51單片機有32個IO口,你這些外設根本用不完這些IO,所以不需要進行IO復用。IO復用也不一定要用到573。

⑤ at24c02存儲器怎麼工作

工作原理:
動態存儲器每片只有一條輸入數據線,而地址引腳只有8條。為了形成64K地址,必須在系統地址匯流排和晶元地址引線之間專門設計一個地址形成電路。使系統地址匯流排信號能分時地加到8個地址的引腳上,藉助晶元內部的行鎖存器、列鎖存器和解碼電路選定晶元內的存儲單元,鎖存信號也靠著外部地址電路產生。當要從DRAM晶元中讀出數據時,CPU首先將行地址加在A0-A7上,而後送出RAS鎖存信號,該信號的下降沿將地址鎖存在晶元內部。接著將列地址加到晶元的A0-A7上,再送CAS鎖存信號,也是在信號的下降沿將列地址鎖存在晶元內部。然後保持WE=1,則在CAS有效期間數據輸出並保持。當需要把數據寫入晶元時,行列地址先後將RAS和CAS鎖存在晶元內部,然後,WE有效,加上要寫入的數據,則將該數據寫入選中的存貯單元。由於電容不可能長期保持電荷不變,必須定時對動態存儲電路的各存儲單元執行重讀操作,以保持電荷穩定,這個過程稱為動態存儲器刷新。PC/XT機中DRAM的刷新是利用DMA實現的。首先應用可編程定時器8253的計數器1,每隔1⒌12μs產生一次DMA請求,該請求加在DMA控制器的0通道上。當DMA控制器0通道的請求得到響應時,DMA控制器送出到刷新地址信號,對動態存儲器執行讀操作,每讀一次刷新一行。
存儲器(Memory)是現代信息技術中用於保存信息的記憶設備。其概念很廣,有很多層次,在數字系統中,只要能保存二進制數據的都可以是存儲器;在集成電路中,一個沒有實物形式的具有存儲功能的電路也叫存儲器,如RAM、FIFO等;在系統中,具有實物形式的存儲設備也叫存儲器,如內存條、TF卡等。

⑥ 誰會用AT89S52單片機製作電子密碼鎖,密碼存儲於AT24C02中

//代碼很長,希望你有耐心讀下去
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
void key_scan();
uchar count0,count1,count3,num,n=0,temp,a,j,count4;
uchar mima[8]; //初始密碼存儲區
uchar tab_key[50]; //輸入密碼存儲區
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
bit enterflag; //確認鍵按下與否的標志
bit mimaflag; //密碼正確與否的標志
bit xiugaiflag; //修改密碼標志
bit enter1flag; //修改密碼確認鍵標志
sbit red=P3^7;
sbit bell=P3^6;
sbit rs=P2^0;
sbit rw=P2^1;
sbit lcden=P2^2;
sbit scl=P3^4;
sbit sda=P3^5;
uchar code table1[]="input the passco";
uchar code table2[]="de: --------";
uchar code table3[]="*";
uchar code table4[]="right (^_^) ";
uchar code table5[]="first error!!!!";
uchar code table6[]="second error!!!!";
uchar code table7[]="third error see ";
uchar code table8[]="u tomorrow (^_^)";
uchar code table9[]="define the passc";
uchar code table10[]="ode: --------";
uchar code table11[]="code is new";
//******************************鍵盤消抖函數*******************************
void delay1()
{ ;; }
void delay2(uchar x)
{
uchar a,b;
for(a=x;a>0;a--)
for(b=100;b>0;b--);
}

void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

//****************************e^2room的初始化*******************************
void start() //開始信號
{
sda=1;
delay1();
scl=1;
delay1();
sda=0;
delay1();
}

void stop() //停止
{
sda=0;
delay1();
scl=1;
delay1();
sda=1;
delay1();
}
//****************************應答信號*************************************
void respond()
{
uchar i;
scl=1;
delay1();
while((sda==1)&&(i<250))i++;
scl=0;
delay1();
}
//*****************************寫位元組操作函數**********************************
void write_byte(uchar date)
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1; //保持最高位,左移到進位CY
scl=0;
delay1();
sda=CY;
delay1();
scl=1;
delay1();
}
scl=0;
delay1();
sda=1;//匯流排釋放
delay1();
}
//*******************************讀位元組操作函數*****************************
uchar read_byte()
{
uchar i,k;
scl=0;
delay1();
sda=1;
delay1();
for(i=0;i<8;i++)
{
scl=1;
delay1();
k=(k<<1)|sda; //或運算,放到最低位
scl=0;
delay1();
}
return k;
}
//**********************************寫地址函數******************************
void write_add(uchar address,uchar date)
{
start();
write_byte(0xa0);
respond();
write_byte(address);
respond();
write_byte(date);
respond();
stop();
}
//*******************************讀地址函數*************************************
uchar read_add(uchar address)
{
uchar date;
start();
write_byte(0xa0);
respond();
write_byte(address);
respond();
start();
write_byte(0xa1);
respond();
date=read_byte();
stop();
return date;
}
//****************************LCD1602的初始化*******************************
void write_com(uchar com)
{
rs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}

void write_date(uchar date)
{
rs=1;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}

//***************************************密碼比較函數********************************
bit mimacmp()
{
bit flag;
uchar i;
for(i=0;i<8;i++)
{
if(mima[i]==tab_key[i])
flag=1;
else
{
flag=0;
i=8;
}
}
return(flag); //返回flag
}

////**********************************LCD顯示函數開始**************************************
void lcd_display()
{
uchar i=0;
write_com(0x80+0x40+8);
for(i=0;i<n;i++)
{
write_date(table3[0]);
}
}

//****************************************鍵盤功能分配函數群開始****************************
//** 0 ** 1 **2 ** 3**
//** 4** 5** 6 **7 **
//**8** 9** 確認(A) **無效(B)
//**取消(C)**修改密碼鍵(D)**確認修改鍵(E)**無效(F)

void key_manage1()
{
tab_key[n]=0;
n++;
if(xiugaiflag==1)
{
mima[count4]=0;
count4++;
}
}

void key_manage2()
{

tab_key[n]=1;
n++;
if(xiugaiflag==1)
{
mima[count4]=1;
count4++;
}
}

void key_manage3()
{

tab_key[n]=2;
n++;
if(xiugaiflag==1)
{
mima[count4]=2;
count4++;
}
}

void key_manage4()
{
tab_key[n]=3;
n++;
if(xiugaiflag==1)
{
mima[count4]=3;
count4++;
}
}

void key_manage5()
{
tab_key[n]=4;
n++;
if(xiugaiflag==1)
{
mima[count4]=4;
count4++;
}
}

void key_manage6()
{
tab_key[n]=5;
n++;
if(xiugaiflag==1)
{
mima[count4]=5;
count4++;
}
}
void key_manage7()
{
tab_key[n]=6;
n++;
if(xiugaiflag==1)
{
mima[count4]=6;
count4++;
}
}
void key_manage8()
{
tab_key[n]=7;
n++;
if(xiugaiflag==1)
{
mima[count4]=7;
count4++;
}
}

void key_manage9()
{
tab_key[n]=8;
n++;
if(xiugaiflag==1)
{
mima[count4]=8;
count4++;
}
}
void key_manage10()
{
tab_key[n]=9;
n++;
if(xiugaiflag==1)
{
mima[count4]=9;
count4++;
}
}
//**********************************確認鍵**************************************************************
void key_manage11()
{
enterflag=1; //確認鍵按下
if(n==8) //只有輸入8個密碼後按確認才做比較
mimaflag=mimacmp();
else
mimaflag=0;
if(enterflag==1)
{
enterflag=0;
n=0;
//用FFFFFFFF清除已經輸入的密碼
for(count3=0;count3<8;count3++)
{
delay(5);
tab_key[count3]=0x0f;
}

TR1=1; //打開計數器1
count1=0; //定時器1由50MS累計到1S所用的計數器
if(mimaflag==1)
{
a=0;

write_com(0x01);
write_com(0x80);
for(count3=0;count3<16;count3++)
{
write_date(table4[count3]); //密碼正確,顯示RIGHT,綠燈亮
delay(5);
}
}

else
{
n=0;
red=0;
bell=0;
a++;
if(a==1)
{
for(count3=0;count3<8;count3++) //ffffffff清除密碼
{
delay(5);
tab_key[count3]=0x0f;
}
write_com(0x01);
write_com(0x80);
for(count3=0;count3<16;count3++)
{
write_date(table5[count3]); //密碼錯誤,顯示 first error,紅燈亮
delay(5);
}
TR1=1;
}
if(a==2)
{
for(count3=0;count3<8;count3++) //ffffffff清除密碼
{
delay(5);
tab_key[count3]=0x0f;
}
write_com(0x01);
write_com(0x80);
for(count3=0;count3<16;count3++)
{
write_date(table6[count3]); //密碼錯誤,顯示SECOND ERROR,紅燈亮
delay(5);
}
TR1=1;
}

if(a==3)
{
for(count3=0;count3<8;count3++) //ffffffff清除密碼
{
delay(5);
tab_key[count3]=0x0f;
}
write_com(0x01);
write_com(0x80);
for(count3=0;count3<16;count3++)
{
write_date(table7[count3]); //密碼錯誤,顯示third error see,紅燈亮
delay(5);
}
write_com(0x80+0x40);
for(count3=0;count3<16;count3++)
{
write_date(table8[count3]);//密碼錯誤,顯示 U TOMORROW ,紅燈亮
delay(5);
}
TR1=0;

}

}
}

}
void key_manage12()
{
tab_key[n]=11;
n++; //密碼計數清零

}
//****************************************************取消鍵********************************************
void key_manage13()
{

n=0; //密碼計數清零
write_com(0x80); //指針所指位置
for(count3=0;count3<16;count3++)
{
write_date(table1[count3]); //第一行顯示INPUT THE PASSPORD:
delay(5);
}
write_com(0x80+0x40);
for(count3=0;count3<16;count3++)
{
write_date(table2[count3]); //開機顯示--------
delay(5);
tab_key[count3]=0x0f; //用FFFFFFFF清楚已經輸入的密碼
}

}
//*******************************************修改密碼鍵**********************************
void key_manage14()
{
uchar aa=0;
n=0;
xiugaiflag=1;
write_com(0x01);
write_com(0x80);
for(count3=0;count3<16;count3++)
{
write_date(table9[count3]); //顯示define the password
delay(5);
tab_key[count3]=0x0f; //用FFFFFFFF清楚已經輸入的密碼
}
write_com(0x80+0x40);
for(count3=0;count3<16;count3++)
{
write_date(table10[count3]); //顯示--------
delay(5);
}
TR0=1;

}
//******************************************修改密碼鍵的確認鍵********************************
void key_manage15()
{
n=0;
enter1flag=1;
if(enter1flag==1)
{
enter1flag=0;
count4=0;
for(count3=0;count3<16;count3++)
{
tab_key[count3]=0x0f; //用FFFFFFFF清楚已經輸入的密碼
}
write_com(0x01);
write_com(0x80);
for(count3=0;count3<16;count3++)
{
write_date(table11[count3]);
delay(100);
}
TR1=1;
count1=0;
}
}
void key_manage16()
{
tab_key[n]=15;
n++;
}

//****************************************定時器1的50MS,共延時1秒*****************************
void time_1() interrupt 3
{

TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
if(count1<20)
{
count1++;
}
else //計時到1S
{
TR1=0;
count1=0;
mimaflag=0;

red=1;
bell=1;
//顯示FFFFFFFF
write_com(0x01);
write_com(0x80);
for(count3=0;count3<16;count3++)
{
write_date(table1[count3]); //顯示INPUT THE PASSCODE
delay(5);
}
write_com(0x80+0x40);
for(count3=0;count3<16;count3++)
{
write_date(table2[count3]); //開機顯示FFFFFFFF
delay(5);
}
}

}
//***********************************************定時0**********************************************
void time_0() interrupt 1
{

TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
if(count4<8)
{
key_scan();
}
else
{
TR0=0;
count4=0;
}
}

//初始化函數
void init()
{

uchar i;
lcden=0;
write_com(0x38); //打開顯示模式設置
write_com(0x0c); //打開顯示,游標等等設置未零
write_com(0x06); //當讀或寫一個字元後地址指針加一,且游標加一,當寫一個字元後整頻顯示左移,
write_com(0x01); //清零指令
write_com(0x80); //指針所指位置

//定時器初始化
TMOD=0x11; //T0,T1工作方式1
TH0=(65536-2000)/256;
TL0=(65536-2000)%256; //T0初始化2MS

TH1=(65536-50000)/256;
TL1=(65536-50000)%256; //T1初始化50MS

TR1=0;
ET1=1;
EA=1;
TR0=0;
ET0=1;

count0=0; //初始沒有密碼輸入,故為零
enterflag=0; //沒有確認鍵按下
mimaflag=0; //密碼正確與否鍵先置零

red=1; //紅燈不亮
//************密碼存入EPROM中**********************************
sda=1;
delay(5);
scl=1;
delay(5);
for(i=0;i<8;i++)
{
write_add(i,8);
delay2(100);
}
for(i=0;i<8;i++)
{
mima[i]=read_add(i);
delay(5);
}

}
void main()
{ rw=0;
init();
write_com(0x80); //指針所指位置
for(count3=0;count3<16;count3++)
{
write_date(table1[count3]); //第一行顯示INPUT THE PASSPORD:
delay(5);
}
write_com(0x80+0x40);
for(count3=0;count3<16;count3++)
{
write_date(table2[count3]); //開機顯示FFFFFFFF
delay(5);
}
while(1)
{
key_scan(); //調用鍵盤掃描函數
lcd_display();
}

}
//**************************************************鍵盤掃描函數開始********************************
void key_scan()
{
//**********掃描第一行*********
P1=0xfe;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(100);
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xee:
key_manage1();
break;

case 0xde:
key_manage2();
break;

case 0xbe:
key_manage3();
break;

case 0x7e:
key_manage4();
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
//**************************************************掃描第二行***********************************
P1=0xfd;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(100);
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xed:
key_manage5();
break;

case 0xdd:
key_manage6();
break;

case 0xbd:
key_manage7();
break;

case 0x7d:
key_manage8();
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
//*********************************************掃描第三行***********************************
P1=0xfb;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(100);
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xeb:
key_manage9();
break;

case 0xdb:
key_manage10();
break;

case 0xbb:
key_manage11();
break;

case 0x7b:
key_manage12();
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}

//***************************************************掃描第四行****************************************
P1=0xf7;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(100);
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xe7:
key_manage13();
break;

case 0xd7:
key_manage14();
break;

case 0xb7:
key_manage15();
break;

case 0x77:
key_manage16();
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
}

⑦ 求AT24C16,與AT24C02的電路(用51單片機控制) 順便說說 AT24C02與 AT24

根據他們的連接方式不同,可用的地址也略有不同
24C01在一個匯流排上最多可定址八個1K器件,24C02在一個匯流排上最多可定址八個2K器件,A2、A1和A0內部必須連接。
24C04僅使用A2、A1作為硬體連接的器件地址輸入引腳,在一個匯流排上最多可定址四個4K器件。A0引腳內部未連接。
24C08僅使用A2作為硬體連接的器件地址輸入引腳,在一個匯流排上最多可定址兩個8K器件。A0和A1引腳內部未連接。
24C16未使用作為硬體連接的器件地址輸入引腳,在一個匯流排上最多可連接一個16K器件。A0、A1和A2引腳內部未連接
簡單說就是,以at24c02為例,at24c02共有256個(2k)可用地址,而前1024(8K)個地址可以共用,共用的條件是必須指定使用哪一部分,當選擇的地址可以兼容時,程序便是兼容的,地址不兼容,程序當然也會出問題!!

⑧ 求一段基於51單片機的AT24C02的存儲和調用程序(C語言)

#include<c8051f410.h>
#include<intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit SDA=P1^0;
sbit SCL=P1^1;
void delay(void)
{
uint m;
for(m=0;m<0xffff;m++)
_nop_();
}
void start (void) // IIC開始
{
SDA=1;
SCL=1; //在至少4u秒期間SDA從高電平到低電平
SDA=0;
SCL=0;
}
void stop(void) // IIC結束
{
SDA=0;
SCL=1; //在至少4u秒期間SDA從低電平到高電平
SDA=1;
SCL=0;
}
uchar check(void) // 檢查應答信號
{
uchar ACK;
SDA=1;
SCL=0;
SCL=1;
if (SDA == 1)
{
ACK = 1;
}
else
{
ACK = 0;
}
return(ACK);
}
void send(uchar _data) // 發送一個位元組
{
uchar bitcount=8; //發送8位
SCL=1;
do
{
if((_data&0x80)==0x80)
{
SDA=1; //發送1
}
else
{
SDA=0; //發送0
}
SCL=0; // 在時鍾大於4u秒期間寫數據
_data=_data<<1;
bitcount--;
SCL=1;
}while(bitcount);
}
uchar recive(void) //接受一個位元組
{
uchar temp1=0;
uchar bitcount1=8;
SDA=1; //置輸入
do
{
SCL=1; //在時鍾大於4u秒期間讀數據
if(SDA) //讀1
{
temp1=temp1|0x01;
}
else //讀0
{
temp1=temp1&0xfe;
}
SCL=0;
if(bitcount1-1)
{
temp1=temp1<<1;
}
bitcount1--;
SCL=1;
}while(bitcount1);
return(temp1);
}
void ack(void) //發送繼續讀信號
{
SDA=0;
SCL=0;
SCL=1;
}
void nack(void) //停止繼續讀
{
SDA=1;
SCL=0;
SCL=1;
}
void wrtoROM(uchar *_data,uint address,uchar num) //給24LC256寫數據
{
uint i;
uint adrl=address%256; //低8位地址
uint adrh=address/256; //高8位地址
start(); //起始信號
send(0xa4); //寫主控器識別地址,本人是a2
while(check()); //等待應答
send(adrh); //送數據高8位地址
while(check()); //等待應答
send(adrl); //送數據低8位地址
while(check()); //等待應答
for(i=0;i<num;i++,_data++)
{
send(*_data); //發送數據
while(check()); //等待應答
}
stop(); //停止
delay(); //延時,下次發數據
}
void rdfromROM(uchar *_pdata,uint address,uchar num2) //從24LC256中讀數據
{
uint adrl;
uint adrh;
uchar j;
for(j=0;j<num2;j++,_pdata++)
{
adrl=address%256; //地址低位
adrh=address/256; //地址高位
start(); //開始
/* send(0xa2); //寫主控器識別地址(寫),本人是a2
while(check()); //等待應答
send(adrh); //送高位
while(check()); //等待應答
send(adrl); //送低位
while(check()); //等待應答
start(); //開始讀數據
send(0xa3); //寫主控器識別地址(讀)
while(check()); //等待應答 */

send(0xa5); //寫主控器識別地址(寫),本人是a2
while(check()); //等待應答
send(adrh); //送高位
while(check()); //等待應答
send(adrl); //送低位
while(check()); //等待應答
*_pdata=recive();
// nack();
stop();
address=address+1; //指向下一個地址
}
}
main()
{
uint h,n;
uchar str[64]={0x5d,0x5d,0x32,0x18,0x6c,0x88,0xa0,0x1d,0x20,0x08};
SCL=1;
SDA=1;
for(n=0;n<255;)
{
wrtoROM(str,n,64); //寫一頁的數據,根據24LC256一頁是64個位元組
n=n+64; //寫下一頁數據
}

for(h=0;h<64;h++) //數組清0
{
str[h]=0x21;
}
delay();
rdfromROM(str,0x02,64); //讀從地址0開始的一頁數據
while(1)
{ ;
}
}

⑨ FM24C02與AT24C02這兩個儲存器主要區別是什麼,在使用控制方面有無區別,請給詳解,謝謝

首先是他們的廠家不一樣,電路和原理一樣.FM24CXX是沒有次數限制的,簡單說就是不會因為軟體問題而不能工作.AT24XX是有使用次數的,就是幾十萬幾百萬次。還有就是FM系列的比AT系列的要貴一些。謝謝,求採納

⑩ at24c02是什麼

AT24C02是Ateml公司的2KB的電可擦除存儲晶元,採用兩線串列的匯流排和單片機通訊,電壓最低可以到2.5V,額定電流為1mA,靜態電流10uA(5.5V),晶元內的資料可以在斷電的情況下保存40年以上,而且採用8 腳的DIP 封裝,使用方便。簡而言之,AT24C02是一個在突然掉電的情況下存儲數據的晶元,即掉電存儲晶元。