您的位置:控制工程论坛网论坛 » 教程与手册 » 第十三课 C51的循环语句

xilinxue

xilinxue   |   当前状态:在线

总积分:16186  2025年可用积分:0

注册时间: 2008-06-26

最后登录时间: 2020-03-22

空间 发短消息加为好友

第十三课 C51的循环语句

xilinxue  发表于 2008/11/4 19:13:32      709 查看 1 回复  [上一主题]  [下一主题]

手机阅读

   循环语句 是几乎每个程序都会用到的,它的作用 就是用来实现需要反复进行多次的操 作。如一个 12M  的 51 芯片应用电路中要求实现1 毫秒的延时,那么就要执行1000  次空语句 才能达到延时的目的(当然能使用定时器来做,这里就不讨论),如果是写 1000 条空语 句那是多么麻烦的事情,再者就是要占用很多的存储空间。我们能知道这 1000 条空语句, 无非就是一条空语句重复执行 1000 次,因此我们就能用循环语句去写,这样不但使程序结构清晰明了,而且使其编译的效率大大的提高。在  C  语言中构成循环控制的语句有 while,do-while,for 和 goto 语句。同样都是起到循环作用,但具体的作用和使用方法又大不一 样。我们具体来看看。

goto 语句


       这个语句在很多高级语言中都会有,记得小时候用 BASIC 时就很喜欢用这个语句。它是 一个无条件的转向语句,只要执行到这个语句,程序指针就会跳转到 goto 后的标号所在的 程序段。它的语法如下:


goto  语句标号; 其中的语句标号为一个带冒号的标识符。示例如下


void  main(void)


{


unsigned  char  a;


start:  a++;


if  (a==10)  goto  end;


goto  start;


end:;


}


上面一段程序只是说明一下 goto 的使用方法,实际编写很少使用这样的手法。这段程序的意思


是在程序开始处用标识符“start:”标识,表示程序这是程序的开始,“end:”标识程序的 结束,标识符的定义应遵循前面所讲的标识符定义原则,不能用 C 的关键字也不能和其它变 量和函数名相同,不然就会出错了。程序执行 a++,a 的值加 1,当 a 等于 10 时程序会跳到 end 标识处结束程序,不然跳回到 start 标识处继续 a++,直到 a 等于 10。上面的示例说明 goto 不但能无条件的转向,而且能和 if 语句构成一个循环结构,这些在 C 程序员的程 序中都不太常见,常见的 goto 语句使用方法是用它来跳出多重循环,不过它只能从内层循环 跳到外层循环,不能从外层循环跳到内层循环。在下面说到 for 循环语句时再略为提一提。 为何大多数 C 程序员都不喜欢用 goto 语句?那是因为过多的使用它时会程序结构不清晰,


过多的跳转就使程序又回到了汇编的编程风格,使程序失去了 C 的模块化的优点。


while 语句


while  语句的意思很不难理解,在英语中它的意思是“当…的时候…”,在这里我们可 以理解为“当条件为真的时候就执行后面的语句”,它的语法如下:


while  (条件表达式)  语句;


使用 while 语句时要注意当条件表达式为真时,它才执行后面的语句,执行完后再次回


到 while 执行条件判断,为真时重复执行语句,为假时退出循环体。当条件一开始就为假时, 那么 while 后面的循环体(语句或复合语句)将一次都不执行就退出循环。在调试程序时要



 



注意 while 的判断条件不能为假而造成的死循环,调试时适当的在 while 处加入断点,也许 会使你的调试工作更加顺利。当然有时会使用到死循环来等待中断或 IO 信号等,如在第一 篇时我们就用了 while(1)来不停的输出“Hello  World!”。下面的例子是显示从 1 到 10 的累 加和,读者能修改一下 while 中的条件看看结果会如果,从而体会一下 while 的使用方法。


#include <AT89X51.H>


#include <stdio.h>


void main(void)


{


unsigned int I = 1;


unsigned int SUM = 0; //设初值


SCON = 0x50; //串行口方式 1,允许接收


TMOD = 0x20; //定时器 1 定时方式 2


TCON = 0x40; //设定时器 1 开始计数


TH1 = 0xE8;   //11.0592MHz 1200 波特率


TL1 = 0xE8; TI = 1;


TR1 = 1; //启动定时器


while(I<=10)


{


SUM = I + SUM; //累加


printf ("%d SUM=%d\n",I,SUM); //显示


I++;


}


while(1); //这句是为了不让程序完后,程序指针继续向下造成程序“跑飞”


}


//最后运行结果是 SUM="55";


do  while 语句


do while 语句能说是 while 语句的补充,while 是先判断条件是否成立再执行循环体,


而 do  while 则是先执行循环体,再根据条件判断是否要退出循环。这样就决定了循环体无 论在任何条件下都会至少被执行一次。它的语法如下:


do  语句  while  (条件表达式)


用 do  while 怎么写上面那个例程呢?先想一想,再参考下面的程序。


