2.2 常用语句与函数

1.常用语句

课件 C51语言中程序的基本语法

视频 C51语言中程序的基本语法

C51语言中最常用语句有赋值语句、条件语句和循环语句。C51语言中规定每条语句结束后都必须以分号结尾

1)赋值语句

赋值语句最为常见,出现的频率最多,其实质就是由赋值表达式加上一个分号构成的。如a=3;t=a;等等。必须要注意的是,赋值表达式里出现的变量,一定是预先定义过的,C51语言要求变量是“先定义,后使用”。另外,赋值语句中,赋值符号右侧常量(或表达式结果)的数据类型必须与赋值号左侧的变量类型匹配,否则会出现语法错误。

2)条件语句

条件语句是用来判断所给定的条件是否满足,并根据判定的结果来决定执行哪一个操作的语句。

C51语言中条件判断主要使用的是if语句,if语句有3种表现形式。

这个语句表示的含意是:如果X>5,那就打印输出“X大于5”这句话;否则,跳过中间的语句块向下执行,什么也不输出。

这种形式就是典型的分支判断,其含义是当X>5时,打印输出“X大于5”这句话;否则,会打印输出“X不大于5”这句话。

这是if语句的嵌套形式,适用于需要分支判断较多的情况。其意义是哪一个表达式成立就执行其对应的语句块。如果都不成立,就什么也不执行。使用中需要注意,else语句只与最接近的if语句成对关联(也要注意大括号的影响范围)。另外,如果语句块中只有一条语句,则可以省略语句块两侧的大括号。

上面例程中,首先判断X的值是否大于或等于5,如果成立,则打印输出“X大于或等于5”后,不再执行下面的判断语句,完成整个if判断;如果给定的值不大于5,则会执行紧接着下来的else分支语句,这里又包含了一个if判断,此时再次判断X的值是否大于或等于3,如果成立,则打印输出“X在3与5之间”后,不再执行其他语句,完成整个if判断;如果给定X的值也不大于3,则再向下执行紧接着的else分支语句,这里再次包含了一个if判断,此时判断X的值是否大于或等于1,如果成立,则打印输出“X在1与3之间”后,不再执行其他语句,结束整个if判断;如果X小于1,则直接执行下面的else分支语句,直接打印输出“X小于1”并结束整个if判断。通过示例我们看到if嵌套执行的过程就是一个多次判断、逐步缩小范围的过程。

在日常使用中,还经常使用switch语句来完成这类多路分支的判断,switch语句的用法如下所示:

switch语句特别适合多路分支的判断处理,当有多种选择的可能存在时,使用switch会比使用if以及if的嵌套更方便。执行时,首先计算表达式的值,然后与每一个case里的常量相比较,如果符合,就接着执行这个case语句中的语句体,然后执行break跳出整个switch。如果没有break语句,那么在执行完符合常量值的那个语句体后,会接着执行下面case中的语句,直到switch结束,这点请初学者务必注意。

上面例程中,首先对传入的变量grade进行判断,判断其值是否为'A',若为A则打印输出“85~100”字样,然后结束switch语句;如果不是A,则顺序向下执行,依次判断是否为'B',如果是B,则打印输出“70~84”字样后结束switch语句。以此类推,如果也不是B,则继续向下判断'C'和'D'两种情况。如果全部case语句中没有满足项,则执行default语句,打印输出“error”字样后结束switch语句。

3)循环语句

循环语句也是经常用的语句之一。通过循环语句能够利用计算机高速处理的特性,重复执行某些代码,以完成大量有规则的重复性运算。特别地,在C51程序中,在主函数内一定有一个无限循环来保证程序从加电开始一直在运行。

C51语言中的循环语句有多种,平时使用最多是while循环和for循环。下面分别说明。

(1)while循环。while语句用来实现“当型”循环结构。其语法形式如下:

其含义是当表达式结果为真时,会一直执行该循环体语句块,直到表达式不能继续成立为止。

上述程序的含意是:通过while循环实现从0一直累加到100的功能。

注意,这里i++的含义。sum=sum+i++这一语句可以分解为以下两个语句:

sum=sum+i;

i=i+1;

请读者试一试,如何求出100以内奇数或偶数的和呢?

(2)for循环。for循环是C51中使用最为灵活的循环,不仅可以用于循环次数确定的情况,也可以用于循环次数不确定的情况,基本上可以替代while循环。其语法形式如下:

它的执行过程是这样的:先计算表达式1,接着计算表达式2,判断表达式2是否成立,如果成立,则开始执行循环体语句块,再接着执行表达式3;然后再次计算表达式2看其是否成立,如果表达式2依然成立,再次执行循环体语句块,接着又是执行表达式3;如此循环往复,直到表达式2不再成立为止。也有人将for循环的形式写为for(循环变量赋初值;循环条件判断;循环变量变化){循环体语句},这样可能会更容易理解一些。

