收藏 分享(赏)

51单片机C语言变量定义.doc

上传人:精品资料 文档编号:9629870 上传时间:2019-08-19 格式:DOC 页数:3 大小:18.62KB
下载 相关 举报
51单片机C语言变量定义.doc_第1页
第1页 / 共3页
51单片机C语言变量定义.doc_第2页
第2页 / 共3页
51单片机C语言变量定义.doc_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
资源描述

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 可位寻址内部数据存储器(16

3、字节) ,允许位与字节混合访问 idata 间接访问内部数据存储器(256 字节) ,允许访问全部内部地址 pdata 分页访问外部数据存储器(256 字节) ,用 MOVX Ri 指令访问 xdata 外部数据存储器(64KB),用 MOVX DPTR 指令访问 code 程序存储器(64KB), 用 MOVC A+DPTR 指令访问 表 61 存储器类型 如果省略存储器类型,系统则会按编译模式 SMALL,COMPACT 或 LARGE 所规定的默认存储器类型去指定变量的存储区域。无论什么存储模式都可以声明变量在任何的 8051 存储区范围,然而把最常用的命令如循环计数器和队列索引放在内部

4、数据区可以显著的提高系统性能。还有要指出的就是变量的存储种类与存储器类型是完全无关的。SMALL 存储模式把所有函数变量和局部数据段放在 8051 系统的内部数据存储区这使访问数据非常快,但 SMALL 存储模式的地址空间受限。在写小型的应用程序时,变量和数据放在 data 内部数据存储器中是很好的因为访问速度快,但在较大的应用程序中 data 区最好只存放小的变量、数据或常用的变量(如循环计数、数据索引) ,而大的数据则放置在别的存储区域。COMPACT 存储模式中所有的函数和程序变量和局部数据段定位在 8051 系统的外部数据存储区。外部数据存储区可有最多 256 字节(一页) ,在本模式

5、中外部数据存储区的短地址用R0/R1 。LARGE 存储模式所有函数和过程的变量和局部数据段都定位在 8051 系统的外部数据区外部数据区最多可有 64KB,这要求用 DPTR 数据指针访问数据。之前提到简单提到 sfr,sfr16,sbit 定义变量的方法,下面我们再来仔细看看。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; /先定义一个特殊功能寄存器名再指定位变量名所在的位置当可寻址位位于特殊功能寄存器中时可采用这种方

8、法(3)sbit 位变量名字节地址位位置sbit P1_1 = 0x90 1;这种方法其实和 2 是一样的,只是把特殊功能寄存器的位址直接用常数表示。在 C51 存储器类型中提供有一个 bdata 的存储器类型,这个是指可位寻址的数据存储器,位于单片机的可位寻址区中,可以将要求可位录址的数据定义为 bdata,如:unsigned char bdata ib; /在可位录址区定义 ucsigned char 类型的变量 ibint bdata ab2; /在可位寻址区定义数组 ab2,这些也称为可寻址位对象sbit ib7=ib7 /用关键字 sbit 定义位变量来独立访问可寻址位对象的其中一

9、位sbit 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 引脚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);

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报