#include  <AT89X51.H>


#include  <stdio.h>


void  main(void)


{



 



unsigned  int  I  =  1;


unsigned  int  SUM  =  0;  //设初值


SCON  =  0x50;  //串行口方式 1,允许接收 TMOD  =  0x20;  //定时器 1 定时方式 2


TCON  =  0x40;  //设定时器 1 开始计数


TH1  =  0xE8;  //11.0592MHz  1200 波特率 TL1  =  0xE8;


TI  =  1;


TR1  =  1;  //启动定时器


do


{


SUM  =  I  +  SUM;  //累加


printf  ("%d  SUM=%d\n",I,SUM);  //显示 I++;


}


while(I<=10);


while(1);


}


在上面的程序看来 do  while 语句和 while 语句似乎没有什么两样,但在实际的应用中要注


意任何 do while 的循环体一定会被执行一次。如把上面两个程序中 I 的初值设为 11,那么 前一个程序不会得到显示结果,而后一个程序则会得到 SUM="11"。


for  语句


在明确循环次数的情况下,for 语句比以上说的循环语句都要方便简单。它的语法如下: for  ([初值设定表达式];[循环条件表达式];[条件更新表达式])  语句 中括号中的表达式是可选的,这样 for 语句的变化就会很多样了。for 语句的执行:先


代入初值,再判断条件是否为真,条件满足时执行循环体并更新条件,再判断条件是否为 真……直到条件为假时,退出循环。下面的例子所要实现的是和上二个例子一样的,对照着 看不难理解几个循环语句的差异。


#include  <AT89X51.H>


#include  <stdio.h>


void  main(void)


{


unsigned  int  I;


unsigned  int  SUM  =  0;  //设初值


SCON  =  0x50;  //串行口方式 1,允许接收 TMOD  =  0x20;  //定时器 1 定时方式 2


TCON  =  0x40;  //设定时器 1 开始计数



 



TH1  =  0xE8;  //11.0592MHz  1200 波特率 TL1  =  0xE8;


TI  =  1;


TR1  =  1;  //启动定时器


for  (I=1;  I<=10;  I++)  //这里能设初始值,所以变量定义时能不设


{


SUM  =  I  +  SUM;  //累加


printf  ("%d  SUM=%d\n",I,SUM);  //显示


}


while(1);


}


如果我们把程序中的 for 改成 for(; I<=10; I++)这样条件的初值会变成当前 I 变量的


值。如果改成 for(;;)会怎么样呢?试试看。


continue  语句


continue  语句是用于中断的语句,通常使用在循环中,它的作用是结束本次循环,跳 过循环体中没有执行的语句,跳转到下一次循环周期。语法为:


continue;


continue 同时也是一个无条件跳转语句,但功能和前面说到的 break 语句有所不一样, continue  执行后不是跳出循环,而是跳到循环的开始并执行下一次的循环。在上面的例子 中的循环体加入 if  (I==5)  continue;看看什么结果?


return  语句


return 语句是返回语句,不属于循环语句,是要学习的最后一个语句所以一并写下了。 返回语句是用于结束函数的执行,返回到调用函数时的位置。语法有二种:


return  (表达式);


return; 语法中因带有表达式,返回时先计算表达式,再返回表达式的值。不带表达式则返回的


值不确定。


下面是一个同样是计算 1-10 的累加,所不一样是的用了函数的方式。


#include  <AT89X51.H>


#include  <stdio.h>


int  Count(void);  //声明函数


void  main(void)


{


unsigned  int  temp;



 



SCON  =  0x50;  //串行口方式 1,允许接收 TMOD  =  0x20;  //定时器 1 定时方式 2


TCON  =  0x40;  //设定时器 1 开始计数


TH1  =  0xE8;  //11.0592MHz  1200 波特率 TL1  =  0xE8;


TI  =  1;


TR1  =  1;  //启动定时器


temp  =  Count();


printf  ("1-10  SUM=%d\n",temp);  //显示


while(1);


}


int  Count(void)


{


unsigned  int  I,  SUM;


for  (I=1;  I<=10;  I++)


{


SUM  =  I  +  SUM;  //累加


}


return  (SUM);


}

1楼 0 0 回复
  • xilinxue

    xilinxue   |   当前状态:在线

    总积分:16186  2025年可用积分:0

    注册时间: 2008-06-26

    最后登录时间: 2020-03-22

    空间 发短消息加为好友

    xilinxue   发表于 2008/11/4 19:13:32

      我希望大家 多使用FOR 或者 WHILE


    对于GOTO 这个语句能不用最好就不要使用了,还有就是SWITCH这个循环分支语句能用IF和FOR代替就用他们代替,因为它编译出来的汇编大妈非常多,效率不高,大家可以动手看下

    2楼 回复本楼

    引用 xilinxue 2008/11/4 19:13:32 发表于2楼的内容

总共 , 当前 /