常量变量及存储器类型
- 格式:doc
- 大小:47.00 KB
- 文档页数:12
第7章常量、变量及存储器类型7.1 常量常量是在程序执行过程中其值不能改变的量。
常量的数据类型有整型、浮点型、字符型和字符串型等,C51编译器还扩充了一种位(bit)标量。
7.2 在51 MCU DEMO试验板上实现乘法运算:两个乘数分别为常量与变量,其积在数码管上显示(最大显示到50)。
7.2.1 实现方法先宏定义CONST为常量2,然后定义1个无符号字符型变量x并赋初值1,再定义1个无符号整型变量y用于存放结果,使x的值与CONST相乘,其积存于y中。
然后将y的内容送试验板上右侧2个LED数码管进行显示。
每0.5秒后x 的值加1,直到26为止。
7.2.2 源程序文件在D盘建立一个文件目录(CS7-1),然后建立CS7-1.uv2的工程项目,最后建立源程序文件(CS7-1.c)。
输入下面的程序:#include <REG51.H> //1unsigned char codeSEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//2 #define CONST 2 //3/*=====================4===============*/ void delay(unsigned int k) //5{ //6unsigned int i,j; //7for(i=0;i<k;i++){ //8for(j=0;j<121;j++) //9{;}} //10} //11//=====================12===========void main(void) //13{ //14unsigned char x=1,y,i; //15while(1) //16{ //17y=x*CONST; //18for(i=0;i<250;i++) //19{ //20P0= SEG7[ y%10]; //21P2=0xfe; //22delay(1); //23P0= SEG7[ y/10]; //24P2=0xfd; //25delay(1); //26} //27if(x<25)x=x+1; //28} //29} //30编译通过后,51 MCU DEMO试验板接通5V稳压电源,将生成的CS7-1.hex 文件下载到试验板上的单片机89S51中,注意,标示“LEDMOD_DATA”及“LEDMOD_COM”的双排针应插上短路块。
变量是在程序运行过程中其值可以改变的量。
在C51中,在使用变量前必须对变量进行定义,指出变量的数据类型和存储模式,以便编译系统为它分配相应的存储单元。
变量的定义格式如下:[存储种类] 数据类型说明符[存储器类型] 变量名1[=初值],变量名2[=初值]…;(1)格式说明1)存储种类是指变量在程序执行过程中的作用范围。
C51变量的存储种类有四种,分别是自动(auto)、外部(extern)、静态(static)和寄存器(register)。
定义变量时,如果省略存储种类,则该变量默认为自动(auto)变量。
用auto定义的变量作用范围仅在定义它的函数体或复合语句内部有效。
用extern定义的变量称为外部变量,其作用范围为整个程序。
用static定义的变量称为静态变量。
其作用范围仅在定义的函数体内有效,一直存在,再次进入该函数时,变量的值为上次结束函数时的值。
用register定义的变量称为寄存器变量,处理速度快,但数目少。
C51编译器编译时能自动识别程序中使用频率最高的变量,并自动将其作为寄存器变量,用户无需专门声明。
2)在定义变量时,必须通过数据类型说明符指明变量的数据类型,指明变量在存储器中占用的字节数。
可以是基本数据类型说明符,也可以是组合数据类型说明符,还可以是用typedef和#define定义的类型别名。
别名要按用户自定义标识符的原则命名。
例如:使用“#define uchar unsigned char”定义了“uchar”,则可以使用这个类型定义变量。
3)存储器类型是用于指明变量所处的单片机的存储器区域情况。
省略则默认为data类型,即片内前128字节的RAM;bdata为可位寻址内部数据存储器,定义的变量可以用sbit定义位变量访问其中的二进制位;idata 可以访问51的内部256字节的RAM;code定义的变量存储在程序存储器,只能读出不能写入,相当于常量。
4)变量名是C51区分不同变量,为不同变量取的名称,也就是用户自定义标识符,要遵循标识符的命名原则。
变量和常量在内存中的存储方式电脑编程是现代社会中一项重要的技能,它涉及到计算机科学和软件开发等领域。
在编程中,变量和常量是基本的概念,它们在内存中的存储方式对于程序的执行和效率具有重要影响。
本文将探讨变量和常量在内存中的存储方式,以及它们对程序性能的影响。
在计算机编程中,变量是一种用于存储和表示数据的容器。
它们可以存储不同类型的数据,如整数、浮点数、字符等。
变量在内存中的存储方式取决于其数据类型和编程语言的规范。
对于大多数编程语言而言,变量在内存中的存储方式是通过分配一块内存空间来存储其值。
这个内存空间可以被计算机读取和写入,以便在程序执行过程中对变量进行操作。
当我们声明一个变量时,计算机会为其分配一块内存空间,并将变量的值存储在这个空间中。
在内存中,变量的存储方式可以分为两种:栈和堆。
栈是一种后进先出(LIFO)的数据结构,它用于存储局部变量和函数调用的上下文。
当一个函数被调用时,其局部变量和参数将被存储在栈中。
当函数执行完毕后,这些变量和参数将被自动释放,栈空间也会被回收。
相比之下,堆是一种动态分配内存的方式,用于存储动态分配的变量和对象。
当我们使用关键字“new”或“malloc”来创建一个变量或对象时,计算机会在堆中分配一块内存空间,并将其地址返回给我们。
这样,我们可以通过引用这个地址来访问和操作这个变量或对象。
除了变量,常量也是编程中常见的概念。
常量是一种固定不变的值,它们在程序执行过程中不能被修改。
常量在内存中的存储方式与变量类似,也是通过分配一块内存空间来存储其值。
然而,与变量不同的是,常量在内存中的存储通常是在编译时确定的,并且它们的值是不可修改的。
在内存中存储常量的方式可以有多种实现方式,其中一种常见的方式是将常量存储在只读内存区域。
只读内存区域是一块特殊的内存空间,它用于存储程序中的常量和字符串文字等不可修改的数据。
这样做的好处是可以提高程序的性能和安全性,因为只读内存区域的数据是只读的,无法被修改。
常量、变量、函数与表达式⒈常量常量(constant)是指在程序运行过程中保持不变的量,在V isual Basic中,常量一般分为数值常量与字符串常量两种。
⑴数值常量数值常量就是数学中说的常数,数值常量有整型常量和实型常量两种。
整型常量即整数,是指不带小数的数值,如1、0、-10、+107等都是合法的整数。
实型常量即实数,是指带小数的数值。
实型常量又分为定点数和浮点数两种。
定点数:3.14159 ,-6.8,1.997浮点数:2e6、1e5、88E-18浮点数对应的就是数学上的科学计数法,以幂数形式表示一个实数,例如1234.56可以表示为1.23456×103 。
由于程序中无法表示上标和下标,因此用英文字母"E"(或"e")表示底数10,则1.23456×103可表示为1.23456E3。
⑵字符串常量被一对双引号括起来的若干个合法的字符称为字符串常量。
例如"china"、"Visual Basic"、"18"、"3.14"等。
字符串常量指的是双引号中的字符,不包括双引号本身。
⑶符号常量如果程序中多次用到同一个常量,则可以用一个有意义的名字表示这个常量,称为符号常量,代表常量的符号称为"常量名",常量名的命名方法与后面的变量名一样。
例如,求圆的周长和面积的程序代码:Let r=5Let s=3.14159*r*rLet c=2*3.14159*rPrint "s=";s, "c=";c可以先用Const语句定义一个符号常量pi代替3.14159,形式如下:Const 常量名[As 类型]=表达式则可以写出如下的程序代码:Const pi As Single=3.14159Let r=5Let s=pi*r*rLet c=2*pi*rPrint "s=";s, "c=";c当常量需要改动时,仅需改动符号常量定义语句。
数据的存储器类型和存储器模式2009-05-10 13:28数据的存储器类型和存储器模式变量是一种在程序执行过程中,其数值不断变化的量。
C51规定变量必须先定义后使用。
C51对变量的进行定义的格式如下:[存储种类] 数据类型 [存储器类型] 变量名表。
其中,存储种类和存储器类型是可选项。
1. 存储种类存储种类是指变量在程序执行过程中的作用范围。
变量的存储种类有四种,分别为:自动(auto)、外部(extern)、静态(static)和寄存器(register)。
使用存储种类说明符auto定义的变量称为自动变量。
自动变量作用范围在定义它的函数体或复合语句内部,在定义它的函数体或复合语句被执行时,C51才为该变量分配内存空间,当函数调用结束返回或复合语句执行结束时,自动变量所占用的内存空间被释放,这些内存空间又可被其他的函数体或复合语句使用。
可见使用自动变量能最有效地使用80C51单片机内存。
定义变量时,如果省略存储种类,则该变量默认为自动(auto)变量。
由于80C51单片机访问片内RAM速度最快,通常将函数体内和复合语句中使用频繁的变量放在片内RAM中,且定义为自动变量,可有效地利用片内有限的RAM资源。
使用外部种类存储符extern定义的变量称为外部变量。
在一个函数体内,要使用一个已在该函数体外或别的程序模块文件中定义过的外部变量时,该变量在本函数体内要用extern说明。
外部变量被定义后,即分配了固定的内存空间,在程序的整个执行时间内都是有效的。
通常将多个函数或模块共享的变量定义为外部变量。
外部变量是全局变量,在程序执行期间一直占有固定的内存空间。
当片内RAM资源紧张时,不建议将外部变量放在片内RAM。
使用存储种类说明符static定义的变量称为静态变量。
静态变量分为局部静态变量和全局静态变量。
局部静态变量是在两次函数调用之间仍能保持其值的局部变量。
有些程序要求在多次调用之间仍然保持变量的值,使用自动变量无法作用到这一点。
第五课常量(常量是在程序运行过程中不能改变值的量,而变量是可以......)(一)第五课常量上一节我们学习了KEIL C51编译器所支持的数据类型。
而这些数据类型又是怎么用在常量和变量的定义中的呢?又有什么要注意的吗?下面就来看看吧。
晕!你还区分不清楚什么是常量,什么是变量。
常量是在程序运行过程中不能改变值的量,而变量是可以在程序运行过程中不断变化的量。
变量的定义可以使用所有C51编译器支持的数据类型,而常量的数据类型只有整型、浮点型、字符型、字符串型和位标量。
这一节我们学习常量定义和用法,而下一节则学习变量。
常量的数据类型说明是这样的1.整型常量可以表示为十进制如123,0,-89等。
十六进制则以0x开头如0x34,-0x3B等。
长整型就在数字后面加字母L,如104L,034L,0xF340等。
2.浮点型常量可分为十进制和指数表示形式。
十进制由数字和小数点组成,如,,等,整数或小数部分为0,可以省略但必须有小数点。
指数表示形式为[±]数字[.数字]e[±]数字,[]中的内容为可选项,其中内容根据具体情况可有可无,但其余部分必须有,如125e3,7e9,-。
3.字符型常量是单引号内的字符,如’a’,’d’等,不可以显示的控制字符,可以在该字符前面加一个反斜杠”“组成专用转义字符。
常用转义字符表请看表5-1。
4.字符串型常量由双引号内的字符组成,如”test”,”OK”等。
当引号内的没有字符时,为空字符串。
在使用特殊字符时同样要使用转义字符如双引号。
在C中字符串常量是做为字符类型数组来处理的,在存储字符串时系统会在字符串尾部加上o转义字符以作为该字符串的结束符。
字符串常量”A”和字符常量’A’是不同的,前者在存储时多占用一个字节的字间。
5.位标量,它的值是一个二进制。
转义字符含义ASCII码(16/10进制)o空字符(NULL)00H/0n换行符(LF)0AH/10r回车符(CR)0DH/13t水平制表符(HT) 09H/9b退格符(BS)08H/8f换页符(FF) 0CH/12’单引号27H/39”双引号22H/34\反斜杠5CH/92表5-1 常用转义字符表常量可用在不必改变值的场合,如固定的数据表,字库等。
第7章常量、变量及存储器类型7.1 常量常量是在程序执行过程中其值不能改变的量。
常量的数据类型有整型、浮点型、字符型和字符串型等,C51编译器还扩充了一种位(bit)标量。
7.2 在51 MCU DEMO试验板上实现乘法运算:两个乘数分别为常量与变量,其积在数码管上显示(最大显示到50)。
7.2.1 实现方法先宏定义CONST为常量2,然后定义1个无符号字符型变量x并赋初值1,再定义1个无符号整型变量y用于存放结果,使x的值与CONST相乘,其积存于y中。
然后将y的内容送试验板上右侧2个LED数码管进行显示。
每0.5秒后x 的值加1,直到26为止。
7.2.2 源程序文件在D盘建立一个文件目录(CS7-1),然后建立CS7-1.uv2的工程项目,最后建立源程序文件(CS7-1.c)。
输入下面的程序:#include <REG51.H> //1unsigned char codeSEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//2 #define CONST 2 //3/*=====================4===============*/ void delay(unsigned int k) //5{ //6unsigned int i,j; //7for(i=0;i<k;i++){ //8for(j=0;j<121;j++) //9{;}} //10} //11//=====================12===========void main(void) //13{ //14unsigned char x=1,y,i; //15while(1) //16{ //17y=x*CONST; //18for(i=0;i<250;i++) //19{ //20P0= SEG7[ y%10]; //21P2=0xfe; //22delay(1); //23P0= SEG7[ y/10]; //24P2=0xfd; //25delay(1); //26} //27if(x<25)x=x+1; //28} //29} //30编译通过后,51 MCU DEMO试验板接通5V稳压电源,将生成的CS7-1.hex 文件下载到试验板上的单片机89S51中,注意,标示“LEDMOD_DATA”及“LEDMOD_COM”的双排针应插上短路块。
我们看到右边2个LED数码管从“02”开始显示偶数,即“02”、“04”…,显示到“50”后不变。
7.2.3 程序分析解释序号1:包含头文件REG51.H。
序号2:数码管0~9的字形码。
序号3:定义CONST为常量2。
该行的第一个非空白字符为#,表示该行是预处理器的伪指令语句行,它虽然处在源程序中,但并不产生程序代码,而是通知预处理器如何操作。
这里的作用就是用CONST代替2。
序号4:程序分隔。
序号5~11:定义函数名为delay的延时子函数。
序号12:程序分隔。
序号13:定义函数名为main的主函数。
序号14:main的主函数开始。
序号15:定义无符号字符型变量x并赋初值1。
定义无符号字符型变量y、i。
序号16:while循环语句,这里进行无限循环。
序号17:while循环语句开始。
序号18:将变量x与常量CONST相乘,其积放y中。
序号19:for循环语句,用于点亮最右侧的2个数码管。
序号20:for循环语句开始。
序号21:取出y个位数的字形码送P0口。
序号22:点亮个位数码管。
序号23:延时1mS以便观察清楚。
序号24:取出y十位数的字形码送P0口。
序号25:点亮十位数码管。
序号26:延时1mS以便观察清楚。
序号27:for循环语句结束。
序号28:如果变量x小于25则加1。
序号29:while循环语句结束。
序号30:main的主函数结束。
7.3 变量变量是一种在程序执行过程中其值可以变化的量。
C语言程序中的每一个变量都必须有一个标识符作为它的变量名。
同样的,变量的数据类型也有整型、浮点型、字符型和字符串型以及位(bit)标量。
7.4 存储器类型在使用一个变量或常量之前,必须先对该变量或常量进行定义,指出它的数据类型和存储器类型,以便编译系统为它分配相应的存储单元。
在C51中对变量进行定义的格式如下:[存储种类] 数据类型 [存储器类型] 变量名表如:auto int data x;char code y=0x55;其中,“存储种类”和“存储器类型”是可选项。
变量的存储种类有四种:自动(auto)、外部(extern)、静态(static)和寄存器(register)。
在定义一个变量时如果省略存储种类选项,则该变量将为自动(auto)变量。
定义一个变量时除了需要说明其数据类型之外,Keil C51编译器还允许说明变量的存储器类型。
Keil C5l编译器完全支持8051系列单片机的硬件结构,可以访问其硬件系统的所有部分。
对于每个变量可以准确地赋予其存储器类型,从而可使之能够在单片机系统内准确地定位。
表7-1列出了Keil C51编译器所能识别的存储器类型。
表7-1 Keil C51编译器的存储器类型定义变量时如果省略“存储器类型”选项,则按编译模式SMALL、COMPACT 或LARGE所规定的默认存储器类型确定变量的存储区域,不能位于寄存器中的参数传递变量和过程变量也保存在默认的存储器区域内。
C51编译器的3种存储器模式(默认的存储器类型)对变量的影响如下:1.SMALL变量被定义在8051单片机的内部数据存储器(data区)中,因此对这种变量的访问速度最快。
另外,所有的对象,包括堆栈,都必须嵌入内部数据存储器,而堆栈的长度是很重要的,实际栈长取决于不同函数的嵌套深度。
PACT变量被定义在分页外部数据存储器(pdata区)中,外部数据段的长度可达256字节。
这时对变量的访问是通过寄存器间接寻址(MOVX @Ri)进行的,堆栈位于8051单片机内部数据存储器中。
采用这种编译模式时,变量的高8位地址由P2口确定。
因此,在采用这种模式的同时,必须适当改变启动程序STARTUP.A51中的参数:PDATASTART和PDATALEN;用L5l进行连接时还必须采用连接控制命令PDATA来对P2口地址进行定位,这样才能确保P2口为所需要的高8位地址。
RGE变量被定义在外部数据存储器(xdata区,最大可达64K字节)中,使用数据指针DPTR来间接访问变量。
这种访问数据的方法效率是不高的,尤其是对于2个或多个字节的变量,用这种数据访问方法对程序的代码长度影响非常大。
另外一个不方便之处是这种数据指针不能对称操作。
8051系列单片机具有21个特殊功能寄存器,它们离散分布在片内RAM的高128字节中。
如定时器方式控制寄存器TMOD、中断允许控制寄存器IE等。
为了能够直接访问这些特殊功能寄存器,C51编译器扩充了关键字sfr和sfrl6,利用这种扩充关键字可以在C语言源程序中直接对8051单片机的特殊功能寄存器进行定义。
定义方法如下:sfr 特殊功能寄存器名=地址常数;例如:sfr TMOD=0x89;//定义定时/计数器方式控制寄存器,其地址为89H。
这里需要注意的是,在关键字sfr后面必须是一个名字,名字可任意选取,但应符合一般习惯。
等号后面必须是常数,不允许有带运算符的表达式,而且该常数必须在特殊功能寄存器的地址范围之内(80H~0FFH)。
在新一代的增强型80C51单片机中,特殊功能寄存器经常组合成16位来使用。
为了有效地访问这种16位的特殊功能寄存器,可采用关键字sfrl6,例如对80C52单片机的定时器T2,可采用如下的方法来定义:sfr16 T2=0xCC;//定义T2,其地址为T2L=0CCH,T2H=0CDH。
这里T2为特殊功能寄存器名,等号后面是它的低字节地址,其高字节地址必须在物理上直接位于低字节之后。
这种定义方法适用于所有新一代的8051增强型单片机中新增加的特殊功能寄存器的定义。
在80C51单片机应用系统中经常需要访问特殊功能寄存器中的某些位,C51编译器为此提供了一种扩充关键宇sbit,利用它可以访问可位寻址对象。
使用方法有如下3种:1.sbit位变量名=位地址这种方法将位的绝对地址赋给位变量,位地址必须位于80H~0FFH之间。
例如:sbit OV=0xD2;sbit CY=0xD7; -2.sbit位变量名=特殊功能寄存器名^位位置当可寻址位位于特殊功能寄存器中时可采用这种方法,“位位置”是一个0~7之间的常数。
例如:sbit OV=PSW^2;sbit CY=PSW^7;3.sbit位变量名=字节地址^位位置这种方法以一个常数(字节地址)作为基址,该常数必须在80H~0FFH之间。
“位位置”是一个0~7之间的常数。
例如:sbit OV=0xD0^2;sbit CY=0xD0^7;当位对象位于8051单片机内部存储器的可位寻址区bdata时称之为“可位寻址对象”。
C51编译时会将对象放入8051单片机内部可位寻址区。
例如:int bdata my_x=12345;使用关键字可以独立访问可位寻址对象中的某一位。
例如:sbit my_bit0=my_x^0;sbit my_bit15=my_x^15;操作符后面的位位置的最大值(即“^”后面的值)取决于指定的基址类型,对于char来说是0~7;对于int来说是0~15;对于long来说是0~31。
从变量的作用范围来看,有全局变量和局部变量之分。
全局变量是指在程序开始处或各个功能函数的外面所定义的变量,在程序开始处定义的全局变量在整个程序中有效,可供程序中所有的函数共同使用,而在各功能函数外面定义的全局变量只对从定义处开始往后的各个函数有效,只有从定义处往后的各个功能函数可以使用该变量,定义处前面的函数则不能使用它。
局部变量是指在函数内部或以花括号{}围起来的功能块内部所定义的变量,局部变量只在定义它的函数或功能块以内有效,在该函数或功能块以外则不能使用它。
因此局部变量可以与全局变量同名,但在这种情况下局部变量的优先级较高,而同名的全局变量在该功能块内被暂时屏蔽。
从变量的存在时间来看又可分为静态存储变量和动态存储变量。
静态存储变量是指在程序运行期间其存储空间固定不变的变量,动态存储变量是指该变量的存储空间不确定,在程序运行期间根据需要动态地为该变量分配存储空间。
一般来说全局变量为静态存储变量,局部变量为动态存储变量。
在进行程序设计的时侯经常需要给一些变量赋以初值,C语言允许在定义变量的同时给变量赋初值。
例如:unsigned char data val=5;int xdata y=10000;7.5 在51 MCU DEMO试验板上实现两个局部变量val1、val2的显示:val1的值在右边的个、十位2个数码管上显示,从1到99变化。