当前位置:首页 » 服务存储 » 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是一个在突然掉电的情况下存储数据的芯片,即掉电存储芯片。