Keil C51单片机中变量的使用方法解析

发布者:科技徜徉最新更新时间:2023-06-05 来源: elecfans关键字:Keil  C51  单片机  变量 手机看文章 扫描二维码
随时随地手机看文章

8051内核单片机是一种通用单片机,在国内占有较大的市场份额。在将C语言用于51内核单片机的研究方面,Keil公司做得最为成功。由于51内核单片机的存储结构的特殊性,Keil C51中变量的使用与标准C有所不同。正确地使用变量,有利于获得高效的目标代码。下面详细介绍Keil C51中变量的使用方法。


一、CPU存储结构与变量的关系

变量都需要有存储空间,存储空间的不同使得变量使用时的工作效率也不同。

标准C的典型运行环境是8086(含IA-32系列)内核,其存储结构是CPU内部有寄存器,外部有存储器,寄存器的访问速度大大高于存储器的访问速度。在标准C中,不加特别定义的变量是放在存储器中的,使用register可以强制变量存储在寄存器中,对于使用特别频繁且数量不多的变量可以选用这种存储模式,以获得更高的工作效率。

相比之下,51内核单片机的存储结构则显得有些怪异,它的存储空间有3个:程序存储器空间(64 KB含片内、片外)、片外数据存储器空间(64KB)、片内数据存储器及特殊功能寄存器空间。它没有真正意义上的寄存器,它的寄存器其实是片内数据存储器(如R0~R7)和特殊功能寄存器(如A、B等)中的一部分。因此,在Keil C51中使用变量就和标准C有很大不同。


二、Keil C51变量分析

Keil C51支持标准C原有的大多数变量类型,但为这些变量新增了多种存储类型,也新增了一些标准C没有的变量。

2.1 Keil C51新增的变量存储类型

Keil C51中定义变量的格式如下:

[存储种类]数据类型[存储类型]变量名表;

其中,[存储类型]是标准C中没有的,[存储类型]共有6种,分别介绍如下:

①data。将变量存储在片内可直接寻址的数据存储器中。使用这种存储模式,目标代码中对变量的访问速度最快。

②bdata。将变量存储在片内可位寻址的数据存储器中。在目标代码中变量可以方便地进行位处理,在不进行位处理时与data相同。

③idata。将变量存储在片内间接寻址的数据存储器中。在52内核中,当片内直接寻址数据存储器不够用时,可以使用128字节间接寻址数据存储器,访问速度一般较data要慢一些,但具有最大的片内数据存储器空间;在51内核中因无单独的间接寻址数据存储器区,idata与data无区别。

④xdata。将变量存储在片外数据存储器中。目标代码中只能使用“MOVX A,@DPTR”和“MOVX@DPTR,A”指令访问变量,访问速度最慢,但存储空间最大(64KB)。

⑤pdata。将变量存储在片外数据存储器中的第一页(00H~FFH)中。目标代码中可以使用“MOVX A,@Ri”和“MOVX@Ri,A”指令访问变量,访问速度与xdata相同,存储空间为256字节。

⑥code。将变量存储在程序存储器中。目标代码中只能使用MOVC指令访问变量,因变量存储在程序存储器中,具有非易失性且为只读。

2.2 Keil C51新增的指针变量存储类型

Keil C51中的指针变量形式如下:

数据类型[数据存储类型]*[指针存储类型]标识符;

其中,[数据存储类型]和[指针存储类型]都是标准C中没有的。[数据存储类型]定义数据(即寻址对象)存储的空间,[指针存储类型]定义指针自身存储的空间。若不使用[数据存储类型],则指针为一般指针,占用3个字节;若使用[数据存储类型]则指针为基于存储器的指针,占用1~2个字节。

2.3 Keil C51新增的变量类型

bit:位变量。存储在片内数据存储器的可位寻址字节(20H~2FH)的某个位上,这个变量在实时控制中具有很高的实用价值。

sfr:特殊功能寄存器变量。存储在片内特殊功能寄存器中,用来对特殊功能寄存器进行读写操作。

sbit:特殊功能寄存器位变量。存储在片内特殊功能寄存器的可位寻址字节(地址可以被8整除者)的某个位上,用来对特殊功能寄存器的可位寻址位进行读写操作。

sbitl6:16位特殊功能寄存器变量。存储在片内特殊功能寄存器的连续2个字节的低地址上,这个变量类型很少使用。

以上这些Keil C51中新增的变量类型,不支持数组和指针操作。


