从数据存储类型来说8051系列有片內、片外程序存储器,片内、片外数据存储器片内程序存储器还分直接寻址区和间接寻址类型,分别对应code、data、xdata、idata以及根据51系列特点而设萣的pdata类型使用不同的存储器,将使程序执行效率不同在编写C51程序时,最好指定变量的存储类型这样将有利于提高程序执行效率(此问題将在后面专门讲述)。与ANSI-C稍有不同它只分SAMLL、COMPACT、LARGE模式,各种不同的模式对应不同的实际硬件系统也将有不同的编译结果。
data:固定指前面0x00-0x7f的128個RAM可以用acc直接读写的,速度最快生成的代码也最小。
idata:固定指前面0x00-0xff的256个RAM,其中前128和data的128完全相同只是因为访问的方式不同。idata是用类似C中的指针方式访问的汇编中的语句为:mox ACC,@Rx.(不重要的补充:c中idata做指针式的访问效果很好)
pdata:外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写用movx ACC,@Rx读写。這个比较特殊而且C51好象有对此BUG,建议少用但也有他的优点,具体用法属于中级问题这里不提。
code的作用是告诉单片机rom是指我定义的數据要放在ROM(程序存储区)里面,写入后就不能再更改其实是相当与汇编里面的寻址MOVX(好像是),因为C语言中没办法详细描述存入的是ROM还是RAM(寄存器)所以在软件中添加了这一个语句起到代替汇编指令的作用,对应的还有data是存入RAM的意思
程序可以简单的分为code(程序)区,和data (数据)区code区在运行的时候是不可以更改的,data区放全局变量和临时变量是要不断的改变的,cpu从code区读取指令对data区的数据进行运算处理,因此code区存储在什么介质上并不重要象以前的计算机程序存储在卡片上,code区也可以放在rom里面也可以放在ram里面,也可以放在flash里面(但是運行速度要慢很多主要读flash比读ram要费时间),因此一般的做法是要将程序放到flash里面然后load到ram里面运行的;DATA区就没有什么选择了,肯定要放在RAM裏面放到rom里面改动不了。
bdata如何使用它呢若程序需要8个或者更多的bit变量,如果你想一次性给8个变量赋值的话就不方便了(举个例子说說它的方便之处,想更深入的了解请在应用中自己琢磨)又不可以定义bit数组只有一个方法
64K常规片内外ROM代码区
普通51系列单片机rom是指存储空間资源分配情况:
下表是新型80C51单片机rom是指扩展空间的分配情况:
64K常规片内外ROM代码区 |