单片机扩展存储24C08时序图那里有,数据存储的原理是怎样的

作者&投稿:鲜蕊 (若有异议请与网页底部的电邮联系)
24c08存储地址问题 分页写~

1K地址空间,由外部A2和内部存储阵列A9A8决定地址,例如你的A2固定接地,那么1K的存储空间分成4块,器件写地址分别是#0A0H,#0A2H,#0A4H,#0A6H,器件读地址是#0A1H,#0A3H,#0A5H,#0A7H,每个地址都对应256个字节。正好是8位地址00H--FFH。所以你的400个地址往后写,就要选定一个地址空间如#0A2H,再写入字节地址#091H,然后按字节写或按页写方式,写到#0FFH后,器件地址要变成#0A4H了,字节地址从00H开始。

AT24c08,属于非易失的存储器件,只占用单片机的两个引脚。
它使用IIC总线,是一种特殊串行数据的规范,介绍起来比较麻烦,网上有很多资料可供查询。

百度一下,PDF版的文件

24C08读写操作,适用于初学者

#include <AT89X52.H>
#include <stdio.h>
#include <absacc.h>
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07, 0x7f,0x6f,};
unsigned char sec; //定义计数值,每过1秒,sec加1
unsigned int tcnt; //定时中断次数
bit write=0; //写24C08的标志;
sbit gewei=P2^5; //个位选通定义
sbit shiwei=P2^6; //十位选通定义
/////////24C08读写驱动程序////////////////////
sbit scl=P3^6; // 24c08 SCL
sbit sda=P3^7; // 24c08 SDA
void delay1(unsigned char x)
{ unsigned int i;
for(i=0;i<x;i++);
;}
void flash() //延时2us
{
;
;
}
void x24c08_init() //24c08初始化子程序
{
scl=1;
flash();
sda=1;
flash();
}
void start() //启动I2C总线
{
sda=1;
flash();
scl=1;
flash();
sda=0;
flash();
scl=0;
flash();
}
void stop() //停止I2C总线
{
sda=0;
flash();
scl=1;
flash();
sda=1;
flash();
}
void writex(unsigned char j) //写一个字节
{
unsigned char i,temp;
temp=j;
for (i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
flash();
sda=CY;
flash();
scl=1;
flash();
}
scl=0;
flash();
sda=1;
flash();
}
unsigned char readx() //读一个字节
{
unsigned char i,j,k=0;
scl=0;
flash();
sda=1;
for (i=0;i<8;i++)
{
flash();
scl=1;
flash();
if (sda==1) j=1;
else j=0;
k=(k<<1)|j;
scl=0;
}
flash();
return(k);
}
void clock() // I2C总线时钟
{
unsigned char i=0;
scl=1;
flash();
while ((sda==1)&&(i<255))i++;
scl=0;
flash();
}
////////从24c02的地址address中读取一个字节数据/////
unsigned char x24c08_read(unsigned char address)
{
unsigned char i;
start();
writex(0xa0);
clock();
writex(address);
clock();
start();
writex(0xa1);
clock();
i=readx();
stop();
delay1(10);
return(i);
}
//////向24c02的address地址中写入一字节数据info/////
void x24c08_write(unsigned char address,unsigned char info)
{
EA=0;
start();
writex(0xa0);
clock();
writex(address);
clock();
writex(info);
clock();
stop();
EA=1;
delay1(50);
}
/////////////24C08读写驱动程序完/////////////////////
void Delay(unsigned int tc) //延时程序
{
while( tc != 0 )
{unsigned int i;
for(i=0; i<100; i++);
tc--;}
}
void LED() //LED显示函数
{
shiwei=0;
P0=table[sec/10];
Delay(8);
shiwei=1;
gewei=0;
P0=table[sec%10];
Delay(5);
gewei=1;
}
void t0(void) interrupt 1 using 0 //定时中断服务函数
{
TH0=(65536-50000)/256; //对TH0 TL0赋值
TL0=(65536-50000)%256; //重装计数初值
tcnt++; //每过250ust tcnt加一
if(tcnt==20) //计满20次(1秒)时
{
tcnt=0; //重新再计
sec++;
write=1; //1秒写一次24C08
if(sec==100) //定时100秒,在从零开始计时
{sec=0;}
}
}
void main(void)
{
TMOD=0x01; //定时器工作在方式1
ET0=1;
EA=1;
x24c08_init(); //初始化24C08
sec=x24c08_read(2);//读出保存的数据赋于sec
TH0=(65536-50000)/256; //对TH0 TL0赋值
TL0=(65536-50000)%256; //使定时器0.05秒中断一次
TR0=1; //开始计时
while(1)
{
LED();
if(write==1) //判断计时器是否计时一秒
{
write=0; //清零
x24c08_write(2,sec); //在24c08的地址2中写入数据sec
}
}
}

