您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > C51单片机循环语句
C51单片机循环语句循环语句是几乎每个程序都会用到的,它的作用就是用来实现需要反复进行多次的操作。如一个12M的51芯片应用电路中要求实现1毫秒的延时,那么就要执行1000次空语句才能达到延时的目的(当然能使用定时器来做,这里就不讨论),如果是写1000条空语句那是多么麻烦的事情,再者就是要占用很多的存储空间。我们能知道这1000条空语句,无非就是一条空语句重复执行1000次,因此我们就能用循环语句去写,这样不但使程序结构清晰明了,而且使其编译的效率大大的提高。在C语言中构成循环控制的语句有while,do-while,for和goto语句。同样都是起到循环作用,但具体的作用和使用方法又大不一样。我们具体来看看。goto语句这个语句在很多高级语言中都会有,记得小时候用BASIC时就很喜欢用这个语句。它是一个无条件的转向语句,只要执行到这个语句,程序指针就会跳转到goto后的标号所在的程序段。它的语法如下:goto语句标号;其中的语句标号为一个带冒号的标识符。示例如下voidmain(void){unsignedchara;start:a++;if(a==10)gotoend;gotostart;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)来不停的输出“HelloWorld!”。下面的例子是显示从1到10的累加和,读者能修改一下while中的条件看看结果会如果,从而体会一下while的使用方法。#includeAT89X51.H#includestdio.hvoidmain(void){unsignedintI=1;unsignedintSUM=0;//设初值SCON=0x50;//串行口方式1,允许接收TMOD=0x20;//定时器1定时方式2TCON=0x40;//设定时器1开始计数TH1=0xE8;//11.0592MHz1200波特率TL1=0xE8;TI=1;TR1=1;//启动定时器while(I=10){SUM=I+SUM;//累加printf(%dSUM=%d\n,I,SUM);//显示I++;}while(1);//这句是为了不让程序完后,程序指针继续向下造成程序“跑飞”}//最后运行结果是SUM=55;dowhile语句dowhile语句能说是while语句的补充,while是先判断条件是否成立再执行循环体,而dowhile则是先执行循环体,再根据条件判断是否要退出循环。这样就决定了循环体无论在任何条件下都会至少被执行一次。它的语法如下:do语句while(条件表达式)用dowhile怎么写上面那个例程呢?先想一想,再参考下面的程序。#includeAT89X51.H#includestdio.hvoidmain(void){unsignedintI=1;unsignedintSUM=0;//设初值SCON=0x50;//串行口方式1,允许接收TMOD=0x20;//定时器1定时方式2TCON=0x40;//设定时器1开始计数TH1=0xE8;//11.0592MHz1200波特率TL1=0xE8;TI=1;TR1=1;//启动定时器do{SUM=I+SUM;//累加printf(%dSUM=%d\n,I,SUM);//显示I++;}while(I=10);while(1);}在上面的程序看来dowhile语句和while语句似乎没有什么两样,但在实际的应用中要注意任何dowhile的循环体一定会被执行一次。如把上面两个程序中I的初值设为11,那么前一个程序不会得到显示结果,而后一个程序则会得到SUM=11。for语句在明确循环次数的情况下,for语句比以上说的循环语句都要方便简单。它的语法如下:for([初值设定表达式];[循环条件表达式];[条件更新表达式])语句中括号中的表达式是可选的,这样for语句的变化就会很多样了。for语句的执行:先代入初值,再判断条件是否为真,条件满足时执行循环体并更新条件,再判断条件是否为真……直到条件为假时,退出循环。下面的例子所要实现的是和上二个例子一样的,对照着看不难理解几个循环语句的差异。#includeAT89X51.H#includestdio.hvoidmain(void){unsignedintI;unsignedintSUM=0;//设初值SCON=0x50;//串行口方式1,允许接收TMOD=0x20;//定时器1定时方式2TCON=0x40;//设定时器1开始计数TH1=0xE8;//11.0592MHz1200波特率TL1=0xE8;TI=1;TR1=1;//启动定时器for(I=1;I=10;I++)//这里能设初始值,所以变量定义时能不设{SUM=I+SUM;//累加printf(%dSUM=%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的累加,所不一样是的用了函数的方式。#includeAT89X51.H#includestdio.hintCount(void);//声明函数voidmain(void){unsignedinttemp;SCON=0x50;//串行口方式1,允许接收TMOD=0x20;//定时器1定时方式2TCON=0x40;//设定时器1开始计数TH1=0xE8;//11.0592MHz1200波特率TL1=0xE8;TI=1;TR1=1;//启动定时器temp=Count();printf(1-10SUM=%d\n,temp);//显示while(1);}intCount(void){unsignedintI,SUM;for(I=1;I=10;I++){SUM=I+SUM;//累加}return(SUM);}
本文标题:C51单片机循环语句
链接地址:https://www.777doc.com/doc-3073887 .html