嵌入式C语言程序设计教程 教学课件 ppt 作者 李红 第五章

上传人:E**** 文档编号:89543413 上传时间:2019-05-27 格式:PPTX 页数:24 大小:572.49KB
返回 下载 相关 举报
嵌入式C语言程序设计教程 教学课件 ppt 作者 李红 第五章_第1页
第1页 / 共24页
嵌入式C语言程序设计教程 教学课件 ppt 作者 李红 第五章_第2页
第2页 / 共24页
嵌入式C语言程序设计教程 教学课件 ppt 作者 李红 第五章_第3页
第3页 / 共24页
嵌入式C语言程序设计教程 教学课件 ppt 作者 李红 第五章_第4页
第4页 / 共24页
嵌入式C语言程序设计教程 教学课件 ppt 作者 李红 第五章_第5页
第5页 / 共24页
点击查看更多>>
资源描述

《嵌入式C语言程序设计教程 教学课件 ppt 作者 李红 第五章》由会员分享,可在线阅读,更多相关《嵌入式C语言程序设计教程 教学课件 ppt 作者 李红 第五章(24页珍藏版)》请在金锄头文库上搜索。

1、第五章 函数,任务一 函数的定义与调用 【任务实例1】 机器人从起始区出发,在场地上走三角形后,回到原点并停止。 参考程序: #pragma SMALL #include void delay (void) /*延时函数*/ unsigned int j; for(j=0;j 2000;j+) void main(void) unsigned int data i; for(i=0;i3;i+) /*for语句循环,循环体执行3次 */ P0 = 0x15; delay(); P0 while(1); 添加简介,【知识点】 1 函数的基本概念 嵌入式C程序中有一个函数是必须存在的,这个函数就是

2、main函数(又称为主函数)。main函数是唯一的。main函数是嵌入式C程序执行的入口,即程序开始执行时,系统首先调用main函数执行。 2. 函数定义 嵌入式C 语言的编译器会自带标准的函数库,这些都是一些常用的函数。标准函数已由编译器软件商编写定义,使用者直接调用就能了,而无需定义。但是标准的函数不足以满足使用者的特殊要求,因此嵌入式C 语言允许使用者根据需要编写特定功能的函数,要调用它必须要先对其进行定义。 函数定义的一般形式 函数定义的一般形式如下: 类型标识符 函数名(形式参数表列) 声明部分 执行部分 函数的定义,有几点需要说明: (1)函数名前面的类型标识符用来说明函数返回值的

3、类型,返回值其实就是一个变量,只要按变量类型来定义函数类型就行了。 (2)函数名要符合标识符的命名规则。 (3)函数定义时的参数称为形式参数,简称形参。 (4)如果在形式参数列表中只列出参数名,则需要在其后说明每个参数的类型。 (5)如果函数要返回运算值则要使用 return 语句进行返回。return 语句格式为: return();,【任务实例2】 机器人从起始区出发,走圆弧,机器人无法停止,始终在以圆弧路线行走。 参考程序: #pragma SMALL #include void delay1(int data a) /*延时函数,参数单位约为 1ms */ unsigned int d

4、ata i,j; for(i=0;ia;i+) for(j=0;j 122;j+) void main(void) while(1) P0 = 0x15; delay1(1); P0 = 0x16; delay1(2); 添加,【知识点】 1函数调用前提 在嵌入式C程序中,一个函数可以被调用,但要求这个函数已存在,或者函数是系统函数,或者函数是用户已定义完成的函数。 对于库函数,只要在调用函数所在文件用include命令包含相应的头文件即可;而对于用户定义的函数,调用时函数已经被定义。如果未定义,需在调用前添加函数说明。 2 函数的调用 函数有两种情况,一种是有返回值的函数,一种是只完成一定的

