[原创] STC89C52RC内部EEPROM的操作

小硕硕   2015-7-30 09:52 楼主
玩单片机也很长时间了,我是以玩为乐趣,属于不求甚解的那种,所以时间长了也有了许多的电路板,但是哪个玩的也不精通,看到有新功能的总想去学学、去了解,看看是什么原理实现的,了解的差不多了就放一边去了,虽然是这样但是51单片机我始终还是放不下,有时间还是会拿起来玩玩。


想必现在玩STC89C52RC单片机的朋友是最多的吧!我呢只用STC89C52单片机驱动外设,比如LED,数码管,液晶和键盘,对显示器件情有独钟,还有那些AD、EEPROM神马的我都不玩的,就是懒的弄那些通讯总线神马的看到就,虽然手里有写好的头文件但也还是懒的调用,懒的分析。


在看EEPROM 24C04的时候觉得那种带有记忆的小实验好神奇啊,总想着自己什么时候也能写出一个来,可以自己实在是懒的看24C04的程序啊,什么通讯协议,页,扇区,地址,想想还是算了吧,我记得我曾经静心好好看了看那个程序,可惜还是没有看懂,不能理解程序的思路,于是乎就放弃了。



等会,扯了这么多,喝点水去      



书归正传,分享一个STC89C52RC EEPROM的程序,写之前要先擦除呦



  1. #include <reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. int show[]={0xff,0x00,0xff,0x00,
  6.                         0x81,0x42,0x24,0x18,
  7.                         0x24,0x42,0x81,0xff,
  8.                         0x80,0x40,0x20,0x10,
  9.                         0x08,0x04,0x02,0x01,
  10.                         0x02,0x04,0x08,0x10,
  11.                         0x20,0x40,0x80};

  12. delay(uint n)
  13. {
  14.         uint x,y;
  15.         for(x=n;x>0;x--)
  16.                 for(y=120;y>0;y--);                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
  17. }

  18. sfr isp_wdt=0xe1;
  19. sfr isp_data=0xe2;
  20. sfr isp_addrh=0xe3;
  21. sfr isp_addrl=0xe4;
  22. sfr isp_cmd=0xe5;
  23. sfr isp_trig=0xe6;
  24. sfr isp_contr=0xe7;

  25. //EEPROM扇区擦除程序
  26. void stc89cxx_eeprom_erase(uchar t_addr)
  27. {
  28.         isp_addrh=t_addr;//
  29.         isp_addrl=0;
  30.         EA=0;
  31.         isp_contr=0x81;
  32.         isp_cmd=3;
  33.         isp_trig=0x46;
  34.         isp_trig=0xb9;
  35.         _nop_();
  36.         _nop_();
  37.         isp_contr=0;
  38.         isp_cmd=0;
  39.         isp_trig=0;
  40.         isp_addrh=0;
  41.         isp_addrl=0;
  42.         EA=1;
  43. }

  44. //EEPROM字节写程序
  45. void stc89cxx_eeprom_char_write(uchar w_addr_h,uchar w_addr_l,uchar w_data)
  46. {
  47.         isp_data=w_data;
  48.         isp_addrh=w_addr_h;
  49.         isp_addrl=w_addr_l;
  50.         EA=0;
  51.         isp_contr=0x81;
  52.         isp_cmd=2;
  53.         isp_trig=0x46;
  54.         isp_trig=0xb9;
  55.         _nop_();
  56.         _nop_();
  57.         isp_contr=0;
  58.         isp_cmd=0;
  59.         isp_trig=0;
  60.         isp_addrh=0;
  61.         isp_addrl=0;
  62.         EA=1;
  63. }

  64. //EEPROM字节度程序
  65. stc89cxx_eepeom_char_read(uchar r_addr_h,uchar r_addr_l)
  66. {
  67.         uchar r_isp_data;
  68.         isp_addrh=r_addr_h;
  69.         isp_addrl=r_addr_l;
  70.         EA=0;
  71.         isp_contr=0x81;
  72.         isp_cmd=1;
  73.         isp_trig=0x46;
  74.         isp_trig=0xb9;
  75.         _nop_();
  76.         _nop_();
  77.         isp_contr=0;
  78.         isp_cmd=0;
  79.         isp_trig=0;
  80.         isp_addrh=0;
  81.         isp_addrl=0;
  82.         EA=1;
  83.         r_isp_data=isp_data;
  84.         return(r_isp_data);
  85. }

  86. init_rs232()
  87. {
  88.         SCON=0X50;
  89.         PCON=0X00;
  90.         TH1=0XF3;
  91.         TL1=0XF3;
  92.         TMOD=0X20;
  93.         TR1=1;

  94. }

  95. main()
  96. {
  97.         uint i;

  98.         init_rs232();

  99.         i=stc89cxx_eepeom_char_read(0x20,0x00);

  100.     delay(100);

  101.                 stc89cxx_eeprom_erase(0x20);

  102.         while(1)
  103.         {
  104.         for(;i<27;i++)
  105.                 {
  106.        
  107.         stc89cxx_eeprom_char_write(0x20,0x00,i);
  108.                 SBUF=i;
  109.                 delay(100);
  110.                 P0=show[i];       
  111.                 delay(800);       
  112.                  }
  113.         if(i==27)
  114.                 i=0;
  115.         }
  116.        
  117. }
