AT89S51 和 AT89S52的区别

   在印象中,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,也可以节省一些内存。

This entry was posted in 从初学者到电子工程师. Bookmark the permalink.

5 Responses to AT89S51 和 AT89S52的区别

  1. lookyour says:

    习惯上 如果没有条件扩flash 有些程序段 干脆用汇编写 更省一些

  2. Apache says:

    朕汇编不熟………..

  3. 苗苗 says:

    我是一名大学生 ,上面的情况我也深有体会,他说的很好,我感觉是这样

  4. 学习 says:

    说的很精彩 Good!!!

  5. 单后东 says:

    学习

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word