1、只要频频用到或对运算速度要求很高的变量才放到data区内,如for循环中的计数值。
2、其他不频频调用到和对运算速度要求不高的变量都放到xdata区。
3、常量放到code区,如字库、批改系数。
4、逻辑标志变量能够界说到bdata中。
在51系列芯片中有16个字节位寻址区bdata,其间能够界说8*16=128个逻辑变量。这样能够大大下降内存占用空间。界说办法是: bdata bit LedState;但位类型不能用在数组和结构体中。
5、data区内最好放局部变量。
由于局部变量的空间是能够掩盖的(某个函数的局部变量空间在退出该函数是就开释,由其他函数的局部变量掩盖),能够进步内存利用率。当然静态局部变量在外,其内存运用方法与全局变量相同;
6、保证程序中没有未调用的函数。
在Keil C里遇到未调用函数,编译器就将其以为可能是中止函数。函数里用的局部变量的空间是不开释,也便是同全局变量相同处理。这一点Keil做得很愚笨,但也没办法。
7、假如想节约data空间就有必要用large形式。
将未界说内存方位的变量全放到xdata区。当然最好对一切变量都要指定内存类型。
8、运用指针时,要指定指针指向的内存类型。
在C51中未界说指向内存类型的通用指针占用3个字节;而指定指向data区的指针只占1个字节;指定指向xdata区的指针占2个字节。如指针p是指向data区,则应界说为:
曾经没搞过C51,大学年代跟单片机教师的时分也是捣鼓下汇编,现在从头搞单片机,由于手头材料不多,找到一些C51的程序,发现里边有这些关键字,不甚明晰,没办法只好找了下,发现如下描绘:
从数据存储类型来说,8051系列有片内、片外程序存储器,片内、片外数据存储器,片内程序存储器还分直接寻址区和直接寻址类型,别离对应code、data、xdata、idata以及依据51系列特色而设定的pdata类型,运用不同的存储器,将使程序履行功率不同,在编写C51程序时,最好指定变量的存储类型,这样将有利于进步程序履行功率(此问题将在后边专门叙述)。与ANSI-C稍有不同,它只分SAMLL、COMPACT、LARGE形式,各种不同的形式对应不同的实践硬件体系,也将有不同的编译成果。
在51系列中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,主张少用。但也有他的长处,详细用法归于中级问题,这儿不提。
三、有关单片机ALE引脚的问题
“单片机不拜访外部锁存器时ALE端有正脉冲信号输出,此频率约为时钟振动频率的1/6.每逢拜访
外部数据存储器是,在两个机器周期中ALE只呈现一次,即丢掉一个ALE脉冲.”这句话是不是有毛
病.我觉得按这种说法,应该丢掉3个ALE脉冲才对,我一向想不通是怎么回事,期望大虾们帮帮我.
小弟感激涕零.
答:
其他一切指令每6个机器周期宣布一个ALE,而MOVX指令占用12个机器周期只宣布一个ALE
四、怎么将一个INT型数据转换成2个CHAR型数据?
经keil优化后,char1=int1/256,char2=int1%6或char1=int1>>8,char2=int1&0x00ff功率是相同的。
五、在KEIL C51上仿真完了,怎样生成HEX文件去烧写??
右键点项目中Target 1,选第二个,在OUTPUT中选中CREAT HEX
六、typedef 和 #define 有何不同??
typedef 和 #define 有何不同》》》 如
typedef unsigned char UCHAR ;
#define unsigned char UCHAR ;
typedef命名一个新的数据类型,但实践上这个新的数据类型是现已存在的,只不过是界说了
一个新的姓名.
#define仅仅一个标号的界说.
你举的比如两者没有差异,可是#define还能够这样用
#define MAX 100
#define FUN(x) 100-(x)
#define LABEL
等等,这些情况下是不能用typedef界说的
七、请问怎么设定KELC51的仿真作业频(时钟)
用右键点击左面的的target 1,然后在xtal一栏输入
八、不同模块怎样同享sbit变量,extern不行?
把SBIT界说独自放到一个.H中,每个模块都包括这个.h文件
九、C51中关于Px.x的拜访有必要自己界说吗?
是的。
如sbit P17 = 0x97;即可界说对P1.7的拜访
十、SWITCH( )句子中表达式不能够是位变量对吗?
能够用位变量:
#include
#include
void main()
{
bit flag;
flag=0;
switch(flag)
{
case 0:{printf(“0n”);break;}
case 1:{printf(“1n”);break;}
default:break;
}
}
bit 变量只要两种状况,if 句子满足啦,!!!
十一、const常数声明占不占内存???
const 仅仅用来界说“常量”,所占用空间与你的界说有关,如:
const code cstStr[] = {“abc”};
占用代码空间;而如:
const char data cstStr[] = {“abc”};
当然占用内存空间。
别的,#define 之界说好像不占用空间。
十二、philips的单片机P89C51RD+的扩展RAM在C51中怎么运用?
试一试将auxr.1清0,然后在c言语中直接声明xdata类型的变量
十三、BUG of Keil C51
程序顶用如下句子:
const unsigned char strArr[] = {“数学”};
成果发现strArr[] 内容为 {0xCA,0xD1,0xA7},真古怪!