5、操作,不返回值。对于返回值,函数的调用形式是: 变量=函数名(实参列表); 对于不返回值的函数,调用形式是: 函数名(实参列表); 调用函数时,还有几点需要说明: (1) “函数名”就是指被调用的函数 (2) 调用函数时的参数称为实际参数,简称实参。实参可以是变量、常量或表达式,是有确定值的参数。实参列表能为零或多个参数,多个参数时要用逗号隔开,每个参数的类型、位置应与函数定义时所的形式参数一一对应,它的作用就是把参数传到被调用函数中的形式参数,如果类型不对应就会产生一些错误。调用的函数是无参函数时不写参数,但不能省后面的括号。 (3)数据传递是通过形参接收实参的数值完成的。函数调用时,形参被

6、分配内存单元,并接收对应实参传来的值。 (4)函数的调用作为一个运算对象出现在表达式中,能称为函数表达式。注意的是这种调用方式要求被调用的函数能返回一个同类型的值, 不然会出现不可预料的错误。,3. 函数说明 嵌入式C语言中,函数和变量一样,都要先定义后引用。标准库函数只要用#include 引入已写好说明的头文件,在程序就能直接调用函数了。如果在函数调用前没有定义函数,则需在调用函数前进行函数说明。函数说明的形式为: 类型名 函数名(参数类型1 参数名1,参数类型n 参数名n) 也可以把这些写到文件名.h 的文件中用#include “文件名.h”引入。如果被调函数的定义和主调函数不是在同一

7、文件中的,则要用如下的方式进行说明: extern 类型标识符 函数的名称(形式参数表); 说明被调函数的定义在同一项目的不一样文件之上,库函数的头文件也是如此说明库函数的,说明的函数也能称为外部函数。 函数的定义和说明是完全不一样的,在编译的角度上看函数的定义是把函数编译存放在ROM 的某一段地址上,而函数说明是告诉编译器要在程序中使用那些函数并确定函数的地址。如果在同一文件中被调函数的定义在主调函数之前,这个时候能不用说明函数类型。也就是说在 main 函数之前定义的函数,在程序中就能不用写函数类型说明了。能在一个函数体调用另一个函数(嵌套调用),但不允许在一个函数定义中定义另一个函数。函

8、数定义和说明中的“类型、形参表、名称”等都要相一致。,任务二 中断服务函数 【任务实例1】 在P3口接上键盘(或开关)、P1口接上LED,程序将P3口的状态反应到P1口上。 参考程序: #include 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 unsi

9、gned int Temp; /定义局部变量 P1 = P3State(); /调用函数取得 p3 的状态反相后并赋给 P1 for(Temp=0;Temp50;Temp+); /延时 /用于返回 P3 的状态,演示函数的使用 unsigned char P3State(void) unsigned char Temp; Temp = P3; /读取 P3 的引脚状态并保存在变量 Temp 中 return Temp; ,微软用户1,【知识点】 1. 中断函数 中断服务函数只有在中断源请求响应中断时才会被执行,在处理突发事件和实时控制是十分有效的。例如:电路中一个按钮, 要求按钮后 LED 点

10、亮,这个按钮何时会被按下是不可预知的,为了要捕获这个按钮的事件, 通常会有三种方法,一是用循环语句不断的对按钮进行查询,二是用定时中断在间隔时间内扫描按钮,三是用外部中断服务函数对按钮进行捕获。 嵌入式c语言语言扩展了函数的定义,能直接编写中断服务函数,不必考虑出入堆栈的问题。扩展的关键字是 interrupt,它是函数定义时的一个选项,只要在一个函数定义后面加上这个选项就变成了中断服务函数。定义中断服务函数时能用如下的形式。 函数类型 函数名 (形式参数) interrupt n using n using选项:指定选用 51 芯片内部 4 组工作寄存器中的哪个组。可由编译器自动选择。 in

