redblack tree:谁有STC 的 EEPROM C程序

来源:百度文库 编辑:偶看新闻 时间:2024/05/06 16:46:58
51单片机学习论坛 » c51编程(单片机的c语言) » 谁有STC 的 EEPROM C程序 ‹‹ 上一主题 | 下一主题 ››
打印

谁有STC 的 EEPROM C程序

ayumi7

单片机高中生

  • 个人空间
  • 发短消息
  • 加为好友
  • 当前离线
1# 发表于 2009-12-23 13:49  只看该作者

谁有STC 的 EEPROM C程序

网上找的不能用

我要的效果是  有个数在变动 (变动后就存储) ,关电,    开机读出来。


谢谢
UID
91206 
帖子
171 
精华
积分
349 
阅读权限
50 
在线时间
32 小时 
注册时间
2009-5-23 
最后登录
2011-4-1 

查看详细资料

TOP

8051

管理员

版主

  • 个人空间
  • 发短消息
  • 加为好友
  • 当前离线
2# 发表于 2009-12-23 15:07  只看该作者 思路大概是每一段时间储存,过一段时间就替换。如果是注意这个时间不是太短, 应当 也不是太难。 不过储存器的寿命恐怕要考虑 新人报道注意事项:
1 给大家送一个见面礼, 比如自己收藏的程序代码资料等
2 如果有可能请认真回复5个贴子 活跃本论坛的气氛
3 不要发类似: 请给编一个***代码发到***邮箱的贴子,天下没有免费午餐
学林ihifi播放器即将上市
UID
15341 
帖子
9287 
精华
积分
14253 
阅读权限
200 
在线时间
338 小时 
注册时间
2006-9-5 
最后登录
2011-8-8 

查看详细资料

TOP

chen1986sl

版主

汇编入门,C学习中

  • 个人空间
  • 发短消息
  • 加为好友
  • 当前离线
3# 发表于 2009-12-23 17:52  只看该作者 STC的具体什么型号。因为04和12的 要写入的CMD不一样。

我先贴个 11F04E
//目标IC: STC-11F04E
//功能: EEPROM使用
//硬件:
//       P10-P12外接3个LED到正级


#include                           


sfr  IAP_DATA =   0xC2;
// 对对DATA FLASL/EEPROM读或者写的时候 数据全暂放的地方
sfr  IAP_ADDRH =   0xC3;
// 读写 地址的高8位
sfr  IAP_ADDRL =   0xC4;
// 读写 地址的底8位
sfr  IAP_CMD =   0xC5;
//命令模式寄存器
//0x00  待机模式
//0x01  对DATA FLASL/EEPROM 字节读
//0x02  对DATA FLASL/EEPROM 字节写
//0x03  对DATA FLASL/EEPROM 扇区搽

sfr  IAP_TRIG =   0xC6;
//命令触发寄存器
sfr  IAP_CONTR =   0xC7;
//IAP_CONTR.7  IPEN:读写功能允许为 1:允许  0:禁止
//IAP_CONTR.6  SWBS:。。。。。

  

#define uchar unsigned char
#define uint unsigned int

uchar  DATA;


sbit led1=P1^0;
sbit led2=P1^1;
sbit led3=P1^2;


void _delay_ms(uint time)
{
           uint sj;
    for(;time>0;time--)
            {
                   for(sj=115;sj>0;sj--);
            }
}


void  IAP_Disable()//关闭IAP
{
        IAP_CONTR=0;  //关闭IAP
        IAP_CMD=0;    //命令模式清0 可以不要
          IAP_TRIG=0;     //  可以不要
        IAP_ADDRH=0x80;   // 之向高地址 非EEPROM区域
        IAP_ADDRL=0x00;   //  防止误操作
}


