Chinaunix首页 | 论坛 | 博客
  • 博客访问: 370333
  • 博文数量: 66
  • 博客积分: 3201
  • 博客等级: 中校
  • 技术积分: 695
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-04 11:17
文章分类

全部博文(66)

文章存档

2016年(1)

2014年(1)

2012年(1)

2011年(2)

2010年(18)

2009年(42)

2008年(1)

分类:

2009-09-01 11:52:09

AT89S51 和 AT89S52的区别

http://blog.csdn.net/gmcxsqjh/archive/2009/01/06/3719787.aspx

   在印象中,S51 和 S52的区别不太大,正是由于平常的不仔细,在后面的开发中遇到了问题,记忆深刻,特意把一些经验记录下来,希望能给需要的人一些帮助。

      前些日子,朋友有几台基于89S51的设备需要维修,实际上就是MCU坏掉了,由于厂家已经不给维护,只能重写全部程序,在对设备的硬件仔细研究之后,我开始动手了。

      由于当时手头没有PLCC封装的89S51 ,就用 89S52 替代,毕竟硬件外围电路上,89S51 和S52 是没有区别的(也可能有,但我还没发现,呵呵)。没多长时间,程序开发调试完成。于是买来几块89S51,准备编译一下,问题出现了,首先出现错误提示:

ADDRESS SPACE OVERFLOW XXXX

经Google得到,原来89S51 的 内存只有 128字节 而89S52内存有 256 字节,明显是内存不够用了,经过优化减少全局变量,Data=110.4 bytes 已经少于 128字节,编译成功,烧写。

         芯片装到设备上,出现了跑飞的情况,原以为是程序逻辑的问题,经过仔细查找没发现错误的地方,但程序仍然跑飞,很奇怪。

         再Google ,发现:虽然89S51 有 128 字节的内存,但不能全部给全局变量使用,需要预留20~30字节给堆栈使用,否则程序当然会跑飞。

         反复查看代码,发现程序中有一些常量,但仍然放在内存中,比如:

char a[]={'a','b','c','d'};

偶尔发现别人的代码中有这种形式的定义:

char code a[]={'a',b','c','d'};

原来,常量可以放在程序Rom里,于是将一些程序中不需要变化的变量(其实就是常量哈)全部修改为char code  a;的形式,烧写,调试,以前跑飞的情况终于解决了。

另外,对于只使用正值的char 可以修改为 unsigned char,也可以节省一些内存。

阅读(750) | 评论(0) | 转发(0) |
0

上一篇:模拟电路复习要点

下一篇:几张图备忘

给主人留下些什么吧!~~