您的位置 首页 方案

C51学习心得

1、只有频繁用到或对运算速度要求很高的变量才放到data区内,如for循环中的计数值。2、其他不频繁调用到和对运算速度要求不高的变量都放到x

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区,则应界说为:char data *p;。还可指定指针自身的寄存内存类型,如:char data * xdata p;。其意义是指针p指向data区变量,而其自身寄存在xdata区。

曾经没搞过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},真古怪!

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/257938.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部