基于proteus的51单片机仿真实例三十八、C语言的函数调用
1、函数调用
C语言程序中函数是可以互相调用的(注意:主函数是唯一一个不能被调用的函数)。所谓函数调用就是在一个函数的执行过程中,引用另外一个已经定义或声明了的函数(注意:函数必须先声明后调用)。主调函数调用被调函数的一般形式为:
函数名(实际参数表列)
说明如下:
函数名:指出被调用的函数
实际参数列表:实际参数列表中可以包含多个实际参数,各个参数之间用逗号隔开。实际参数的作用是将它的值传递给被调用函数中的形式参数。需要注意的是:函数调用中的实际参数与函数定义中的形式参数必须在数量、类型及顺序上严格保持一致,这样才能确保正确地进行参数传递。否则在执行过程中会出现错误。如果调用的是无参函数,则可以没有实际参数表列,但圆括号()不能省略。
2、C语言中可以采用三种方式实现函数的调用
1)函数语句调用
在主调函数中将函数作为一条语句,例如:
sum(); 这是无参函数的调用,它不要求被调函数返回一个确定的值
2)函数表达式调用
被调函数作为语句的一部分,只要求它完成一定的操作。
在主调函数中将函数调用作为一个运算对象直接出现在表达式中,这种表达式称为函数表达式。例如
P0=sum(2,3);
这其实是一条赋值语句,在这条语句中包含了函数调用,在这里将被调用函数的返回值赋给P0,因此这种函数调用方式要求被调函数返回一个确定的值。
3)作为函数参数调用
在主调函数中将函数调用作为另一个函数调用的实际参数。例如
sum=max(a,num(b,c));
这种在调用一个函数的过程中,又调用了另外一个函数的方式,称为函数的嵌套。
3、对被调函数的说明
在一个函数中调用另一个函数(即被调函数),需要具备如下条件:
1)被调函数必须是已经存在的函数(库函数或者是在该函数之前被定义或声明过的函数)
2)如果程序中使用了库函数,或者使用不在同一文件中的自定义函数,则需要在程序的开头用#include预处理命令将调用有关函数时所需的信息文件包含到本程序中。对于自定义函数,如果不是在本文本中定义的,那么在程序开始时要用extern修饰符进行原型声明。
4、本例演示一个既带参数,又有返回值的函数调用实例,
5、在keil c51中新建工程ex27,输入如下的程序代码,编译并生成ex27.hex文件
//实例27:函数参数及返回值综合演示实验,通过P0口显示
#include <reg51.h>
//
unsigned char sum(unsigned char num1,unsigned char num2) //函数返回值类型为无符号字符型
{
unsigned char num3; //定义变量
num3 = num1 + num2; //求和
return (num3); //返回值
}
unsigned char sum(unsigned char num1,unsigned char num2) //函数返回值类型为无符号字符型
{
unsigned char num3; //定义变量
num3 = num1 + num2; //求和
return (num3); //返回值
}
void main(void)
{
P0 = sum(22,33); //值送P0口显示
while(1)
{
}
}
{
P0 = sum(22,33); //值送P0口显示
while(1)
{
}
}
6、在proteus中新建仿真文件ex27.dsn,原理图如下图所示
7、将ex27.hex文件载入at89c51中,启动仿真,运行结果如下图所示