360截图20150730095107130.bmp

回复评论 (18)

STC我之前写过一个,必须每次要清片,而且要整块整块清,很麻烦
科技改变生活
点赞  2015-7-30 10:08
不少单片机内部EEPROM都是要整页擦除才能写,对于只需要更改一个数据,操作起来很麻烦
点赞  2015-7-30 10:36
引用: 眼大5子 发表于 2015-7-30 10:08
STC我之前写过一个,必须每次要清片,而且要整块整块清,很麻烦

发帖之前没搜索,我的错了。。。。。。。。。。。。。。。
点赞  2015-7-30 11:10
作为技术从业人员必须严谨,商家的广告性词汇不应从工程师的口中或笔下出现。
注意利用FLASH程序存储器IAP功能实现的数据在线存储跟EEPROM的操作是截然不同的,虽然二者的目的一致。
上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
点赞  2015-7-30 11:26
引用: chunyang 发表于 2015-7-30 11:26
作为技术从业人员必须严谨,商家的广告性词汇不应从工程师的口中或笔下出现。
注意利用FLASH程序存储器IAP ...

哪儿有,我去删掉。。。
点赞  2015-7-30 12:24
引用: 小硕硕 发表于 2015-7-30 12:24
哪儿有,我去删掉。。。

还没明白?去弄清楚什么是EEPROM……
上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
点赞  2015-7-30 12:34
引用: chunyang 发表于 2015-7-30 12:34
还没明白?去弄清楚什么是EEPROM……

你在说什么啊。
点赞  2015-7-30 16:51


我第一次用手机发帖,此时不在电脑旁,受maylove管理员所托我来解释一下。
首先非常肯定版主的意思,作为一个技术人员要严谨用词,不可像商家一样为了吹捧自己产品而偷换概念。我也为楼主解释下版主的意思:这个STC单片机其实利用的是另外一种技术而把数据存储到flash而非真正意义上的eeprom,但是两者目的是一样的,版主希望楼主能够搞清楚这个概念,并非有怀疑楼主是商家的意思,楼主大可不必在意。当然经过跟管理员沟通得知楼主只是一个初学者,所以难免会有一些模糊概念,也希望版主在对知识的立场能予以谅解,更希望楼主也继续努力学习,彻底学精单片机。最后,天气热了,希望大家都能学习开心,工作快乐。凡事多沟通,不要一个人憋在心里。
点赞  2015-7-30 17:07
没必要那么较真吧… 既然内部存在flash储存器,那么可以省掉部分外置的EEPROM。又何乐而不为呢! 操作eeprom需要特定时序,如果将操作内部flash当成是操作eeprom,那么可能会混淆概念,今后真正使用eeprom时可能会带来麻烦。 本帖最后由 qiushenghua 于 2015-7-30 17:12 编辑
点赞  2015-7-30 17:08
引用: qiushenghua 发表于 2015-7-30 17:08
没必要那么较真吧…
既然内部存在flash储存器,那么可以省掉部分外置的EEPROM。又何乐而不为呢!
操作eep ...

工程师就应该较真。没说STC的方法不好,说的是工程师该正确、严谨的使用术语。
上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
点赞  2015-7-30 18:04
引用: 眼大5子 发表于 2015-7-30 17:07
我第一次用手机发帖,此时不在电脑旁,受maylove管理员所托我来解释一下。
首先非常肯定版主的意思,作 ...

说的不错,养成一个良好的严谨习惯对工程师至关重要。
上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
点赞  2015-7-30 18:10
引用: weizhongc 发表于 2015-7-30 16:51
你在说什么啊。

分不清MCU内置EEPROM和Flash程序存储器的区别,显然对MCU的基本结构缺乏了解,二者的操作方式有很大区别,在存储器组织上则是根本的不同。
上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
点赞  2015-7-30 18:13
这样的,很多单片机使用flash模拟eeprom,实现相同的功能,但flash要比eep慢些,这功能不算什么新鲜的sst早就有的,它实际上是在线编程的一种副产品.
纠正一点,写flash之前只要是擦过的就可以,并不是写前必须擦,擦除要比写入费的时间多.
你可以在初始化时准备好,一擦一块是必须的.
更深入一点的是你可以通过程序把某个位写成0而不必擦除,可以把1写成0而0变1必须用擦除指令,不信你试试.
点赞  2015-7-31 00:11
还有读的时候可以不用指令读,和51访问程序区一样的(某些型号除外).
点赞  2015-7-31 00:17
赞一个。。。。。。
点赞  2015-7-31 06:15
晓得了
点赞  2015-7-31 07:31
引用: huo_hu 发表于 2015-7-31 00:17
还有读的时候可以不用指令读,和51访问程序区一样的(某些型号除外).

这个厉害
点赞  2015-7-31 09:52
前用所谓的内部eeprom写入再读出正常,掉电数据就没了,也不知道什么情况
点赞  2015-7-31 09:54
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复