51单片机data,bdata,idata,xdata使用注意事项

发布者:science56最新更新时间:2024-08-19 来源: cnblogs关键字:51单片机  data  bdata  idata  xdata  注意事项 手机看文章 扫描二维码
随时随地手机看文章

1、data区空间小,所以只有频繁用到或对运算速度要求很高的变量才放到data区内,比如for循环中的计数值。

2、data区内最好放局部变量。

因为局部变量的空间是可以覆盖的(某个函数的局部变量空间在退出该函数是就释放,由别的函数的局部变量覆盖),可以提高内存利用率。当然静态局部变量除外,其内存使用方式与全局变量相同;

3、确保你的程序中没有未调用的函数。

在keil c里遇到未调用函数,编译器就将其认为可能是中断函数。函数里用的局部变量的空间是不释放,也就是同全局变量一样处理。这一点keil c做得很愚蠢,但也没办法。

4、程序中遇到的逻辑标志变量可以定义到bdata中,可以大大降低内存占用空间。

在51系列芯片中有16个字节位寻址区bdata,其中可以定义8*16=128个逻辑变量。定义方法是:bdatabit ledstate;但位类型不能用在数组和结构体中。

5、其他不频繁用到和对运算速度要求不高的变量都放到xdata区。

6、如果想节省data空间就必须用large模式,将未定义内存位置的变量全放到xdata区。当然最好对所有变量都要指定内存类型。

7、当使用到指针时,要指定指针指向的内存类型。

在c51中未定义指向内存类型的通用指针占用3个字节;而指定指向data区的指针只占1个字节;指定指向xdata区的指针占2个字节。如指针p是指向data区,则应定义为:char data *p;。还可指定指针本身的存放内存类型,如:char data * xdata p;。其含义是指针p指向data区变量,而其本身存放在xdata区。

单片机初学者一般对c51语言里的data,xdata,bdata,idata,code,不是很清楚,因为在微

 

此文来自: 马开东博客 转载请注明出处 网址: http://www.makaidong.com

机的c语言里根本没有这些东西,一下子出来难以让人接受,特别是没有硬件基本的朋友们.这也是写程序的时候经常犯错误的地方。请看下表 
普通51系列单片机存储空间资源分配情况

空间名称

地址范围

说明

datad:00h~7fh片内ram直接寻址区
bdatad:20h~2fh片内ram位寻址区
idatai:00h~ffh片内ram间接寻址区
xdatax:0000h~ffffh64k片外ram数据区
codec:0000h~ffffh64k片内外rom代码区
bank0~bank31b0:0000h~ffffh
:
:
b31:0000h~ffffh
分组代码区,最大可扩展32x64kb rom






下表是新型80c51单片机扩展空间的分配情况

空间名称

地址范围

说明

datad:00h~7fh片内ram直接寻址区
bdatad:20h~2fh片内ram位寻址区
idatai:00h~ffh片内ram间接寻址区
xdatax:0000h~ffffh64kb常规片外ram数据区
hdatax:0000h~ffffffh16mb扩展片外ram数据区
codec:0000h~ffffh64k常规片内外rom代码区
hconst(ecode)c:0000h~ffffffh16mb扩展片外rom常数区(对dallas390可用作代码区)
bank0~bank31b0:0000h~ffffh
:
:
b31:0000h~ffffh
分组代码区,最大可扩展32x64kb rom



单片机中关键字data,idata,xdata,pdata的区别data:
固定指前面0x00-0x7f的128个ram,可以用acc直接读写的,速度最快,生成的代码也最小。

idata:
固定指前面0x00-0xff的256个ram,其中前128和data的128完全相同,只是因为访问的方式不同。idata是用类似c中的指针方式访问的。汇编中的语句为:mox acc,@rx.(不重要的补充:c中idata做指针式的访问效果很好)

xdata:
外 部扩展ram,一般指外部0x0000-0xffff空间,用dptr访问。 pdata:外部扩展ram的低256个字节,地址出现在a0-a7的上时读写,用movx acc,@rx读写。这个比较特殊,而且c51好象有对此bug, 建议少用。但也有他的优点,具体用法属于中级问题,这里不提。

startup.a51的作用
和 汇编一样,在c中定义的那些变量和数组的初始化就在startup.a51中进行,如果你在定义全局变量时带有数值,如unsigned char data xxx='100

 


关键字:51单片机  data  bdata  idata  xdata  注意事项 引用地址:51单片机data,bdata,idata,xdata使用注意事项

上一篇:C51中断函数的写法
下一篇:单片机keil C中的data、bdata、idata、xdata、hdata、pdata、code解释

推荐阅读最新更新时间:2024-11-09 20:30

