24C02终于搞定了!分享程序给需要的坛友,最大存储255字节!
给别人做的个东西,要求数据掉电保存,大的框架很早就搭建起来了,但是到了24C02这,卡住了。不是无法实现存储,只是我的数据量比较大,好几天在网上搜索24C02相关的程序,几乎把所有的能看的都看遍了,我失望的才发现,大同小异,大家都是互相抄来抄去的,没有一个能很好用的,而且有的程序又是缺个括号,或者只有括号的一半,另一半和里边的变量都不知道跑哪去了,看的很是郁闷啊,开始想,不到万不得已,坚决不看英文的技术手册,今早一大早泡图书馆看书查资料,复印了好几十页,到了实验室又打印了技术文档,边看边查单词边翻译,还有在我的好兄弟的一起协助下,终于轻松实现了24C02存储255个数据。同时也大体明白了24C02得工作原理。1、24C02是2Kbits 意思是有2048bit,换算成字节是256Byte,也就是说最多可以存储255个字节的数据;
2、ATMEl24C02(应该其他厂家的24C02也是这样子吧。。。)有32页,每页可以存放8个字节;
3、24C02有两种工作模式:(1)、字节写入模式:结合技术文档我认为该模式是这样工作的:首先是可以再任意的地址(0x00~0xFF)写入一个字节,也可以在某一地址连续的写入N字节,而且不需要翻页,从技术手册得知,答题时说字节写入模式下,页指针根写入数据的多少来自动增加实现翻页功能,不用自己在程序里边实现;
(2)、页写入模式:页写入模式下,手册上写着,一页可以存8字节,当存储的数据大于8时,则会覆盖先前保存的数据,例如,有16个数据 uchar data={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15},从24C02的0x00地址开始存放,当存完一页(8个)时,第9个数据会保存在0x00,覆盖掉开始保存的1,后边的数据一次类推,这样的现象叫做“翻转”,如果想写完一页后将剩余的数据保存在下一页,页指针需要自己来设定。
我觉着,字节写入模式相对更简单些。
下边,附上我的程序,供大家参考,如有疑问的地方,欢迎大家交流!
///使用单片机:89S51
///晶振:12MHz
#include<reg52.h>
#include "INTRINS.H"
#define uchar unsigned char
#define uint unsigned int
sbit scl = P3^2;
sbit sda = P3^3;
/*********74H573控制端*********/
sbit dula = P2^7;//段选
sbit wela = P2^6;//位选
sbit LED = P2^5;//秒显示
uchar tt=0;
uchar i=0,j=0,temp=0,a=0,b=0,c=0;
/*******数码管段选_时间********/
uchar code table_duan[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
/*********数码管位选**********/
uchar code table_wei[]={0xfe,0xfd,0xfb,0xf7,0xef};
void delay1(uint x)
{
uint i,j ;
for(i=x;i--;i>0)
for(j=110;j--;j>0);
}
/**************************** 显示函数 **************************/
void display(uchar wee,uchar H_hour,uchar L_hour,uchar H_min,uchar L_min)
{
dula=1;
P0=table_duan;//数码管5位,星期
dula=0;
wela=1;
P0=table_wei;
wela=0;
delay1(1);
dula=1;
P0=table_duan;//数码管4位,小时十位
dula=0;
wela=1;
P0=table_wei;
wela=0;
delay1(1);
dula=1;
P0=table_duan;//数码管3位,小时个位
dula=0;
wela=1;
P0=table_wei;
wela=0;
delay1(1);
dula=1;
P0=table_duan;//数码管2位,分钟十位
dula=0;
wela=1;
P0=table_wei;
wela=0;
delay1(1);
dula=1;
P0=table_duan;//数码管1位,分钟个位
dula=0;
wela=1;
P0=table_wei;
wela=0;
delay1(1);
}
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;
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 write_add(uchar address,uchar date)
{
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;
}
/*-------------------------------------------------------------
主程序
功能:实现存储器EEPROM AT24C02的数据读写操作
------------------------------------------------------------*/
void main()
{
TMOD=0x01;//设置定时器0为工作方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=0;//启动定时器0
P2=P2&0xc0;
init();
for(i=0; i<255; i++)
{
write_add(i,i);
delay1(1);
}
TR0=1;
while(1)
{
if(j == 255)j=0;
TR0=0;
temp=read_add(j);
TR0=1;
a=temp/100;
b=temp%100/10;
c=temp%100%10;
display(a,b,c,0,0);
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
if(tt == 5)
{
tt = 0;
LED = ~LED;//用于指示是否工作正常
j++;
}
}
非常好的资料~~~~~~~~~~~~~怎么就没人回复呢? 这个有啥亮点?完全没看出来
我就想看你那个最大的亮点
要求数据掉电保存
这个如何实现? 在51上如何搞定
顺便说1下
要求数据掉电保存
这个可是月经贴了.多个论坛N人都扯过.貌似八仙过海阿 24C02明明是可以存256个字节,为什么说是255个了?地址是从0~255. 256个字节,就可以存到256个字节,怎么最大只能存255个字节呢? 只不过地址是从00开始,到FF结束而已。 不管怎么说也顶一下 这个程序跟GTX程序很像;能弄出来就好,毕竟不是每个人都是大牛 主要是时序问题,恭喜楼主搞定了24C02,想当初这个时序也是搞了半天。 还是要支持一下的。搞清楚时序最重要。 skynet 发表于 2013-1-8 21:04 static/image/common/back.gif
这个有啥亮点?完全没看出来
我就想看你那个最大的亮点
你自己去百度里边搜搜,你看看有多少人说的详细行不?24C02是eeprom,掉电保存数据,你难道不懂,要是连这都实现不了,那它有何存在意义?哥们,你按照程序编译下载到单片机先写入eeprom数据后,在程序里边注释掉写入部分保留从24C02读取数据的函数,你看看行不行,不要动不动就怀疑,本来辛辛苦苦搞出来是想方便坛友的,你这太打击人了。。。 lxa0 发表于 2013-1-8 21:01 static/image/common/back.gif
非常好的资料~~~~~~~~~~~~~怎么就没人回复呢?
谢谢,决定能用,请放心!的确是现在网上有好多这样的资料,但几乎都是如出一辙,大家不愿动脑子去自己写,而且还给别人回复居然说都不看数据手册,真心鄙视之,好不容易自己弄懂了和大家分享,又有人轻视,真心无语。。。 唉,楼主,我说的掉电保存,不是你说的掉电保存.......
举个例子,比如你的系统在运行中,系统没有后备电池的,此时外部电源,比如市电,突然没有了.你的系统需要把当前运行的数据立刻写入EEPROM之中保存起来.
等市电再次来的时候,把EEPROM中的数据读出来,系统从掉电的那个状态开始运行.
举例比如,电机当前的速度,电视机当前的台号,空调当前的温度.等等之类的.你不可能频繁的写EEPROM来保存,只能是掉电之前瞬间写入.............
实际项目中.楼主你做到了就会体会到了 skynet 发表于 2013-1-9 10:20 static/image/common/back.gif
唉,楼主,我说的掉电保存,不是你说的掉电保存.......
举个例子,比如你的系统在运行中,系统没有后备电池的,此 ...
晕,你没说清楚啊,这难道属于24C02的功能吗?如果属于,还请您指导。 skynet 发表于 2013-1-9 10:22 static/image/common/back.gif
举例比如,电机当前的速度,电视机当前的台号,空调当前的温度.等等之类的.你不可能频繁的写EEPROM来保存,只能 ...
受教了,自己做的东西还比较少,还希望今后能多跟您这样的牛人学习交流,谢了!看您积分挺高,相比您很厉害,经验很丰富 stely 发表于 2013-1-8 22:06 static/image/common/back.gif
还是要支持一下的。搞清楚时序最重要。
谢谢!!! ourdemo 发表于 2013-1-8 21:53 static/image/common/back.gif
这个程序跟GTX程序很像;能弄出来就好,毕竟不是每个人都是大牛
您说的对,我就是学习他的开发板的,楼主好眼力啊,我在网上查过好多资料,但是都没说清楚有多少页,每页可以写多少个字节,有的说16个,有的说8个,说法不一,在研究技术文档的同时研究了郭天祥的程序,才明白了好多 dlmaowf 发表于 2013-1-8 21:18 static/image/common/back.gif
256个字节,就可以存到256个字节,怎么最大只能存255个字节呢?
不好意思,昨天搞得太累了,所以弄错了,你看程序其实可以明白,其实是0~255也就是256个字节,谢谢提醒~! 求是,支持 {:titter:} 真是激动人心的好消息,看来离天艹民猪复兴又增加了一个百分比!
哈哈,纯粹开个玩笑
{:titter:}^_^b祝贺lz有进步,
大家都是那么菜鸟一路走过来的 wkman 发表于 2013-1-9 11:20 static/image/common/back.gif
真是激动人心的好消息,看来离天艹民猪复兴又增加了一个百分比!
哈哈,纯粹开个玩笑
谢谢楼主,还请您多光顾,以后又不懂的还想多请教您! 楼主很有成就感,恭喜一下。
再接再励,一鼓作气,把 I2C 协议吃透。 zhanan 发表于 2013-1-9 12:48 static/image/common/back.gif
楼主很有成就感,恭喜一下。
再接再励,一鼓作气,把 I2C 协议吃透。
谢谢,做完手头的活,好好研究下,有问题还想跟您请教啊! 恭喜恭喜~~~想當年搞定24C02我都開心死了!
但是後面的困難還很多啊!!相比之下24C02只是一枚針而已。加油吧!
例如:
你的delay()讓MCU白白耗掉資源,MCU吃電不幹活,有木有?!
看见楼主挺辛苦和认真求知的份上顶一个,不过楼主还要继续深度理解哦,在实际中有很多是没有那么理想的,真正的停电数据保存,不但软件要做,还有硬件部分也有许多需要处理的.....羊羊大师提出的东东对你应该有很大的启发的. 本帖最后由 Sc0pin 于 2013-1-9 13:58 编辑
看错了
Good Job
开始想,不到万不得已,坚决不看英文的技术手册,
但这不是一个好习惯 本帖最后由 Tliang 于 2013-1-9 15:20 编辑
恭喜楼主,给个24C系列的EEPROM资料给你看看。你就知道为什么有的是可以连续写8个有的可以连续写16个有的可以连续写32了。
编辑:楼主还要继续理解IIC协议呀。程序还有漏洞。
<--------------------------------------YES
↓ ↑
写数据:开始->写写命令和地址->判断是否都应答 YES->写数据->判断是否应答 YES->继续写? NO->停止->返回正确
↓ ↓
NO-------------------------------------------------------------------------------------->返回错误
发送应答<-YES
↓ ↑
读数据:开始->写写命令和地址->判断是否都应答 YES->开始信号->写读命令->判断是否应答 YES->读数据->继续读? NO->停止->返回正确
↓ ↓
NO------------------------------------------------------------------------------------------------------------------>返回错误
你的程序并未判断是否应答,没有应答应该停止继续发送数据并作出提示。 skynet 发表于 2013-1-9 10:20 static/image/common/back.gif
唉,楼主,我说的掉电保存,不是你说的掉电保存.......
举个例子,比如你的系统在运行中,系统没有后备电池的,此 ...
帮顶下洋洋,其实洋洋说的是低压保存. 带EEP的单片机很多了,价格也便宜,没必要就为256个Byte再增加一个元件,况且你也只是存存数据而已,不是掉电保存状态 gbwaikp2011 发表于 2013-1-9 10:25 static/image/common/back.gif
受教了,自己做的东西还比较少,还希望今后能多跟您这样的牛人学习交流,谢了!看您积分挺高,相比您很厉 ...
哈哈,楼主连大名鼎鼎的喜羊羊前辈都不认识啊,绝对是论坛的高高手之一!!
喜羊羊说的那个掉电数据保存,我想到的就是检测市电电压,或者变压器之后的直流电压,然后阁一个二极管,二极管之后接大容量电容,然后才是给单片机系统供电,这样,当市电掉电时,二极管前面的电压会先于后面的电压降为0,也就是在MCU系统还在工作的时候,就可以检测到市电异常,及时做当前数据保护(现场保护??)偶了 lryxr2507 发表于 2013-1-9 13:26 static/image/common/back.gif
看见楼主挺辛苦和认真求知的份上顶一个,不过楼主还要继续深度理解哦,在实际中有很多是没有那么理想的,真正 ...
哇塞,小弟有眼不识泰山啊,登论坛比较少,现在知道喜羊羊前辈了!!! dudududu 发表于 2013-1-9 17:55 static/image/common/back.gif
哈哈,楼主连大名鼎鼎的喜羊羊前辈都不认识啊,绝对是论坛的高高手之一!!
喜羊羊说的那个掉电数据保存 ...
哇塞,小弟有眼不识泰山啊,登论坛比较少,现在知道喜羊羊前辈了!!! Tliang 发表于 2013-1-9 14:33 static/image/common/back.gif
恭喜楼主,给个24C系列的EEPROM资料给你看看。你就知道为什么有的是可以连续写8个有的可以连续写16个有的可 ...
非常感谢您!!!我这是第一次用,哈哈,谢谢您的资料啊!!! skynet 发表于 2013-1-9 10:22 static/image/common/back.gif
举例比如,电机当前的速度,电视机当前的台号,空调当前的温度.等等之类的.你不可能频繁的写EEPROM来保存,只能 ...
大师,小弟有眼不识泰山,冒犯了!抱歉啊!!! 搞一下模拟从机不就理解更深 。。。从不把I2C放眼里,当年用电脑并口跑I2C无比畅快,写过不知多少I2C器件,读过不知多少I2C器件,重力加速计,触摸屏,====,24C02写入速度不快,写一个字节必须得等待几个ms,否则就写不进去,这个。。。只能怪LZ手册不仔细看。手册里写的数据,按最长的跑时序,一点问题都不会有。想当年用并口时也没有说花几天时间整啊,程序编出来,加几个Sleep,效果马上就能看到啊。 wye11083 发表于 2013-1-9 18:59 static/image/common/back.gif
。。。从不把I2C放眼里,当年用电脑并口跑I2C无比畅快,写过不知多少I2C器件,读过不知多少I2C器件,重力加 ...
用页写,要不然太浪费时间。 gbwaikp2011 发表于 2013-1-9 10:17 static/image/common/back.gif
你自己去百度里边搜搜,你看看有多少人说的详细行不?24C02是eeprom,掉电保存数据,你难道不懂,要是连 ...
估计他的意思是,单片机掉电了,能不能及时把数据写到2402上…… 3htech 发表于 2013-1-10 08:34 static/image/common/back.gif
用页写,要不然太浪费时间。
字节写不过1秒而已。又不是写几百M的东西 wye11083 发表于 2013-1-10 12:57 static/image/common/back.gif
字节写不过1秒而已。又不是写几百M的东西
1s很长,看门狗应该要复位了。 很好的! 3htech 发表于 2013-1-10 14:38 static/image/common/back.gif
1s很长,看门狗应该要复位了。
不会的。最简单的办法,你可以把数据放到一个数组里,每循环一次检查一下标志位,如果空闲就写下一个字节。这样就相当于软中断。 I2C 不错的东西 看看咯!!! 支持楼主的钻研精神! hnqylgq 发表于 2013-1-12 21:43 static/image/common/back.gif
支持楼主的钻研精神!
谢谢!!!一起研究!!! 非常好,有用,谢谢分享。 不错,不错...菜鸟学习报道.. 非常好的资料 实际上你应该一开始就看数据手册。 skynet 发表于 2013-1-9 10:22 static/image/common/back.gif
举例比如,电机当前的速度,电视机当前的台号,空调当前的温度.等等之类的.你不可能频繁的写EEPROM来保存,只能 ...
STC的数据手册靠IO就可以检测,不知道有没有人实现? 楼主费的心思~ 厉害
不过我记得24C02跟 后面的 24C08 (还是 C16) 的时序还是有点不一样? 真心学习了~谢过lz 以前用过24LC256,实际上与24C02是基本上一样的,就是写地址时多写一个。用元件时看看数据手册还是很有好处的。 支持下!!!!!!! 呵呵,支持下lz http://www.amobbs.com/thread-5483488-1-1.html
顺带支持了24检测型号。 支持,非常好,灵活应用,解决问题就好。 单片机需要继续学习啊 mark!谢谢分享!{:lol:} 用过24C08,不过没有用到存储上限 刚好在找24C02读写的例程,
你这是先把数据1--256存入地址0--255.,然后在定时5器的控制下从地址0开始读取,送数码管显示,直到地址255。不知道理解对了没? 支持楼主,程序是自己调试出来的 必须顶。 1、24C02是2Kbits 意思是有2048bit,换算成字节是256Byte,也就是说最多可以存储255个字节的数据;
--------------------------------------------
错误呀,LZ{:titter:} 顶一个,楼主威武! 果然是高手 之前驱动起来过,到时没有真正的用过 MARK 24C02实例 先收藏再说 貌似在哪看见过程序。 这个就和郭天祥的程序一模一样嘛 学习一下 doujiang 发表于 2013-5-3 09:25
这个就和郭天祥的程序一模一样嘛
对有看过呀 I2C很多时候是比较麻烦,不如SPI的简单! 还不错哦 呵呵 没做过这方面的,不过应该蛮好玩的 可以参考一下~ 谢谢 顶一下好东西 mark{:lol:}{:lol:}{:lol:}{:lol:} divineliu 发表于 2013-5-3 09:49 static/image/common/back.gif
I2C很多时候是比较麻烦,不如SPI的简单!
但是IIC需要的引脚始终比SPI的少啊... Mark 31 mark 一下, 有用 恭喜楼主搞定了24C02 借资料一看哈,正在研究~{:smile:} 感谢楼主无私奉献,先收藏下来 好东西,mark一下 明天来看 学习了,哎,现在大部分人都学arm,fpga,linux……,,
现在发现弄一个强大稳定的系统才是真正需要学习的,
不能再浮躁了, 少掉的那个字节到哪里去了呢? 楼主不迷信权威不迷信网络的独立思考精神值得学习!
但是做为项目,要保存255字节,用24c02,如果是我的人这么干,是要挨骂的。万一客户需求有改变,多了一些字节怎么办?是刷一下程序还是把设备都拆回来换24c16? 要写24c02了,参考一下,谢谢LZ分享 谢谢 ;楼主学习了 qq335702318 发表于 2013-1-9 13:07
恭喜恭喜~~~想當年搞定24C02我都開心死了!
但是後面的困難還很多啊!!相比之下24C02只是一枚針而已。加油 ...
请问头像是谁? 感觉IIC的速度是使用存储芯片的关键 难道现在没有人学汇编了吗?{:shocked:} 学到了掉电存储的那个大电容。。。 学习了,楼主是个用心的人。
页:
[1]
2