C51的函数

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/* ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
此程序用于说明函数的简单调用 ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ */
void delay(unsigned int time) {
while(time­­); }
d++;
6
return d; }
unsigned char get_value2(unsigned char *pd)*pd; }
void main() {
unsigned char a=100,b; b=get_value1(a); /*a 为参数,通过 get_value1 函数的形式参数传入函数中 这里要指出的是 get_value1 函数的形式参数 d,是定义在 函数内的,变量 a 传进来时是将变量 a 的值赋给了 d,实际 参与运算的是 d,可以说 d 是 a 的一个副本,对 d 的操作与 a 无关。所以 b 的值为 101,而 a 的值仍然为 100,这种传递方 式称为参数的值传递。 */式称为值传递。 b=get_value2(&a); /*get_value2 函数的参数为指针型,&a 作为参数传入,是
/* ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
此程序用于说明通过函数指针的用法 ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ */
void delay(unsigned int time) {
while(time­­); }
函数类型 函数名(数据类型 形式参数,数据类型 形式参数........) {
函数体; } 其中,函数类型和形式参数的数据类型可以取 C51 的基本数据类型,如:整型(int)、 长整型(long)、字符型(char)、单浮点型(float)、双浮点型(double)、无值型(void)、
1
指针型(*)等。 如上面所说函数的说明可以在主函数所在的文件中,如下例: #include <reg51.h>
/* ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
此程序用于说明函数的说明 ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ */
void fun1() //函数的说明 返回为 void 无值型 无参数 函数名为 fun1 { //....... }
unsigned char get_value1(unsigned char d) {
return d; }
/* ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
此函数用于将一个字符串反转 ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ */
char * reverse(char *s) {
unsigned len=strlen(s); unsigned head=0,tail=len­1;
8
unsigned char temp; while(tail>head) { temp=s[head]; s[head]=s[tail]; s[tail]=temp; head++; tail­­; } return s; }
4
2.通过函数指针实现函数调用 函数运行时的数据也是存在于内存中的,那么就可以用指针(函数的首地址)来
对函数进行调用。 先来介绍一下函数指针的定义方法(指向函数的指针其实和指向变量的指针大同
小异,只是指向的对象不同而已) 如果定义一个函数指针来指向上面程序的 delay 函数,则这个指针这平来定义: void (*pfun)(unsigned int time); 只需要将函数名替换成指针变量名即可。 具体的调用方法如下例: #include <reg51.h> #include <string.h>
/* ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
此程序用于说明通过函数指针的用法 ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ */
unsigned char get_value1(unsigned char d) {
不再啰嗦,下面开始对 C51 的函数进行详细的介绍。 (1)函数的定义
C51 程序中所有函数与变量一样在使用之前必须说明。函数的说明可以放在主函 数所在的文件中,也可以放在其它的文件中,在调用时需要将函数说明所在的文件包含进来, 这样程序在编译、连接时才能到相应的文件与库中去寻找相应的函数。
函数定义就是确定该函数所要完成的功能及运行方式。 C51 中的函数定义采用了 ANSI 的标准格式:
函数是一个自我包含的完成一定相关功能的执行代码段。我们可以把函数看成是一个 “黑盒子”,只要将数据送进去就能得到结果,而函数内部究竟是如何工作,外部程序可以 不知道,外部程序只要调用它即可,所知道的公限于输入给函数什么,以及函数输出什么(这 正是函数库的思想)。函数提供了编制程序的手段,使之容易读、写、理解、修改和维护。
//这样的定义意思为函数名为 pdelay,返回空指针型,一定要加上括号
void main() {
pdelay=delay; pvalue=get_value; //让函数指向函数 (*pdelay)(1000); //用指向函数的指针调用函数 value=(*pvalue)(100);//返回 while(1); } 3.函数参数的传递 1)调用函数向被调用函数以形式参数传递 在函数调用时,可以将参数通过函数定义时所定义的形式参数(就是参数表 内的参数)传递到函数内部参与运算。 如下例: #include <reg51.h> #include <string.h>
#include <reg51.h> #include <string.h>
/* ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
此程序用于说明通过函数指针的用法 ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ */
9
如下例,用这种方法进行参数传递,函数无需形参。 #include <reg51.h> #include <string.h>
/* ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
此程序用于说明通过全局变量进行参数传递 ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ */
/* ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
此程序用于说明函数在其它文件中说明的方法 ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ */
void main() { fun1(); while(1); } _fun.h void fun1() //函数的说明 返回为 void 无值型 无参数 函数名为 fun1 { //....... } (2)函数的调用与返回 1.函数的简单调用
int get_value(int value) {
return value; }
int value;
5
void (*pdelay)(unsigned int time);
int (*pvalue)(int value);
//以上语句定义函数指针
//void *pdelay(unsigned int time) 这样的定义是不对的
void fun2(); //函数说明在主函数的后面,在主函数前要进行函数声明 //否则主函数调用它的时候找不到它
void main() { fun1(); fun2(); while(1); }
void fun2() {
2
//....... } 以上程序介绍了函数的说明,也介绍了函数的声明。下面的例程用来说明函数说明 在别人文件中,主文件中通过文件包括进行调用的方法: _main.c 文件: #include <reg51.h> #include <_fun.h> //使用#define 预编译宏包含文件
void main() {
unsigned char a=100,b; char s[6];char *ps; b=get_value1(a); //b=100 strcpy(s,"yahoo"); ps=reverse(s); //reverse 函数返回一个字符指针 while(1); } 3)用全局变量实现参数互传 上面介绍的方法可以在调用函数和被调用函数间传递参数,但使用不太方便。 如果将所要传递的参数定义为全局变量,可使变量在整个程序中对所有函数都可见。这样相 当于在调用函数与被调用函数之间实现了参数的传递和返回。这也是实际中经常使用的方 法,但定义全局变量势必长久地占用了内存。因此,全局变量的数目受到限制,特别对于较 大的数组更是如此。
将变量 a 的地址传入,则在函数对这个地址上的变量的操 作是直接作用在变量上的,因此会改变 a 的值。调用后 b=101,而 a 亦为 101。这种参数传递方式称为参数的址传递。 */ while(1); } 2)被调用函数向调用函数返回值 一般使用 return 语句由被调用函数向调用函数返回值,该语句有以下用途
C51 语言程序鼓励和提倡将一个大问题划分为一个个子问题,以应于解决一个子问题编 制一个函数,这样的好处就是让各部分相互充分独立,并且任务单一。因而这些充分独立的 小模块也可以作为一种固定规格的小“构件”,用来构成新的大程序。
C51 还可以建立和使用库函数。每一个库函数都完成一定的功能,可由用户随意调用。 对这些库函数应熟悉其功能,只有这样才可省去很多不必要的工作。( KEIL 为 C51 使用者 提供了丰富的库函数资源,在后面的章节会有详细地介绍)
7
1.它能立即从所在的函数退出,返回到调到它的程序中去。 2.返回一个值给调用它的函数。 有两种方法可以终止子函数运行并返回到调用它的函数中,一是执行到函数 的最后一条语句后语句,二是执行到语句 return 时返回。前者当子函数执行完后仅返回给调 用函数一个 0。若要返回一个值,就必须用 return 语句。只需在 return 语句中指定返回的值 即可。
C51 调用函数时直接使用函数名和实参的方法,也就是将要赋给被调用函数的参 量,按该函数说明的参数形式传递过去,然后进入子函数运行,运行结束后再按子函数规定 的数据类型返回一个值给调用函数。使用 C51 的库就是函数简单调用的方法。
3
如下例所示: #include <reg51.h> #include <string.h>
C51 的函数
在前面对 C51 进行介绍的过程中其实已经星星点点地提及了一些 C51 函数的知识,在 这一章里将对 C51 的函数进行详细系统地介绍。
函数的概念是非常非常重要的,程序中无时无刻没有函数的身影,只要我们创建了一个 工程,开始编写程序,我们就不知不觉之中已经用到了函数--主函数在每一个程序中是必 须要有的。
int get_value(int value) {
return value; }
void main() {
int value; delay(1000); //简单调用,1000 为实参,无返回值 value=get_value(100);//简单调用,100 为实参,返回 100 value=strlen("yahoo!!");//简单调用库函数,返回 7 while(1); }
unsigned char array[10];
void change_it() {
unsigned char i; for(i=0;i<10;i++) { array[i]=i; } }
void main() {
相关文档
最新文档