<meta name="keywords" content="必胜时时彩开户,keywords" /> 第五课 C51变量 联系我们

第五课 C51变量

  上课所提到变量就是一种在法式模范模范推行历程当中其值能赓续变换的量。要在法式模范模范中应用变量必须先用标识符作为变量名,并指出所用的数据类型和存储形式,这样编译系统才干为变量分配照顾的存储空间。界说一个变量的名堂以下:
    [存储种类] 数据类型 [存储器类型] 变量名表
  在界说名堂中除数据类型和变量名表是须要的,其它都是可选项。存储种类有四种:自动(auto),外部(extern),静态(static)和存放器(register),缺省类型为自动(auto)。这些存储种类的详细寄义和应用措施,将在第七课《变量的存储》中进一步阻拦学习。
  而这里的数据类型则是和我们在第四课中学习到的名种数据类型的界说是一样的。说清晰了了一个变量的数据类型后,还可选择诠释该变量的存储器类型。存储器类型的诠释就是指定该变量在单片机c语言硬件系统中所应用的存储区域,并在编译时准确的定位。表6-1中是KEIL uVision2所能认别的存储器类型。重视的是在AT89c51芯片中RAM只需低128位,位于80H到FFH的高128位则在52芯片中才有用,并和特殊存放器地址堆叠。特殊存放器(SFR)的地址表请看附录二 AT89c51特殊功效存放器列表

表6-1 存储器类型

存储器类型

说 明

data

直接会见外部数据存储器(128字节),会见速率最快

bdata

可位寻址外部数据存储器(16字节),允许位与字节混淆会见

idata

直接会见外部数据存储器(256字节),允许会见一切外部地址

pdata

分页会见外部数据存储器(256字节),用MOVX @Ri指令会见

xdata

外部数据存储器(64KB),用MOVX @DPTR指令会见

code

法式模范模范存储器(64KB),用MOVC @A+DPTR指令会见

 


  假定省略存储器类型,系统则会按编译形式SMALL,COMPACT或LARGE所划定的默许存储器类型去指定变量的存储区域。岂论甚么存储形式都能声明变量在任何的8051存储区规模,可是把最经常应用的敕令如循环计数器和行列索引放在外部数据区能显着的前进系统性能。尚有要指出的就是变量的存储种类与存储器类型是完全有关的。

. 数据存储形式
存储形式决议了没有明确指定存储类型的变量,函数参数等的缺省存储区域,共三种:
1. 1. Small形式
所有缺省变量参数均装入外部RAM,优点是会见速率快,弱点是空间无限,只适用于小法式模范模范。
2. 2. Compact形式
所有缺省变量均位于外部RAM区的一页(256Bytes),详细哪一页可由P2口指定,在STARTUP.A51文件中诠释,也可用pdata指定,优点是空间较Small为裕如速率较Small慢,较large要快,是一种中央状态。
3. 3. large形式
所有缺省变量可放在多达64KB的外部RAM区,优点是空间年夜,可存变量多,弱点是速率较慢。
提醒:存储形式在单片机c语言编译器选项被选择。

  之条件到质朴提到sfr,sfr16,sbit界说变量的措施,下面我们再来仔细看看。
  sfr和sfr16能直接对51单片机的特殊存放器阻拦界说,界说措施以下:
    sfr 特殊功效存放器名= 特殊功效存放器地址常数;
    sfr16 特殊功效存放器名= 特殊功效存放器地址常数;
  我们能这样界说AT89c51的P1口
    sfr P1 = 0x90; //界说P1 I/O口,其地址90H
  sfr要害定前面是一个要界说的名字,可随便任性拔取,但要切合标识符的命名规则,名字最好有一定的寄义如P1口能用P1为名,这样法式模范模范会变的好读许多若干许多几何。等号前面必须是常数,禁绝可有带运算符的表达式,而且该常数必须在特殊功效存放器的地址规模以内(80H-FFH),详细可检查附录中的相关表。sfr是界说8位的特殊功效存放器而sfr16则是用来界说16位特殊功效存放器,如8052的T2准时器,能界说为:
    sfr16 T2 = 0xCC; //这里界说8052准时器2,地址为T2L=CCH,T2H=CDH
用sfr16界说16位特殊功效存放器时,等号前面是它的低位地址,高位地址一定要位于物理低位地址之上。重视的是不克不及用于准时器0和1的界说。
  sbit可界说可位寻址工具。如会见特殊功效存放器中的某位。着实这样应用是经常要用的如要会见P1口中的第2个引脚P1.1。我们能照以下的措施去界说:
(1)sbit 位变量名=位地址
  sbit P1_1 = Ox91;
这样是把位的相对地址赋给位变量。同sfr一样sbit的位地址必须位于80H-FFH之间。
(2)Sbit 位变量名=特殊功效存放器名^位职位
sft P1 = 0x90;
  sbit P1_1 = P1 ^ 1; //先界说一个特殊功效存放器名再指定位变量名所在的职位
当可寻址位位于特殊功效存放器中时可接纳这类措施
(3)sbit 位变量名=字节地址^位职位
  sbit P1_1 = 0x90 ^ 1;
  这类措施着实和2是一样的,只是把特殊功效存放器的位址直接用常数体现。
  在单片机c语言存储器类型中供应有一个bdata的存储器类型,这个是指可位寻址的数据存储器,位于单片机的可位寻址区中,能将请求可位录址的数据界说为bdata,如:
