<meta name="keywords" content="必胜时时彩开户,keywords" /> 第十四课 C51函数 联系我们

第十四课 C51函数

上一篇的最后一个例子中有用到函数,着实一直涌现在例子中的  main()也算是一个函数,只不外它较量特殊,编译时以它做为法式模范模范的泉源段。有了函数 C 语言就有了模块化的优 点,浅易功效较多的法式模范模范,会在编写法式模范模范时把每项伶仃的功效分红数个子法式模范模范模块,每个子 法式模范模范便可以用函数来完成。函数还能被重复的挪用,是以一些经常应用的函数能做成函数库 以供在编写法式模范模范时直接挪用,从而更好的完成模块化的设计,年夜年夜前进编程使命的效力。 一.函数界说

通常 C 语言的编译器会自带尺度的函数库,这些都是一些经常应用的函数,Keil uv 中也不 破例。尺度函数已由编译器软件商编写界说,应用者直接挪用便可以了,而无需界说。但是 尺度的函数缺乏以知足应用者的特殊请求,是以 C 语言允许应用者凭证须要编写特定功效的 函数,要挪用它必须要先对其阻拦界说。界说的形式以下:

函数类型    函数称谓(形式参数表)

函数体

函数类型是诠释所界说函数前往值的类型。前往值着实就是一个变量,只需按变量

类型来界说函数类型就好了。如函数不须要前往值函数类型能写作“void”体现该函数没 有前往值。重视的是函数体前往值的类型一定要和函数类型不合,否则会组成弱点。函数名 称的界说在遵守 C 语言变量命名规则的同时,不克不及在统一法式模范模范中界说同名的函数这将会组成 编译弱点(统一法式模范模范中是允许有同名变量的,由于变量有全局和部门变量之分)。形式参数 是指挪用函数时要传入到函数体内加入运算的变量,它能有一个、几个或没有,当不须要 形式参数也就是无参函数,括号内能为空或写入“void”体现,但括号不克不及少。函数体中 能网罗有部门变量的界说和法式模范模范语句,如函数要前往运算值则要应用 return 语句阻拦返 回。在函数的{}号中也能甚么也不写,这就成了空函数,在一个法式模范模范项目中能写一些 空函数,在以后的修改和升级中能便利的在这些空函数中阻拦功效扩年夜。

二.函数的挪用

函数界说好以后,要被其它函数挪用了才干被推行。C 语言的函数是能相互挪用的, 但在挪用函数前,必须对函数的类型阻拦诠释,就算是尺度库函数也不破例。尺度库函数的 诠释会被按功效划分写在纷歧样的头文件中,应用时只需在文件最前面用#include  预处置赏罚赏罚语 句引入照顾的头文件。如前面一直有应用的 printf 函数诠释就是放在文件名为 stdio.h 的 头文件中。挪用就是指一个函数体中援用此外一个已界说的函数来完成所须要的功效,这个时间函 数体称为主挪用函数,函数体中所援用的函数称为被挪用函数。一个函数体中能挪用数个 其它的函数,这些被挪用的函数异常也能挪用其它函数,也能嵌套挪用。笔者自己以为 主函数只是相关于被挪用函数而言。在 c51 语言中有一个函数是不克不及被其它函数所挪用的, 它就是 main 主函数。挪用函数的浅易形式以下:

函数名  (现实参数表) “函数名”就是指被挪用的函数。现实参数表能为零或多个参数,多个参数时要用逗

号离隔,每个参数的类型、职位应与函数界说时所的形式参数逐一对应,它的作用就是把参 数传到被挪用函数中的形式参数,假定类型纰谬应就会发生一些弱点。挪用的函数是无参函 数时不写参数,但不克不及省前面的括号。

在之前的一些例子我们也能看纷歧样的挪用要领:

1.函数语句


如  printf  ("Hello  World!\n"); 这是在 我们的第一个法式模范模范中泛起的,它以 "Hello

World!\n"为参数挪用 printf 这个库函数。在这里函数挪用被看作了一条语句。

2.函数参数 “函数参数”这类要领是指被挪用函数的前往值算作此外一个被挪用函数的现实参

数,如 temp=StrToInt(CharB(16));CharB 的前往值作为 StrToInt 函数的现实参数转达。

3.函数表达式

而在上一篇的例子中有 temp = Count();这样一句,这个时间函数的挪用作为一个运算 工具涌现在表达式中,能称为函数表达式。例子中 Count()前往一个 int 类型的前往 值直接赋值给 temp。重视的是这类挪用要领请求被挪用的函数能前往一个同类型的值, 否则会泛起弗成预感的弱点。

前面说到挪用函数前要对被挪用的函数阻拦诠释。尺度库函数只需用#include  引入已 写好诠释的头文件,在法式模范模范便可以直接挪用函数了。如挪用的是自界说的函数则要用以下形 式编写函数类型诠释

类型标识符    函数的称谓(形式参数表); 这样的诠释要领是用在被调函数界说和主调函数是在统一文件中。你也能把这些写到

文件名.h 的文件中用#include "文件名.h"引入。假定被调函数的界说和主调函数不是在同 一文件中的,则要用以下的要领阻拦诠释,诠释被调函数的界说在统一项目的纷歧样文件之上, 着实库函数的头文件也是云云诠释库函数的,假定诠释的函数也能称为外部函数。

