8051单片机C语言开发(五)_第1页
8051单片机C语言开发(五)_第2页
8051单片机C语言开发(五)_第3页
8051单片机C语言开发(五)_第4页
8051单片机C语言开发(五)_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章函数程序的一般组成形式#include<xx.h>main(){……..}function_1(数据类型形参1,数据类型形参2,…….){

执行语句;

}function_n(数据类型形参1,数据类型形参2,…….){

执行语句;

}1精选课件ppt一、函数的分类1、用户使用角度分:标准库函数用户定义(无参、有参、空函数)

2、函数使用范围分:静态函数(内部函数):只能在定义它的文件中被调用

static类型说明函数名(形参)外部函数(默认):可以在定义它的文件和其他文件中被调用

[extern]类型说明函数名(形参)

2精选课件ppt二、函数的定义C51对函数的功能进行了扩展,函数定义的完整形式如下:函数类型函数名(形式参数列表)[small|compact|large][reentrant][interruptn][usingn]说明:1、[small|compact|large]:在用keilC中,当project设置好后,可不必在函数中说明模式,若想说明,二者必须一致,否则出错;2、函数定义位置主函数之前定义;(1)主函数之前原型声明,主函数之后定义;(2)声明格式:类型说明函数名(形参类型1,形参类型2)或者函数名(数据类型形参1,…….,数据类型形参n)(3)形参定义:函数名(数据类型形参1,…….,数据类型形参n)。

3精选课件ppt3、[reentrant]可重入函数

可重入函数可以在同一个时刻由多个进程共享。当一个进程正在执行一个可重入函数,另一个进程可以中断该进程,并可以开始执行同一个可重入函数,而不影响函数的运行结果。例:函数A正在调用函数B,此时中断来了,执行中断函数C,C恰好又要调用B。

ANSIC语言中,调用函数时会把函数的参数和函数中使用的局部变量入栈。因为8051内部堆栈空间的限制,为了提高效率,C51没有提供这种堆栈,而是提供一种压缩栈。每个函数有一个给定存储空间,用于存放局部变量。函数中的每个变量都存放在这个空间的固定位置。当递归调用该过程时会导致变量被覆盖,所以通常情况下C51中的函数是不能重入。必须使用reentrant函数属性来声明函数是可重入的。

C51编译器为再入函数生成一个模拟栈,通过这个模拟栈来完成参数传递和存放局部变量(每个变量有其单独的空间)。可重入函数占用内存空间较大,运行较慢,并且不允许传递bit类型的变量,也不能定义局部位变量。可重入函数经常在实时应用系统中应用,也可在中断函数和非中断函数同时调用同一个函数时使用。4精选课件ppt可使用using函数说明属性来规定函数所使用的寄存器组。格式如下:usingn

:n为0-3这个参数表示使用的寄存器组的编号.using属性只能在函数定义中使用,不能在函数原型声明中使用。使用using属性的函数将自动完成以下操作:a、进入函数前,将当前使用的寄存器组的标号保存在堆栈中。改PSW的寄存器组选择位,选择设定的寄存器组作为当前的寄存器组。b、函数退出时,将寄存器组恢复成进入函数前的寄存器组。

intalarm; intalarm_count; externvoidalfunc(intiValue); voidfalarm(void)using3{ alarm_count++;

alfunc(alarm=1);} 5精选课件ppt三、函数的参数1、形参与实参:实参-〉形参:单向传递(值传递);实参、形参类型必须一致;数组作为参数,是“地址传递”。即传递的为实参数数组的起始地址,故实参、形参数组占用同一段单元,互相影响。2、参数的传递规则:参数传递的途径有:寄存器、存储器、堆栈。返回值均通过寄存器传递。利用寄存器传递参数(例)intf(inta,intb,char*c)传递参数char,指针(单字节)int,指针(双字节)long,float通用指针参数1R7R6,R7R4-R7R1(L),R2(H)R3:存储类型参数2R5R4,R5使用固定地址同上参数3R3R2,R3使用固定地址同上6精选课件ppt返回参数传递返回类型寄存器描述bit进位标志(CF)charR7unsignedchar单字节指针intR6&R7高字节在R6,低字节在R7unsignedint双字节指针longR4-R7高字节R4,低字节在R7unsignedlongfloatR4-R732位IEEE格式通用指针R1-R3存储器类型在R3,高字节在R2,低字节R17精选课件ppt四、函数的调用1、函数指针调用函数:编译器为函数分配一个入口地址,即指针函数。指针变量定义

函数值返回类型

(*指针变量名)(函数形参表)#include<reg51.h>#include<stdio.h>unsignedlongc;

unsignedlongf(intn)reentrant{unsignedlongresult;if(n==0)result=1;elseresult=n*f(n-1);return(result);}8精选课件pptvoidmain(){intj;longint(*p)(int);#ifndefMONITOR51SCON=0x50;/*SCON:mode1,8-bitUART,enablercvr*/TMOD|=0x20;/*TMOD:timer1,mode2,8-bitreload*/TH1=221;/*TH1:reloadvaluefor1200baud@16MHz*/TR1=1;/*TR1:timer1run*/TI=1;/*TI:setTItosendfirstcharofUART*/#endif

p=f;for(j=0;j<10;j++){c=(*p)(j);printf("%2d!=%lu\n",j,c); if(j==8)P1=0;//调试用

}}9精选课件ppt2、几点说明(*p)()定义一个指向函数的指针变量,在未赋值前不特定指

向某函数,赋

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论