三、Keil C51中使用变量存储模式的必要性

在Keil C51中,变量的存储模式是一个可选项,如果不使用这个选项,则Keil C51在编译时自动进行优选分配。但这种处理方法有以下缺点:

①系统不知道各种变量的使用频度,有可能对使用频度高的变量使用了访问速度慢的片外存储方式,而对使用频高的变量使用了片内存储方式,使得程序的运行效率降低;

②在使用指针寻址时,由于不知道寻址对象的存储方式,只好使用一般指针,在Keil C51中一般指针要多占用1~2个字节,并且使用时还要对存储方式进行判断,增加了寻址操作时间。

如果能够在定义变量的同时定义其存储类型,可以高效地使用51内核单片机的存储空间,获得高质量的目标代码。


四、Keil C51变量的使用方法

4.1 全局变量和静态局部变量

全局变量一般会在多个函数中被使用,并在整个程序运行期间内有效,静态局部变量虽然只在一个函数中使用,但也是在整个程序运行期间有效。对于这些变量,应尽量选择data型,这样在目标代码中就可以用直接寻址指令访问,获得最高的访问速度,提高程序的工作效率。例如一个保存人数的全局变量n_g,在多个函数中都被经常用到,可以这样定义:

unsigned int data n_g;//对n_g赋值时使用“MOV XXH,……”指令

4.2 数组(包括全局和局部)

定义数组一般用idata存储类型,在目标代码中使用“MOV@Ri”指令进行间接寻址。如果因数组元素过多而在编译时报错,可以改用pdata和xdata存储类型。

数组定义为data存储类型意义不大,因为既然使用数组,就是希望能够根据某一自变量访问数组元素。如定义X[100],一般都是为了能够使用X(i是一个变量)来访问,这样在目标代码中就必须使用问接寻址,所以数组没有必要使用data存储类型,即便使用了data存储类型,在目标代码中也仍然要用间接寻址指令。数组定义成idata存储类型,在使用52内核且片内数据存储器不够时,会使用只能间接寻址的片内数据存储空间。这样,既不能降低处理速度,又扩大了可使用的存储空间。

4.3 供查表用的数据

这类数据的特点是需要始终保持不变,且使用时只读,因此应定义为code型。例如一个字形表:

Keil C51单片机中变量的使用方法解析

全局或局部code型变量在存储时无区别。

4.4 非静态局部变量

非静态局部变量仅在某一函数内使用,退出该函数时变量也被释放。

若系统使用small存储模式,对于这些变量可以不加存储说明,由编译软件自行按最优原则决定,因为仅在函数内使用的非静态局部变量,有可能使用工作寄存器R0~R7,这样会更快速和更节省存储空间。例如:

unsigned char i,j; //系统尽可能会用R0~R7存储i和j

若系统使用了compact或large存储模式,则应将这些变量定义为data存储模式,以防系统自行决定时被定义为pdagta或xdata模式而降低工作效率。

4.5 指针

如前所述,定义指针变量时有2个存储类型:数据存储类型,说明被寻址对象的存储类型;指针存储类型,说明指针自身的存储类型。当数据存储类型为xdata时,指针自身占用2个字节;当数据存储类型为pdata以及idata等片内存储类型时,指针自身占用1个字节;若不说明数据存储类型,指针自身就要占用3个字节。因此,在KeilC51中使用指针时,应尽量定义数据存储类型,但要特别注意指针中的数据存储类型与被寻址对象的存储类型必须一致。指针都是频繁使用的,它要不断被设置、修改和使用,因此它自身的存储类型应选择data型。例如定义一个数组时就同时定义其存储类型,以后用指针对其寻址时就将数组的存储类型添加到指针的数据类型中。方法如下:

Keil C51单片机中变量的使用方法解析

4.6 二义性变量

在标准C中如果要使用一个二义性变量,只能用枚举类型。如:

Keil C51单片机中变量的使用方法解析

以上程序在Keil C51中使用时,变量t虽然仅有0和1两种状态,但在目标代码中仍占用一个字节。此处理方法既浪费存储资源,又延长了处理时间,这对于8086内核算不上多大问题,但在资源有限、运行速度不高的51内核中就不能不考虑了。在Keil C51中可使用以下方法:

Keil C51单片机中变量的使用方法解析

这两种方式效果是完全相同的,但在目标代码中变量t仅占用1位(即1/8字节),而且因为51内核单片机指令系统中有位处理指令,生成的目标代码占用内存少、运行速度快。

