8051单片机基础知识 - 图文 - 下载本文

所包含的一个成员,即它所包含的各个成员只能分时共享同一存贮空间,这是共用体和结构的区别所在。定义其类型一般格式为:

union 共用体类型标识符 {类型说明符 变量名; };

说明共用体变量的一般格式为:

union 共用体类型标识符 共用体变量名表 例:union int_or_char {int i; char ch; };

union int_or_char cnvt; 或 union {int i; char ch; }cnvt; 五.枚举(enum)

枚举数据类型是一个有名字的某些整数型常量的集合。这些整数型常量是该类型

变量可取的所有的合法值。枚举定义应当列出该类型变量的可取值。 一个完整的枚举定义说明语句的一般格式是: enum 枚举名 {枚举值列表}; enum 枚举名 变量列表;

例:enum day {Sun,Mon,Tue,Wed,Thu,Fri,Sat}d1,d2; 或enum day { Sun,Mon,Tue,Wed,Thu,Fri,Sat}; enum day d1,d2;

函 数

一.C语言程序的一般组成结构:

全程变量说明

main() /主函数/

{局部变量说明 主程序 执行语句 }

function_1(形式参数表) /函数1/ 形式参数说明 {局部变量说明 执行语句 }

. . . . . . 函数 function_n(形式参数表) /函数n/ 形式参数说明 {局部变量说明 执行语句

26

}

·普通函数之间可以互相调用,但普通函数不能调用主函数;

·一个C程序的指向从main()函数开始,调用其他函数后返回到主函数main()中, 最后在主函数main()中结束整个C程序的运行。 二.函数的分类

C语言函数分为主函数main()和普通函数两种。 普通函数从不同角度又可分为:

从用户使用的角度划分:标准库函数、用户自定义函数;

从函数定义的形式上划分:无参数函数、又参数函数、空函数。 三.函数的定义

1.无参数函数的定义

返回值类型标识符 函数名() {函数体语句}

无参数函数一般不带返回值,因此函数返回值类型标识符可以省略。 2.有参数函数的定义

返回值类型标识符 函数名(形式参数列表) 形式参数说明 {函数体语句} 3.空函数的定义方法

返回值类型说明符 函数名() { }

四.函数的参数和函数值

函数之间的参数传递由函数调用时,主调函数的实际参数与被调函数的形式参数之间进行数据传递来实现,被调函数的最后结果由被调函数的return语句返回给调用函数。

1.形式参数和实际参数

形式参数:在定义函数时,函数名后面括号中的变量名称为“形参”; 实际参数:在函数调用时,主调函数名后面括号中的表达式称为“实参”。

在C语言的函数调用中,实际参数与形式参数之间的数据传递是单向进行的。只能由实参传递给形参,而不能由形参传递给实参。实参与形参的类型必须一致,否则会发生类型不匹配的错误。 2.函数的返回值

函数调用时,主调函数与被调函数之间参数传递及函数值返回的全部过程示意图 如下: main() { ┋ result=gcd(a,b) ┋ } int gcd(u,v) int u,v; { ┋ return u;

27

}

五.函数的调用

1.函数调用的一般形式: 函数名 (实参列表) 2.函数调用的方式: A.函数调用语句;

B.函数结果作为表达式的一个运算对象;

C.函数参数:被调函数作为另一个函数的实参。 3.对被调函数的说明:

在一个函数中调用另一个函数必须具有以下条件:

A.被调函数必须使已经存在的函数(库函数或用户自定义函数);

B.如果程序中使用了库函数,或不在同一文件中的另外的自定义函数,则应该在程序的开头处使用#include包含语句,将所用的函数信息包括到程序中来;

C.如果程序中使用自定义函数,且该函数与调用它的函数同在一个文件中,则应根据主调函数与被调函数在文件中的位置,决定是否对被调函数做出说明如下: a. 如被调函数出现在主调函数之后,一般应在主掉函数中在对被调函数调用之前 对被调函数的返回值类型做出说明,其一般形式为: 返回值类型说明符 被调函数的函数名();

b. 如被调函数的定义出现在主调函数之前,可以不对被调函数加以说明。 c. 如在所有函数定义之前,在文件开头处,在函数的外部已经说明了函数的类型,则在主调函数中不必对所调函数再作返回值类型说明。

4.函数的嵌套

在C语言中,在调用一个函数的过程中,允许调用另一个函数。 5.函数的递归调用

在调用一个函数的过程中,又直接或间接地调用该函数本身,这种情况称为函数的递归调用。

6.用函数指针变量调用函数

A.指向函数的指针变量的一般定义形式为:

函数值返回类型(*指针变量名) (函数形参表?)

