矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 5644|回复: 10

初学贴<3>学51单片机,函数的应用

[复制链接]
     
发表于 2014-5-22 23:31:35 | 显示全部楼层 |阅读模式
本帖最后由 yangcheng84 于 2014-5-22 23:34 编辑

本帖最后由 yangcheng84 于 2014-5-21 17:00 编辑


初学贴<1>:http://www.crystalradio.cn/thread-552316-1-1.html
初学贴<2>:http://www.crystalradio.cn/thread-552827-1-1.html
初学贴<2>续:http://www.crystalradio.cn/thread-553057-1-1.html


初学贴<3>函数的应用
/************************************************************/
函数的应用

我们写程序的时候,可能会遇到一种情况,就是反复执行功能类似的动作,

比如:有方程y=2x+5;   求x=0,  x=1,   x=5;   x=80 ….时方程 y的解

数学里,我们就是一个一个数字的代入上面的公式,在稿纸上就是这样写

y=2*0+5   (x=0时);
y=2*1+5   (x=1时);

y=2*5+5   (x=5时);

y=2*80+5   (x=80时);

y=2*n+5   (x=n时);

在程序中,我们也是可以那样写的,算多少次就写多少行. 但是我们也发现,这有点雷同、机械化了,占用程序ROM空间多。对,就是要机械化,但不是算一次重写一次的机械化。C语言中,积极鼓励用户将功能类似的代码独立起来,应用时,机械化的套用就可以了.这就是所谓的“模块化设计”上例中,这个模块就叫“函数”

在数学里,函数有着自变量和因变量的说法,y=2x+5 中,如果称x自变量的话,y就是因变量了。换句话说,x就是函数的输入,y就是函数的输出. C语言也一样,有输入和输出的
形式,只不过,
输入-------惯用名称:形参
输出-------惯用名称:返回值,在前面加关键字return
且一个函数只能有一个返回值. 中断函数不能有形参输入.
有的函数可能不需要输入给它,有的函数也是,算完了也不需要把结果传递出来,那么这些不需要的情况就用关键字:void (空的意思) 替代就可以了.

格式:

返回值数据类型声明    自定义的函数名(形参表)
{
    //函数体,括号就是函数的边界

}


来,我们用C语言描述y=2x+5 ,写一个功能函数(假设我们计算的y数值范围在65535以内,且x为正整数)

unsigned  int  sum(  unsigned  int   a )
  {
   unsigned  int  y;
   y=2*a+5;
   return (y);  //返回(即输出)
  }

上例里,我们定义输出范围是unsigned  int   ,形参(输入变量)是a.名称是  sum

有了这个函数,那么我们计算方程y=2x+5;   当x=0,  x=1,   x=5;   x=80 ….时方程 y的解就简单了,

需要用就调用一次就可以了。
y= sum(0);  //变量 x=2  被输入给计算函数sum,其结果送给y;
y= sum(1);  //变量 x=1  被输入给计算函数sum,其结果送给y;
y= sum(5);  //变量 x=5  被输入给计算函数sum,其结果送给y;
y= sum(80);  //变量 x=80  被输入给计算函数sum,其结果送给y;

…..

最后,和一般变量一样,除返回值为int型外,都需要遵循C语言先定义在引用的原则。完整练习用的程序如下:

#include  <AT89X52.H>
  #define    LED   P1_0
unsigned  int  sum(  unsigned  int   a );  //函数声明(定义)

/**************************************
  函数功能:计算2*a +  5 的值
  入    口:a
  返    回:2*a +  5 的值
**************************************/
unsigned  int  sum(  unsigned  int   a )
           {
             unsigned  int  y;
             y=2*a+5;
             return (y);  //返回(即输出)
           }


/**************************************
  函数功能:主调函数
  入    口:无
  返    回:无
**************************************/

main()
{
while(1)
      {
          if( sum( 2)  = =9 ) LED=0;   //计算2*a+5,当a=2时,结果为5就点灯
          else                 LED=1;  //否则灭灯


       }

}



最后,引用函数的目的就是简化程序结构,将一个复杂逇任务分解成许许多多的,功能简单的函数,通过函数的多次调用,组合、排序,得到许多复杂的功能  ,那样一来,方面了设计,用同样的ROM能完成更多的事情.啦

评分

1

查看全部评分

     
发表于 2014-5-23 09:31:41 | 显示全部楼层
每天进步一点点!
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2014-5-23 18:12:59 | 显示全部楼层
luosifu 发表于 2014-5-23 09:08
楼主最好解释一下为什么输入的参数叫“形参”
为什么开始是这样的:unsigned  int  sum(  unsigned  int   ...

罗总,我也是爱好者,不是教授,也不会写教材,点到即可,不明白的人肯定会细查资料的啊.
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2014-5-24 10:54:20 | 显示全部楼层
tangwenguang520 发表于 2014-5-23 09:31
每天进步一点点!

回复 支持 反对

使用道具 举报

发表于 2014-5-24 17:05:07 | 显示全部楼层
楼主那句 if( sum( 2)  = =9 )不就是永远为真的么?  那么led永远点亮?
还有 //计算2*a+5,当a=2时,结果为5就点灯“这句  应该是结果为9吧  注释会给人很大的帮助,但是如果注释错误的话  会让人很迷茫的
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2014-5-24 21:55:41 | 显示全部楼层
本帖最后由 yangcheng84 于 2014-5-24 22:39 编辑
疯糖蔚男的天 发表于 2014-5-24 17:05
楼主那句 if( sum( 2)  = =9 )不就是永远为真的么?  那么led永远点亮?
还有 //计算2*a+5,当a=2时,结 ...


对,就是你说的
回复 支持 反对

使用道具 举报

     
发表于 2014-5-24 22:22:37 | 显示全部楼层
楼主辛苦了每天来一节收获很多谢谢
回复 支持 反对

使用道具 举报

发表于 2016-3-23 13:14:17 | 显示全部楼层
没有体现变量a的作用
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2016-3-24 01:05:33 | 显示全部楼层
cjzwym 发表于 2016-3-23 13:14
没有体现变量a的作用

a  是函数形参,有作用的
回复 支持 反对

使用道具 举报

     
发表于 2016-3-24 22:35:37 | 显示全部楼层
这么好的贴没人回啊
回复 支持 反对

使用道具 举报

     
发表于 2016-3-27 21:41:28 | 显示全部楼层
讲的很好,很透彻,受益匪浅。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2024-5-4 12:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表