第05章-Keil-C51程序设计基础.ppt
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 05 Keil C51 程序设计 基础
- 资源描述:
-
,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第五讲,Keil,C51,程序设计基础,单片机程序设计实践教程,1,Keil,C51,程序设计基础,单片机程序既可以用汇编语言也可以用,C,语言进行编写,两者都可以在,C51,的环境下进行开发,这两者之间既有区别也有联系。,C51,是一种特殊的,C,编译器,它扬弃了,C,语言的一些不适合,MCS-51,单片机的特性,针对,MCS-51,单片机的特性做了适应性保留,使其更适合对单片机底层硬件进行直接控制。,汇编语言则是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言。其主要优点是占用资源少、程序执行效率高。但是,不同的,CPU,其汇编语言可能有所差异,所以不易相互之间进行移植。,2,用这两种语言进行单片机系统开发,存在各自的优缺点,主要体现在以下几点。,(,1,)、汇编语言可以更好地针对硬件进行控制,汇编语言的一条指令就对应一个机器码,每一步执行什么动作都很清楚,并且程序大小和堆栈调用情况都容易控制,调试起来也比较方便。而用,C,语言进行编写,一条,C,语言指令编译后,会变成很多条机器码,很容易出现,ROM,空间不够、堆栈溢出等问题。,3,(,2,)、,C,语言可以提供良好的人机开发接口,C,语言是一种编译型程序设计语言,它兼顾了多种高级语言的特点,并具备汇编语言的功能,可以实现结构更为复杂的单片机系统功能。,C,语言有功能丰富的库函数,运算速度快、编译效率高、有良好的可移植性,而且可以直接实现对系统硬件的控制。,C,语言是一种结构化程序设计语言,它支持当前程序设计中广泛采用的由顶向下结构化程序设计技术。此外,,C,语言程序还具有完善的模块程序结构,从而为软件开发中采用模块化程序设计方法提供了有力的保障。,因此,使用,C,语言进行程序设计已成为软件开发的一个主流。用,C,语言来编写目标系统软件,会大大缩短开发周期,并且明显地增加软件的可读性,便于对已编制好的程序进行改进和扩充,从而研制出规模更大、性能更完备的系统。,4,针对汇编语言可以更好的针对硬件进行控制的特点,很多单片机设计和生产公司开发了,MCS-51,单片机的增强型衍生产品,这些产品在内部的主要功能部件上未作出任何变化,只是增加了程序存储器,Flash,和数据存储器,RAM,的容量,使其更适合运用,C,语言开发代码更长的复杂程序。如,表,4-1,给出的,STC,单片机,RC/RD,(,5V,)系列选型一览表中,就是根据这两个因素进行型号区分的。,因此,用,C,语言进行单片机程序设计是单片机开发与应用的必然趋势。所以,作为一个致力于单片机系统开发的开发人员来说,最好能够掌握基本的,C,语言编程。,基于以上原因,本书的所有项目都是采用,Keil,C51,下的,C,语言进行开发的,本章就对,C51,的一些基本知识进行简要介绍,读者可以结合后面的具体项目,加深对这部分知识的理解和掌握。关于,MCS-51,单片机利用汇编进行编程方面的知识,有兴趣的读者也可以查阅相关的资料自行学习。,5,5.1,标识符和关键字,C,语言中的标识符是设计人员在程序中自己定义的一种字符序列,用来命名程序中需要辨认的对象,包括符号常量、变量、数组及函数等对象。标识符具有以下一些特征:,(1),、由字母、数字、下划线构成。,(2),、开头必须是字母或下划线。,(3),、长度不得大于,32,个字符,而通常是前,8,个字符有效。,(4),、区分大、小写字母。,例如,以下标识符是合法的:,A,,,x,,,x_3,,,BOOK 1,,,sum5,以下标识符是非法的:,3s,(以数字开头),,s*T,(出现非法字符*),,3x,(以减号开头),,bowy,1,(出现非法字符,(,减号,),),6,在使用标识符时还必须注意以下几点:,(1),、标准,C,语言不限制标识符的长度,但它受各种版本的,C,语言编译系统的限制,同时也受到具体机器的限制。例如,在某版本,C,语言中规定标识符前八位有效,当两个标识符前八位相同时,则被认为是同一个标识符。,(2),、在标识符中,大小写是有区别的。例如,,SEA,和,sea,是两个不同的标识符。,(3),、标识符虽然可由程序员随意定义,但标识符是用于标识某个量的符号。因此,命名应尽量有相应的意义,以便于理解。,(4),、不应该使用,C,语言中的保留标识符来做自定义的变量或者函数等的标识符。使用保留标识符来做自定义变量或者函数等的标识符不是语法错误,可以通过编译,因为保留标识符是合法的标识符,符合标识符命名法则。但是,因为这些标识符已经被,C,语言使用或者保留了,所以使用保留标识符来做自定义变量或者函数等的标识符可能会引起意想不到的问题。,7,例如,,C,语言语句,int,double;,是错误的,因为,double,是关键字,不能做变量名。下面列出了,C,语言的所有关键字,读者在使用中应慎用这些关键字,不要将其作为标识符来使用。,Auto,、,enum,、,restrict,、,unsigned,、,break,、,extern,、,return,、,void,、,case,、,float,、,short volatile,、,char,、,for,、,signed,、,while,、,const,、,goto,、,sizeof,、,Bool,、,continue,、,if,、,static,、,default,、,inline,、,struct,、,_Imaginary,、,do,、,int,、,switch,、,double,、,long,、,typedef,、,else,、,register,和,union,等。,8,5.2 C51,的数据类型,在,C,语言中,每个变量在使用之前必须先定义其数据类型。,C,语言中有以下几种数据类型:整型,(,int,),、浮点型,(float),、字符型,(char),、指针型,(*),、无值型,(void),以及结构,(,struct,),和联合,(union),。为了充分利用,MCS-51,单片机的资源特点,,C51,在,C,语言的数据类型基础上增设了位型变量,sbit,,取消了布尔变量,其实两者的使用方法基本类似。表,5-1,列出了,C51,的基本数据类型。,9,表,5-1 C51,的基本数据类型,类型说明符,位数,字节数,数的范围,signed,int,16,2,3276832767,即,2,15,(,2,15,-1,),unsigned,int,16,2,065535,即,0,(,2,16,-1,),signed long,32,4,21474836482147483647,即,2,31,(,2,31,-1,),unsigned long,32,4,04294967295,即,0,(,2,32,-1,),float,32,4,10,-37,10,38,double,64,8,10,-307,10,308,long double,128,16,10,-4931,10,4932,signed char,8,1,128,127,unsigned char,8,1,1 0,255,bit,或,sbit,0,,,1,10,5.2.1,整型,(,int,),5.2.1.1,整型常量,整型常量就是整常数。在,51,中,使用的整常数有八进制、十六进制和十进制三种。,1,、十进制整常数:,十进制整常数没有前缀。其数码为,0,9,。,2,、八进制整常数:,八进制整常数必须以,0,开头,即以,0,作为八进制数的前缀。数码取值为,0,7,。八进制数通常是无符号数。,如以下各数是八进制数:,015(,十进制为,13),、,0101(,十进制为,65),、,0177777(,十进制为,65535),;,3,、十六进制整常数:,十六进制整常数的前缀为,0X,或,0 x,。其数码取值为,09,,,AF,或,af,。,如以下各数是十六进制整常数:,0X2A(,十进制为,42),、,0XA0(,十进制为,160),、,0XFFFF(,十进制为,65535),。,11,5.2.1.2,整型变量,根据表,5-1,,加上不同的修饰符,整型数有以下几种类型:,signed,int,(有符号短整型数)、,signed long,(有符号长整型数说明)、,unsigned,int,(无符号短整型数)和,unsigned long,(无符号长整型数),字长和数的取值范围已在表,5-1,中列出。,整型数在内存中是以补码方式存放的,应遵循以下原则:,正数的补码和原码相同。,负数的补码应将该数的绝对值的二进制形式按位取反再加,1,。,例如,,101,的原码为,1100101B,,反码为,1111111110011010B,,补码为,1111111110011011B,由反码加,1,求得。,12,5.2.2,实型数据,5.2.2.1,实型常量,实型也称为浮点型。实型常量也称为实数或者浮点数,所有浮点数都被默认为,double,。在,51,中,实数只采用十进制。它有二种形式:十进制小数形式和指数形式。,(,1,)、十进制数形式:由数码,0 9,和小数点组成。例如,,0.0,、,23.0,、,9.739,、,0.113,、,23.0,、,3330.,、,267.8230,等均为实数,它们共同的特点是都有小数点。,(,2,)、指数形式:由十进制数,加阶码标志,“,e,”,或,“,E,”,以及阶码(只能为整数,可以带符号)组成。其一般形式为:,aEn,(,a,为十进制数,,n,为十进制整数),其值为,a*10n,。如,,3.45E5,其值为,3.45*105,。,13,5.2.2.2,实型变量,实型变量分为单精度(,float,型)和双精度(,double,型)两种类型。表,5-1,给出了这两类变量的字长和取值范围。以下示例给出了变量定义的格式和书写规则。,例如,,float,x,y,;(,x,y,为单精度实型变量,),,,double,a,b,c,;(,a,b,c,为双精度实型变量,),。,实型变量在单片机内存中是按指数形式存储,具体的存放形式请参照相关,C,语言程序设计书籍。,14,5.2.3,字符型数据(,char,),5.2.3.1,字符常量,字符常量是用单引号括起来的一个字符。例如,,a,、,b,、,=,、,、,?,等都是合法的字符常量。,在,C51,中,规定字符常量有以下特点:,字符常量只能用单引号括起来,不能用双引号或其他括号。,字符常量只能是单个字符,不能是字符串。,15,字符可以是字符集中任意字符。但数字被定义为字符型之后就不能参与数值运算。如,,9,和,9,是不同的,,9,是字符常量,不能参与运算。,字符可以用,ASCII,码值表示。例如,十进制数,85,表示大写字母,U,;十六进制数,0 x5d,表示,;八进制数,0102,表示大写字母,B,。,一些不能用符号表示的控制符,只能用,ASCII,码值来表示。如,十进制数,10,表示,n,换行;十六进制数,0 x0d,表示回车,r,;十六进制数,0 x0c,表示换页,f,等。,对于字符串常量,一般用双引号括起来表示。如,,Hello C51,。,16,5.2.3.2,字符变量,字符变量用来存储字符常量,为单个字符。加上不同的修饰符,可以定义有符号和无符号两种类型的字符型变量。例如;,char a:,/a,被定义为有符号字符变量,unsigned char b;,/b,被定义为无符号字符变量,字符在计算机中以其,ASCII,码方式表示的,是以,ASCII,码的形式存放在变量的内存单元之中的,其长度为,1,个字节。有符号字符型数取值范围为,128,127,无符号字符型数到值范围是,0255,。,字符变量类型定义的格式和书写规则都与整型变量相同。如,,x,的十进制,ASCII,码是,120,,,y,的十进制,ASCII,码是,121,。所以也可以把它们看成是整型量。,C51,允许对整型变量赋以字符值,也允许对字符变量赋以整型值。在输出时,允许把字符变量按整型量输出,也允许把整型量按字符量输出。,17,5.2.4,指针型,(*),指针是一种特殊的数据类型,在其它语言中一般没有。指针是指向变量的地址,实质上指针就是存储单元的地址。根据所指的变量类型不同,可以是整型指针,(,int,*),、浮点型指针,(float*),、字符型指针,(char*),、结构指针,(,struct,*),和联合指针,(union*),。,18,5.2.5 bit,位标量,bit,是,C51,编译器的一种扩充数据类型,利用它可定义一个位标量,但不能定义位指针,也不能定义位数组。它的值是一个二进制位,不是,0,就是,1,,类似一些高级语言中的布尔类型,True,和,False,。,例如,,bit lock,;,/,将,lock,定义为位变量,bit,dirention,;,/,将,direction,定义为位变量,函数也可以有,bit,类型的参数,也可以有,bit,类型的返回值。,19,5.2.6,各类数值型数据之间的混合运算,变量的数据类型相互之间是可以转换的,转换的方法有两种,一种是自动转换,一种是强制转换。自动转换发生在不同数据类型的量混合运算时,由编译系统自动完成。自动转换遵循以下规则:,(1),、若参与运算量的类型不同,则先转换成同一类型,然后进行运算。,(2),、转换按数据长度增加的方向进行,以保证精度不降低。如,,int,型和,long,型运算时,先把,int,量转成,long,型后再进行运算。,(3),、所有的浮点运算都是以双精度进行的,即使仅含,float,单精度量运算的表达式,也要先转换成,double,型,再作运算。,(4),、,char,型和,short,型参与运算时,必须先转换成,int,型。,下面给出了类型自动转换的规则:,char,shortintunsignedlongfloatdouble,。,20,5.3 C51,的数据存储类型,C51,允许将变量或常量定义成不同的存储类型,,C51,编译器允许的存储类型主要包括,data,、,bdata,、,idata,、,pdata,、,xdata,和,code,等,它们和单片机的不同存储区相对应。,C51,存储类型与,MCS-51,单片机实际存储空间的对应关系如表,5-2,所示。,21,存储类型,长度,(bit),长度,(Byte),值域范围,与存储空间的对应关系,data,8,1,0,255,直接寻址片内低,128,bdata,8,1,32,47,按位或字节寻址片内,RAM,idata,8,1,0,255,间接寻址片内数据,RAM,pdata,8,1,0,255,分页寻址,256,xdata,16,2,0,65535,寻址,64K,code,16,2,0,65535,寻址,64K,表,5-2 C51,存储类型与,51,单片机实际存储空间的对应关系,22,5.3.1 data,区,结合图,2-5,,,data,区是,51,单片机内部,RAM,的前,128B,,地址为,00H,7FH,,这部分主要是作为数据段。访问,data,区比访问表,5-2,中的其他区块要快,这是因为它采用直接寻址方式,而访问其它区块须采用间接寻址或分页寻址等方式。使用,data,区时应注意以下几点:,(1),、,data,区空间小,所以只有频繁用到或对运算速度要求很高的变量才放到,data,区内,比如,for,循环中的计数值。,(2),、,data,区内最好放局部变量。因为局部变量的空间是可以覆盖的(某个函数的局部变量空间在退出该函数时就释放,由别的函数的局部变量覆盖),可以提高内存利用率。当然静态局部变量除外,其内存使用方式与全局变量相同。,23,(3),、从,00H7FH,的,data,区数据范围,包括两个小段,第一个子段包含四组寄存器组,每组寄存器组包含八个寄存器,共,32,个寄存器。,可在任何时候通过修改,PSW,寄存器的,RS1,和,RS0,这两位来选择四组寄存器的任意一组作为工作寄存器组,,MCS-51,单片机也可默认任意一组作为工作寄存器组,工作寄存器组的快速切换不仅使参数传递更为方便,而且可在,MCS-51,中进行快速任务转换。,例如,定义字符变量,var1,为,data,型,被分配在片内,RAM,中:,char data var1,;,24,5.3.2,bdata,区,程序中遇到的逻辑标志变量可以定义到,bdata,区中,,bdata,区的字节地址范围为,20H,2FH,(见图,2-5,),在此范围内定义的位变量可以大大降低内存的占用空间,在,MCS-51,系列芯片中这,16,个字节位寻址区,bdata,的地址分配见表,2-5,,它可以定义,8*16=128,个逻辑变量。定义方法是:,bit,bdata,LedState,,但位类型不能用在数组和结构体中。,例如,将位变量,flags,定义为,bdata,型,定位在片内,RAM,中的位寻址区:,bit,bdata,flags,;,25,5.3.3,idata,区,可寻址片内,RAM,,允许访问地址从,00H,FFH,的全部内部,RAM,称为,idata,区。由于这些,idata,区含有,SFR,,,SFR,地址与,idata,区含有重叠部分,因此,MCS-51,系列芯片是通过区分所访问的存储区,来解决地址重叠问题,因为,idata,区只能通过间接寻址来访问。,例如,浮点型变量,x,、,y,和,z,被定义为,idata,存储类型,定位在片内,RAM,中,并只能用间接寻址方式进行访问:,float,idata,x,,,y,,,z,;,26,5.3.4,pdata,区,该区域为外部扩展,RAM,的低,256B,,汇编语言是用,MOVX,ACC,Rx,来进行读写。,例如,无符号整型变量,dimension,被定义为,pdata,型,定位在片外数据存储区,,C,语言中的语句如下,相当于用,MOVX,ACC,Ri,访问:,unsigned,int,pdata,dimension,;,27,5.3.5,xdata,区,MCS-51,系列芯片的最后一个存储空间为,64KB,,采用,16,位地址寻址,称作外部数据区,简称,xdata,区。这个区通常包括一些,RAM,,如,SRAM,,或一些需要通过总线接口的外围器件,对,xdata,区的读写操作需要至少两个处理周期。因此,使用频繁的数据应尽量保存在,data,区中,其他不频繁用到和对运算速度要求不高的变量都放到,xdata,区。,例如,无符号字符型三维数组变量,vector1044,被定义为,xdata,存储类型,定位在片外,RAM,中,占据,10,4,4=160,个字节:,unsigned char,xdata,vector1044,;,28,5.3.6 code,区,程序存储区,code,是用来存放可执行的代码段的,能够进行,16,位寻址,空间可达,64KB,。代码段是只读的,当要对外接存储器件,如,EPROM,进行寻址时,处理器会产生一个信号,对该器件进行选中操作。,目前使用的外接存储器一般为,EEPROM,。它可以被其他外围器件或,MCS-51,单片机进行改写,这使系统更新更加容易。带电池的,SRAM,也可用来代替,EPROM,,它可以像,EEPROM,一样进行程序的更新,并且没有像,EEPROM,那样读写周期的限制,但是当电源耗尽时,存储在,SRAM,中的程序也随之丢失。使用,SRAM,来代替,EPROM,时,允许快速下载新程序到目标系统中,这样就避免了编程,-,调试,-,擦写这样一个循环过程,不再需要使用昂贵的在线仿真器。,29,因为,MCS-51,系列芯片的片内,RAM,容量很有限,通常会把,RAM,分给参与运算的变量或数组,而那些程序中不变的数据则应存放在片内的,code,存储区,以节省宝贵的,RAM,空间。例如,在,code,区赋初值一般采用如下方式:,unsigned char code,skydata,=0 x02,0 x34,0 x22,0 x32,0 x21,0 x12;/,数据保存在,code,区,30,5.3.7 C51,的存储模式,如果在变量定义时略去以上存储类型的标志符,编译器会自动默认存储类型。默认的存储类型由,SMALL,、,COMPACT,和,LARGE,存储模式指令限制。,例如,若表明,char var1,在,SMALL,存储模式下,,var1,被定位在,data,存储区;在,COMPACT,模式下,,var1,被定位在,idata,存储区;在,LARGE,模式下,,var1,被定位在,xdata,存储区中。存储模式的有关说明如表,5-3,所示。,31,存储模式,说 明,SMALL,参数及局部变量放入可直接寻址的片内存储器(最大,128,字节,默认存储类型是,data,),因此访问十分方便。另外所有对象,包括栈,都必须嵌入片内,RAM,。栈长很关键,因为实际栈长依赖于不同函数的嵌套层数,COMPACT,参数及局部变量放入分页片外存储区(最大,256,字节,默认的存储类型是,pdata,),通过寄存器,R0,和,R1,间接寻址,栈空间位于内部数据存储区中,LARGE,参数及局部变量直接放入片外数据存储区(最大,64KB,,默认存储类型为,xdata,),使用数据指针,DPTR,来进行寻址。用此数据指针访问的效率较低,尤其是对二个或多个字节的变量,这种数据类型的访问机制直接影响代码的长度,另一个不便之处在于这种数据指针不能对称操作,表,5-3 C51,存储模式及说明,32,5.3.8 C51,对单片机资源的定义,在前文已经介绍过,,MCS-51,单片机是通过特殊功能寄存器,SFR,实现对其主要资源进行控制的。,MCS-51,单片机有,21,个,SFR,,,MCS-52,以上单片机中的,SFR,多于这个数,它们分布在片内,RAM,的高,128B,中,地址能够被,8,整除的,SFR,一般可以进行位寻址,对,SFR,只能用直接寻址方式访问。,C51,允许通过使用关键字(,sfr,、,sbit,)或直接引用编译器提供的头文件来实现对,SFR,的访问,但对于片外,RAM,或扩展,I/O,的直接访问只能由用户实现。,33,(,1,)、使用关键字定义,sfr,和,sfr16,sfr,和,sfr16,可以直接对,MCS-51,单片机的特殊寄存器进行定义,定义方法如下:,sfr,特殊功能寄存器名,=,特殊功能寄存器地址常数,;,sfr16,特殊功能寄存器名,=,特殊功能寄存器地址常数,;,例如,可以这样定义,STC89C52RC,的,P1,口:,sfr,P1=0 x90;/,定义,P1 I/O,口,其地址,90H,sfr,关键字后面是一个要定义的名字,可任意选取,但要符合标识符的命名规则,名字最好有一定的含义,如,P1,口可以用,P1,为名,这样程序会易于理解。等号后面必须是常数,不允许有带运算符的表达式,而且该常数必须在特殊功能寄存器的地址范围之内(,80H,FFH,)。,34,sfr,是定义,8,位的特殊功能寄存器,而,sfr16,则是用来定义,16,位特殊功能寄存器。如,STC89C52RC,的,T2,定时器,可以定义为:,sfr16 T2=0 xCC;/,这里定义,STC89C52RC,定时器,2,,地址为,T2L=CCH,T2H=CDH,用,sfr16,定义,16,位特殊功能寄存器时,等号后面是它的低位地址,高位地址默认为位于物理低位地址之上。注意,C51,中规定,sfr16,不能用于定时器,T0,和,T1,的定义。,(,2,)、使用,sbit,进行位定义,sbit,定义可位寻址对象,主要有以下几种定义方式:,1),sbit,位变量名位地址,可以用于定义访问特殊功能寄存器中的某位,例如,要经常访问,P1,口中的第,2,个引脚,P11,,可以按照以下方法进行定义:,sbit,P11=Ox91;,这样实现把位的绝对地址赋给位变量。同,sfr,一样,,sbit,的位地址必须位于,80H,FFH,之间。,35,2),sbit,位变量名特殊功能寄存器名,位的位置,例如,,sft,P1=0 x90;,sbit,P1_1=P11;/,先定义一个特殊功能寄存器名再指定位变量名所在的位置,当可寻址位位于特殊功能寄存器中时可采用这种方法,3),sbit,位变量名字节地址,位位置,例如,,sbit,P1_1=0 x90 1;,这种方法其实和第,2,种定义方法一样,只是把特殊功能寄存器的地址直接用常数表示。,36,(,3,)、通过头文件访问,SFR,C51,编译器中的头文件已经给出了常用,MCS-51,单片机中的,SFR,及其可位寻址位的定义。比如,,Keil,C51,将这些头文件按单片机的不同生产公司、不同型号分别存在,Keil,C51,的,INC,子目录下,在程序中只需直接引用这些头文件即可实现对,SFR,的访问和控制。,头文件引用实例:,#include /,使用的单片机为,MCS-51,系列,main(),TL0=0 xb0;/,访问定时器,T0,,设置时间常数,TH0=0 x3c;,TR0=1;/,启动定时器,T0,其中,,TL0,,,TH0,和,TR0,而已在头文件,“,reg51.h,”,中用,sbit,进行了定义。,37,(,4,)、扩展,I/O,端口或片外,RAM,的直接访问,扩展的片外,RAM,或,I/O,端口需要用户自己先定义后才能在语句或函数中使用,在后面的项目中有很多地方都会用到,这是一种总线方式的,I/O,端口读写控制方法,其方法如下:,#include /,定义,XBYTE,为一个指针,指向外部数据,RAM,的零地址单元,#define PA XBYTE0 xffec /,将,PA,定义为外部,I/O,口,地址为,0 xffec,main(),PA=0 x3A;/,将数据,3AH,写入地址为,0 xffec,的存储单元或,I/O,端口,38,5.4 C51,的基本运算,C51,的基本运算与,C,语言基本类似,主要包括以下几类:,(,1,)、算术运算符 用于各类数值运算,包括加,(,),、减,(,),、乘,(*),、除,(/),、求余,(,或称模运算,,%),、自增,(,),、自减,(,),共七种。,(,2,)、关系运算符 用于比较运算,包括大于,(),、小于,(=),、小于等于,(=),和不等于,(!=),六种。,(,3,)、逻辑运算符 用于逻辑运算,包括与,(&),、或,(|),、非,(!),三种。,39,(,4,)、位操作运算符 参与运算的量按二进制位进行运算,包括位与,(&),、位或,(|),、位非,(),、位异或,(),、左移,(),六种。,(,5,)、赋值运算符 用于赋值运算,分为简单赋值,(=),、复合算术赋值,(,=,=,*=,/=,%=),和复合位运算赋值,(&=,|=,=,=,=),三类共十一种。,(,6,)、指针运算符 用于取内容,(*),和取地址,(&),两种运算。,还有条件运算符、逗号运算符、求字节数运算符和其它特殊运算符等。,40,5.4.1,算术运算符和算术表达式,5.4.1.1,基本的算术运算符,C51,最基本的算术运算符有以下五种:,(,1,)、加法运算符,“,”,加法运算符为双目运算符,即应有两个量参与加法运算,具有右结合性。,(,2,)、减法运算符,“,”,减法运算符为双目运算符。,(,3,)、乘法运算符,“,*,”,双目运算符,具有左结合性。,(,4,)、除法运算符,“,/,”,双目运算符,具有左结合性。参与运算量均为整型时,结果也为整型,舍去小数。如果运算量中有一个是实型,则结果为双精度实型。,(,5,)、求余运算符,(,模运算符,),“,%,”,双目运算符,具有左结合性。要求参与运算的量均为整型。求余运算的结果等于两数相除后的余数。,41,5.4.1.2,自增、自减运算符,(,1,)、自增运算符 记为,“,”,,其功能是使变量的值自增,1,。,(,2,)、自减,1,运算符 记为,“,”,,其功能是使变量值自减,1,。,自增,1,、自减,1,运算符均为单目运算符,都具有右结合性,有以下几种形式:,i i,自增,1,后再参与其它运算。,i i,自减,1,后再参与其它运算。,i,i,参与运算后,,i,的值再自增,1,。,i i,参与运算后,,i,的值再自减,1,。,42,5.4.1.3,强制类型转换运算符,其一般形式为:,(,类型说明符,)(,表达式,),功能是把表达式的运算结果强制转换成类型说明符所表示的类型。,例如,,(float)a,;,/,把,a,转换为实型,43,5.4.1.4,赋值运算符,赋值运算符记为,“,=,”,,由,“,=,”,连接的式子称为赋值表达式。,其一般形式为:,变量,=,表达式,例如,,x=,a+b,;/,将,a,和,b,的和赋值给,x,44,5.4.2,关系运算符,在程序中经常需要比较两个量的大小关系,以决定程序下一步的工作。比较两个量的运算符称为关系运算符。,在语言中有以下关系运算符:,小于。,大于。,=,大于等于。,=,等于。,!=,不等于。,关系运算符都是双目运算符,其结合性均为左结合。关系运算符的优先级低于算术运算符,高于赋值运算符。在六个关系运算符中,,、,、,=,的优先级相同,高于,=,和,!=,,,=,和,!=,的优先级相同。,45,5.4.3,逻辑运算符,C51,中提供了三种逻辑运算符:,&,与运算。,|,或运算。,!,非运算。,与运算符,&,和或运算符,|,均为双目运算符,具有左结合性。非运算符,!,为单目运算符,具有右结合性。,逻辑运算的值为,“,真,”,和,“,假,”,两种,用,“,1,”,和,“,0,”,来表示。其求值规则如下:,(,1,)、与运算,&,参与运算的两个量都为真时,结果才为真,否则为假。,(,2,)、或运算,|,参与运算的两个量只要有一个为真,结果就为真;两个量都为假时,结果为假。,(,3,)、非运算,!,参与运算的量为真时,结果为假;参与运算的量为假时,结果为真。,46,5.4.4,位运算,位运算的操作对象只能是整型和字符型数据,不能是实型数据。,C51,提供以下六种位运算,&,(按位与)两个字符或整数按位进行逻辑与运算。,|,(按位或)两个字符或整数按位进行逻辑或运算。,(按位异或)两个字符或整数按位进行逻辑异或运算。,(按位取反)两个字符或整数按位进行逻辑非运算。,(右移)两个字符或整数按位进行逻辑右移运算。,位操作指令是本书项目程序中的重点,在,C51,控制类程序设计中的应用比较普遍。,47,5.5 C51,的基本语句,C51,的所有程序都是由表达式语句构成的,表达式是一个式子,在表达式的后面加上分号(;)就构成了表达式语句,表达式语句是,C,语言的一大特色。在其它语言中表达式不能单独存在,而在,C,语言中,任何表达式都可以以相应表达式语句的形式存在于程序中。例如,,i+,;,a-b-c-1,;,x*,x+y,*y,;,sin(0.75),;,C,语言程序是结构化的程序,设计了多种程序控制语句,用于循环和选择等。,48,5.5.1,条件语句,用,if,语句可以构成分支结构,它根据给定的条件进行判断,以决定执行某个分支程序段。,C51,的,if,语句有三种基本形式。,(,1,)、形式,1,if(,表达式,),语句,1;,else,语句,2;,上述结构表示,如果表达式的值为非,0(TURE),即真,则执行语句,1,,执行完语句,1,从语句,2,后开始继续向下执行;如果表达式的值为,0(FALSE),即假,则跳过语句,1,而执行语句,2,。,(,2,)、形式,2,if(,表达式,),语句,1;,上述结构表示,若表达式的值为非,0,则执行语句,1,;否则跳过语句,1,继续执行。,49,(,3,)、形式,3,阶梯式,if-else-if,结构:,if(,表达式,1),语句,1;,else if(,表达式,2),语句,2;,else if(,表达式,3),语句,3;,.,.,.,else,语句,n;,这种结构是从上到下逐个对条件进行判断,一旦发现条件满足就执行与它有关的语句,并跳过其它剩余阶梯;若没有一个条件满足,则执行最后一个,else,语句,n,(缺省条件)。,50,5.5.2,循环语句,for,循环语句的一般形式为,for(;),语句,;,“,初始化,”,是一个赋值语句,它用来给循环控制变量赋初值,只执行一次;,“,条件表达式,”,是一个关系表达式,它决定什么时候退出循环;,“,增量,”,定义循环控制变量每循环一次后按什么方式变化。这三个部分之间用,“,;,”,隔开。,5.5.2.1,for,循环,C51,提供三种基本的循环语句:,for,语句、,while,语句和,do-while,语句。,51,使用,for,循环时应注意:,for,循环中语句可以为语句体,但要用,“,”,和,“,”,将参加循环的语句括起来。,for,循环中的,“,初始化,”,、,“,条件表达式,”,和,“,增量,”,都是选择项,即可以省略,但,“,;,”,不能省略。省略了,“,初始化,”,,表示 不对循环控制变量赋初值;省略了,“,条件表达式,”,,则不做其它处理时便成为死循环;省略了,“,增量,”,,则不对循环控制变量进行操作,这时可在语句体中加入修改循环控制变量的语句。,52,5.5.2.2 while,循环,while,循环的一般形式为,while(,条件,),语句,;,while,循环表示当条件为真时,便执行语句,直到条件为假才结束循环,并继续执行循环程序外的后续语句。,与,for,循环一样,while,循环总是在循环的头部检验条件,这就意味着循环可能什么也不执行就退出。,53,5.5.2.3 do-while,循环,do-while,循环的一般格式为,do,语句,;,while(,条件,);,此循环与,while,循环的不同在于:它先执行循环中的语句,然后再判断条件是否为真,如果为真则继续循环;如果为假,则终止循环。因此,,do-while,循环至少要执行一次循环语句。,54,5.5.2.4,开关语句,在编写程序时,经常会碰到按不同情况分转的多分支问题,这时可用嵌套,if-else-if,语句来解决,但,if-else-if,语句使用不方便,并且容易出错。,C51,中的开关语句就是针对这种情况设计出来的,其格式为,switch(,变量,),case,常量,1:,语句,1,或空,;,case,常量,2:,语句,2,或空,;,.,.,.,case,常量,n;,语句,n,或空,;,default:,语句,n+1,或空,;,执行,switch,开关语句时,将变量逐个与,case,后的常量进行比较,若与其中一个相等,则执行该常量下的语句,若不与任何一个常量相等,则执行,default,后面的语句。,55,5.5.3 break,、,continue,和,goto,语句,5.5.3.1 break,语句,break,语句通常用在循环语句和开关语句中。当,break,语句用于开关语句,switch,中时,可使程序跳出,switch,语句而执行,switch,语句以后的语句;如果没有,break,语句,则将成为一个死循环而无法退出。,当,break,语句用于,do-while,、,for,、,while,循环语句中时,可使程序终止循环而执行循环后面的语句,通常,break,语句总是与,if,语句联在一起,即满足条件时便跳出循环。,使用时应注意,:,break,语句对,if-else,的条件语句不起作用。,在多层循环中,一个,break,语句只向外跳一层。,56,5.5.3.2 continue,语句,continue,语句的作用是跳过循环体中剩余的语句而强行执行下一次循环。,continue,语句只用在,for,、,while,、,do-while,等循环体中,常与,if,条件语句一起使用,用来加速循环。,57,5.5.3.3,goto,语句,goto,语句是一种无条件转移语句,使用格式为:,goto,标展开阅读全文

咨信网声明:本文档由用户上传并分享,仅供学习交流、研究之用,未经授权,严禁复制、发行、汇编、翻译或网络传播等,侵权必究。
咨信网小贴示:
1、浏览或下载可查看了解,请点击【咨信网告知】。
2、下载文件中如有侵权或不适当内容,将立即纠正。
3、如果因为网速或其他原因下载失败请重新下载,重复下载[60天内]不扣币。
4、开具发票登录电脑端申请,请点击【索取发票】。
咨信网客服组:【微信客服】
1、浏览或下载可查看了解,请点击【咨信网告知】。
2、下载文件中如有侵权或不适当内容,将立即纠正。
3、如果因为网速或其他原因下载失败请重新下载,重复下载[60天内]不扣币。
4、开具发票登录电脑端申请,请点击【索取发票】。
咨信网客服组:【微信客服】


第05章-Keil-C51程序设计基础.ppt
















自信AI助手














微信客服
客服QQ
发送邮件
意见反馈



链接地址:https://www.zixin.com.cn/doc/13340266.html