当前位置:首页 > 单片机 > 单片机
[导读]  变量就是一种在程序执行过程中其值能不断变化的量。要在程序中使用变量必须先用标识符作为变量名,并指出所用的数据类型和存储模式,这样编译系统才能为变量分配相应的存储空间。定义一个变量的格式如下:  [存

  变量就是一种在程序执行过程中其值能不断变化的量。要在程序中使用变量必须先用标识符作为变量名,并指出所用的数据类型和存储模式,这样编译系统才能为变量分配相应的存储空间。定义一个变量的格式如下:
  [存储种类] 数据类型 [存储器类型] 变量名表
  在定义格式中除了数据类型和变量名表是必要的,其它都是可选项。存储种类有四种:自动(auto)、外部(extern)、静态(static)和寄存器(register),缺省类型为自动(auto)。这些存储种类的具体含义和使用方法,将在第七课《变量的存储》中进一步进行学习。
  而这里的数据类型则是和我们在第四课中学习到的名种数据类型的定义是一样的。说明了一个变量的数据类型后,还可选择说明该变量的存储器类型。存储器类型的说明就是指定该变量在单片机c语言硬件系统中所使用的存储区域,并在编译时准确的定位。表6-1中是KEIL uVision2所能认别的存储器类型。注意的是在AT89c51芯片中RAM只有低128位,位于80H到FFH的高128位则在52芯片中才有用,并和特殊寄存器地址重叠。

存储器类型

说 明

data

直接访问内部数据存储器(128字节),访问速度最快

bdata

可位寻址内部数据存储器(16字节),允许位与字节混合访问

idata

间接访问内部数据存储器(256字节),允许访问全部内部地址

pdata

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

xdata

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

code

程序存储器(64KB),用MOVC @A+DPTR指令访问

  如果省略存储器类型,系统则会按编译模式SMALL、COMPACT或LARGE所规定的默认存储器类型去指定变量的存储区域。无论什么存储模式都能声明变量在任何的8051存储区范围,然而把最常用的命令如循环计数器和队列索引放在内部数据区能显著的提高系统性能。还有要指出的就是变量的存储种类与存储器类型是完全无关的。

  数据存储模式
存储模式决定了没有明确指定存储类型的变量,函数参数等的缺省存储区域,共三种:
Small模式:所有缺省变量参数均装入内部RAM,优点是访问速度快,缺点是空间有限,只适用于小程序。
Compact模式:所有缺省变量均位于外部RAM区的一页(256Bytes),具体哪一页可由P2口指定,在STARTUP.A51文件中说明,也可用pdata指定,优点是空间较Small为宽裕速度较Small慢,较large要快,是一种中间状态。
large模式:所有缺省变量可放在多达64KB的外部RAM区,优点是空间大,可存变量多,缺点是速度较慢。
  提示:存储模式在单片机c语言编译器选项中选择。

  之前提到简单提到sfr,sfr16,sbit定义变量的方法,下面我们再来仔细看看。sfr和sfr16能直接对51单片机的特殊寄存器进行定义,定义方法如下:
sfr 特殊功能寄存器名= 特殊功能寄存器地址常数;
sfr16 特殊功能寄存器名= 特殊功能寄存器地址常数;
我们能这样定义AT89c51的P1口

sfrP1=0x90;//定义P1I/O口,其地址90H

  sfr关键定后面是一个要定义的名字,可任意选取,但要符合标识符的命名规则,名字最好有一定的含义,如P1口能用P1为名,这样程序会变的好读好多。等号后面必须是常数,不允许有带运算符的表达式,而且该常数必须在特殊功能寄存器的地址范围之内(80H-FFH),具体可查看附录中的相关表。sfr是定义8位的特殊功能寄存器,而sfr16则是用来定义16位特殊功能寄存器,如8052的T2定时器,能定义为:

sfr16T2=0xCC;//这里定义8052定时器2,地址为T2L=CCH,T2H=CDH

  用sfr16定义16位特殊功能寄存器时,等号后面是它的低位地址,高位地址一定要位于物理低位地址之上。注意的是不能用于定时器0和1的定义。

  sbit可定义可位寻址对象。如访问特殊功能寄存器中的某位。其实这样应用是经常要用的如要访问P1口中的第2个引脚P1.1。我们能照以下的方法去定义:
(1)sbit 位变量名=位地址

sbitP1_1=0x91;

这样是把位的绝对地址赋给位变量。同sfr一样sbit的位地址必须位于80H-FFH之间。
(2)Sbit 位变量名=特殊功能寄存器名^位位置

sfrP1=0x90;sbitP1_1=P1^1;//先定义一个特殊功能寄存器名再指定位变量名所在的位置

  当可寻址位位于特殊功能寄存器中时可采用这种方法
(3)sbit 位变量名=字节地址^位位置

sbitP1_1=0x90^1;

  这种方法其实和2是一样的,只是把特殊功能寄存器的位址直接用常数表示。
  在单片机c语言存储器类型中供给有一个bdata的存储器类型,这个是指可位寻址的数据存储器,位于单片机的可位寻址区中,能将要求可位录址的数据定义为bdata,如:

unsignedcharbdataib;  //在可位录址区定义ucsignedchar类型的变量ibintbdataab[2];      //在可位寻址区定义数组ab[2],这些也称为可寻址位对象sbitib7=ib^7        //用关键字sbit定义位变量来独立访问可寻址位对象的其中一位sbitab12=ab[1]^12;

  操作符"^"后面的位位置的最大值取决于指定的基址类型,char0-7,int0-15,long0-31。
  

  下面我们用上一课的电路来实践一下这一课的知识。同样是做一下简单的跑马灯实验,项目名为RunLED2。程序如下:

sfrP1=0x90;//这里没有使用预定义文件,sbitP1_0=P1^0;//而是自己定义特殊寄存器sbitP1_7=0x90^7;//之前我们使用的预定义文件其实就是这个作用sbitP1_1=0x91;//这里分别定义P1端口和P10,P11,P17引脚voidmain(void){unsignedinta;unsignedcharb;do{for(a=0;a<50000;a++)P1_0=0;//点亮P1_0for(a=0;a<50000;a++)P1_7=0;//点亮P1_7for(b=0;b<255;b++){for(a=0;a<10000;a++)P1=b;//用b的值来做跑马灯的花样}P1=255;//熄灭P1上的LEDfor(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*xdataptr;//ptr为一个指向char数据的指针,而ptr本身放于外部RAM区,以上的long,char等指针指向的数据可存放于任何存储器中。

一般指针本身用3个字节存放,分别为存储器类型,高位偏移,低位偏移量。
2. 2. 存储器指针
基于存储器的指针说明时即指定了存贮类型,例如:

chardata*str;//str指向data区中char型数据intxdata*pow;//pow指向外部RAM的int型整数。

这种指针存放时,只需一个字节或2个字节就够了,因为只需存放偏移量。
3. 3. 指针转换
即指针在上两种类型之间转化:
当基于存储器的指针作为一个实参传递给需要一般指针的函数时,指针自动转化。
如果不说明外部函数原形,基于存储器的指针自动转化为一般指针,导致错误,因而请用“#include”说明所有函数原形。
能强行改变指针类型。

变量的存储类别

一、static(

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

嵌入式开发作为一种专业且技术密集型的领域,涵盖了从硬件底层驱动、中间件到应用层软件开发等多个层面的工作,其所需的工具种类繁多,各有针对性,旨在提升开发效率、保证代码质量以及简化调试过程。

关键字: 嵌入式开发 keil

单片机内部有很多的特殊功能寄存器,每个寄存器在单片机内部都分配有唯一的地址,一般我们会根据寄存器功能的不同给寄存器赋予各自的名称,当我们需要在程序中操作这些特殊功能寄存器时,必须要在程序的最前面将这些名称加以声明,声明的...

关键字: C51 数据类型 扩充定义

数据元(Data Element),也称为数据元素,是用一组属性描述其定义、标识、表示和允许值的数据单元,在一定语境下,通常用于构建一个语义正确、独立且无歧义的特定概念语义的信息单元。数据元可以理解为数据的基本单元,将若...

关键字: C51 数据类型

之后新建新的工程,添加.a文件就可以使用了,当然也可以使用keil来添加,但是keil默认的是用.lab,需要自己配置一下文件属性,改为lib文件即可。一半release sdk的时候用这种方式很关键的,毕竟自己的核心代...

关键字: keil 文件属性 lib文件

▼点击下方名片,关注公众号▼欢迎关注【玩转单片机与嵌入式】公众号,回复关键字获取更多免费资料。回复【加群】,限时免费进入知识共享群;回复【3D封装库】,常用元器件的3D封装库;回复【电容】,获取电容、元器件选型相关的内容...

关键字: C51 MDK RealView

在Keil C51软件中51单片机的中断服务和外设驱动程序的开发

关键字: keil5 编译 C51

Intel公司1980年推出了MCS-51系列单片机:集成 8位CPU、4K字节ROM、128字节RAM、4个8位并口、1个全双工串行口、2个16位定时/计数器。寻址范围64K,并有控制功能较强的布尔处理器。 80C5...

关键字: C51 KEIL 编程

c上标3下标5怎么算用计算机,c上标3下标5怎么算

关键字: C51 KEIL

DSP28335与AD7606通过SPI的串行数据交互

关键字: keil C

AD7606的并行采集

关键字: ad7606 数据 C keil
关闭
关闭