unsigned char bdata ib; //在可位录址区界说ucsigned char类型的变量ib
int bdata ab[2]; //在可位寻址区界说数组ab[2],这些也称为可寻址位工具
sbit ib7=ib^7 //用要害字sbit界说位变量来自力会见可寻址位工具的其中一名
sbit ab12=ab[1]^12;
  操作符"^"前面的位职位的最年夜值取决于指定的基址类型,char0-7,int0-15,long0-31。
下面我们用上一课的电路来现实一下这一课的知识。异常是做一下质朴的赛马灯实验,项目名为RunLED2。法式模范模范以下:

sfr P1 = 0x90; //这里没有应用预界说文件,
sbit P1_0 = P1 ^ 0; //而是自己界说特殊存放器
sbit P1_7 = 0x90 ^ 7; //之前我们应用的预界说文件着实就是这个作用
sbit P1_1 = 0x91; //这里划分界说P1端口和P10,P11,P17引脚

void main(void)
{
unsigned int a;
unsigned char b;
do{
for (a=0;a<50000;a++)
P1_0 = 0; //点亮P1_0
for (a=0;a<50000;a++)
P1_7 = 0; //点亮P1_7
for (b=0;b<255;b++)
{
for (a=0;a<10000;a++)
P1 = b; //用b的值来做赛马灯的名堂
}
P1 = 255; //熄灭P1上的LED
for (b=0;b<255;b++)
{
for (a=0;a<10000;a++) //P1_1闪灼
P1_1 = 0;
for (a=0;a<10000;a++)
P1_1 = 1;
}
}while(1);
}

 

. Keil c51指针变量
单片机c语言支持浅易指针(Generic Pointer)和存储器指针(Memory_Specific Pointer).
1. 1. 浅易指针
浅易指针的声明和应用均与尺度C类似,不外同时还能诠释指针的存储类型,例如:
long * state;为一个指向long型整数的指针,而state自己则依存储形式存放。
char * xdata ptr;ptr为一个指向char数据的指针,而ptr自己放于外部RAM区,以上的long,char等指针指向的数据可存放于任何存储器中。
浅易指针自己用3个字节存放,划分为存储器类型,高位偏移,低位偏移量。
2. 2. 存储器指针
基于存储器的指针诠释时即指定了存贮类型,例如:
char data * str;str指向data区中char型数据
int xdata * pow; pow指向外部RAM的int型整数。
这类指针存放时,只需一个字节或2个字节就够了,由于只需存放偏移量。
3. 3. 指针转换
即指针在上两种类型之间转化:
l 当基于存储器的指针作为一个实参转达给须要浅易指针的函数时,指针自动转化。
l 假定不诠释外部函数内幕,基于存储器的指针自动转化为浅易指针,招致弱点,是以请用“#include”诠释一切函数内幕。
l 能强行改变指针类型。

 变量的存储种别

一、static(静态部门)变量。
1、静态部门变量在法式模范模范一切运转时代都不会释放内存。
2、关于静态部门变量,是在编译的时间赋初值的,即只赋值一次。假定在法式模范模范运转时曾经有初值,则以后每次挪用的时间不再重新赋值。
3、假定界说部门变量的时间不赋值,则编译的时间自动赋值为0。而关于自动变量而言,界说的时间不赋值,则是一个不愿定的值。
4、虽然静态变量在函数挪用阻拦后依然存在,然则其他函数不克不及援用。
 
  2、用extern声明外部变量。
用extern声明外部变量,是为了扩年夜外部变量的作用规模。好比一个法式模范模范能由多个源法式模范模范文件组成。假定一个法式模范模范中须要援用另外一个文件中曾经界说的外部变量,就须要应用extern来声明。
  准确的做法是在一个文件中界说外部变量,而在另外一个文件中应用extern对该变量作外部变量声明。
  一个文件中:   int abc;
  另外一个文件中:   extern abc;
 
例子:
用extern将外部变量的作用域扩年夜到其他文件:
文件1:
//用extern将外部变量的作用域扩年夜到其他文件中
#include
#include
#include
unsigned int array[10];
void fillarray();
void init_ser()
{
 SCON=0X50;
 TMOD|=0X20;
 TH1=0XF3;
 TR1=1;
 TI=1;
}
void main()
{
 unsigned int i;
 init_ser();
 fillarray();
 for(i=0;i<10;i++)
 {
  printf("array[%d]=%d\n",i,array[i]);
 }
  for(;;){;}
}
 
文件2:
extern int array[10];
void fillarray()
{
 unsigned char i;
 for(i=0;i<10;i++)
 {
  array[i]=i;
 }
}

 

在单片机c语言中变量的空间分配几个措施

1、 data区空间小,以是只需频仍用到或对运算速率请求很高的变量才放到data区内,好比for循环中的计数值。

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

由于部门变量的空间是能笼罩的某个函数的部门变量空间在加入该函数是就释放,由别的函数的部门变量笼罩),能前进内存应用率。虽然静态部门变量除外,其内存应用要领与全局变量类似;

3、 确保你的法式模范模范中没有未挪用的函数。

在Keil C里遇到未挪用函数,编译器就将其以为能够是中止函数。函数里用的部门变量的空间是不释放,也就是同全局变量一样处置赏罚赏罚。这一点Keil C做得很愚蠢,但也没措施。

4、 法式模范模范中遇到的逻辑标志变量能界说到bdata中,能年夜年夜降低内存占用空间。

在51系列芯片中有16个字节位寻址区bdata,其中能界说8*16=128个逻辑变量。界说措施是: bdata bit 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区。