uchar IAP_read(uchar  addr)       ///IAP 读 程序  //读addr地址的数据 返回
{
IAP_CONTR=0x82;//使能IAP 660个时钟的速度
IAP_CMD=0x01  ;//命令模式是扇区读
IAP_ADDRH = (uchar)(addr >> 8);   
IAP_ADDRL = (uchar)(addr & 0x00ff);   
EA=0;
IAP_TRIG=0X5A;
IAP_TRIG=0XA5;
_delay_ms(1);
EA=1;
IAP_Disable();  //关IAP
return (IAP_DATA); //读数据
}

void IAP_SectorErase(uchar addr)   ///IAP  察除 程序  //察除addr地址数据
{
IAP_CONTR=0x82;//使能IAP 660个时钟的速度
IAP_CMD=0x03  ;//命令模式是扇区搽除
IAP_ADDRH = (uchar)(addr >> 8);   
IAP_ADDRL = (uchar)(addr & 0x00ff);   
EA=0;
IAP_TRIG=0X5A;
IAP_TRIG=0XA5;
_delay_ms(1);
EA=1;
IAP_Disable();  //关IAP
}

void  IAP_Program(uint addr, uchar dat)    ///IAP 写 程序  在addr地址 写入 dat数据
{
IAP_CONTR=0x82;//使能IAP 660个时钟的速度
IAP_CMD=0x02  ;//命令模式是扇区写
IAP_ADDRH = (uchar)(addr >> 8);   
IAP_ADDRL = (uchar)(addr & 0x00ff);   
IAP_DATA=dat;// 写dat数据
EA=0;
IAP_TRIG=0X5A;
IAP_TRIG=0XA5;
_delay_ms(1);
EA=1;
IAP_Disable();  //关IAP
}

void  main()
{

IAP_SectorErase(0);///察除0地址内容
IAP_SectorErase(1);///察除0地址内容
IAP_SectorErase(2);///察除0地址内容

IAP_Program(0,0x56);  //在0 1 2地址写如2个数据
IAP_Program(1,0x66);
IAP_Program(2,0x76);


if(IAP_read(0)==0x56)   led3=0;  //读3个数据 用LED判断数据有错误没/
if(IAP_read(1)==0x66)   led2=0;
if(IAP_read(2)==0x76)   led1=0;

while(1);
} 同君一席话,胜读十年书。三人同行,必有我师,择其善者而从之,其不善者而改之。QQ:79733188(注明是搞电子的)-mail:chen1986sl_126.com
UID
5408 
帖子
323 
精华
积分
2055 
阅读权限
100 
在线时间
7 小时 
注册时间
2005-7-30 
最后登录
2010-8-7 

查看详细资料

TOP

chen1986sl

版主

汇编入门,C学习中

  • 个人空间
  • 发短消息
  • 加为好友
  • 当前离线
4# 发表于 2009-12-23 17:53  只看该作者 再上个125616(AD)

sfr  IAP_DATA =    0xe2;
sfr  IAP_ADDRH =   0xe3;
sfr  IAP_ADDRL =   0xe4;
sfr  IAP_CMD =     0xe5;
sfr  IAP_TRIG =    0xe6;
sfr  IAP_CONTR =   0xe7;













void _delay_ms(uint time)
{
           uint sj;
    for(;time>0;time--)
            {
                   for(sj=125;sj>0;sj--);
            }
}


void  IAP_Disable()//关闭IAP
{
        IAP_CONTR=0;  //关闭IAP
        IAP_CMD=0;    //命令模式清0 可以不要
          IAP_TRIG=0;     //  可以不要
        IAP_ADDRH=0x80;   // 之向高地址 非EEPROM区域
        IAP_ADDRL=0x00;   //  防止误操作
}


