51单片机的代码解析_第1页
51单片机的代码解析_第2页
51单片机的代码解析_第3页
51单片机的代码解析_第4页
51单片机的代码解析_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

51单片机的代码解析今天在查看51单片机的代码时,发现了以下两行代码:unsignedcharcodedis_code[11]={0xc0,0xc0,0xa4,0xb0,//0,1,2,30x99,0x92,0x82,0xf8,0x80,0x90,0xff};//4,5,6,7,8,9,off这里的data和code到底是什么意思呢?经过上网查找,我终于明白了。在51单片机中,data指的是单片机内部自带的RAM空间,而xdata则指的是单片机外扩的RAM空间。pdata则是指单片机外扩RAM空间中的页面空间,每个页面的大小为256字节,页地址由P2口决定。而bit则是指RAM中的位寻址空间,其地址单元为0x20~0x7f。在51系列中,data、idata、xdata和pdata的区别如下:data:指的是前面0x00-0x7f的128个RAM,可以用acc直接读写,速度最快,生成的代码也最小。idata:指的是前面0x00-0xff的256个RAM,其中前128个与data的128个完全相同,只是因为访问方式不同。idata是用类似C中的指针方式访问的,汇编中的语句为:moxACC,@Rx。xdata:指的是外部扩展的RAM,一般指外部0x0000-0xffff空间,用DPTR访问。pdata:指的是外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写,用movxACC,@Rx读写。如果程序需要8个或更多的bit变量,可以使用bdata。例如,如果想一次性给8个变量赋值,就可以使用以下方法:charbdataMODE;sbitMODE_7=MODE^7;sbitMODE_6=MODE^6;sbitMODE_5=MODE^5;sbitMODE_4=MODE^4;sbitMODE_3=MODE^3;sbitMODE_2=MODE^2;sbitMODE_1=MODE^1;sbitMODE_0=MODE^0;这样就可以方便地定义8个bit变量了。下面是修改后的文章:我们可以通过定义8个bit变量MODE_n来定义Keilc的特殊数据类型。需要注意的是,一定要使用sbit而不是bit,例如sbitMODE_0=MODE^0;。在80C51单片机的内部数据存储器中,20H~2FH是位操作区域。每个位都有自己的位地址,可以对每个位进行位操作。位的地址空间为00H~07FH,共128位。20H的最低位为00H,2FH的最高位为7FH。对于字节地址能被8整除的特殊功能寄存器的每个位,也具有可寻址的位地址。其位地址从80H开始。特殊寄存器的地址和它的位的最低位位地址的数字相同。例如,P0口的地址是80H,那么P0口的最低位位地址也是80H。需要将地址和位地址分清楚,前者是P0口的地址,它有8位,每位有位地址。最低位的位地址是80H,次之是81H。它们在物理结构上是分开的。在C语言中,我们可以这样定义它们:bita,c,d;/*定义几个位变量*/ucharbdataput_1;/*在位寻址区域定义一个变量,而它的8位再分别定义一个标号*/sbitbuzzer=put_1^0;sbitled1=put_1^1;sbitled2=put_1^2;sbitled3=put_1^3;sbitled4=put_1^4;sbitrun=put_1^5;sbitup=put_1^6;sbitdown=put_1^7;sbitled=P1^1;/*定义P1口的1口为led*/在编程中,直接使用标号可以使编程更加方便。下面的表格显示了普通51系列单片机的存储空间资源分配情况:空间名称|地址范围-------------------------DATA|D:00H~7FHBDATA|D:20H~2FHIDATA|I:00H~FFHXDATA|X:0000H~FFFFHCODE|C:0000H~FFFFHB0~B31|BANK0~BANK31这些信息可以帮助大家查询。如果有问题,可以在评论或论坛中提出。单片机中data、idata、xdata和pdata这四个关键字的区别data关键字指的是前面0x00-0x7f的128个RAM,可以用acc直接读写,速度最快,生成的代码也最小。idata关键字指的是前面0x00-0xff的256个RAM,其中前128和data的128完全相同,只是因为访问的方式不同。idata是用类似C中的指针方式访问的,汇编中的语句为:moxACC,@Rx。xdata关键字指的是外部扩展RAM,一般指外部0x0000-0xffff空间,用DPTR访问。pdata关键字指的是外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写,用movxACC,@Rx读写。这个关键字比较特殊,而且C51好像有对此BUG,建议少用。但也有它的优点,具体用法属于中级问题,这里不再详述。startup.a51的作用和汇编一样,在C中定义的那些变量和数组的初始化就在startup.a51中进行。如果你在定义全局变量时带有数值,如unsignedchardataxxx="100",那startup.a51中就会有相关的赋值。如果没有=100,startup.a51就会把它清零。这些初始化完毕后,还会设置SP指针。对非变量区域,如堆栈区,将不会有赋值或清零动作。有人喜欢改startup.a51,为了满足自己一些想当然的爱好,这是不必要的,有可能错误的。比如,掉电保护的时候想保存一些变量,但改startup.a51来实现是很笨的方法,实际只要利用非变量区域的特性,定义一个指针变量指向堆栈低部:0xff处就可实现。为什么还要去改?可以这么说:任何时候都可以不需要改startup.a51,如果你明白它的特性。下面的图片展示了51单片机rom和ram的分配情况(2010.10.22更新)。一些新型的8051芯片使用地址扩展寄存器来扩展传统8051的代码和XDATA空间。下图展示了编程扩展型8051芯片所需的存储器类型。当使用LX51连接/定位器进行存储器换页时,这些存储器类型也可用于传统的8051芯片。除了BL51连接/定位器的代码换页,LX51连接/定位器还支持标准8051芯片的XDATA和代码区域的数据换页。存储器类型地址范围说明DATAD:00-D:7F可直接寻址的片内RAMBITD:20-D:2F可位寻址的RAM;使用位指令访问IDATA间接寻址的片内RAM;可以使用@R0或@R1访问I:00-I:FFXDATAX:0000-X:FFFF-64KBRAM(读/写访问)。使用MOVX指令访问-16MBRAM(读/写访问)。使用MOVX指令和HDATA扩展的DPTR访问CODEC:0000-C:FFFF-64KBROM(只读)。用于存储常量或可执行代码ECODEC:0000-C:FFFFFF-16MBROM(只读)。用于存储常量。在Dallas390架构的某些模式下也可能存储程序BANK0-BANK3B0:0000-B31:FFFF用于把程序存储器空间扩展到32×64KB注意:存储器前缀D:、I:、X:、C:、B0:、B31:不可用于Ax51汇编器或BL51连接/

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论