版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第五章C51函数
第1页5.1函数5.1.1函数定义函数定义普通格式以下:函数类型函数名(形式参数表)[reentrant][interruptm][usingn]形式参数说明{ 局部变量定义 函数体}前面部件称为函数首部,后面称为函数尾部,格式说明:1.函数类型函数类型说明了函数返回值类型。2.函数名函数名是用户为自定义函数取名字方便调用函数时使用。3.形式参数表形式参数表用于列录在主调函数与被调用函数之间进行数据传递形式参数。第2页【例5-1】定义一个返回两个整数最大值函数max()。intmax(intx,inty){intz;z=x>y?x:y;return(z);}也能够用成这么:intmax(x,y)intx,y;{intz;z=x>y?x:y;return(z);}第3页4.reentrant修饰符
这个修饰符用于把函数定义为可重入函数。所谓可重入函数就是允许被递归调用函数。函数递归调用是指当一个函数正被调用还未返回时,又直接或间接调用函数本身。普通函数不能做到这么,只有重入函数才允许递归调用。
关于重入函数,注意以下几点:(1)用reentrant修饰重入函数被调用时,实参表内不允许使用bit类型参数。函数体内也不允许存在任何关于位变量操作,更不能返回bit类型值。(2)编译时,系统为重入函数在内部或外部存放器中建立一个模拟堆栈区,称为重入栈。重入函数局部变量及参数被放在重入栈中,使重入函数能够实现递归调用。(3)在参数传递上,实际参数能够传递给间接调用重入函数。无重入属性间接调用函数不能包含调用参数,不过能够使用定义全局变量来进行参数传递。第4页5.interruptm修饰符interruptm是C51函数中非常主要一个修饰符,这是因为中止函数必须经过它进行修饰。在C51程序设计中,当函数定义时用了interruptm修饰符,系统编译时把对应函数转化为中止函数,自动加上程序头段和尾段,并按MCS-51系统中止处理方式自动把它安排在程序存放器中对应位置。
在该修饰符中,m取值为0~31,对应中止情况以下:0——外部中止01——定时/计数器T02——外部中止13——定时/计数器T14——串行口中止5——定时/计数器T2其它值预留。编写MCS-51中止函数注意以下:(1)中止函数不能进行参数传递,假如中止函数中包含任何参数申明都将造成编译犯错。第5页(2)中止函数没有返回值,假如企图定义一个返回值将得不到正确结果,提议在定义中止函数时将其定义为void类型,以明确说明没有返回值。(3)在任何情况下都不能直接调用中止函数,不然会产生编译错误。因为中止函数返回是由8051单片机RETI指令完成,RETI指令影响8051单片机硬件中止系统。假如在没有实际中止情况下直接调用中止函数,RETI指令操作结果会产生一个致命错误。(4)假如在中止函数中调用了其它函数,则被调用函数所使用存放器必须与中止函数相同。不然会产生不正确结果。(5)C51编译器对中止函数编译时会自动在程序开始和结束处加上对应内容,详细以下:在程序开始处对ACC、B、DPH、DPL和PSW入栈,结束时出栈。中止函数未加usingn修饰符,开始时还要将R0~R1入栈,结束时出栈。如中止函数加usingn修饰符,则在开始将PSW入栈后还要修改PSW中工作存放器组选择位。(6)C51编译器从绝对地址8m+3处产生一个中止向量,其中m为中止号,也即interrupt后面数字。该向量包含一个到中止函数入口地址绝对跳转。(7)中止函数最好写在文件尾部,而且禁止使用extern存放类型说明。预防其它程序调用。
第6页【例5-2】编写一个用于统计外中止0中止次数中止服务程序externintx;voidint0()interrupt0using1{x++;}6.usingn修饰符修饰符usingn用于指定本函数内部使用工作存放器组,其中n取值为0~3,表示存放器组号。对于usingn修饰符使用,注意以下几点:(1)加入usingn后,C51在编译时自动在函数开始处和结束处加入以下指令。{PUSHPSW;标志存放器入栈MOVPSW,#与存放器组号相关常量……第7页POPPSW;标志存放器出栈}(2)usingn修饰符不能用于有返回值函数,因为C51函数返回值是放在存放器中。如存放器组改变了,返回值就会犯错。5.1.2函数调用与申明一.函数调用函数调用普通形式以下:函数名(实参列表);对于有参数函数调用,若实参列表包含多个实参,则各个实参之间用逗号隔开。按照函数调用在主调函数中出现位置,函数调用方式有以下三种:(1)函数语句。把被调用函数作为主调用函数一个语句。第8页(2)函数表示式。函数被放在一个表示式中,以一个运算对象方式出现。这时被调用函数要求带有返回语句,以返回一个明确数值参加表示式运算。(3)函数参数。被调用函数作为另一个函数参数。二.自定义函数申明在C51中,函数原型普通形式以下:[extern]函数类型函数名(形式参数表);函数申明是把函数名字、函数类型以及形参类型、个数和次序通知编译系统,方便调用函数时系统进行对照检验。函数申明后面要加分号。
假如申明函数在文件内部,则申明时不用extern,假如申明函数不在文件内部,而在另一个文件中,申明时须带extern,指明使用函数在另一个文件中。第9页【例5-3】函数使用#include<reg52.h>//包含特殊功效存放器库#include<stdio.h>//包含I/O函数库intmax(intx,inty);//对max函数进行申明voidmain(void)//主函数{inta,b;SCON=0x52;//串口初始化TMOD=0x20;TH1=0xF3;TR1=1;scanf(“pleaseinputa,b:%d,%d”,&a,&b);printf(“\n”);printf(“maxis:%d\n”,max(a,b));while(1);}intmax(intx,inty){intz;z=(x>=y?x:y);return(z);}第10页【例5-4】外部函数使用程序serial_initial.c#include<reg52.h>//包含特殊功效存放器库#include<stdio.h>//包含I/O函数库voidserial_initial(void)//主函数{SCON=0x52;//串口初始化TMOD=0x20;TH1=0xF3;TR1=1;}程序main.c#include<reg52.h>//包含特殊功效存放器库#include<stdio.h>//包含I/O函数库externserial_initial();voidmain(void)第11页{inta,b;serial_initial();scanf(“pleaseinputa,b:%d,%d”,&a,&b);printf(“\n”);printf(“maxis:%d\n”,a>=b?a:b);while(1);}5.1.3函数嵌套与递归一.函数嵌套在一个函数调用过程中调用另一个函数。C51编译器通常依靠堆栈来进行参数传递,堆栈设在片内RAM中,而片内RAM空间有限,因而嵌套深度比较有限,普通在几层以内。假如层数过多,就会造成堆栈空间不够而犯错。
第12页【例5-5】函数嵌套调用#include<reg52.h>//包含特殊功效存放器库#include<stdio.h>//包含I/O函数库externserial_initial();intmax(inta,intb){intz;z=a>=b?a:b;return(z);}intadd(intc,intd,inte,intf){intresult;result=max(c,d)+max(e,f);//调用函数maxreturn(result);}main(){intfinal;serial_initial();final=add(7,5,2,8);printf(“%d”,final);while(1);}第13页二.函数递归递归调用是嵌套调用一个特殊情况。假如在调用一个函数过程中又出现了直接或间接调用该函数本身,则称为函数递归调用。【例5-6】递归求数阶乘n!。在数学计算中,一个数n阶乘等于该数本身乘以数n-1阶乘,即n!=n(n-1)!,用n-1阶乘来表示n阶乘就是一个递归表示方法。在程序设计中经过函数递归调用来实现。程序以下:在函数递归调用中要防止出现无终止本身调用,应经过条件控制结束递归调用,使得递归次数有限。下面是一个利用递归调用求n!例子。第14页#include<reg52.h>//包含特殊功效存放器库#include<stdio.h>//包含I/O函数库externserial_initial();intfac(intn)reentrant{intresult;if(n==0) result=1;else result=n*fac(n-1);return(result);}main(){intfac_result;serial_initial();fac_result=fac(11);printf(“%d\n”,fac_result);}第15页Anyquestion?
Thanks!
第16页上机练习:1、各自建立工程,输入例5-2,5-3,5-4,5-5,5-6源程序,链接,编译,调试,用keil串行口窗口观察输出结果。第17页2、8051单片机P1口接有8只发光二极管,P3.2-P3.5接有4个按键,如图1所表示,要求:按下K1键LED灯全亮,按下K2键LED灯全灭。上机练习:8051P1.0P1.1图1P1.2P1.3P1.4P1.5P1.6P1.7P3.2P3.4P3.3P3.5+5VK1K2K3K4第18页程序以下:#include<reg51.h>程序实现:建立工程key1,输入源程序。voidmain()在Debug选项下左下角Parameter{unsignedcharkey;文本框里面加入“-dledkey”。编译for(;;)链接、调试,选择Peripheral下{P3|=0x3c;//将P3.2-P3.5“键盘、LED试验仿真板”仿真观察。置高电平key=P3|0xfb;//判断K1是否按下if(key!=0xff)P1=0;key=P3|0xf7;//判断K2是否按下if(key!=0xff)P1=0xff;}}上机练习:第19页3、如图1所表示,要求:按下K1键P1.7和P1.3所接LED灯亮;按下K2键P1.6和P1.2所接LED灯亮;按下K3键P1.5和P1.1所接LED灯亮;按下K4键P1.4和P1.0所接LED灯亮。#include<reg51.h>程序实现:建立工程key2,输入源程序。voidmain()在Debug选项下左下角Parameter{unsignedcharkey;文本框里面加入“-dledkey”。编译for(;;)链接、调试,选择Peripheral下{P3|=0x3c;“键盘、LED试验仿真板”仿真观察。key=P3;switch(key){case0xfb:P1=0xee;break;case0xf7:P1=0xdd;break;case0xef:P1=0xbb;break;case0xdf:P1=0x77;break;}}}上机练习:第20页上机练习:4、如图1所表示,要求:按下K1键LED灯依次循环点亮;松开K1灯熄灭。#include<reg51.h>#include<intrins.h> //该文件包含有_crol_(…)函数说明voidmDelay(unsignedintDelayTime){ unsignedintj=0; for(;DelayTime>0;DelayTime--) {for(j=0;j<125;j++){;} }}voidmain(){ unsignedcharOutData=0xfe; while(1) { P3|=0x3c; while((P3|0xfb)!=0xff) { P1=OutData; OutData=_crol_(OutData,1);//循环左移 mDelay(1000);/*延时1000毫秒*/}P1=0xff; }}第21页
程序实现:建立工程loop1,输入源程序。在Debug选项下左下角Parameter文本框里面加入“-dledkey”。编译、链接、调试,选择Peripheral下“键盘、LED试验仿真板”仿真观察。5、如图1所表示,要求:开机后全部LED灯不亮;按下K1键LED灯从LED1到LED8依次循环点亮,然后全部熄灭;再按K1键,重复上述过程。假如中间按下K2键,则全部LED灯马上全部熄灭;并返回起始状态。(提醒:break语句)程序实现:建立工程loop2,输入
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- IT行业技术人才聘用合同范本
- 乡村道路施工总承包合同模板
- 发电机采购安装合同范本
- 临时用工合同模板:权威版
- 临时设备租赁简易合同
- 个人出租住房合同范本
- 专利使用权转让合同书范文
- XX市公共体育设施建设及运维合同
- 个人汽车抵押借款合同协议模板
- 买卖合同重大变革前瞻
- 九宫数独200题(附答案全)
- 17~18世纪意大利歌剧探析
- 微课制作技术与技巧要点
- β内酰胺类抗生素与合理用药
- 何以中国:公元前2000年的中原图景
- 第一章:公共政策理论模型
- 中考数学试题(含答案)共12套
- GB/T 4513.7-2017不定形耐火材料第7部分:预制件的测定
- GB/T 10205-2009磷酸一铵、磷酸二铵
- 公司财务制度及流程
- 深圳版初中英语单词汇总
评论
0/150
提交评论