51单片机编程在不同内存空间(data xdata bdata)定义变量的注意事项

发布者:电子艺术大师最新更新时间:2024-05-06 来源: elecfans关键字:51单片机  编程  内存空间  定义变量 手机看文章 扫描二维码
随时随地手机看文章

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,不是很清楚,因为在微机的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单片机  编程  内存空间  定义变量 引用地址:51单片机编程在不同内存空间(data xdata bdata)定义变量的注意事项

上一篇:单片机 C语音开发 sbit使用方法··
下一篇:3x3矩阵键盘扫描原理及扫描程序

推荐阅读最新更新时间:2024-11-10 11:41

89C51单片机之红外通信 ----自学笔记
一、概述 常见的红外线遥控器:空调遥控器,电视机遥控器。 1.1、什么是红外线 人眼可见光按波长从长到短排列,依次为:红、橙、黄、绿、青、蓝、紫。 红光的波长范围为0.62~0.76um(微米)。 紫光的波长范围位0.38~0.46um(微米) 。 1米(m)=1000000微米(um) 比紫光波长还短的叫紫外线。 比红光波还长的叫红外线。 红外线遥控就是利用波长位0.76~1.5um(微米)之间的近红外线来传送控制信号的。 1.2、红外系统的组成 红外系统的组成:红外发射装置和红外接收设备两大部分组成。 红外发射装置的组成:由键盘电路、红外编码芯片、电源和红外发射电路组成。 红外接收设备的组成:红外接收电路、红外解
[单片机]
89C<font color='red'>51单片机</font>之红外通信 ----自学笔记
51单片机做32路流水灯程序
用51单片机做的超级32路流水灯程序 下面是实物图片: 源代码下载地址: http://www.51hei.com/f/ts24.rar #include reg51.h #include intrins.h #define ushort unsigned short //P0,P1,P2,P3数据类型是 unsigned short ;数值范围 :0~~~~65 635 #define uint unsigned int ushort code display_P0 ={ //P0 口显示内容 0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,
[单片机]
<font color='red'>51单片机</font>做32路流水灯程序
MCS51单片机的排序程序(ASM源代码)
MCS51单片机的排序程序(ASM源代码) ;内部RAM数据排序程序(升序) ;入口 :R0(起始地址),N(数据个数) ;占用资源:ACC,B,R5,R6,R7 ;堆栈需求:2字节 ;出口 :R0 ISELSORT :MOV R7,N DEC R7 ISST1 :MOV A,R7 MOV R6,A MOV A,R0 MOV R1,A MOV R2,A MOV B,@R1 ISST2 :INC R1 MOV A,@R1 CLR C SUBB A,B JC ISST3 MOV A,R
[单片机]
基于51单片机的自行车测速测距程序
实物图如下: 电路原理图如下: 单片机源程序如下: #include reg52.h #include Star1602.h #define CIRCLE 2.0 //宏定义 车轮的周长(这个要根据实际的车轮进行设置) sbit Signal = P1^0; //这里的Signal表示的是霍尔传感器的信号引脚 int m_second=0; //定义变量m_second,用来记录时间(以毫秒为单位) float speed=0.0 ; //定义速度变量 float length=0.0 ;//定义路程变量 void main() { lcd_init(); //初始化液晶函数 TMOD = 0x01; //
[单片机]
基于<font color='red'>51单片机</font>的自行车测速测距程序
STM32F1_片内FLASH编程
前言 今天总结“STM32F103 片内FLASH编程”,对于学习编程的人来说“FLASH”这个词肯定很熟悉,因为FLASH主要用于存储数据。对于STM32来说,内部FLASH的容量有大有小,从16K到2M不等,主要看芯片的型号。 对于刚从51或者430转入学习ARM-Cortex M芯片的人来说,可能只知道内部FLASH是拿来装载程序的,事实上Cortex M芯片内部FLASH的可以拿来编程的,而且还可以像外部FLASH一样存储数据。对,今天提供的工程就是使用内部FLASH像外部FLASH一样读写数据,而且不是块或者页编程(即不覆盖临近地址数据)。 在实际的开发中,内部FLASH存储数据也是很重要的一点,特别是一些不常修
[单片机]
STM32F1_片内FLASH<font color='red'>编程</font>
DS1302时钟汇编程序数码管显示时间
数码管用2个573接到p0口,电路详见单片机开发板的原理图:http://www.51hei.com/f/HL-1V6.5.pdf 段选是p0口控制的,位选是P2口控制的.;===============DS1302================== CLK EQU P1.4 RST EQU P1.0 ;1302定义引脚 IO EQU P1.2 ORG 00H JMP MAIN ;======================================= MAIN: MOV P0,#0FFH MOV P1,#0FFH MOV P2,#0FFH MOV P3
[单片机]
学习51单片机有关晶振的问题总结
  今天笔者把自己当年学习51单片机有关晶振的问题一并总结出来,希望对初学51的童鞋来说能有帮助。   一、为什么51单片机爱用11.0592MHZ晶振?   其一:因为它能够准确地划分成时钟频率,与UART(通用异步接收器/发送器)量常见的波特率相关。特别是较高的波特率(19600,19200),不管多么古怪的值,这些晶振都是准确,常被使用的。   其二:用11.0592晶振的原因是51单片机的定时器导致的。用51单片机的定时器做波特率发生器时,如果用11.0592Mhz的晶振,根据公式算下来需要定时器设置的值都是整数;如果用12Mhz晶振,则波特率都是有偏差的,比如9600,用定时器取0XFD,实际波特率10000,一般波特
[单片机]
51单片机学习总结系列(0)之单片机最小系统
学习51单片机接近两年了,最近总结一下51单片机学习,加上明年3月报了蓝桥杯大赛单片机类,也算是对比赛的准备。后续主要以蓝桥杯配的板子CT107D更新,还会加上平时遇到板子的模块以及自己做的一些小项目,每周保持更新,如果以下内容有问题,欢迎指正。(782373034@qq.com) 对于一个初学者来说,我个人认为第一个要了解的就是单片机最小系统,任何开发板也是在此基础上外加一系列外围电路模块。所以足以说明它的重要性。 下面先贴出51单片机最小系统图。 如图中所示,51单片机最小系统包括复位电路、时钟电路、EA拉高。图中P0口接了一个10K上拉电阻,主要是P0口驱动能力比较弱。下面分析最小系统各个部分。 时钟电路:单
[单片机]
<font color='red'>51单片机</font>学习总结系列(0)之单片机最小系统
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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