4.7 特殊功能寄存器变量(包括位变量)

特殊功能寄存器中,累加器A、寄存器B、堆栈指针SP和数据指针DPTR是归系统使用的,在C51中不提供给用户。其他的特殊功能寄存器都可以用sfr定义成变量,其中地址可以被8整除者的各位,还可以用bsfr定义成位变量。访问这些变量,就可以对特殊功能寄存器及其可以位寻址的各位进行读写,达到操作单片机内部各硬件的目的。对于标准的51内核单片机,头文件reg51.h、reg52.h或其他头文件中已对这些特殊功能寄存器变量作了定义,用户可以用#include将此头文件包含进来,然后就可以使用了。现在很多51内核兼容型单片机扩展了更多的特殊功能寄存器,这些就需要用户自行定义,具体方法可参考器件的使用说明。

4.8 外部数据存储器变量

若设置成pdata和xdata存储类型,将把变量存储在片外数据存储器中。这两种存储类型的访问速度最慢,非迫不得已不要使用。在使用这两种存储类型时,注意尽量只用它保存原始数据或最终结果,尽量减少对其访问的次数,需要频繁访问的中间结果不要用它。

4.9 用外部数据存储器地址扩展的其他硬件

在单片机外部扩展的其他硬件,一般都借用外部数据存储器地址,表现为外部数据存储器单元形式。对于这些硬件,可以用指针进行读写操作。例如:

Keil C51单片机中变量的使用方法解析

五、结语

Keil C51中的变量增加了存储类型,在使用时而显得比标准C稍微复杂。在Keil C51中,变量的存储类型不同,访问变量所需要的时间也不同,由于C51内核单片机资源少、速度慢,变量存储类型对系统工作速度的影响不可忽视。在了解变量与单片机存储结构关系的基础上,根据程序对变量的使用要求,合理地选择变量的存储类型,可以在相同的硬件上获得更高的工作效率。


关键字:Keil  C51  单片机  变量 引用地址:Keil C51单片机中变量的使用方法解析

上一篇:自己做的基于单片机的密码锁设计
下一篇:S51及CPLD通用下载线,S51 programmer

推荐阅读最新更新时间:2024-11-13 09:04

