找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2|回复: 0
收起左侧

第4章 C语言基础以及流水灯的实现4.4 4.5 4.6

[复制链接]
ID:1167894 发表于 2026-3-23 09:48 | 显示全部楼层 |阅读模式
4.4  for循环语句
for语句是C语言编程的一个常用的语句,这个语句必须得学会其用法,它不仅仅可以用来做延时,更重要的是用来做一些循环运算。for语句的一般形式如下:
        for (表达式1; 表达式2; 表达式3)
        {
            (需要执行的语句);
        }
其执行过程是:表达式1首先执行且只执行一次;然后执行表达式2,通常都是一个用于判定条件的表达式,如果表达式2条件成立,就执行(需要执行的语句);然后再执行表达式3;再判断表达式2,执行(需要执行的语句);再执行表达式3.....一直到表达式2不成立时,跳出循环继续执行循环后面的语句。举个例子:
        for (i=0; i<2; i++)
        {
            j++;
        }
这里有一个符号++刚刚讲过了。假如j最开始初值是0,首先执行表达式1的i=0,然后判断i小于2这个条件成立,就执行一次j++,j的值就是1了,然后经过表达式3后,i的值也变成1了,再判断条件2,还是符合,j再加一次,j变成2了,再经过表达式3后i也变成2了,再判断条件2,发现2<2这个条件不成立了,所以就不会再执行j++这个语句了。所以执行完毕后,j的值就是2。
for语句除了这种标准用法,还有几种特殊用法,比如前面的闪烁小灯对for语句的用法for(i=0; i<30000; i++) ;没有加(需要执行的语句),就是什么都不操作。但是什么都不操作的话,这个for语句循环判断了30000次,程序执行是会用掉时间的,所以就起到了延时的作用。比如把30000改成20000,会发现灯的闪烁速度加快了,因为延时时间短了,当然,改成40000后会发现,闪烁慢了。但是有一点特别注意,C语言的延时时间是不能通过程序看出来的,也不会成比例,比如这个for循环里边的表达式2使用30000时延时是3秒的话,那么改成40000的时候,可能并不一定是4秒。
还有一种写法for( ; ; ),这样写后,这个for循环就变成了死循环了,就不停的执行(需要执行的语句),和前边讲的while(1)的意思是一样的了。那while这个语法是如何用的呢?
4.5  while循环语句
在单片机C语言编程的时候,每个程序都会固定的加一句while(1),这条语句就可以起到死循环的作用。对于while语句来说,他的一般形式是:
        while (表达式)
        {
            循环体语句;
        }
在C语言里,通常“表达式”符合条件叫做真,不符合条件,叫做假。比如前边i<30000,当i等于0的时候,那这个条件成立,就是真;如果i大于30000的时候,i<30000条件不成立,就叫做假。
while(表达式)这个括号里的表达式,为真的时候,就会执行循环体语句,当为假的时候,就不执行。
还有另外一种情况,就是C语言里边,除了表达式外,还有常数,习惯上,把非0的常数都认为是真,只有0认为是假,所以程序中使用了while(1),这个数字1,可以改成2、3、4......等等都可以,都是一个死循环,不停的执行循环体的语句,但是如果把这个数字改成0,那么就不会执行循环体的语句了。
通过学习for循环和while循环,是不是会产生一个疑问?为何有的循环加上{},而有的循环却没加呢?什么时候需要加,什么时候不需要加呢?
前边讲过,在C语言中,分号表示语句的结束,而在循环语句里{}表示的是循环体的所有语句,如果不加大括号,则只循环执行一条语句,即第一个分号之前的语句,而加上大括号后,则会执行大括号中所有的语句,举个例子看一下,上节课的闪烁小灯程序如下所示。
        程序(1):                   程序(2):
        while (1)                               while (1)
        {                                         LED = 0;
            LED = 0;                            for(i=0;i<30000;i++);
            for(i=0;i<30000;i++);             LED = 1;
            LED = 1;                            for(i=0;i<30000;i++);
            for(i=0;i<30000;i++);
        }
程序(1)可以实现闪烁功能。而程序(2)没有加大括号,从语法上来看是没有任何错误的,写到Keil里编译一下也不会报错。但是从逻辑上来讲,程序(2)只会不停的循环“LED = 0;”这条语句,实际上和程序(3)效果是相同的。
        程序(3):
        while(1)
        {
            LED = 0;
        }
        for(i=0;i<30000;i++);
        LED = 1;
        for(i=0;i<30000;i++);
程序执行到while(1)已经进入死循环了,所以后边三条语句是一辈子也执行不到的。因此为了防止出类似的逻辑错误,推荐不管循环语句后边是一条还是多条语句,都加上{}以防出错。
4.6  函数的简单介绍
函数定义的一般形式如下:
        函数值类型 函数名 (形式参数列表)
        {
            函数体
        }
1、函数值类型,就是函数返回值的类型。在后边章节的部分例程中,会有很多函数中有return x这条语句,这个返回值也就是函数本身的类型。还有一种情况,就是这个函数只执行操作,不需要返回任何值,那么这个时候它的类型就是空类型void,这个void按道理来说是可以省略的,但是一旦省略,Keil软件会报一个警告,所以通常也不省。
2、函数名,可以由任意的字母、数字和下划线组成,但数字不能作为开头。函数名不能与其他函数或者变量重名,也不能是关键字。什么是关键字呢,后边慢慢接触,比如char这类,都是关键字,是程序中具备特殊功能的标志符,这种东西不可以命名函数。
3、形式参数列表,也叫做形参列表,这个是函数调用的时候,相互传递数据用的。有的函数不需要传递参数给它,那么可以用void来替代,void同样可以省略,但是那个括号是不能省略的。
4、函数体,包含了声明语句部分和执行语句部分。声明语句部分主要用于声明函数内部所使用的变量,执行语句部分主要是一些函数需要执行的语句。特别注意,所有的声明语句部分必须放在执行语句之前,否则编译的时候会报错。
5、一个工程文件必须有且仅有一个main函数,程序执行的时候,都是从main函数开始的。
6、关于形参和实参的概念,后边再总结,如果遇到程序里有,大家再跟着抄一段时间。先用,后讲解,这样更有利于理解。
来回顾一下闪烁LED程序中的主函数,根据注释再认真分析一遍,是不是对函数的认识就清楚多了。
void main()  //void即函数类型
{
    //以下为声明语句部分
    unsigned int i = 0;  //定义一个无符号整型变量i,并赋初值0
   
    //以下为执行语句部分
    ENLED = 0;   //U3、U4两片74HC138总使能
    ADDR3 = 1;   //使能U3使之正常输出
    ADDR2 = 1;   //经U3的Y6输出开启三极管Q16
    ADDR1 = 1;
    ADDR0 = 0;
    while (1)
    {
        LED = 0;                     //点亮小灯
        for (i=0; i<30000; i++);  //延时一段时间
        LED = 1;                     //熄灭小灯
        for (i=0; i<30000; i++);  //延时一段时间
    }
}
代码中的“//”是注释符,意思是说在这之后的内容都是注释。注释是给程序员自己或其他人看的,用于对程序代码做一些补充说明,对程序的编译和执行没有任何影响。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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