uchar IAP_read(uint  addr)       ///IAP 读 程序  //读addr地址的数据 返回
{
IAP_CONTR=0x82;//使能IAP 660个时钟的速度
IAP_CMD=0x01  ;//命令模式是扇区读
IAP_ADDRH = (uchar)(addr >> 8);   
IAP_ADDRL = (uchar)(addr & 0x00ff);   
EA=0;
IAP_TRIG=0X46;
IAP_TRIG=0Xb9;
_delay_ms(1);
EA=1;
IAP_Disable();  //关IAP
return (IAP_DATA); //读数据
}


void IAP_SectorErase(uint addr)   ///IAP  察除 程序  //察除addr地址数据
{
IAP_CONTR=0x82;//使能IAP 660个时钟的速度
IAP_CMD=0x03  ;//命令模式是扇区搽除
IAP_ADDRH = (uchar)(addr >> 8);   
IAP_ADDRL = (uchar)(addr & 0x00ff);   
EA=0;
IAP_TRIG=0X46;
IAP_TRIG=0Xb9;
_delay_ms(1);
EA=1;
IAP_Disable();  //关IAP
}

void  IAP_Program(uint addr, uchar dat)    ///IAP 写 程序  在addr地址 写入 dat数据
{
IAP_CONTR=0x82;//使能IAP 660个时钟的速度
IAP_CMD=0x02  ;//命令模式是扇区写
IAP_ADDRH = (uchar)(addr >> 8);   
IAP_ADDRL = (uchar)(addr & 0x00ff);   
IAP_DATA=dat;// 写dat数据
EA=0;
IAP_TRIG=0X46;
IAP_TRIG=0Xb9;
_delay_ms(1);
EA=1;
IAP_Disable();  //关IAP
} 同君一席话,胜读十年书。三人同行,必有我师,择其善者而从之,其不善者而改之。QQ:79733188(注明是搞电子的)-mail:chen1986sl_126.com
UID
5408 
帖子
323 
精华
积分
2055 
阅读权限
100 
在线时间
7 小时 
注册时间
2005-7-30 
最后登录
2010-8-7 

查看详细资料

TOP

chen1986sl

版主

汇编入门,C学习中

  • 个人空间
  • 发短消息
  • 加为好友
  • 当前离线
5# 发表于 2009-12-23 17:55  只看该作者 建议用809类的 MCU复位IC   来检测掉点,用外中断 来判断,家大电解电容来存储数据。

思路就这样,如果还有什么不清楚的  大家再讨论。 同君一席话,胜读十年书。三人同行,必有我师,择其善者而从之,其不善者而改之。QQ:79733188(注明是搞电子的)-mail:chen1986sl_126.com
UID
5408 
帖子
323 
精华
积分
2055 
阅读权限
100 
在线时间
7 小时 
注册时间
2005-7-30 
最后登录
2010-8-7 

查看详细资料

TOP

wanwei

单片机教授

投石问路

  • 个人空间
  • 发短消息
  • 加为好友
  • 当前离线
6# 发表于 2010-3-15 23:35  只看该作者 以上EEPROM操作经过实验 只能写入读出0~255,怎么回事 ※※※※※※※-----搞制作发烧不必退去-----※※※※※ ※※※※※※※-----做实验痴迷无须醒来-----※※※※※ zetao0815@163.com
UID
10763 
帖子
110 
精华
积分
1652 
阅读权限
90 
在线时间
0 小时 
注册时间
2006-4-21 
最后登录
2010-3-15 

查看详细资料

TOP

scxjun

单片机幼儿园

  • 个人空间
  • 发短消息
  • 加为好友
  • 当前离线
7# 发表于 2010-11-26 12:55  只看该作者 因为只有8位嘛,你要想大于255,那样分区多装几个地址
UID
119474 
帖子
39 
精华
积分
阅读权限
10 
在线时间
24 小时 
注册时间
2010-7-1 
最后登录
2011-5-27 

查看详细资料

TOP

jxr0345

单片机初中生

  • 个人空间
  • 发短消息
  • 加为好友
  • 当前离线
8# 发表于 2010-11-27 13:54  只看该作者 太好了,感谢