收藏 分销(赏)

第7章-单片机C语言编程基础知识.pptx

上传人:人****来 文档编号:9250031 上传时间:2025-03-18 格式:PPTX 页数:61 大小:1.40MB 下载积分:14 金币
下载 相关 举报
第7章-单片机C语言编程基础知识.pptx_第1页
第1页 / 共61页
第7章-单片机C语言编程基础知识.pptx_第2页
第2页 / 共61页


点击查看更多>>
资源描述
,C,语言提高篇,单片机原理及应用,#,谢谢观看,2,3,7,.1.1,标识符和关键字,7,.1.2,C51,数据类型,7,.1.3,常量与变量,4,5,C,语言是一种编译型程序设计语言,,它既具有高级语言的特点,又具备了汇编语言的功能。相对于汇编语言而言,使用,C,语言开发系统可以缩短开发周期、增强程序的可读性,并且便于改进、扩充和移植。,C,语言程序本身不依赖于硬件开发平台,程序不做修改或做少量修改就可以移植到不同的单片机中。目前,,使用,C,语言进行程序设计已经成为单片机软件开发的主流,。,基于单片机的,C,语言又称为,C51,语言,。和标准,C,语言所不同的是,,C51,语言运行于单片机平台上,并根据单片机的硬件特点扩展了部分关键字,。以下关于,C,语言的描述都是基于单片机的,后面不再强调这一点。,1,C,语言程序由,一个主函数和若干其他函数构成,,主函数可以调用其他函数,其他函数之间可以相互调用,。,主函数名必须为,main(),。,C,程序通过调用该函数去执行指定的语句。,2,3,C,程序的,执行是从,main(),函数开始,的,系统对该函数的位置无特殊规定。,4,C,程序中,一个函数需要调用另一个函数时,,被调用函数应预先定义或声明,。,6,基于单片机的,C,语言程序有以下几个特点:,5,函数通常由说明部分和函数体两部分组成,,说明部分是对函数名、函数类型、形参名和形参类型等所做的说明,。,C,程序书写格式自由,一行可以有多条语句,,每条语句均以“,;,”结尾,。,6,7,指针与指针变量,:若定义变量,x,,,&x,即为指向,x,的指针;若,xp=&x,,那么,利用,*xp,可以访问变量,x,。,8,当前程序需要包含其他源程序文件时,应在当前程序的开始处使用包含,处理命令,#include,,该命令的含义是将其他源文件的全部内容包含到本程序中。,9,在,C,程序中,可以用,#define,定义的标识符来表示一个常量,。,7,1,标识符,标识符是表示程序中自定义对象名称的符号,。其中的,自定义对象,可以是,常量、变量、数组、结构、语句标号以及函数等,。,C51,语言中,,标识符由字母(,a,z,,,A,Z,)、数字(,0,9,)和下划线“,_,”组成,,一个标识符最多可支持,32,个字符。,标识符应尽量见名知意,定义标识符时需要遵守以下规则:,标识符的第一个字符必须是字母或者下划线,不能为数字。,C51,的标识符区分大小写,例如,“,ch1,”和“,Ch1,”表示两个不同的标识符。,用户自定义的标识符不能与系统保留的关键字相同。,8,2,关键字,关键字是,C51,编译器保留的一些特殊标识符,它们具有特定的含义和用法,。单片机的,C51,语言继承了,ANSIC,标准定义的,32,个关键字,如表,7-1,所示。,表,7-1 C51,的关键字,9,关键字,用途,说明,auto,存储种类说明,用以说明局部变量为自动变量,可省略,break,程序语句,退出最内层循环,case,程序语句,switch,语句中的选择项,char,数据类型说明,单字节整型数或字符型数据,const,存储类型说明,在程序执行过程中不可更改的常量值,continue,程序语句,转向下一次循环,default,程序语句,switch,语句中的失败选择项,do,程序语句,构成,do-while,循环结构,double,数据类型说明,双精度浮点数,else,程序语句,构成,if-else,选择结构,enum,数据类型说明,枚举类型,extern,存储种类说明,在其他程序模块中说明了的全局变量,表,7-1 C51,的,关键字,(续),10,关键字,用途,说明,float,数据类型说明,单精度浮点数,for,程序语句,构成,for,循环结构,goto,程序语句,构成,goto,转移结构,if,程序语句,构成,ifelse,选择结构,int,数据类型说明,基本整型数,long,数据类型说明,长整型数,register,存储种类说明,使用,CPU,内部寄存的变量,return,程序语句,函数返回,short,数据类型说明,短整型数,signed,数据类型说明,有符号数,二进制数据的最高位为符号位,sizeof,运算符,计算表达式或数据类型的字节数,static,存储种类说明,静态变量,struct,数据类型说明,结构类型数据,switch,程序语句,构成,switch,选择结构,typedef,数据类型说明,重新进行数据类型定义,union,数据类型说明,联合类型数据,unsigned,数据类型说明,无符号数据,void,数据类型说明,无类型数据,volatile,数据类型说明,该变量在程序执行中可被隐含地改变,while,程序语句,构成,while,和,do-while,循环语句,同时,,C51,语言又结合单片机硬件的特点扩展了,19,个关键字,包括,_at_,,,idata,,,sfr16,,,alien,,,interrupt,,,small,,,bdata,,,large,,,_task_,,,code,,,bit,,,pdata,,,using,,,reentrant,,,xdata,,,compact,,,sbit,,,data,和,sfr,等。,Keil,软件中的,C51,编译器支持的数据类型如表,7-2,所示。,表,7-2 C51,编译器支持,的数据类型,11,数据类型,长度,值域,unsigned char,单字节,0,255,signed char,单字节,128,+,127,unsigned int,双字节,0,65535,signed int,双字节,32768,+,32767,unsigned long,四字节,0,4294967295,signed long,四字节,2147483648,+,2147483647,float,四字节,1.175494E,38,3.402823E,+,38,*,1,3,字节,对象的地址,bit,位,0,或,1,sfr,单字节,0,255,sfr16,双字节,0,65535,sbit,位,0,或,1,12,1,bit,字,下面针对,C51,语言中扩展的数据类型做简单说明。,2,sfr,bit,是,C51,编译器扩充的数据类型,它可以定义一个位变量,定义位变量时可以为变量赋值,但不能定义位指针或位数组。位变量的取值是一个二进制位,非,0,即,1,。,该数据类型的定义格式为:,bit,变量名,=,变量值,;,sfr,是一种扩充数据类型,它能够定义一个特殊功能寄存器,利用它可以访问,51,单片机内部的所有特殊功能寄存器。该类型的变量占用一个内存单元,变量的取值范围为,0 x80,0 xFF,。,该数据类型的定义格式为:,sfr,变量名,=,变量地址,;,例如,“,sfr P1=0 x90;”,这条语句定义变量,P1,为,P1,端口在片内的寄存器。,13,3,sfr16,sfr16,也是一种扩充数据类型,它定义的变量占用两个内存单元。,sfr16,和,sfr,一样用于操作特殊功能寄存器,不同的是,,sfr16,定义的变量可访问,16,位特殊功能寄存器,,sfr16,类型变量的取值范围为,0,65535,。,该数据类型的定义格式如下:,sfr16,变量名,=,变量地址,;,此处的变量地址为,16,位地址中的低,8,位地址。通过,sfr16,类型变量访问,16,位特殊功能寄存器时,先读低字节数据,后读高字节数据;对特殊功能寄存器写入数据时,先写入高字节地址,再写入低字节地址。,14,4,sbit,位寻址位,sbit,是,C51,的一种扩充数据类型,利用它可以访问单片机内部,RAM,中位地址空间或特殊功能寄存器中的可位寻址的位。,该数据类型的定义格式有以下,3,种:,sbit,变量名,=,位地址,;,sbit,变量名,=sfr,地址,位序号,;,sbit,变量名,=,字节地址,位序号,;,例如:,sbit OV=0 xd2;/0 xd2,是,OV,的位地址,sbit OV=PSW2;/PSW,寄存器需要先使用,sfr,定义,sbit OV=0 xd02;/0 xd0,是,PSW,寄存器的地址,(,2,)浮点型常量,浮点型常量可分为十进制和指数两种表示形式。,十进制浮点型常量,由数字和小数点组成,整数或小数部分为,0,时可以省略,但必须要保留小数点,如,0.888,,,3345.345,,,0.0,,,.25,,,300.,等。,指数浮点型常量,表示形式为:,数字,.,数字,e,数字。,中的内容为可选项,如,125e3,,,7e9,,,3.0e3,等。,1,常量,在程序运行过程中,值不能被修改的量称为常量,如固定的数据表、字符等。常量的数据类型有整型、浮点型、字符型、字符串型和位标量型等。,(,1,)整型常量,整型常量的表示方法有多种,可以采用十进制方式表示,如,123,,,0,,,89,等;若采用十六进制表示,数据应以,0 x,开头,如,0 x34,,,0 x3B,等;如果是长整型数据,则需要在数字后面加上字母,L,,如,104L,,,034L,,,7850L,等。,15,(,3,)字符型常量,将单个字符放在单引号内的常量就是字符型常量,如,ad,等。有一类字符型常量专门用来表示控制字符,如回车符、换行符等,它们被称为转义字符,其表示方式为在字符前面加上一个反斜杠“,”,如,n,。常用转义字符如表,7-3,所示。,表,7-3,常用转义字符表,16,转义字符,含义,ASCII,码(十六,/,十进制),o,空字符(,NULL,),00H/0,n,换行符(,LF,),0AH/10,r,回车符(,CR,),0DH/13,t,水平制表符(,HT,),09H/9,b,退格符(,BS,),08H/8,f,换页符(,FF,),0CH/12,单引号,27H/39,双引号,22H/34,反斜杠,5CH/92,(,4,)字符串型常量,该常量通常由放在双引号内的一个或多个字符组成,如,testOK,等。当双引号内没有字符时,该字符串为空字符串。,在,C51,语言中,字符串常量是被当作字符类型数组来处理的。在存储字符串时系统会在字符串尾部加上“,0,”转义字符作为该字符串的结束符。例如,字符串常量,A,和字符常量,A,是不同的,前者在存储时多占用一个字节的空间。,17,(,5,)位标量,该常量是,C51,编译器的一种扩充数据类型,它的值是一个二进制位。,例如,定义位标量,False,和,True,:,#define False 0 x0/,用预定义语句可以定义常量,这里定义,False,为,0,,,True,为,1,#define True 0 x1/,程序中用到,False,时编译器自动用,0,替换,同理,True,替换为,1,2,变量,在程序运行过程中,值可以改变的量称为变量,,C51,编译器支持的数据类型均可定义变量。要在程序中使用变量,必须先定义变量,即指定变量名,并指出变量对应的数据类型和存储模式,这样编译系统才能为变量分配相应的存储空间。,18,变量的定义格式如下:,存储类型,数据类型,存储器类型,变量名表,在定义格式中,除了数据类型和变量名表是必要的,其他的都是可选项。,(,1,)存储类型,不同存储类型的变量或不同位置定义的变量都具有不同的作用范围,这个有效范围即是变量的作用域。在单片机程序中,变量的存储种类可以分为自动变量、全局变量、静态变量和寄存器变量。,自动变量,定义变量时,在变量名前面加上关键字,auto,,即把该变量定义为自动变量。它一般出现在函数内部或复合语句中,其作用范围是本函数或复合语句内部,如果省略关键字,auto,,即默认该变量为自动型变量。,19,在程序执行过程中,自动变量的存储空间是动态分配的。当程序执行到该变量的声明语句时,编译器根据变量类型自动为其分配存储空间;当函数或复合语句执行完毕后,自动变量的存储空间将立刻被取消,自动变量失效。,全局变量,此类变量以关键字,extern,标识。全局变量一般定义在所有函数的外部,其作用域是从全局变量定义的位置到源文件结束,它可以被作用域范围内的任何函数调用。全局变量有时也称为外部变量。,静态变量,此类变量以关键字,static,标识。从变量的作用域来看,静态变量和自动变量类似,其作用域是定义该变量的函数的内部。如果静态变量定义在函数外部,它将具有全局变量的作用域。,20,从内存占用的角度来看,静态变量和全局变量类似,一旦分配存储空间,它始终占有该内存空间,直至程序运行结束。,寄存器变量,单片机的,CPU,寄存器中也可以保存少量的变量,这种变量称为寄存器变量。寄存器变量以关键字,register,标识。单片机对,CPU,寄存器的读写速度要远高于对其他类型变量的访问速度,所以把最频繁使用的变量定义为寄存器变量可以有效地提高程序运行速度。,由于单片机资源有限,系统只允许同时定义两个寄存器变量。如果多于两个,编译时系统会自动将其他寄存器变量当做非寄存器变量来处理。,21,(,2,)存储器类型,存储器类型用于指定变量在,C51,硬件系统中所使用的存储区域,这样便于在编译时进行准确定位。,Keil,软件所能识别的存储器类型如表,7-4,所示。,22,存储器类型,说明,data,直接访问内部数据存储器(,128,字节),访问速度最快,bdata,可位寻址内部数据存储器(,16,字节),允许位与字节混合访问,idata,间接访问内部数据存储器(,256,字节),允许访问全部内部地址,pdata,分页访问外部数据存储器(,256,字节),用,MOVX Ri,指令访问,xdata,外部数据存储器(,64KB,),用,MOVX DPTR,指令访问,code,程序存储器(,64KB,),用,MOVC A+DPTR,指令访问,表,7-4,存储器类型,如果在定义变量时省略了存储器类型,编译系统会按照默认的存储模式去指定变量的存储区域,这些存储模式包括,small,,,compact,和,large,。,small,存储模式,该模式是将函数参数和局部变量都放置在片内,RAM,中(默认变量类型为,data,,最大,128,字节)。另外,其他所有对象(包括栈)也都优先放置在片内,RAM,区,当片内,RAM,用满时,再放置到片外,RAM,中。,compact,存储模式,此种存储模式是将参数和局部变量都放置在片外,RAM,区(默认存储类型是,pdata,,最大,256,字节),变量需要通过间接寻址方式进行访问。,large,存储模式,该模式是将参数和局部变量放在片外,RAM,中(默认的存储类型是,XDATA,,最大,64KB,);变量需要使用数据指针,DPTR,通过间接寻址方式访问。,23,(,3,)对变量进行绝对定位,C51,扩展的关键字,_at_,用于对变量作绝对地址定位,,_at_,一般出现在变量的定义中,其格式为:,存储类型,数据类型,存储区,变量名,1 _at_,地址常数,,变量名,2,例如:,unsigned char data aa _at_ 0 x30;/,对,data,区域中的变量,aa,作绝对地址定位,unsigned int pdata cc10 _at_ 0 x34;/,对,pdata,区域中的数组,cc,作绝对地址定位,unsigned char xdata printer_port _at_ 0 x7fff;/,对,xdata,区域中的变量,printer_port,作绝对地址定位,24,对变量定位绝对地址时,要注意以下几点:,定位绝对地址时,变量不能初始化,因此不能对,code,型常量绝对定位;,定位绝对地址的变量只能是全局变量,不能在函数中对变量进行绝对定位;,定位绝对地址的变量多用于,I/O,端口,一般情况下不对变量作绝对定位;,位变量不能使用,_at_,进行绝对定位。,25,3,变量的初始化及赋值,(,1,)变量的初始化,变量的初始化是指定义时给变量赋予一个默认值,外部变量和静态全局变量一般在定义时被初始化,局部变量包括静态局部变量是在进入定义它们的函数或复合语句时才被初始化。所有的全局变量在没被明确初始化时都会被系统自动清零,而局部变量和寄存器变量在未被赋值前其值是不确定的。,赋予外部变量和静态变量的初值必须是常数表达式,而自动变量和寄存器变量的初值可以是任意表达式,这个表达式可以是常数或前面说明过的变量和函数。例如:,float f0,f1=0.2;/,定义全局变量,在初始化时,f0,被清零,,f1,被赋,0.2,main(),static int i=10,j;/,定义静态局部变量,初始化时,i,被赋,10,,,j,为,0,int k=i*5;/,定义局部变量,初始化时,k,被赋,10*5=50,char c=y;/,定义字符型变量并初始化,26,(,2,)变量的赋值,变量赋值是指给已定义的变量赋一个具体值。常见的变量赋值有以下几种类型:,给整型变量和浮点型变量赋值,。赋值格式如下:,变量名,=,表达式,;,例如:,main(),int a,m;/,定义局部整型变量,a,,,m,float n;/,定义局部浮点变量,n,a=100,m=20;/,给变量赋值,n=a*m*0.1;,27,C,语言中给多个变量赋同一数值时允许使用连等的方式。例如:,main(),int a,b,c;,a=b=c=0;/,同时给,a,,,b,,,c,赋值,给字符型变量赋值,。可将字符常量、字符的,ASCII,值或转义字符等赋给字符型变量,例如:,main(),char a0,a1,a2;/,定义局部字符型变量,a0,,,a1,,,a2,a0=b;/,将字符,b,赋给,a0,a1=50;/,将十进制数字,2,的,ASCII,码值,50,赋给,a1,a2=x0d;/,将回车符赋给,a2,28,29,7,.2.1,算术运算符,7,.2.2,关系运算符,7.2.3,逻辑运算符,7.2.4,布尔“位”运算符,7.2.5,赋值运算符,7.2.6,递增,/,递减运算符,7.2.7,运算符的优先级,30,单片机,C,程序的运算符和表达式如下:,关系运算符,6,个,=,大于,xy,若,x,变量的值大于,y,变量的值,其结果为,1,,否则为,0,小于,x=,大于等于,x=y,若,x,变量的值大于或等于,y,变量的值,则结果为,1,,否则为,0,=,小于等于,xy,),|,(,yz,),若,x,变量的值大于,y,变量的值,或,y,变量的值也大于,z,变量的值,其结果为真(值为,1,),否则为假(值为,0,),!,非运算,!(,xy,),若,x,变量的值大于,y,变量的值,其结果为真(值为,1,),否则为假(值为,0,),34,布尔位运算符与逻辑运算符类似,不同之处在于逻辑运算的最终结果为真或假,而布尔位运算符的结果是一个具体数据。布尔位运算符如表,7-8,所示。,表,7-8,布尔“位”,运算符,符号,作用,举例,解释,&,与运算,A=x&y,变量,A,的结果为将,x,与,y,变量的每个位进行,AND,运算,|,或运算,B=x|y,变量,B,的结果为将,x,与,y,变量的每个位进行,OR,运算,异或运算,C=xy,变量,C,的结果为将,x,与,y,变量的每个位进行,XOR,运算,取反运算,D=,x,变量,D,的结果为将,x,与,y,变量的每个位进行取反运算,左移运算,E=x,右移运算,F=xn,变量,F,的结果为将变量,x,值右移,n,位。,35,常见的赋值运算符是“,=,”,由它又衍生出其他多种赋值运算符,如表,7-9,所示,。,表,7-9,赋值,运算符,36,符号,作用,举例,说明,=,赋值,A=x,将变量,x,的值赋给变量,A,+=,赋值加,B+=x,相当于,B=B+x,-=,赋值减,C-=x,相当于,C=C-x,*=,赋值乘,D*=x,相当于,D=D*x,/=,赋值除,E/=x,相当于,E=E/x,%=,赋值取余,F%=x,相当于,F=F%x,&=,赋值与,G&=x,相当于,G=G&x,|=,赋值或,H|=x,相当于,H=H&x,=,赋值异或,I=x,相当于,I=Ix,=,左移赋值,J=n,相当于,J=J=,右移赋值,K=n,相当于,K=K,左移、右移,自左向右,7,=!=,关系运算符,自左向右,8,&,按位与,自左向右,9,按位异或,自左向右,10,|,按位或,自左向右,11,&,逻辑与,自左向右,12,|,逻辑或,自左向右,13,=*=/=%=+=-=,=&=|=,赋值运算符,自右向左,40,7.3.1,循环结构,7,.3.2,选择结构,41,循环结构是程序中需要反复执行某个功能而设置的一种程序结构,它通常由循环体和循环条件构成。它根据循环体中的条件判断是否继续执行循环体。,C51,语言提供,3,种循环语句:,for,语句、,while,语句和,do-while,语句。,1,for,语句,for,语句的一般形式为:,for(,表达式,1;,表达式,2;,表达式,3),语句,;,其中,表达式,1,为赋值语句,给循环变量进行初始化赋值;表达式,2,是关系逻辑表达式,其值用于判断循环条件是否成立,取值为真或假;表达式,3,定义循环变量在每次循环后的变化方式。,例如:,for(int i=0;i8;i+),P0=data;,42,2,while,语句,while,语句的特点是先判断条件表达式,表达式的值为真就执行循环体中的语句;表达式的值为假就结束循环,继续执行循环外的下一条语句。语句格式如下:,while(,表达式,),语句,;,43,3,do-,while,语句,do-while,语句的特点是先执行一遍循环体再判断条件,语句格式如下:,do,语句,;,while(,表达式,);,该语句在执行时要先执行一次,do,后面的语句,然后判断表达式是否为真,如果表达式的值为真,则再次执行,do,后面的语句,直到表达式为假时,结束循环并继续执行循环外的后续语句。,选择结构是根据条件决定程序的走向,,C51,提供的选择语句有,if-else,语句及,switch,语句,。,if-else,语句,又称为条件选择语句,在执行时需要先对条件进行判断,再根据判断结果执行不同的语句,语句格式如下:,if(,表达式,),语句,1;,else,语句,2;,该语句需要先判断表达式的值是否成立,如果成立,执行语句,1,,否则执行语句,2,。,1,if-else,语句,44,有时简单的,if-else,语句不能满足实际应用,我们也可以使用,if-else,的多重条件判断语句编写程序,其格式如下:,if(,表达式,1),语句,1;,else if(,表达式,2),语句,2;,else if(,表达式,3),语句,3;,else,语句,4;,45,执行该语句时,先判断表达式,1,是否成立,如果成立,执行语句,1,;如果不成立,再判断表达式,2,是否成立,如果成立,执行语句,2,,否则判断表达式,3,;如果表达式,3,成立,则执行语句,3,,如不成立,执行语句,4,。,2,switch,语句,switch,语句为程序的走向提供多重选择,因而被称为多分支选择语句。这种选择方式不存在优先等级的问题,语句格式如下:,switch(,表达式,),case,常数,1:,语句,1;break;,case,常数,2:,语句,2;break;,default:,语句,n;break;,46,switch,后面表达式的值与某一,case,后面的常数值相等时,就执行该,case,后面的语句,遇到,break,语句时退出,switch,语句。当所有的,case,中的常数值都没能够与表达式的值匹配时,就执行,default,后面的语句。,switch,语句在使用时要注意以下几点:,47,每个,case,后面的常数值必须是互不相同的。,每个,case,和,default,出现的次序不影响程序的执行结果。,如果遗忘了,case,后面的,break,语句,则程序在执行了当前,case,语句后,不会退出,switch,语句,而是继续执行后续的,case,语句。,48,(,1,)数组的声明,数组也是一种变量,它将相同数据形态的若干个变量以同一个变量名称来表示。数组的声明格式如下:,数据类型 数组名,数组大小,;,例如,声明一个含有,5,个字符的数组,语句如下:,char LPC5;,该字符数组共包含,5,个变量,分别是,LPC0,LPC4,。由于,C51,语言中没有“字符串”这种数据类型,所以字符数组常用来存放字符串。,数组(,array,),是一种将同类型数据集合管理的数据结构,而,指针(,Pointer,),是存放存储器地址的变量,它们都是数据管理的好帮手。,1,数组,49,(,2,)数组的赋值,声明数组的同时也可以对其赋初值,如“,char LPC5=ABCD;,”。,经过上述声明后,,LPC0=A,,,LPC1=B,,,LPC2=C,,,LPC3=D,,,LPC4=0,。,若声明时不知道数组的长度,也可将数组的长度省略,交由程序处理。例如:,char string1=welcome to hua dong jiao dali gong xue yuan,声明整型或浮点型数组时,如需指定其初值,可采用如下方式:,int Num6=30,22,33,44,55,66;,50,多维数组定义格式如下:,数据类型 数组名,常量表达式,1,常量表达式,2,常量表达式,n;,例如:,int Num32=10,11,12,13,14,15;,2,指针,(,1,)指针的定义,指针是用来存放存储器地址的变量,既然是变量,使用前也需要先定义。定义格式如下:,数据类型,*,变量名称,;,例如,声明一个名为,ptr,的指针,语句如下:,int*ptr;,也可以将同类型的变量与指针放在一起声明,例如:,int*ptr1,*ptr2,a,b,c;,与指针息息相关的运算符是“,&,”,该运算符的功能是取变量的地址,它可以将指定变量的地址放入指针变量。常见的语句形式如下:,ptr1=,51,执行上述语句后,,a,变量的地址被放入了,ptr1,指针变量中。该语句如果用于数组变量,可以先获取数组的第一个元素的地址,例如:,ptr1=,执行上面的语句后,,Num,数组的首地址将被放入,ptr1,指针变量中。若要将,Num0,的内容输出到,P2,口,可使用语句“,p2=Num0;,”或者“,p2=*ptr1;,”。,52,(,2,)指针变量的运算,若先使指针变量,p,指向数组,a,(即,p=a,),则:,p+,(或,p+=1,),该操作将使指针变量,p,指向下一个数组元素,即,a1,。,*p+,,由于,+,与,*,运算符优先级相同,而结合方向为从右向左,因此,,*p+,等价于,*(p+),,即先得到,p,指向的变量的值(,*p,),然后再执行,p,自加运算。,(*p)+,,表示,p,所指向的元素值加,1,,而不是,p,加,1,。例如,,p=&a0,,且,a0=3,,那么执行完,(*p)+,后,,a0=4,。,若,p,指向当前数组中第,i,个元素,则:,53,*(p-),与,ai-,等价,相当于先执行,*p,,然后再使,p,自减;,*(+p),与,a+i,等价,先执行,p,自加操作,再执行,*p,运算;,*(-p),与,a-i,等价,先执行,p,自减操作,再执行,*p,运算。,3,函数,函数由函数头和函数体两部分组成,。,函数头,又由返回值类型、函数名和形式参数表组成。返回值类型可以是某个数据类型;函数名是用户为函数起的名字,用来唯一标识一个函数;形式参数表可以有零个或多个变量,在进行函数调用时,实际参数将被复制到这些变量中。,函数体,则是函数实现自身功能的一组语句。函数的一般形式如下:,类型说明符 函数名,(,形式参数表,),函数体,54,例如:,void Sub_name(int x),int i,j;,unsigned char LED;,LED=0 xff;/*,关闭,LED*/,其中,函数的返回值类型是,void,;函数名是,Sub_name,;从函数外部传递给函数的变量是,x,;“,int i,j;,和,unsigned char LED;,”是函数中的变量声明;“,LED=0 xff;/*,关闭,LED*/,”是函数体程序区。,55,普通函数与,main(),函数的结构类似,两者的区别在于普通函数能够接受从函数外部传递的变量,即形式参数,而,main(),函数没有形式参数。,56,C51,语言中提供了各种预处理命令,其作用类似于汇编程序中的伪指令。在编译环境对源程序进行编译前,需要先对程序中的预处理命令进行处理,然后将处理结果和源程序一起编译。,C51,语言中的预处理命令包括宏定义命令、文件包含命令和条件编译命令等。通常,除条件编译命令外,预处理命令一般放在函数体之外,并且通常都放置在源文件的开头。,1,宏定义命令,57,#define,命令用来指定常数、字符串或宏函数的代名词,与汇编语言的“,equ,”“,reg,”命令一样,,#define,命令的格式如下:,#define,代名词常数,(,字符串或宏函数,),例如:,#define outputs P2,经过上述定义后,如果要将数据通过,P2,口输出,,P2,就可以用,output,代替,输出语句如下:,outputs=0 xff;/*,输出,1111 1111*/,进行编译时,预处理器会将整个程序中的所有,outputs,替换为,P2,。,2,文件包含命令,58,#include,命令的功能是将指定的定义或声明文件放入程序之中,该命令常用于引入标准库函数文件。下面是一些常用的,C51,头文件:,absacc.h,包含允许直接访问,8051,不同存储区的宏定义。,assert.h,文件定义宏,用来建立程序的测试条件。,ctype.h,包含字符转换和分类程序。,intrins.h,文件包含指示编译器产生嵌入式固有代码的程序原型。,math.h,文件包含数学程序。,reg51.h,文件中包含,51,单片机的特殊寄存器定义。,reg52.h,文件中包含,52,单片机的特殊寄存器定义。,setjmp.h,文件包含定义,jmp_buf,类型和,setjmp,和,longjmp,程序原型。,stdarg.h,文件包含可变长度参数列表程序。,stdlib.h,文件包含存储区分配程序。,stdio.h,文件包含标准输入和输出程序。,string.h,文件包含字符串操作程序、缓冲区操作程序。,对于,51,单片机而言,源程序开头必须要包含,reg51.h,头文件,因为该文件对,51,单片机的相关位及寄存器进行了定义,这样在程序中才可以正常使用寄存器等资源。,59,3,条件编译命令,60,C,语言是一种可移植性很高的程序语言,源程序可在不同版本的,C,语言编译器下进行编译。不同的,C,语言编译器提供不同的资源与指令语法,这时就需要使用条件编译命令来区分不同的编译器。在,8051,的程序设计中,也可以使用条件编译命令来适应不同的外围设备控制方式。条件编译格式如下:,#if,常量表达式,程序段,1,#else,程序段,2,#endif,若常量表达式成立,则编译程序,1,,否则编译程序,2,。,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服