第七章 函数程序设计_第1页
第七章 函数程序设计_第2页
第七章 函数程序设计_第3页
第七章 函数程序设计_第4页
第七章 函数程序设计_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

1、 第七章第七章 函数程序设计函数程序设计 v函数的概念、定义格式函数的概念、定义格式v函数的调用方法函数的调用方法v函数的形式参数、实际参数和函数的返回值函数的形式参数、实际参数和函数的返回值 主要内容主要内容 函数的定义格式函数的定义格式函数的调用方法函数的调用方法函数的返回值函数的返回值 重点重点 函数的定义格式函数的定义格式函数的调用方法函数的调用方法 难点难点 在程序设计中,常将一些常用的功能模块编写成在程序设计中,常将一些常用的功能模块编写成函数,放在函数库中供公共选用,以减少重复编写函数,放在函数库中供公共选用,以减少重复编写程序段的工作量。程序段的工作量。 一个较大的程序一般应分

2、为若干个程序模块,一个较大的程序一般应分为若干个程序模块,每一个模块用来实现一个特定的功能。所有高级语每一个模块用来实现一个特定的功能。所有高级语言中都有子程序这个概念,用子程序实现模块的功言中都有子程序这个概念,用子程序实现模块的功能。在能。在C语言中,子程序的作用是由函数完成的。一语言中,子程序的作用是由函数完成的。一个个C程序可由一个主函数和若干个函数构成,由主函程序可由一个主函数和若干个函数构成,由主函数调用其它函数,其它函数也可以相互调用。同一数调用其它函数,其它函数也可以相互调用。同一个函数可以被一个或多个函数调用任意多次。个函数可以被一个或多个函数调用任意多次。三、函数的分类三、

3、函数的分类从函数的形式分从函数的形式分(1)有参函数:被调用时需接受主调函数传递来的数据。)有参函数:被调用时需接受主调函数传递来的数据。(2)无参函数:被调用时不需要主调函数传递数据。)无参函数:被调用时不需要主调函数传递数据。一、问题的引入一、问题的引入为什么要用函数?函数的作用?为什么要用函数?函数的作用?二、函数的概念二、函数的概念定义:函数是一个可反复使用的程序段,从其它的程定义:函数是一个可反复使用的程序段,从其它的程序段中均可通过调用语句来执行这段程序。序段中均可通过调用语句来执行这段程序。(2)有参函数的定义格式:有参函数的定义格式:存储类型说明符存储类型说明符 数据类型说明符

4、数据类型说明符 函数名(形函数名(形式参数表)式参数表) 形式参数说明序列;形式参数说明序列; 数据定义语句序列;数据定义语句序列; 执行语句序列;执行语句序列; 四、函数的定义四、函数的定义(1)无参函数的定义格式:无参函数的定义格式: 存储类型说明符存储类型说明符 数据类型说明符数据类型说明符 函数名(函数名(void) 数据定义语句序列;数据定义语句序列; 执行语句序列;执行语句序列; void MCU_init() SOPT_COPE = 0; /关闭看门狗关闭看门狗ICGC1 = 0 x28; ICGC2 = 0 x51; while(ICGS1_LOCK = 0); PTAD =

5、init_a; PTADD = ctr_a; PTBD = init_b; PTBDD = ctr_b; PTCD = init_c; PTCDD = ctr_c; PTDD = init_d; PTDDD = ctr_d; PTED = init_e; PTEDD = ctr_e; PTFD = init_f; PTFDD = ctr_f; PTGD = init_g; PTGDD = ctr_g; EnableInterrupts;无参数的函数定义无参数的函数定义:存储类型说明符存储类型说明符 数据类型说明符数据类型说明符 函数名(函数名(void) 数据定义语句序列;数据定义语句序列;

6、执行语句序列;执行语句序列; 存储类型说明符存储类型说明符 在这里并没有说明在这里并没有说明数据类型说明符为数据类型说明符为void说明函数的没有计说明函数的没有计算结果给主程序,只是执行了一个过程。算结果给主程序,只是执行了一个过程。void main(void) MCU_init(); 无参数的函数调用无参数的函数调用:调用函数调用函数 void MCU_init(void)的格式为函数名()的格式为函数名()函数的调用相当于执行了这个函数中的语句序列,执函数的调用相当于执行了这个函数中的语句序列,执行了一定的功能。行了一定的功能。练习:将你们的初始化函数中的初始化代码使用练习:将你们的初

7、始化函数中的初始化代码使用MCU_init()函数实现函数实现,将断点放在将断点放在MCU_init();MCU_init();处,单步处,单步调试程序直至调试程序直至void MCU_init(void)void MCU_init(void)里所有的语句执里所有的语句执行完毕行完毕/*= 164送显示段码子函数送显示段码子函数=*/ void Dsp_seg(byte serial_val) /由高位至低位串行转并行送数由高位至低位串行转并行送数 byte i; e_strobe=0; for(i=0;i8;i+) e_clk=0; if(serial_val&0 x80)=0) e

8、_data=0; else e_data=1; e_clk=1; serial_valx2) max=x1; if (x1x2) max=x1; else max=x2; else max=x2; if (maxx3) max=x3; if (maxx3) max=x3; return (max); return (max); 调用时:调用时: a=maxa=max(1 1,2 2,3 3) 【例【例1】 编写一个函数,求编写一个函数,求3个整型参数的最个整型参数的最大值并返回这个最大值。大值并返回这个最大值。函数程序设计函数程序设计 v函数调用中的数据传递方法函数调用中的数据传递方法v局部变

