第7章 常量、变量及存储器类型
- 格式:doc
- 大小:61.50 KB
- 文档页数:12
(此文档为word格式,下载后您可任意编辑修改!)《C语言程序设计》实验报告2012~2013学年第二学期班级姓名学号指导教师实验一实验项目名称:C程序的运行环境和运行C程序的方法所使用的工具软件及环境:Visual C++6.0一、实验目的:1.了解在Visual C++6.0环境下如何编辑、编译、连接和运行一个C程序;2.通过运行简单的C程序,初步了解C源程序的特点。
二、预习内容:教材《C语言程序设计教程》第1章。
三、实验内容:1.在Visual C++6.0环境下输入并运行下面的程序:#include<stdio.(){printf("This is a C program.\n");return0;}2.在Visual C++6.0环境下输入下面的程序(有语法错误),编译、连接、调试该程序,直至程序无语法错误,然后运行程序,并观察分析运行结果。
#include<stdio.(){int a,b,suma=3;b=4;sun=a+b;print("%d+%d=%d\n",a,b,sum);return0;}四、实验结果:1.运行结果(或截图):2.(1)改正后的源程序:(2)运行结果(或截图):五、思考题:1.一个C程序上机的步骤有哪些?答:2.组成C程序的基本单位是函数,一个函数包括哪几个部分?答:成绩指导教师签名实验二实验项目名称:数据类型、运算符和表达式所使用的工具软件及环境:Visual C++6.0一、实验目的:1.掌握整型、实型与字符型这三种基本类型的概念;2.掌握常量及变量的使用方法;3.掌握基本算术运算符及其表达式的使用方法;4.掌握++、--运算符、赋值运算符及其表达式的使用方法。
二、预习内容:教材《C语言程序设计教程》第2章。
三、实验内容:1.在Visual C++6.0环境下输入下面的程序(有语法错误),编译、连接、调试该程序,直至程序无语法错误。
#include<stdio.(){int2cd=3;floatπ=3.14;char for=′A′;printf("%d,%f,%c\n",2cd,π,for);return0;}2.在Visual C++6.0环境下输入并运行下面的程序,观察分析运行结果。
存储器基础与类型在计算机系统中,存储器扮演着至关重要的角色。
它被用于存储和检索数据,以及执行计算机程序。
存储器可以按照不同的标准进行分类,比如存储介质的类型和存储方式等。
本文将介绍存储器的基础知识和常见的存储器类型。
一、存储器基础知识存储器是计算机中用于存储和检索数据的设备。
计算机存储器按照存储介质的物理性质可以分为两类:主存储器和辅助存储器。
1. 主存储器:主存储器(也称为内存)是计算机系统中用于临时存储数据和程序的设备。
它通常由半导体材料组成,如动态随机存取存储器(DRAM)或静态随机存取存储器(SRAM)。
主存储器的容量直接决定了计算机可以同时处理的数据量和程序的大小。
2. 辅助存储器:辅助存储器(也称为外存)用于持久性地存储数据和程序。
与主存不同,辅助存储器的存储介质通常是磁性或光学介质,如硬盘驱动器(HDD)、固态硬盘(SSD)和光盘等。
辅助存储器的容量一般比主存储器大得多,用于长期保留大量的数据和文件。
二、主存储器类型主存储器可以进一步分类为以下几种类型,每种类型根据其特点和用途有不同的应用场景。
1. 随机存取存储器(RAM):RAM是主存储器最常见的类型之一,它根据存取数据的方式可分为动态随机存取存储器(DRAM)和静态随机存取存储器(SRAM)。
DRAM的存储单元由电容和晶体管构成,电容的充放电过程表示数据的存储与读取。
SRAM的存储单元由两个稳态电路构成,不需要周期性刷新。
由于DRAM的容量大、造价低,因此更常用于计算机的主存储器。
2. 只读存储器(ROM):ROM是一种只能读取数据而不能写入或修改的存储器。
它的内容在制造过程中被永久烧写,因此具有持久性存储特性。
常见的ROM类型包括只读存储器(ROM)和可编程只读存储器(PROM)。
PROM 的内容可以用户编程,而擦除之后则不能再次编程。
这些存储器常用于存储计算机的固化程序和系统配置信息等。
3. 快取存储器(Cache):Cache是位于处理器和主存储器之间的一层存储器,用于加速数据访问。
变量类型存储方法在程序设计中,变量是用来存储数据的一种形式。
变量类型可以决定变量可以存储的数据以及对这些数据进行的操作。
常见的变量类型包括整数(int)、浮点数(float)、布尔值(bool)、字符串(string)等。
每种类型都有不同的存储方法和限制。
1. 整数(int)类型:整数是没有小数部分的数值,可以是正数、负数或零。
整数类型在内存中通常被表示为固定长度的二进制补码。
它的存储方法取决于它的长度,如8位、16位、32位或64位。
整数类型可以进行算术运算,如加减乘除和取模等。
2. 浮点数(float)类型:浮点数是带有小数部分的数值,用于存储具有更高精度和范围的实数。
浮点数类型在内存中通常被表示为浮点数格式,如IEEE754标准。
它的存储方法采用一种指数和尾数的表示方法,可以进行基本的数学运算,如加减乘除。
3. 布尔值(bool)类型:布尔值只有两个取值,即True和False。
在内存中通常用一个字节存储,其中True表示1,False表示0。
布尔类型可以进行逻辑运算,如与(and)、或(or)和非(not)等。
4. 字符串(string)类型:字符串是由字符组成的文本。
在内存中通常使用字符数组或指针来表示字符串。
每个字符通常占用一个字节的存储空间。
字符串类型可以进行拼接、截取和比较等操作。
除了以上常见的类型,还有很多其他类型,如数组、列表、元组、字典等。
它们各自有不同的存储方法和特点。
1. 数组(array)类型:数组是一种存储多个相同类型元素的数据结构。
在内存中通常按连续的位置存储,可以通过下标访问和修改数组中的元素。
2. 列表(list)类型:列表是一种存储多个元素的数据结构,可以包含不同类型的元素。
在内存中通常使用链表或数组实现,可以通过索引访问和修改列表中的元素。
3. 元组(tuple)类型:元组类似于列表,是一种存储多个元素的数据结构,但与列表不同的是,元组是不可变的(immutable),即不能修改它们的元素。
第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变化。