24c08读写程序

#include<at89x52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

sbit SCL="P2"^6;
sbit SDA="P2"^7;
uchar code displaycode[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};
uchar code displaybit[]={0xfe,0xfd,0xfb,0xf7};
uchar displaybuf[3];

void delayX2us(uchar x) //微秒延时
{
while(--x);
}

void delayXms(uchar x) //毫秒延时
{
uchar i;
while(x--)
{
for(i=250;i>0;i--)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}

void start ()
{
SDA=1;
delayX2us(2);
SCL=1;
delayX2us(2);
SDA=0;
delayX2us(2);
}

void stop ()
{
SDA=0;
delayX2us(2);
SCL=1;
delayX2us(2);
SDA=1;
delayX2us(2);
}

void init()
{
SCL=1;
delayX2us(2);
SDA=1;
delayX2us(2);
}

void responds()
{
uchar i;
i=0;
SCL=1;
delayX2us(2);
while(SDA==1&&i<200)
i++;
SCL=0;
delayX2us(2);
}

void write_dat (uchar dat) //写一个字节
{
uchar i;

for(i=0;i<8;i++)
{
SCL=0;
delayX2us(2);
SDA=(bit)(dat&0x80);
delayX2us(2);
SCL=1;
delayX2us(2);
SCL=0;
delayX2us(2);
dat<<=1;
}

SDA=1;
delayX2us(2);

}

void write(uchar dat,uchar add) // 写一个字节dat到地址add
{
start();
write_dat(0xa0);
responds();
write_dat(add);
responds();
write_dat(dat);
responds();
stop();
}

uchar read_dat () //读一个字节
{
uchar i;
uchar dat;
bit j;
for (i=0;i<8;i++)
{
dat<<=1;
SCL=0;
j=SDA;
delayX2us(2);
SCL=1;
if(j==1)
{
dat|=0x01;
}
SCL=0;
}
return dat;
}

uchar read (uchar add) //从地址add中读取一个字节
{
uchar dat;

start();
write_dat(0xa0);
responds();
write_dat(add);
responds();
start();
write_dat(0xa1);
responds();
dat=read_dat();
delayX2us(2);
stop();
return dat;
}

void display(uchar dat) //显示程序
{
uchar bai,shi,ge,i;
bai=dat/100;
shi=dat%100/10;
ge=dat%10;
displaybuf[0]=bai;
displaybuf[1]=shi;
displaybuf[2]=ge;

for(i=0;i<3;i++)
{
P0=displaycode[displaybuf[i]];
P1=displaybit[i];
delayX2us(5);
P1=0xff;
}
}

void main ()
{
uchar dat,add,k;
dat=212;
add=2;
init();

write(dat,add);
delayXms(1000);
k=read(add);

while(1)
{

display(k);

}
}

找到这个型号的 技术手册 上面就有, 我以前用过24c02 的 是I2C 时序, 这个估计也是 。


关于单片机的ALE端口的问题
1。是的,51单片机就是按照访问片外存储器的方法,访问扩展的IO接口。2。8155所需要的时钟信号,可以随意的选用,当然频率不能超过8155的鉴别能力,这个频率,不需要和谁同步。

一块at24c32可以存多少数据?一块at24c04可以存多少数据?回答者自己实 ...
1、摘抄于《AT24C02中文资料》,描述如下:24C01\/02\/04\/08\/16 是低工作电压的 1K\/2K\/4K\/8K\/16K 位串行电可擦除只读存储器,内部组织为128\/256\/512\/1024\/2048 个字节,每个字节8位,该芯片被广泛应用于低电压及低功耗的工商业领域。也就是:128x8(1K),256x8(2K),512x8(4K),1024x8(8K),20...

家庭红外线报警系统毕业设计论文
拨号时,先检测24C04中存储的电话号码。若为空,即未设此电话,跳过不拨,继续拨下一个电话号码。这样,用户可随意设置数个报警电话号码。我们规定号码长度最多不超过4位,以便存在24C04中。 1.1.2 语音电路 为了便于通信,采用了语音芯片,实现语音指示和报警功能。ISD1420为单片语音记录、回放一体化芯片,记录时长为20s...

SIM卡放在手机卡槽里长期不换,是否会影响通话质量和网络传输速率?_百度...
SIM卡是一块IC电路芯片板,属于寿命较长的电子设备,一般来说10年以上都不会老化。内部存储的是一些和运营商的核心网之间的鉴权参数信息,还可以存储一些通信录电话号码,但是不会影响通话质量和下载速度。 SIM卡只要不频繁插拔,表面没有划痕,而且拿出sim卡的时候要注意手上不要沾水,避免sim卡生锈,就不会对sim卡的寿...

乐华彩电RK21BT总线进入方法
乐华R3318,CPU是P87C766BDR\/C,此机有两种方法进入,(1)将CPU35脚对地短接一下。(2)改装一下用户遥控器,将遥控器IC5脚与地之间接10K电阻,按遥控器上的“0”键即可进入,关机退出。乐华RTP-2951 CPU-MC8901A 存储器-24C16 小信号处理电路-OM8839 进入及退出维修模式的方法:按住遥控器...

有人说STC单片机不稳定,具体表现在哪些方面?
其中有一点表现的非常明显,就是掉电跑飞,就是STC单片机,在掉电的瞬间到完全掉电这一过程中,程序会跑飞了,乱跑.曾经我做的一款产品,里面有个功能是把参数存储与24C16里,这个存储功能不会轻易激发,只有发现参数改变了之后才写24C16.结果有数次,掉电之后再上电,参数居然变了,而且总是那一个参数,数值...

康佳电视屏幕上出现FACTORY字母,要怎么样才能清除啊?
进入方法:在维修中若更换存储器24C04,需对整机进行调整,调整时需采用专用调试遥控器KK-Y211。若无专用遥控器时,可用F2109A的遥控器KK-Y173,该遥控器最后一行第3个键无导电胶,可将遥控器贴片掀起,露出一个洞,用导体(如铁片等)接通洞内印刷板的碳膜,进入工厂调试菜单。按压遥控器的“调试...

89C52单片机的内存8K不够用了怎么办?
1.可不可以用24C0*2系列呢?那程序要怎么写了(有关些读一整个函数的),比如我现在有要把温控程序和时钟程序放到52外部,计算器程序放到内部,同时可以使52正常工作,扫描完内部后继续扫描内部。答:不行.2.如果用扩展外部存储芯片,那芯片型号是什么,程序又怎么写?答:可以扩展.典型的并行存储芯片...

怎样制作简易24CXX存储器读写工具?
1、先买一个电脑打印机的打印线(两端有插头);2、再找一块现在市上卖的多用线路板,两孔相连的,截下一小块;3、将两个8脚IC插座及相关元件焊好(两个插座并联),4、将打印插头联线全焊掉,清理干净,留下5根备用,其余包好不用,将小插头线接好(特别注意引脚编号);5、大插头保留外壳(插头...

芯片如何录制
使用独立型“智能拷贝机”复制I2C总线彩电存储块:例如:需要复制彩电存储块的型号为24C08,在“源片”和“空片”座中分别放入24C08源片和空片并锁紧。按选择键,使数码显示为:“2408”。再按拷贝键,数码显示“COPY”,表明复制正在进行。当数码显示“S”时,表明复制已经完成。 经以上复制的芯片与...

晋源区18574326029: 单片机扩展存储24C08时序图那里有,数据存储的原理是怎样的 -
除瑶信达: AT24C08是采用IIC总线结构进行数据传输的

晋源区18574326029: 24c08存储地址问题 分页写 -
除瑶信达: 1K地址空间,由外部A2和内部存储阵列A9A8决定地址,例如你的A2固定接地,那么1K的存储空间分成4块,器件写地址分别是#0A0H,#0A2H,#0A4H,#0A6H,器件读地址是#0A1H,#0A3H,#0A5H,#0A7H,每个地址都对应256个字节.正好是8位地址00H--FFH.所以你的400个地址往后写,就要选定一个地址空间如#0A2H,再写入字节地址#091H,然后按字节写或按页写方式,写到#0FFH后,器件地址要变成#0A4H了,字节地址从00H开始.

晋源区18574326029: 单片机I2c那个24c08,为什么我这个程序烧到板子里,数码管是在加1,可是一按复位键,数码管显示就乱了呢 -
除瑶信达: 24c08的地址位数不对,不是一个byte的地址 应该是两个byte的地址.你这个程序在24c04上应该能正常运行.

晋源区18574326029: 集成块24c08作用是什么 -
除瑶信达: 24C08是一块I2C控制的存储器芯片,它与CPU 配合存取需要的信息.

晋源区18574326029: 24C08的SCL SDA 数据线 -
除瑶信达: 这两个线是传数据用的,SCL是控制信息号,SDA是数据线.它们是一种IIC数据协议.24C08是一种EEPROM数据存储器.这两个线可以接到相应的设备上,设备有要保存的数据就可以通过上面两根线将数据保存到24C08中了.

晋源区18574326029: 为什么24c08在第二次写数据的时候没应答信号 -
除瑶信达: 24c08之类的写入,是芯片取得缓冲数据并存储到芯片寄存器后,用大约10ms时间进行刷新E2ROM的操作.在此期间,24C08 不会接受外部的任何读写请求.你在发送STOP停止信号后,加一个10ms以上的延时才行.也就是当写入EE2ROM数据时上一个STOP与下一个START的间隔,至少10ms.

晋源区18574326029: 创维88cs38n - 3g82存储器24c08用空白24c16可以代吗 -
除瑶信达: 储器24C16是 16K位的串行CMOS EEPROM,内部含有2048个8位字节,而24C08是8K位的,内部含有1024个8位字节,容量比24C16的校但如果你需要写入的内容不大于8K位,可以考虑.否则,最好仍用24C16.

晋源区18574326029: 52单片机不使用24C08如何将数据储存到芯片里.例如密码锁的密码储存到单片机里!!!!!!!!!!!!!!
除瑶信达: 如果密码是恒定不变的可以直接写到代码里.如果是变换的密码,单片机有EPROM没? 如果没有即使记录下来断电时也会丢失数据.

晋源区18574326029: 请问AT24C08是一块这么芯片,有什么作用.我是在一块FPGA开发板上看见的 -
除瑶信达: AT24C08在我的板子上也有,是一种常用的EEPROM存储介质,一般用IIC总线进行连接,容量有2k,4k,8k等等.适用于存储少量数据,或者学习IIC总线用的.

晋源区18574326029: 单片机的时序图怎么看? -
除瑶信达: 这个时序图 是 按 cs=0; sck=0; si=数据的一位; sck=1; //sck是下降沿有效.这样写是完全正确的.数据输出:sck是下降沿有效.cs=0; sck=1; so=指令的一位; sck=0;

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网