9、量、全局变量的定义和使用方法局部变量、全局变量的定义和使用方法v函数的嵌套调用函数的嵌套调用 主要内容主要内容 函数调用中的数据传递方法函数调用中的数据传递方法函数的嵌套调用函数的嵌套调用 重点重点 函数调用中的数据传递方法函数调用中的数据传递方法函数的嵌套调用函数的嵌套调用 难点难点 1值传递方式值传递方式是在形式参数和实际参数之间传递数据是在形式参数和实际参数之间传递数据所传递的是参数值所传递的是参数值调用函数时,将实际参数的值求出赋予对应的形式参数。调用函数时,将实际参数的值求出赋予对应的形式参数。在函在函数体中对形参的处理与实参无关。数体中对形参的处理与实参无关。当函数体执行完毕,形参

10、的当函数体执行完毕,形参的值可能发生变化,但值可能发生变化,但返回后,形参的值不带回到对应的实参中返回后,形参的值不带回到对应的实参中。特点:特点:参数值的单向传递参数值的单向传递形参一般是变量;实参可是变量或表达式。形参一般是变量;实参可是变量或表达式。函数间传递数据有四种方式:函数间传递数据有四种方式:值传递方式;地址传递方式;值传递方式;地址传递方式;返回值传递方式;全局变量传递。前返回值传递方式;全局变量传递。前2种利用函数的参数来种利用函数的参数来传递数据,后传递数据,后2种不是利用函数参数传递数据。种不是利用函数参数传递数据。一、函数调用中的数据传递方法一、函数调用中的数据传递方法

11、2地址传递方式地址传递方式 是在形式参数和实际参数之间传递数据是在形式参数和实际参数之间传递数据所传递的是地址所传递的是地址调用函数时,将实际参数的地址赋予对应的形式参数作为其地调用函数时,将实际参数的地址赋予对应的形式参数作为其地址。由于形参和实参的地址相同(占用相同的内存),所以址。由于形参和实参的地址相同(占用相同的内存),所以调调用时,可看成将实参的值传递给形参;返回时,可看成将形参用时,可看成将实参的值传递给形参;返回时,可看成将形参的值回带给对应的实参。的值回带给对应的实参。特点:特点:参数值的双向传递参数值的双向传递形参是数组名或指针变量;实参是变量的地址、数组名或指形参是数组名