11、terrupt 关键字:不可缺少,它告诉编译器该函数是中断服务函数,并由后面的n 指明所使用的中断号。n 的取值范围为 031,具体的中断号要取决于芯片的型号 2. 使用中断服务函数时注意事项 中断函数不能直接调用中断函数 不能通过形参传速参数 在中断函数中调用其它函数,两者所使用的寄存器组应相同。,任务三 函数的参数形式及函数的嵌套 【任务实例1】 安装好机器人底座,并且安装好循迹传感器,左侧循迹传感器连接主板P2.6端口,右侧循迹传感器连接主板P2.7端口,机器人在一个搭建好的循迹场地上沿固定的黑色轨迹进行行走。 参考程序: #pragma SMALL #include unsigned

12、int data tmp; unsigned int data tmp1; void delay1ms(void) unsigned int data con; for(con=0;con124;con+); void delay(int tmpa) int i; for(i=0;itmpa;i+) delay1ms(); void forward(int tmp,int tmp1) P0 ,void right(int tmp,int tmp1) P0 |= 0x09; P0 |= 0x10; delay(tmp); P0 ,1. 光电传感器的组成 图5-5是双光电传感器,是由发光二极管,光

13、敏电阻,放大调整电路组成,配有工作状态指示,为传感器的调整提供了方便。 2. 光电传感器的工作原理 工作时,发光二极管发出光线,光敏电阻接收反射回来的光线。随接收光线强弱的不同,形成强弱不同的电信号。光敏电阻输出的电信号,经过比较放大电路后输出高低电平两种信号。遇到浅色地面,光线反射较强,光敏电阻阻值减小,输出端输出低电平,状态指示灯点亮。遇到深色地面,光线被吸收,反射回来的光线较弱。光敏电阻阻值增大,输出端输出高电平,状态指示灯熄灭。,【知识点】 1函数间参数的传递 嵌入式C语言中,函数的实参和形参数之间的数据传递是单方向的值传递方式。在函数调用时,使用变量、常量或数组元素作为函数参数时,将

14、实参的值复制到形参相应的存储单元中,即形参和实参分别占用不同存储单元,这种传递方式称为“值传递”。值传递的特点是单向传递,即只能把实参的值传递给形参,而形参值的任何变化都不会影响实参。 2形参的生命周期 在调用函数时,系统给形参分配内存单元,将实参的值赋给形参。函数执行完后,形参占用的空间被释放,实参仍保留调用前的值。 3函数的嵌套调用 嵌入式C语言中不允许嵌套的函数定义,各函数之间是平行的,不存在上一级函数和下一级函数的问题。但是嵌入式C语言允许在一个函数的定义中出现对另一个函数的调用。这样就出现了函数的嵌套调用,即在被调函数中又调用其他函数。,任务四 函数中的全局变量与局部变量、标识符的存

15、储类 【任务实例1】微软用户1 机器人从起始区出发,原地左转80ms,停止20ms。 参考程序: #pragma SMALL #include void delay1(int data a) /*参数单位约为 1ms */ unsigned int data i,j; for(i=0;ia;i+) for(j=0;j 122;j+) int b; void main(void) unsigned int i; b=20 for (i=0;i4;i+) P0 = 0x16; delay1(b); P0=0x00; delay1(b); ,微软用户1,【知识点】 1局部变量 在一个函数内部定义的变量是内部变量,它只能在本函数范围内有效,即它只有在本函数内才能使用它们,在此函数以外是不能使用这些变量的,这样的变量也称为是“局部变量”。另外,形式参数也是局部变量。 2全局变量 一个源文件可以包含一个或若干个函数。在函数内定义的变量是局部变量,而在函数之外定义的变量称为全局变量。全局变量可以为本文件中其他函数所共用。它的有效范围为从定义变量的位置开始到本源文件结束。 3 变量的存储类别 根据变量在程序运行期间是否需占用固定的存储单元,变量的存储类别可分为两类: 动态存储类别:程序运行期间不需要长期占用内存单元,即在程序运行期间根据需要进行动态的分配存储空间的方式。动态存储类别的变

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号