extern    类型标识符    函数的称谓(形式参数表); 函数的界说息争释是完全纷歧样的,在编译的角度上看函数的界说是把函数编译存放在

ROM  的某一段地址上,而函数诠释是告诉编译器要在法式模范模范中应用那些函数并一定函数的地 址。假定在统一文件中被调函数的界说在主调函数之前,这个时间能不用诠释函数类型。也就 是说在 main 函数之前界说的函数,在法式模范模范中便可以不用写函数类型说清晰了了。能在一个函 数体挪用此外一个函数(嵌套挪用),但禁绝可在一个函数界说中界说此外一个函数。还要重视 的是函数界说息争释中的“类型、形参表、称谓”等都要相不合。

三.中止函数 中止服务函数是编写单片机应用法式模范模范弗成缺乏的。中止服务函数只需在中止源请求照顾

中止时才会被推行,这在处置赏罚赏罚突发事宜和实时控制是很是有用的。例如:电路中一个按钮, 请求按钮后 LED 点亮,这个按钮甚么时间会被按下是弗成预知的,为了要捕捉这个按钮的事宜, 通常会有三种措施,一是用循环语句赓续的对按钮阻拦查询,二是用准时中止在距离时间内 扫描按钮,三是用外部中止服务函数对按钮阻拦捕捉。在这个应用中只需单一的按钮功效, 那么第一种要领便可以胜任了,法式模范模范也很质朴,但是它会一直的在对按钮阻拦查询铺张了

CPU 的时间。现实应用中浅易都邑尚有其它的功效请求同时完成,这个时间能凭证须要选用第 二或第三种要领,第三种要领占用的 CPU 时间最少,只需在有按钮事宜发生时,中止服务函 数才会被推行,其他的时间则是推行其它的义务。

假定你学习过汇编语言的话,刚泉源写汇编的中止应用法式模范模范时,你一定会为收支客栈的 效果而困扰过。单片机c语言 语言扩年夜了函数的界说使它能直接编写中止服务函数,你能不用考 虑收支客栈的效果,从而前进了使命的效力。扩年夜的要害字是 interrupt,它是函数界说时 的一个选项,只需在一个函数界说前面加上这个选项,那么这个函数就酿成了中止服务函数。

在前面还能加上一个选项 using,这个选项是指定选用 51 芯片外部 4 组使命存放器中的


谁人组。泉源学习者能不用去唱使命存放器设定,而由编译器自动选择,防止发生不须要的错 误。界说中止服务函数时能用以下的形式。

函数类型    函数名  (形式参数)  interrupt  n  [using  n]

interrupt 要害字是弗成缺乏的,由它告诉编译器该函数是中止服务函数,并由前面的

n 指明所应用的中止号。n 的取值规模为 0-31,但详细的中止号要取决于芯片的型号,像 AT89c51 现实上就应用 0-4 号中止。每其中止号都对应一其中止向量,详细地址为 8n+3, 中止源照顾后处置赏罚赏罚器会跳转到中止向量所处的地址推行法式模范模范,编译器会在这地址上发生一个 无条件跳转语句,转到中止服务函数所在的地址推行法式模范模范。下表是 51 芯片的中止向量和中 断号。

中止号

中止源

中止向量

0

外部中止 0

0003H

1

准时器/计数器 0

000BH

2

外部中止 1

0013H

3

准时器/计数器 1

001BH

4

串行口

0023H

表 9-1    AT89c51 芯片中止号和中止向量

应用中止服务函数时应重视:中止函数不克不及直接挪用中止函数;不克不及经由历程形参传速参数; 在中止函数中挪用其它函数,二者所应用的存放器组应类似。限于篇幅其它与函数相关的知 识这里不克不及逐一加以诠释,如变量的转达、存储,部门变量、一切变量等,有兴趣的同伙可 以会见笔者的网站 浏览更多相关文章。

下面是质朴的例子。起主要在前面做好的实验电路中加多一个按钮,接在 P3.2(12 引脚外 部中止 INT0)和地线之间。把编译好后的法式模范模范烧录到芯片后,当接在 P3.2 引脚的按钮接下 时,中止服务函数 Int0Demo 就会被推行,把 P3 以后的状态反映到 P1,如按钮接下后 P3.7

(之前有在这脚装过一按钮)为低,这个时间 P1.7 上的 LED 就会熄灭。摊开 P3.2 上的按钮后,

P1LED 状态保持先前按下 P3.2 时 P3 的状态。

#include <at89x51.h>

unsigned char P3State(void); //函数的诠释,中止函数不用诠释

void main(void)

{

IT0 = 0; //设外部中止 0 为低电平触发

EX0 = 1; //允许照顾外部中止 0

EA = 1; //总中止开关

while(1);

}

//外部中止 0 演示,应用 2 号存放器组

void Int0Demo(void) interrupt 0 using 2


{

unsigned int Temp; //界说部门变量

P1 = ~P3State(); //挪用函数取得 p2 的状态反相后并赋给 P1

for (Temp=0; Temp<50; Temp++); //延时    这里只是演示部门变量的应用

}

//用于前往 P3 的状态,演示函数的应用

unsigned char P3State(void)

{

unsigned char Temp;

Temp = P3; //读取 P3 的引脚状态并生涯在变量 Temp 中

//这样只需一句语句着实没须要做成函数,这里只是学习函数的基本应用措施

return Temp;

}