12、或指针变量;实参是变量的地址、数组名或指针变量针变量3值传递和地址传递方式的区别值传递和地址传递方式的区别值传递:传递的是数值值传递:传递的是数值地址传递:传递的是地址。地址传递:传递的是地址。二、变量的作用域、局部变量和全局变量二、变量的作用域、局部变量和全局变量1 变量的作用域规则变量的作用域规则变量只能在它的作用范围内使用。变量只能在它的作用范围内使用。变量的作用域与定义变量的位置有关。变量的作用域与定义变量的位置有关。根据变量的作用域可以分为:局部变量和全局变量。根据变量的作用域可以分为:局部变量和全局变量。2 局部变量:局部变量: 在一个函数内部(或复合语句内部)定义的变量是内部变在

13、一个函数内部(或复合语句内部)定义的变量是内部变量,它只在本函数范围内有效。量,它只在本函数范围内有效。说明:说明:函数名不能使用其他函数中定义的变量函数名不能使用其他函数中定义的变量不同函数中可使用相同名字的变量,它们代表不同的对象,不同函数中可使用相同名字的变量,它们代表不同的对象,互不干扰互不干扰 形式参数也是局部变量形式参数也是局部变量不同局部变量的定义方法,局部变量的使用也有所不同不同局部变量的定义方法,局部变量的使用也有所不同2 局部变量:局部变量: (1)普通的变量申明普通的变量申明 byte a; 这种方式申明的函数变量当函数开始调用,在栈空间中分这种方式申明的函数变量当函数开

14、始调用,在栈空间中分配一定的空间,函数调用结束时,变量的空间也会消失。配一定的空间,函数调用结束时,变量的空间也会消失。 (2)用用static声明局部变量声明局部变量 函数中变量的值在函数调用结束后不消失而保留原值,函数中变量的值在函数调用结束后不消失而保留原值,在下次该函数调用时,该变量已有值,即为上一次函数调用在下次该函数调用时,该变量已有值,即为上一次函数调用结束时的值。该局部变量为静态局部变量。结束时的值。该局部变量为静态局部变量。)3.全局变量:在函数之外定义的变量称外部变量,全局变量:在函数之外定义的变量称外部变量,外部变量是外部变量是全局变量(全程变量)。它的有效范全局变量(全

15、程变量)。它的有效范围为从定义变量的位置开始到本源文件结束。围为从定义变量的位置开始到本源文件结束。补充:中断函数补充:中断函数 1、用预处理用预处理“#pragma TRAP_PROC”定定义义 2、用关键字用关键字“interrupt” 3、用关键字用关键字“interrupt”和中断向量号和中断向量号格式为:格式为:interrupt interrupt / /* *codecode* */ / 中断向量号与中断向量表地址的对应关系如下:复位向量中断向量号与中断向量表地址的对应关系如下:复位向量为为0号位于地址号位于地址0 xFFFE,1号紧跟着号紧跟着0号,位于地址号,位于地址0 xF

16、FFC,其余依此类推。其余依此类推。 8.5 知识链接1:定时器模块8.5.1 手机闹钟的设置v手机的闹钟如何设置?8.5.2 闹钟的工作流程设定闹钟要响设定闹钟要响的时间的时间闹钟的时间闹钟的时间1秒秒1秒的增加秒的增加闹钟当前的时间闹钟当前的时间设定的时间?设定的时间?重新设定重新设定闹钟响的时间?闹钟响的时间?否否闹钟响闹钟响是是是是否否闹钟的当前时间一秒一秒的闹钟的当前时间一秒一秒的增加,增加的节拍为增加,增加的节拍为1秒。秒。8.5.3 单片机中的定时模块 定时器是单片机中产生定时功能的功能模块定时器是单片机中产生定时功能的功能模块。MC9S08AC16内部包括三个独立的定时器。内部

17、包括三个独立的定时器。 定时器具有定时器具有定时溢出中断定时溢出中断、输入捕捉、输出比较和脉宽、输入捕捉、输出比较和脉宽调制输出调制输出4个基本功能。个基本功能。8.5.4 定时器内部结构图定时溢出定时溢出中断结构中断结构图图输入捕捉、输输入捕捉、输出比较和脉宽出比较和脉宽调制输出结构调制输出结构图图8.5.5 定时器的定时溢出示意图PS1PS2PS3预分频预分频时钟选择时钟选择总线时钟总线时钟固定时钟固定时钟外部时钟外部时钟16位计数器位计数器TPMxCNT1616位比较器位比较器16位预置器位预置器TPMxMODCLKSBCLKSACNT=MOD溢出标志溢出标志TOF中断允许中断允许TOI

18、E中断逻中断逻辑辑:当当TOIETOIE= =1 1且且TOFTOF= =1 1时将产时将产生溢出生溢出中断请中断请求求中断中断定时器驱动时钟定时器驱动时钟复位计数器复位计数器否否是是8.5.6 和定时溢出功能相关的寄存器寄存器名称寄存器名称命名符号命名符号地址地址用途用途复位初值复位初值状态控制寄存器状态控制寄存器TPMxSC$0020定时器状态和控制定时器状态和控制$00计数器高位寄存器计数器高位寄存器TPMxCNTH$0021实时计数值,只能读出,实时计数值,只能读出,不能写入。不能写入。相当于闹钟相当于闹钟的当前时间的当前时间。$00计数器低位寄存器计数器低位寄存器TPMxCNTL$0

19、022$00预置值高位寄存器预置值高位寄存器TPMxMODH$0023存放用户预置的计数值。存放用户预置的计数值。相当于闹钟的设定时间相当于闹钟的设定时间。$FF预置值低位寄存器预置值低位寄存器TPMxMODL$0024$FF8.5.7 状态控制寄存器TPMxSCbit76543210TOFTOIECPWMSCLKSBCLKSAPS2PS1PS0功功能能描描述述溢出标志,当溢出标志,当TPMxCNT的的值为值为$FFFF (自自由计数状态由计数状态)或或达到预置值时,达到预置值时,定时器的计数定时器的计数器溢出清器溢出清0,同,同时该标志置时该标志置1。溢出中断溢出中断允许。发允许。发生溢出时

20、,生溢出时,系统可执系统可执行溢出中行溢出中断处理程断处理程序;序;1:允许溢:允许溢出中断。出中断。0:不允许:不允许溢出中断。溢出中断。定时溢出定时溢出功能中该功能中该位没有意位没有意义义0 0:没有时钟,定时:没有时钟,定时器禁止;器禁止;0 1:总线时钟:总线时钟1 0:固定的系统时钟:固定的系统时钟1 1:外部时钟:外部时钟只要这两位的值非只要这两位的值非0,定时器就会被启动,定时器就会被启动,TPMxCNT的值循环递的值循环递增,因此这两位起到启增,因此这两位起到启停定时器的作用停定时器的作用分频系数,将时钟源的频分频系数,将时钟源的频率除以分频系数就得到定率除以分频系数就得到定时

21、器的计数频率。时器的计数频率。000:时钟源的频率:时钟源的频率/1001:时钟源的频率:时钟源的频率/2010:时钟源的频率:时钟源的频率/4011:时钟源的频率:时钟源的频率/8100:时钟源的频率:时钟源的频率/6101:时钟源的频率:时钟源的频率/32110:时钟源的频率:时钟源的频率/64111:时钟源的频率:时钟源的频率/128复复位位000000008.5.8 定时器定时溢出参数的计算举例 例8-1:v 已知外部晶振的频率为8MHz,采用禁止内部锁频环模式的外时钟模式,则总线频率为4MHz。定时器的时钟源选择总线时钟,假设要求定时溢出的周期为0.125ms,且允许定时溢出中断,请选择定时器的参数。 分析:v 定时器的溢出周期为0.125ms,则定时器溢出频率为溢出周期的倒数,即1/0.1258kHz,选择分频因子为1,则预置寄存器TPMxMOD的值为:定时器驱动时钟频率/溢出频率=(4000000/1)/8000=500。同时由于允许定时溢出中断,则定时器状态和控制寄存器TPMxSC的值为$48。8.5.9 中断的概念 什么是单片机的中断? 单片机为什么要引入中断? 实时性 并行性 效率 如何响应中断? 监控程序 中断处理函数8.5.10 中断向量 我们在第五章学习了复位向量,知道复位向量保存了复我们在第五章学习了复位向量,知道复位向量保存了复位后单片机系统开

温馨提示

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

评论

0/150

提交评论