《51单片机C语言变量定义》由会员分享,可在线阅读,更多相关《51单片机C语言变量定义(4页珍藏版)》请在人人文库网上搜索。
1、最新 料推荐单片机教程 ,51 单片机 C 语言学习第六课变量上课所提到变量就是一种在程序执行过程中其值能不断变化的量。 要在程序中使用变量必须先用标识符作为变量名, 并指出所用的数据类型和存储模式, 这样编译系统才能为变量分配相应的存储空间。定义一个变量的格式如下:存储种类 数据类型存储器类型 变量名表在定义格式中除了数据类型和变量名表是必要的, 其它都是可选项。 存储种类有四种:自动( auto),外部( extern),静态( static)和寄存器( register),缺省类型为自动 (auto)。这些存储种类的具体含义和用法,将在第七课变量的存储中进一步进行学习。而这里的数据类型则。
2、是和我们在第四课中学习到的名种数据类型的定义是一样的。说明了一个变量的数据类型后, 还可选择说明该变量的存储器类型。 存储器类型的说明就是指定该变量在 C51 硬件系统中所使用的存储区域, 并在编译时准确的定位。表61 中是 KEIL uVision2 所能认别的存储器类型。注意的是在AT89C51芯片中 RAM 只有低 128 位,位于 80H 到 FFH的高 128 位则在 52 芯片中才有用,并和特殊寄存器地址重叠。特殊寄存器(SFR)的地址表请看附录二AT89C51特殊功能寄存器列表存储器类型说 明data直接访问内部数据存储器(128 字节 ),访问速度最快bdata可位寻址内部数据。
3、存储器 (16 字节),允许位与字节混合访问idatapdataxdatacode表 61存储器类型间接访问内部数据存储器( 256 字节),允许访问全部内部地址分页访问外部数据存储器( 256 字节),用 MOVX Ri指令访问外部数据存储器 (64KB),用 MOVX DPTR指令访问程序存储器( 64KB) ,用 MOVC A+DPTR指令访问如果省略存储器类型,系统则会按编译模式 SMALL,COMPACT或 LARGE所规定的默认存储器类型去指定变量的存储区域。 无论什么存储模式都可以声明变量在任何的 8051 存储区范围,然而把最常用的命令如循环计数器和队列索引放在内部数据区可以显。
4、著的提高系统性能。 还有要指出的就是变量的存储种类与存储器类型是完全无关的。SMALL存储模式把所有函数变量和局部数据段放在8051 系统的内部数据存储区这使访问数据非常快,但SMALL 存储模式的地址空间受限。在写小型的应用程序时,变量和数据放在data 内部数据存储器中是很好的因为访问速度快,但在较大的应用程序中data 区最好只存放小的变量、数据或常用的变量(如循环计数、数据索引),而大的数据则放置在别的存储区域。COMPACT存储模式中所有的函数和程序变量和局部数据段定位在8051 系统的外部数据存储区。外部数据存储区可有最多256 字节(一页),在本模式中外部数据存储区的短地址用 R。
5、0/R1。LARGE存储模式所有函数和过程的变量和局部数据段都定位在8051 系统的外部数据区外部数据区最多可有64KB,这要求用 DPTR数据指针访问数据。之前提到简单提到sfr,sfr16,sbit 定义变量的方法,下面我们再来仔细看看。1最新 料推荐sfr 和 sfr16 可以直接对 51 单片机的特殊寄存器进行定义,定义方法如下:sfr 特殊功能寄存器名 = 特殊功能寄存器地址常数;sfr16 特殊功能寄存器名 = 特殊功能寄存器地址常数 ; 我们可以这样定义 AT89C51的 P1 口sfr P1 = 0x90; /定义 P1 I/O 口,其地址 90Hsfr 关键定后面是一个要定义。
6、的名字,可任意选取,但要符合标识符的命名规则,名字最好有一定的含义如 P1口可以用 P1为名,这样程序会变的好读好多。等号后面必须是常数, 不允许有带运算符的表达式, 而且该常数必须在特殊功能寄存器的地址范围之内(80HFFH),具体可查看附录中的相关表。sfr 是定义 8位的特殊功能寄存器而sfr16 则是用来定义 16 位特殊功能寄存器, 如 8052 的 T2定时器,可以定义为:sfr16 T2 = 0xCC; /这里定义 8052 定时器 2,地址为 T2L=CCH,T2H=CDH用 sfr16 定义 16 位特殊功能寄存器时, 等号后面是它的低位地址, 高位地址一定要位于物理低位地址。
7、之上。注意的是不能用于定时器 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 。
8、位变量名字节地址 位位置sbit P1_1 = 0x90 1;这种方法其实和 2 是一样的,只是把特殊功能寄存器的位址直接用常数表示。在 C51存储器类型中提供有一个 bdata 的存储器类型, 这个是指可位寻址的数据存储器,位于单片机的可位寻址区中,可以将要求可位录址的数据定义为bdata,如:unsigned char bdata ib; /在可位录址区定义 ucsigned char类型的变量 ib int bdata ab2; / 在可位寻址区定义数组 ab2,这些也称为可寻址位对象 sbit ib7=ib7 / 用关键字 sbit 定义位变量来独立访问可寻址位对象的其中一位 sbit。
9、 ab12=ab112;操 作 符 后 面 的 位 位 置 的 最 大 值 取 决 于 指 定 的 基 址 类 型 ,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引脚2最新 料推荐void main(void)unsigned int a;unsigned char b;dofor (a=0;a50000;a+)P1_0 = 0; /点亮 P1_0for (a=0;a50000;a+)P1_7 = 0; /点亮 P1_7for (b=0;b255;b+)for (a=0;a10000;a+)P1 = b; /用 b 的值来做跑马灯的花样P1 = 255; /熄灭 P1 上的 LEDfor (b=0;b255;b+)for (a=0;a10000;a+) /P1_1闪烁P1_1 = 0;for (a=0;a10000;a+)P1_1 = 1;while(1);3。