51单片机】 数据管显示HELLO
软件准备+硬件准备 软件: 1.Keil软件v6.12(与书中版本保持一致方便学习,如果喜欢别的版本也可以下载别的) 2. STC-ISP(将十六进制代码写到单片机上) 硬件:TX-1C(书本推荐,并非本人广告) 【学习单片机,你起码得有块单片机的板子吧…也不一定是自己的,借别人的也可以】 HELLO.程序 #include reg52.h #define uchar unsigned char #define uint unsigned int sbit dula=P2^6; //申明U1锁存器的锁存端 sbit wela=P2^7; //申明U2锁存器的锁
[单片机]
【<font color='red'>51单片机</font>】 数据管显示HELLO
气体腰轮流量计安装要求及注意事项
  气体腰轮流量计安装   1、气体腰轮流量计的安装有两种方法,即水平安装和垂直安装(建议釆用垂直安装)。当流量计垂直安装时,介质进口端需在上方,气流由上向下流动,这样安装使得转子对脏物具有自清洁能力;而在水平安装时,流量计进出口端轴线不得低于管道轴线,以免介质中的脏污杂质滞留于流量计的计量室内,影响正常转速。   2、安装时,在流量计上游必须配置过滤器或者过滤网(120-200目),以改善介质的纯净度。   气体腰轮流量计安装注意事项   1、严禁流量计在线焊接管道法兰。   2、安装流量计前必须清除管道中的杂质(垂直安装时应特别注意清除流量计前弯头内的杂 质),避免异物进入而损坏流量计,管道上的内壁应清洁无积垢。   3、
[测试测量]
利用2051单片机烧录24C02,04,08,16
SCL BIT P3.2;EEPROM母片 SDA BIT P3.3 SCL1 BIT P1.2;写入目标EEPROM SDA1 BIT P1.3 ORG 0000H LJMP A1 ORG 002BH A1: MOV P0,#0FFH MOV P1,#0FFH MOV P2,#0FFH MOV P3,#0FFH A2: CLR P1.7;烧录成功指示灯 SETB P3.7;烧录失败指示灯 JB P1.6,$;烧录按键 LCALL M001 JNB P1.6,$ CLR P1.7;烧录时同时亮 CLR P3.7;烧录时同时亮 MOV 39H,#0A0H;写第一页 MOV 38H,#0A1H;读第一页 MOV 37H,#1;总页数
[单片机]
51单片机(AT89C52)A/D转换
#include reg52.h #define uchar unsigned char #define uint unsigned int #define PORT P3 #define dula_h P2|=0x40 #define dula_l P2&=0xbf #define wela_h P2|=0x80 #define wela_l P2&=0x7f sbit cs=P2^0; sbit rd=P2^1; sbit wr=P2^2; uchar read; uchar table ={ //共阳数码管 0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0
[单片机]
<font color='red'>51单片机</font>(AT89C52)A/D转换
第2章 MCS-51单片机的结构与原理
2.1 MCS-51单片机的硬件功能 2.2 MCS-51硬件系统结构 2.3 存储器结构 2.4 I/O端口 2.5 复位电路 2.6 CPU时序 2.7 CPU引脚功能 2.8 单片机的工作方式 2.8.1 复位方式 2.8.2 程序执行方式 单步执行方式 连续执行方式 2.8.3 节电方式 待机方式 掉电保护方式 2.8.4 EPROM的编程和校验方式 8051单片机的主要功能方框图 共性: 一个8位CPU; 片内振荡和定时电路; 128B内部RAM(00H~7FH); 4个8位并行I/O口; 2个16位可编程定时/计数器; 一个全双工串行口; 5个中断源(可编程为两个优先级); 22个SFR(除
[单片机]
51单片机学习笔记:DS18B20测温程序
C代码 #include my51.h #include smg.h #include ds18b20.h void main() //测试 ,6位数码管显示温度值 { u8 i=0; u16 temp=0; while(1) { temp=ds18b20_readTemperaData(); for(i=0;i 100;i++) { displaySMG(ds18b20_processTempData(temp)); } } } C代码 #if
[单片机]
<font color='red'>51单片机</font>学习笔记:DS18B20测温程序
Keil C51对C语言的关键词扩展之十一: xdata
xdata声明的变量位于外部ram 64KB地址范围内某一位置。 程序示例: unsigned int xdata m=0; /* 声明一个全局变量,可位于外部ram 64KB地址范围内任意位置,由编译器决定 */ int main(void) { ...... }
[单片机]
TI 54xx DSP与51单片机的接口技术
1 硬件设计    1.1 时序匹配     HPI8总共有18根信号线。其中数据线8根(HD0~HD7),其余10根都是控制线,如表1所列 ①HAS:在数据线和地址复用的MCU中,与ALE信号连接,在下降沿锁存HBIL、HCNTL0/1、HR/W,因数这些信号通常与地址线连接。如果MCU的数据线和地址线没有复用,则应该接高电平。    ②HDS1、HDS2:数据传输的时序控制。时序见图1,即下降沿传输开始,上升沿传输结束。另外如果不使用HAS(即接高电平),也可以配合HCS对HBIL、HCNTL0/1、HR/W进行锁存。    ③HCNTL0/:选择HPI内部寄
[单片机]
TI 54xx DSP与<font color='red'>51单片机</font>的接口技术
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved