5--第五章-C51函数-单片机.ppt
第五章C51函数Anyquestion?
Thanks!程序实现:建立工程loop1,输入源程序。在Debug选项下左下角Parameter文本框里面加入“-dledkey”。编译、链接、调试,选择Peripheral下“键盘、LED实验仿真板”仿真观察。5、如图1所示,要求:开机后全部LED灯不亮;按下K1键LED灯从LED1到LED8依次循环点亮,然后全部熄灭;再按K1键,重复上述过程。如果中间按下K2键,则所有LED灯立即全部熄灭;并返回起始状态。(提示:break语句)程序实现:建立工程loop2,输入源程序。在Debug选项下左下角Parameter文本框里面加入“-dledkey”。编译、链接、调试,选择Peripheral下“键盘、LED实验仿真板”仿真观察。**5.1函数5.1.1函数的定义函数定义的一般格式如下:函数类型函数名(形式参数表)[reentrant][interruptm][usingn]形式参数说明{ 局部变量定义 函数体}前面部件称为函数的首部,后面称为函数的尾部,格式说明:1.函数类型函数类型说明了函数返回值的类型。2.函数名函数名是用户为自定义函数取的名字以便调用函数时使用。3.形式参数表形式参数表用于列录在主调函数与被调用函数之间进行数据传递的形式参数。【例5-1】定义一个返回两个整数的最大值的函数max()。intmax(intx,inty){intz;z=xy?x:y;return(z);}也可以用成这样:intmax(x,y)intx,y;{intz;z=xy?x:y;return(z);}4.reentrant修饰符这个修饰符用于把函数定义为可重入函数。所谓可重入函数就是允许被递归调用的函数。函数的递归调用是指当一个函数正被调用尚未返回时,又直接或间接调用函数本身。一般的函数不能做到这样,只有重入函数才允许递归调用。关于重入函数,注意以下几点:(1)用reentrant修饰的重入函数被调用时,实参表内不允许使用bit类型的参数。函数体内也不允许存在任何关于位变量的操作,更不能返回bit类型的值。(2)编译时,系统为重入函数在内部或外部存储器中建立一个模拟堆栈区,称为重入栈。重入函数的局部变量及参数被放在重入栈中,使重入函数可以实现递归调用。(3)在参数的传递上,实际参数可以传递给间接调用的重入函数。无重入属性的间接调用函数不能包含调用参数,但是可以使用定义的全局变量来进行参数传递。5.interruptm修饰符interruptm是C51函数中非常重要的一个修饰符,这是因为中断函数必须通过它进行修饰。在C51程序设计中,当函数定义时用了interruptm修饰符,系统编译时把对应函数转化为中断函数,自动加上程序头段和尾段,并按MCS-51系统中断的处理方式自动把它安排在程序存储器中的相应位置。在该修饰符中,m的取值为0~31,对应的中断情况如下:0——外部中断01——定时/计数器T02——外部中断13——定时/计数器T14——串行口中断5——定时/计数器T2其它值预留。编写MCS-51中断函数注意如下:(1)中断函数不能进行参数传递,如果中断函数中包含任何参数声明都将导致编译出错。(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存储类型说明。防止其它程序调用。【例5-2】编写一个