10.2C51语言的标识符和关键字10.4C51语言的程序流程控制10.3C51语言的数据类型及运算符10.5函数10.1C51语言的特点及其程序结构10.6编译预处理命令10.7C51程序设计举例教学目的和要求本章主要介绍单片机高级语言C51的语法、数据结构、语句函数的分类以及简单的C51程序设计。重点要求掌握C51的语法、数据结构、语句函数等,以达到设计简单的应用程序的目的。C51语言的特点及其程序结构C语言是一种通用的计算机程序设计语言,在国际上十分流行,它既可用来编写计算机的系统程序,也可用来编写一般的应用程序。以前计算机的系统软件主要是用汇编语言编写的,对于单片机应用系统来说更是如此。由于汇编语言程序的可读性和可移植性都较差,采用汇编语言编写单片机应用系统程序的周期长,而且调试和排错也比较困难。为了提高编制计算机系统和应用程序的效率,改善程序的可读性和可移植性,最好采用高级语言编程。C语言既具有一般高级语言的特点,又能直接对计算机的硬件进行操作,并且采用C语言编写的程序能够很容易地在不同类型的计算机之间进行移植,因此C语言的应用范围越来越广泛。C51语言的特点及其程序结构C语言具有以下一些特点:1、语言简洁,使用方便灵活。2、可移植性好。3、表达能力强。4、表达方式灵活。5、可进行结构化程序设计。6、可以直接操作计算机硬件。7、生成的目标代码质量高。尽管C语言具有很多的优点,但和其它任何一种程序设计语言一样也有其自身的缺点,如不能自动检查数组的边界、各种运算符的优先级别太多、某些运算符具有多种用途等。C51语言的特点及其程序结构C语言程序是由若干个函数单元组成的,每个函数都是完成某个特殊任务的子程序段。组成一个程序的若干个函数可以保存在一个源程序文件中,也可以保存在几个源程序文件中,最后再将它们连接在一起。C语言源程序文件的扩展名为“.C”,如EX1_1.C,EX1_2.C等。一个C语言程序必须有而且只能有一个名为main()的函数,它是一个特殊的函数,也称为该程序的主函数,程序的执行都是从main()函数开始的。下面我们先来看一个简单的程序例子。C51语言的特点及其程序结构例10-1:已知x=10,y=20,计算z=x+y的结果。main()/*主函数名*/{/*主函数体开始*/intx,y,z;/*主函数内部变量类型说明*/x=10;y=20;/*变量赋值*/z=x+y;/*计算z=x+y的值*/}/*程序结束*/本例的程序是很简单的,它只有一个主函数main()。一般情况下,一个C语言程序除了必须有一个主函数之外,还可能有若干个其它的功能函数。下面我们再来看一个例子。C51语言的特点及其程序结构例10-2:求最大值。#includestdio.h/*预处理命令*/#includereg51.hmain()/*主函数名*/{/*主函数体开始*/inta,A,c;/*主函数的内部变量类型说明*/intmax(intx,inty);/*功能函数max及其形式参数说明*/SCON=0x52;/*8051单片机串行口初始化*/TMOD=0x20;TCON=0x69;TH1=0x0f3;TL1=0x0f3;C51语言的特点及其程序结构scanf(“%d%d”,&a,&A);/*输入变量a和A的值*/c=max(a,A);/*调用max函数*/printf(“max=%d”,c);/*输出变量c的值*/}/*主程序结束*/intmax(intx,inty)/*定义max函数,x、y为形式参数*/{/*max函数体开始*/intz;/*max函数内部变量类型说明*/if(xy)z=x;/*计算最大值*/elsez=y;return(z);/*将计算得到的最大值返回到调用处*/}/*max函数结束*/C51语言的特点及其程序结构从以上两个例子可以看到,一般C语言程序具有如下的结构:预处理命令#includereg51.h函数说明longfun1();floatfun2();功能函数1fun1(){函数体……}主函数main(){主函数体……}功能函数2fun2(){函数体……}C51语言的标志符和关键字C语言的标识符是用来标识源程序中某个对象名字的。这些对象可以是函数、变量、常量、数组、数据类型、存储方式和语句等。一个标识符由字符串、数字和下划线等组成,第一个字符必须是字母或下划线。关键字是一类具有固定名称和特定含义的特殊标识符,有时又称为保留字。在编写C语言源程序时一般不允许将关键字另作别用,换句话说,就是对于标识符的命名不要与关键字相同。与其它计算机语言相比,C语言的关键字是比较少的,ANSIC标准一共规定了32个关键字,表10-1按用途列出了ANSIC标准的关键字。C51语言的标志符和关键字关键字用途说明auto存储类型说明用以说明局部变量break程序语句退出最内层循环体case程序语句switch语句中的选择项char数据类型说明单字节整型数或字符型数据const存储类型说明在程序执行过程中不可修改的变量值continue程序语句转向下一次循环default程序语句switch语句中的失败选择项do程序语句构成do…while循环结构double数据类型说明双精度浮点数else程序语句构成if…else选择结构enum数据类型说明枚举extern存储类型说明在其他程序模块中说明的全局变量float数据类型说明单精度浮点数for程序语句构成for循环结构表10-1ANSIC标准的关键字C51语言的标志符和关键字goto程序语句构成goto转移结构if程序语句构成if…else转移结构int数据类型说明基本整型数long数据类型说明长整型数register存储类型说明使用CPU内部寄存器的变量return程序语句函数返回short数据类型说明短整型数signed数据类型说明有符号数,二进制数据的最高位为符号位sizeof运算符计算表达式或数据类型的字节数static存储类型说明静态变量struct数据类型说明结构类型数据switch程序语句构成switch选择结构typedef数据类型说明数据类型定义union数据类型说明联合类型数据unsigned数据类型说明无符号数据void数据类型说明无类型数据volatile数据类型说明说明该变量在程序执行中可被隐含地改变while程序语句构成while和do…while循环结构C51语言的标志符和关键字C51编译器除了支持ANSIC标准的关键字以外,还扩展了如表10-2所示的关键字:关键字用途说明bit位变量说明声明一个位变量或位类型的函数sbit位变量说明声明一个可位寻址的变量sfr8位特殊功能寄存器声明声明一个特殊功能寄存器(8位)sfr1616位特殊功能寄存器声明声明一个特殊功能寄存器(16位)data存储器类型说明直接寻址的8051内部数据存储器bdata存储器类型说明可位寻址的8051内部数据存储器idata存储器类型说明间接寻址的8051内部数据存储器pdata存储器类型说明“分页”寻址的8051外部数据存储器xdata存储器类型说明8051外部数据存储器code存储器类型说明8051程序存储器interrupt中断函数声明定义一个中断函数reentrant再入函数声明定义一个再入函数using寄存器组定义定义一个8051的工作寄存器组表10-2C51编译器的扩展关键字C51语言的数据类型及运算符C51语言的数据类型任何程序设计都离不开对数据的处理。数据在计算机内存中的存放情况由数据结构决定。C语言的数据结构是以数据类型出现的,数据类型可分为基本数据类型和复杂数据类型,复杂数据类型由基本数据类型构造而成。1、基本数据类型C语言中的基本数据类型有char,int,short,long,float等。C51数据类型以及数据长度和其值域见表10-3C51语言的数据类型及运算符数据类型位数字节数值域bit10~1signedchar81-128~+127unsignedchar810~255enum162-32768~+32767signedshort162-32768~+32767unsignedshort1620~65535signedint162-32768~+32767unsignedint1620~65535signedlong324-2147483648~2147483647unsignedlong3240~4294967295float3240.175494E-38~0.402823E+38sbit10~1sfr810~255sfr161620~65535表10-3基本数据类型的长度C51语言的数据类型及运算符2、复杂数据类型(1)数组类型数组是一组有序数据的集合,数组中的每一个数据元素都属于同一个数据类型。数组中的各个元素可以用数组名和下标来唯一确定。一维数组只有一个下标,多维数组有两个以上的下标。在C语言中,数组必须先定义,然后才能使用。一维数组的定义形式如下:数据类型数组名[常量表达式];其中,“数据类型”说明了数组中各个元素的类型。“数组名”是整个数组的标识符,它的命名方法与变量的命名方法一样。“常量表达式”说明了该数组的长度,即该数组中的元素个数。常数表达式必须用方括号“[]”括起来,而且其中不能含有变量。下面是几个定义一维数组的例子。charxx[15];//定义字符型数组xx,它有15个元素intyy[20];//定义整型数组yy,它有20个元素floatzz[15];//定义浮点型数组zz,它有15个元素C51语言的数据类型及运算符定义多维数组时,只要在数组名后面增加相应于维数的常量表达式即可。对于二维数组的定义形式为:数据类型数组名[常量表达式][常量表达式];需要指出的是,C语言中数组的下标是从0开始的。在引用数值数组时,只能逐个引用数组中的各个元素,而不能一次引用整个数组;但如果是字符数组则可以一次引用整个数组。C51语言的数据类型及运算符例10-3:利用指针将一个字符数组中的字符串复制到另一个字符数组中去。#includestdio.hexternserial_initial();main(){char*s1;charxdata*s2;charcodestr[]={“Howareyou?”};s1=str;s2=0x1000;serial_initial();C51语言的数据类型及运算符while((*s2=*s1)!=’\0’){s2++;s1++;}s1=str;s2=0x1000;printf(“%s\n%s\n”,s1,s2);while(1);}执行程序结果:Howareyou?Howareyou?C51语言的数据类型及运算符(2)指针类型指针类型数据在C语言程序中的使用十分普遍。正确地使用指针类型数据,可以有效地表示复杂的数据结构,直接访问内存地址,而且可以更为有效地使用数组。指针和地址指针变量的定义指针变量定义的一般格式:数据类型[存储器类型]*标识符;其中,“标识符”是所定义的指针变量名。指针变量的引用指针变量是含有一个数据对象地址的特殊变量,指针变量中只能存放地址。有关的运算符有两个,它们是地址运算符“&”和间接访问运算符“*”。例如:&a为变量a地址,*p为指针变量p所指向的变量。C51语言的数据类型及运算符例10-4:输入两个整数x和y,经比较后按大小顺序输出。#includestdio.hexternserial_initial();main(){intx,y;int*p,*p1,*p2;serial_initial();printf(“Inputxandy:\n”);scanf(“%d%d”,&x,&y);p1=&x;p2=&y;if(xy){p1=p2;p2=p;}C51语言的数据类型及运算符printf(“max=%d,min=%d\n”,*p1,*p2);while(1);}程序执行结果:Inputxandy:48(回车)max=8,min=4C51语言的