以低功耗单片机MSP430F449为控制核心的滤波器系统设计
在电子系统中,滤波器是数据采集、信号处理等方面不可缺少的重要环节,如信号采集前的噪声滤除,D/A转换输出的“阶梯状”滤波等等。一般的有源滤波器由运算放大器、RC元件组成,但这种滤波器的截止频率、Q值等参数都是固定不变的,在某些信号频率动态范围较宽的场合就不适宜使用。因此,有必要采取多种截止频率的滤波器,如程控滤波器,对动态范围较宽的信号进行滤波。美国Maxim公司生产的可编程滤波器芯片MAX262可以通过编程进行各种参数的设置,实现低通、高通、带通、陷波等处理,且滤波的特性参数如中心频率、品质因素等,均可以通过程序设置。 本文介绍以低功耗单片机MSP430F449为控制核心,通过凌特公司数字频率源芯片LTC69034产生时钟信
[单片机]
以低功耗<font color='red'>单片机</font>MSP430F449为控制核心的滤波器系统设计
51单片机加1指令(5条) 举例说明
这5条 指令 的的功能均为原寄存器的内容加1,结果送回原寄存器。上述提到,加1指令不会对任何标志有影响,如果原寄存器的内容为FFH,执行加1后,结果就会是00H。这组指令共有直接、寄存器、寄存器减间址等寻址方式: INC A ;(A)+1→(A) 累加器A中的内容加1,结果存在A中 INC data ;(data)+1→(data) 直接地址单元中的内容加1,结果送回原地址单元中 INC @Ri ;((Ri))+1→((Ri)) 寄存器的内容指向的地址单元中的内容加1,结果送回原地址单元中 INC Rn ;(Rn)+1→(Rn)寄存器Rn的内容加1,结果送回原地址单元中 INC DPTR ;(DPT
[单片机]
51单片机 万年历
这个小项目自己做了5天,小有成就感。。。感谢前辈们多多提意见。。 12864液晶、DS12C887时钟芯片、DS18B20温度传感器。。。 #define uchar unsigned char #define uint unsigned int uint temp; float f_temp; sbit Ds=P2^2; sbit Dula=P2^6; sbit Wela=P2^7; sbit LcdCS=P3^5; //寄存器选择输入 通过rs确定是写数据还是写命令 sbit LcdSID=P3^6; //液晶读/写控制 因为不从液晶读取任何数据,所以rw一直为0 sbit LcdSCLK=P3
[单片机]
C51中的关键字
关键字 用 途 说 明 auto 存储种类说明 用以说明局部变量,缺省值为此 break 程序语句 退出最内层循环 case 程序语句 Switch语句中的选择项 char 数据类型说明 单字节整型数或字符型数据 const 存储类型说明 在程序执行过程中不可更改的常量值 continue 程序语句 转向下一次循环 default 程序语句 Switch语句中的失败选择项 do 程序语句 构成do..while循环结构 double 数据类型说明 双精度浮点数 else 程序语句 构成if..else选择结构 enum 数据类型说明 枚举 extern 存储种类说明 在其他程序模块中说明了的全局变量 flost 数据类型说明 单精度
[单片机]
基于 SPCE061A单片机采集语音信号的设计与实现
随着单片机集成化程度的不断提高,现代单片机已经具备了数字信号处理功能,使语音信号处理用单片机实现成为可能。台湾凌阳科技公司(SunPlus)推出的一款SPCE061A就是这样的产品。SPCE061A是以μ nSP TM16位微控制器及信号处理器芯片为内核的16位单片机,采用模块式集成结构,片内集成了2KB RAM、32KB Flash、ADC、DAC、并行I/O等,特别适合语音信号处理。本文介绍如何实现用SPCE061A单片机采集语音信号,并传送到PC机中的方法。 1 硬件系统结构 1.1 SPCE061A结构 SPCE061A的内部结构如图1,其特点如下: *16位μ nSP TM微控制器; *工作电
[单片机]
NXP推出全球首款基于MCU的离线人脸和表情识别解决方案
新闻亮点 ● 人脸和表情识别整体解决方案具有低延迟性,且无需连接云 ● 边缘侧本地处理,有助于保护用户隐私 ● 基于运行FreeRTOS的i.MX RT跨界微控制器(MCU),大幅降低系统成本和使用成本 德国柏林(IFA 2019展会),2019年9月6日——恩智浦半导体(NXP Semiconductors N.V.)(纳斯达克代码:NXPI)今日宣布推出全球首款基于微控制器(MCU)的离线人脸和表情识别解决方案,意在为智能家居、商用和工业设备提供人脸识别处理能力。此套人脸识别方案基于恩智浦最新的跨界 MCU系列i.MX RT106F,运行FreeRTOS操作系统,帮助原始设备制造商(OEM)能快速、轻松、经济地将人
[物联网]
NXP推出全球首款基于<font color='red'>MCU</font>的离线人脸和表情识别解决方案
TI Tiva C系列MCU简化物联网应用开发
近日,德州仪器推出业界第一款支持以太网MAC+PHY Cortex-M4的产品Tiva TM4C129x MCU,129x芯片在连接性、通信性和控制性三个方面做到了与物联网的完美契合。来自德州仪器美国总部的Tiva C系列全球产品总经理Matt Muse为记者详细讲解了129x MCU的卓越性能。Matt Muse提到了Tiva C系列的3C特性,即Connectivity、Communicate和Control,129x MCU是德州仪在物联网环境下推出的一个重磅产品,在人机界面、连接性和云端、服务器连接方面具有非常丰富的控制应用。 在连接性方面,129x是一款支持以太网MAC+PHY的Cortex-M4的芯片,由于MAC+
[单片机]
基于FRAM的MCU为低功耗应用提高安全性
  安全性在包括智能手机配件、智能仪表、个人健康监控、遥控以及存取系统等各种应用中正在变得日益重要。要保护收益及客户隐私,OEM 厂商必须采用安全技术加强系统的防黑客攻击能力。对于大量这些应用而言,将要部署数百万的器件,工程师面临的挑战是在不严重影响系统成本或可靠性的同时,确保最佳安全平衡。主要注意事项包括保护敏感数据的传输,防止 MCU 应用代码及安全数据被读取,防止 MCU 遭到物理攻击,最大限度提高电源效率,以及支持安全升级,确保设备能够应对未来安全威胁等。   安全设备必须能够像银行保险库一样有效地安全存储敏感信息。这类信息包括交换的实际数据(比如客户的信用卡号或者何时用了多少电的记录等)以及任何确保通信通道安全的加密数据
[单片机]
基于FRAM的<font color='red'>MCU</font>为低功耗应用提高安全性
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved