第0次讲义mcu原理keil c51中变量的使用_第1页
第0次讲义mcu原理keil c51中变量的使用_第2页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、引言8051 内核单片机是一种通用单片机,在国内占有较大的市场份额。在将 C 语言用于 51内核单片机的研究方面,Keil 公司做得最为成功。由于 51 内核单片机的结构的特殊性,Keil C51 中变量的使用与标准 C 有所不同。正确地使用变量,有利于获得高效的目标代码。下面详细介绍 Keil C51 中变量的使用方法。1 CPU结构与变量的关系变量都需要有空间,空间的不同使得变量使用时的工作效率也不同。标准 C 的典型运行环境是 8086(含 IA-32 系列)内核,其结构是 CPU有寄存器,外部有器,寄存器的速度大大高于器的速度。在标准 C 中,不加特别定在寄存器中,对于使用特别频义的变

2、量是放在器中的,使用 register 可以强制变量繁且数量不多的变量可以选用这种相比之下,51 内核单片机的模式,以获得更高的工作效率。结构则显得有些怪异,它的空间有 3 个:程序存储器空间(64 KB 含片内、片外)、片外数据器空间(64KB)、片内数据器及特殊功能器(如 R0R7)寄存器空间。它没有真正意义上的寄存器,它的寄存器其实是片内数据和特殊功能寄存器(如 A、B 等)中的一部分。因此,在 Keil C51 中使用变量就和标准 C 有很大不同。2 Keil C51 变量分析Keil C51 支持标准 C 原有的大多数变量类型,但为这些变量新增了多种新增了一些标准 C 没有的变量。类

3、型,也21 Keil C51 新增的变量类型Keil C51 中定义变量的格式如下:种类数据类型类型变量名表;其中,类型是标准 C 中没有的,类型共有 6 种,分别介绍如下:data。将变量在片内可直接寻址的数据器中。使用这种模式,目标代码中对变量的速度最快。bdata。将变量在片内可位寻址的数据器中。在目标代码中变量可以方便地进行位处理,在不进行位处理时与 data 相同。idata。将变量在片内间接寻址的数据器中。在 52 内核中,当片内直接寻址数据器不够用时,可以使用 128 字节间接寻址数据器,速度一般较 data 要慢一些,但具有最大的片内数据idata 与data 无区别。器空间;

4、在 51 内核中因无单独的间接寻址数据器区,xdata。将变量在片外数据器中。目标代码中只能使用“MOVX A,DPTR”和“MOVXDPTR,A”指令变量,速度最慢,但空间最大(64KB)。pdata。将变量在片外数据器中的第一页(00HFFH)中。目标代码中可以使用“MOVX A,Ri”和“MOVXRi,A”指令空间为 256 字节。变量,速度与 xdata 相同,code。将变量在程序在程序器中。目标代码中只能使用 MOVC 指令变量,因变量器中,具有非易失性且为只读。22 Keil C51 新增的指针变量类型Keil C51 中的指针变量形式如下:数据类型数据类型*指针类型标识符;类型

5、都是标准 C 中没有的。数据其中,数据类型和指针类型定义数据(即寻址对象)的空间,指针类型定义指针自身的空间。若不使用数据类型,则指针为一般指针,占用 3 个字节;若使用数据针,占用 12 个字节。23 Keil C51 新增的变量类型类型则指针为基于器的指bit:位变量。在片内数据器的可位寻址字节(20H2FH)的某个位上,这个变量在实时控制中具有很高的实用价值。sfr:特殊功能寄存器变量。在片内特殊功能寄存器中,用来对特殊功能寄存器进行读写操作。sbit:特殊功能寄存器位变量。在片内特殊功能寄存器的可位寻址字节(地址可以被8 整除者)的某个位上,用来对特殊功能寄存器的可位寻址位进行读写操作

6、。sbitl6:16 位特殊功能寄存器变量。址上,这个变量类型很少使用。在片内特殊功能寄存器的连续 2 个字节的低地以上这些Keil C51 中新增的变量类型,不支持数组和指针操作。(本文转自电子工程世界:http:.cn/mcu/2011/0721/article_4672_1.html)3 Keil C51 中使用变量模式的必要性在 Keil C51 中,变量的模式是一个可选项,如果不使用这个选项,则 Keil C51 在编译时自动进行优选分配。但这种处理方法有以下缺点:系统不知道各种变量的使用频度,有可能对使用频度高的变量使用了速度慢的片外方式,而对使用的变量使用了片内方式,使得程序的运

7、行效率降低;方式,只好使用一般指针,在 Keil C51在使用指针寻址时,由于不知道寻址对象的中一般指针要多占用 12 个字节,并且使用时还要对时间。方式进行判断,增加了寻址操作如果能够在定义变量的同时定义其间,获得高质量的目标代码。类型,可以高效地使用 51 内核单片机的空Keil C51 变量的使用方法全局变量和静态局部变量全局变量一般会在多个函数中被使用,并在整个程序运行期间内有效,静态局部变量虽然只在一个函数中使用,但也是在整个程序运行期间有效。对于这些变量,应尽量选择 data型,这样在目标代码中就可以用直接寻址指令,获得最高的速度,提高程序的工作效率。例如一个保存人数的全局变量 n

8、_g,在多个函数中都被经常用到,可以这样定义:unsigneddata n_g;对 n_g 赋值时使用“MOV XXH,”指令42 数组(包括全局和局部)定义数组一般用 idata如果因数组元素过多而在编译类型,在目标代码中使用“MOVRi”指令进行间接寻址。错,可以改用pdata 和 xdata类型。数组定义为 data类型意义不大,因为既然使用数组,就是希望能够根据某一自变量数组元素。如定义 X100,一般都是为了能够使用 Xi(i 是一个变量)来,这样在目标代码中就必须使用问接寻址,所以数组没有必要使用 data类型,即便使用了 data类型,在目标代码中也仍然要用间接寻址指令。数组定义

9、成 idata类型,在使用 52内核且片内数据器不够时,会使用只能间接寻址的片内数据空间。这样,既不能降低处理速度,又扩大了可使用的43 供查表用的数据空间。这类数据的特点是需要始终保持不变,且使用时只读,因此应定义为 code 型。例如一个字形表:全局或局部 code 型变量在44 非静态局部变量时无区别。非静态局部变量仅在某一函数内使用,退出该函数时变量也被。若系统使用 small模式,对于这些变量可以不加说明,由编译自行按最优原则决定,因为仅在函数内使用的非静态局部变量,有可能使用工作寄存器 R0R7,这样会更快速和更节省空间。例如:unsigned char i,j; 系统尽可能会用

10、R0R7i 和 j若系统使用了compact 或 large模式,则应将这些变量定义为 data模式,以防系统自行决定时被定义为 pdagta 或 xdata 模式而降低工作效率。45 指针如前所述,定义指针变量时有 2 个类型:数据类型,说明被寻址对象的类类型。当数据类型为 xdata 时,指针自身占用型;指针类型,说明指针自身的2 个字节;当数据若不说明数据尽量定义数据类型为 pdata 以及 idata 等片内类型时,指针自身占用 1 个字节;类型,指针自身就要占用 3 个字节。因此,在 KeilC51 中使用指针时,应类型,但要特别注意指针中的数据类型与被寻址对象的类型必须一致。指针都

11、是频繁使用的,它要不断被设置、修改和使用,因此它自身的类型应选择data 型。例如定义一个数组时就同时定义其类型,以后用指针对其寻址时就将数组的存储类型添加到指针的数据类型中。方法如下:(本文转自电子工程世界:http:46 二义性变量.cn/mcu/2011/0721/article_4672_2.html)在标准 C 中如果要使用一个二义性变量,只能用枚举类型。如:以上程序在 Keil C51 中使用时,变量 t 虽然仅有 0 和 1 两种状态,但在目标代码中仍占用一个字节。此处理方法既浪费 资源,又延长了处理时间,这对于 8086 内核算不上多大问题,但在资源有限、运行速度不高的 51

12、内核中就不能不考虑了。在 Keil C51 中可使用以下方法:这两种方式效果是完全相同的,但在目标代码中变量 t 仅占用 1 位(即 18 字节),而且因为 51 内核单片机指令系统中有位处理指令,生成的目标代码占用内存少、运行速度快。47 特殊功能寄存器变量(包括位变量)特殊功能寄存器中,累加器 A、寄存器 B、堆栈指针 SP 和数据指针DPTR 是归系统使用的,在 C51 中不提供给用户。其他的特殊功能寄存器都可以用 sfr 定义成变量,其中地址可以被 8 整除者的各位,还可以用 bsfr 定义成位变量。寄存器及其可以位寻址的各位进行读写,达到操作单片机这些变量,就可以对特殊功能各硬件的目

13、的。对于标准的51 内核单片机,头文件 reg51h、reg52h 或其他头文件中已对这些特殊功能寄存器变量作了定义,用户可以用#include 将此头文件包含进来,然后就可以使用了。现在很多 51 内核兼容型单片机扩展了 的特殊功能寄存器,这些就需要用户自行定义,具体方法可参考器件的使用说明。48 外部数据器变量若设置成 pdata 和 xdata类型,将把变量在片外数据器中。这两种类型的速度最慢,非迫不得已不要使用。在使用这两种类型时,注意尽量只用它保存原始数据或最终结果,尽量减少对其的次数,需要频繁的中间结果不要用它。49 用外部数据器地址扩展的其他硬件在单片机外部扩展的其他硬件,一般都借用外部数据器地址,表现为外部数据器单元形式。对于这些硬件,可以用指针进行读写操作。例如:结语Keil C51 中的变量增加了

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论