上述程序是使用for循环实现0~100的累加计算。与使用while循环的程序相比,显然可读性更强,书写也更加简单、方便。

注意这里由于循环变量i已经赋了初值,所以在for循环中,表达式1也可以省略,但表达式1后面的分号不能省略。另外,如果循环体只有一个语句,则循环体外的大括号也可以省略。于是上述的循环可以简写为

不论是while循环还是for循环,在循环条件的判断中都会检测一个变量,这个变量在循环中是按一定规律变化的,通过这个变量的取值变化可以控制循环的执行次数以及何时退出循环。这个变量称为循环变量,循环变量每次改变的幅度就是循环的步长。如上面的示例中,变量i就是循环变量,循环变量的步长是1。

2.函数

课件 C51中的函数

视频 C51中的函数

C51的程序都是由若干个函数构成的。

1)main函数

一个C51的程序通常由一个主函数“main()”和若干个子函数构成。每一个子函数完成一个特定的功能。由主函数“main()”调用其他子函数,其他子函数之间也可以相互调用。但是一个C51程序中只能有一个主函数。

C51程序的执行都是从main()函数开始,调用其他函数后流程返回到main()函数,在main()函数中结束整个程序的运行。main()函数是系统自己调用的。

除了main()函数之外,所有的函数都是平行的,即在定义函数时是互相独立的,一个函数不能从属于任何一个函数。函数彼此间可以互相调用,但不能调用main()函数。而main()函数可以调用任何函数。

2)自定义函数

除主函数外,C51程序中的函数主要有两种:一种是系统提供给用户的标准库函数,另一种是用户自定义出来的函数。使用标准库函数需要事先在程序的头部以声明的方式将库包含进来,如程序开头写的#include <intrins.h>就属于这种包含。用户自定义的函数通常用来解决更为具体的问题。用户自定义函数有两种形式:一种是有参数的函数,另一种是无参数的函数。

用户自定义函数的一般形式如下:

下面以常用的延时函数为例,请读者注意观察两种自定义函数的写法。

无参数函数

有参数函数

函数调用的一般形式如下:

注意一点,在主函数中调用自定义函数,如果该函数的定义是写在主函数(或调用函数)的后面,需要在主函数(调用函数)之前,进行该函数的声明。如果函数的定义是写在主函数(调用函数)的前面,则无须声明。在函数声明中应当保证与函数定义时的首部写法一致,即函数类型、函数名、参数个数、参数类型、参数顺序必须一致。为简便起见,可以不写形参变量名,只写形参变量的类型就可以了。

函数声明的一般形式为:

如上面声明的两个delay()函数,其声明、调用和定义形式如下:

3.C51程序的基本结构

C51中程序的写法十分简单,主要由3部分构成,其程序的基本框架如图2-3所示。

第一部分总是头文件包含语句,所有的C51程序第一句基本都是这一句。如果有其他头文件需要包括进来,可以依次向下写。

第二部分是程序中需要使用的全局变量和一些函数的声明

最后是主函数main( )以及其他函数的书写。

图2-3 C51程序的基本框架

基本上所有的C51语言程序都由上面3部分构成。下面以点亮一个发光二极管的小程序来具体说明C51程序的写法。

在写程序之前,首先简要地介绍一下硬件电路配置情况:在单片机的P1口第0号引脚上接了一个发光二极管。现在通过程序控制,使这个发光二极管点亮。电路原理图如图2-4所示。

图2-4 点亮一个发光二极管电路原理图

在图2-4中发光二极管的一端连接着电源,另一端连接着单片机的P1口第0号引脚。注意51单片机在初始加电时,所有的I/O口默认都是输出高电平的。因此要想使发光二极管点亮,只需将P1口的第0号引脚改为低电平即可。按照这个思路和前面的介绍,编写C51语言程序代码如下:

从上面的程序中可以看出,C51语言程序在写法上的几个特点:

(1)每个程序的第一句,必须将单片机的头文件包含进来,且不用分号结尾。

(2)每个正常语句(特殊除外)必须以分号结尾。

(3)函数体或语句体需要用{}包围起来。

(4)在主函数中,要使用无限循环(死循环),使程序一直运行下去。这是C51程序与普通C语言程序最大的不同,普通的C语言程序要尽量避免死循环,而单片机系统需要程序始终运行,所以必须要有无限循环。

(5)在每个语句的后面,可以使用“//”对该语句添加注释。使用“/*”和“*/”可以将一段程序变为注释语句。注释语句不能被执行。

有关C51语言的知识还有很多,但是上面介绍的内容已经足够初学者使用了。如果对于C51语言感兴趣,喜欢深入研究,可以参考一些有关C语言的书籍进行学习。在本书的后面也会对涉及的其他C51语言中的相关知识进行介绍。