B.在给函数指针变量赋值时,只需给出函数名而不必给出参数,如p=factorial。 C.用函数指针变量调用函数时,只需将(*p)代替函数名即可(p为指针变量),在(*p)之后的括号中可根据需要写上实参。

D.对指向函数的指针变量进行诸如p+n、p++、p—的运算是没有意义的。 六.数组、指针作为函数的参数 1.用数组作为函数的参数

A.当用数组名作函数的参数时,应该在调用函数和被调用函数中分别定义数组; B.实参数组与形参数组的类型应一致,否则将导致结果出错; C.实参数组与形参数组的大小可以一致,也可以不一致。 2.用指向函数的指针变量作为函数的参数

函数指针变量常用的用途之一是把指针作为参数传递给其它函数,如 main() {??

sub(f1,f2); /f1,f2为函数名/ ?? }

28

sub(x1,x2)

int (*x1)(),(*x2)(); {int a,b,i,j; a=(*x1)(i); b=(*x2)(i,j); ??

} 其中变量i和j是函数f1和f2所要求的参数。

用指向函数指针变量作为函数参数的方法,可以使用同一个函数来完成不同的函

数功能,这样就大大增强了函数使用的灵活性。 3.用指向结构的指针变量作函数的参数 方法:

A.象用变量作为函数的参数一样,直接引用结构体变量的成员作参数;

B. 用指向结构变量的指针变量作实际参数,将结构变量的地址传递给被调函数的形参。

4.返回值真的函数

一个函数可以返回一个整形(int)值、字符(char)值、浮点(float)值,同

样也可以返回一个指针型数据,即返回一个数据的地址。 一般形式为:

返回值类型 *函数名(参数表) 例:int *A(x,y);其中A是函数名,调用它后可以得到一个指向整型数据的指针(地 址)。A()前面的*表示此函数是指针型函数(函数的返回值是指针)。

举例:有一个数据档案记录,每个记录中含有四项数据,要求用返回指针的函数来实 现。

float *view(pp,j) float(pp)[4]; int j;

{float *pt; pt=*(pp+j); return(pt); }

main()

{float score[][4]={{8.87,8.83,8.64,8.91},{12.11,12.23,12.34.12.20},

{30.44,30.66,30.58,30.40},{20.12,20.08,20.21,20.66}}; float *view; float *p; int i,n=2; printf(“The record of No.%d are :\\n”,n); p=view(score,n); for(i=0;i<4;i++) printf(“%5.2f\\t”,*(p+i)); }

上例中,函数view被定义为指针型函数,它的形式参数pp是指向包含4个元 素的一维数组的指针变量。pp+1指向score数组的第一行。而*(pp+1)指向score 数组的第一行的第0列元素。Pt是float型指针变量。

29

在主函数main()中,p是float型指针变量,在没有执行调用赋值语句p=view (score,n)之前,它没有指向任何数据。而在执行p=view(score,n)时,首先程 序先调用view()函数,并把实际参数score[ ]和n值传递给view()函数的形式 参数*pp[4]和j,然后通过语句pt=*(pp+j),将view()函数的内部指针pt指向score[ ][ ] 数组的第j行地址,并将此指针值返回给主调函数。继而该地址被赋给指针变量p。 此时,p指针指向score[ ][ ]数组的第n行,然后这个记录行的四项纪录数据被打印 出来。

模块化程序设计

一.基本概念

1.程序组成:程序应包括数据说明(由数据定义部分来实现)和数据操作(由语句来实 现)。数据说明主要定义数据结构(由数据类型表示)和数据的初值,数据 操作的任务是对已提供的数据进行加工。

函数是C语言最基本的组成单位。C程序的组成如下图所示: C程序

源程序i 源程序n 源程序 1 ?? ??

预编译命令 函数 1 ?? 函数n 说明部分 执行部分

2.常用术语

① 文件:计算机中数据或程序都是以文件来存贮的。文件是计算机的基本存贮单位。 计算机中用户可见的是各种各样的文件。

② 源程序文件:一个C源程序文件是由一个或多个函数组成,它完成特定的功能。 ③ 目标文件:目标文件包含所要开发使用的单片机的机器代码。目标指的是所要用的 单片机;目标文件即目标程序文件,是单片机可执行的程序文件。 ④ 汇编器/编译器

汇编器是针对汇编语言程序的;编译器是针对高级语言(如C语言)程序的。它们的作用是把源程序翻译成单片机可执行的目标代码产生一个目标文件。一个源程序文件是一个汇编/编译的单位。对Franklin C工具软件,其汇编/编译如下图所示: 可重定位目标文件 列表文件

30