ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
【51.1 循环的嵌套。】 大循环的内部又包含了小循环,称为循环嵌套。生活中,循环嵌套的现象很常见,一年12个月,假设每个月都是30天(仅仅假设而已),1月份30天,2月份30天......11月份30天,12月份30,这里的年就是大循环,年内部的月就是小循环。一年12个月,大循环就是12次。一个月30天,小循环就是30次。用for语句来表达,大意如下: for(m=1;m<=12;m++) //大循环。一年12个月。这里的m看作月,代表一年12个月的大循环。 { for(d=1;d<=30;d++) //内嵌小循环。一月30天。这里的d看作天,代表一个月30天的小循环。 { } } 【51.2 循环嵌套的执行顺序。】 例子如下: for(i=0;i<2;i++) //大循环 { 语句1; for(k=0;k<3;k++) //内嵌的小循环 { 语句2; } 语句3; } 上述例子中,带i的for称为大循环,带k的for称为小循环,单片机从大循环入口进来,由上往下执行,执行第1次大循环,先执行1次“语句1”,接着进入小循环,小循环要连续循环执行3次“语句2”才跳出小循环,之后执行1次“语句3”,然后再返回到大循环入口判断i条件是否满足,此时条件满足,继续执行第2次大循环,1次“语句1”,3次“语句2”,1次“语句3”,第2次循环结束后又返回到大循环入口判断i条件,此时i已经等于2不再小于2了,因此条件不满足,结束整个循环嵌套。上述执行的语句顺序如下: 语句1; //第1次大循环开始 语句2; 语句2; 语句2; 语句3; 语句1; //第2次大循环开始 语句2; 语句2; 语句2; 语句3; 根据此顺序,再看一个具体的程序例子: a=0; b=0; for(i=0;i<2;i++) //大循环 { a=a+1; //被执行了2次 for(k=0;k<3;k++) //内嵌的小循环 { b= b+1; //被执行了6次 } } 上述例子中,执行完程序后,a的值变成了2,b的值变成了6。重点分析b的变化,“b=b+1”在内嵌循环体里被执行了6次,6次从何而来?就是i乘以k等于6。这个乘法次数是循环嵌套一个很重要的特性。上述程序如果用while语句来实现,等效如下: a=0; b=0; i=0; //控制大循环的变量初始化 while(i<2) //大循环 { a=a+1; //被执行了2次 k=0; //控制小循环的变量初始化 while(k<3) //内嵌的小循环 { b= b+1; //被执行了6次 k=k+1; } i=i+1; } 【51.3 循环嵌套的常见用途---二维数组的应用。】 二维数组a\[2\]\[3\],它有6个变量,在没有学for语句之前,如果要依次把每个元素单独赋值清零真不容易,要写6次赋值语句如下: a\[0\]\[0\]=0; a\[0\]\[1\]=0; a\[0\]\[2\]=0; a\[1\]\[0\]=0; a\[1\]\[1\]=0; a\[1\]\[2\]=0; 自从懂了for嵌套语句之后,可以让同样功能的代码简洁许多。上述代码等效于如下: for(i=0;i<2;i++) //大循环 { for(k=0;k<3;k++) //内嵌的小循环 { a\[i\]\[k\]=0; } } 【51.4 循环嵌套的常见用途---大延时。】 单片机项目会经常会用到delay这个延时函数,大部分都是利用for循环来实现,小延时的函数往往不用嵌套,直接如下编写: for(k=0;k<N;k++); 上述的N是控制循环次数,每次循环都要消耗单片机一点时间,如果N越大需要消耗的时间就越多,起到延时的作用。但是N所能取的最大值受它所定义的类型所限制,比如unsigned char类型最大范围是255,unsigned int类型最大范围是65535,unsigned long类型最大范围是4294967295。如果要实现更大的延时怎么办?就可以用for的循环嵌套,利用循环嵌套可以使得循环总次数进行乘法翻倍的放大,很容易编写大延时的函数。比如: for(i=0;i<M;i++) //大循环 { for(k=0;k<N;k++); //内嵌的小循环 } 此时循环的次数是N乘以M的乘积。如果N和M都是unsigned long类型,就意味着最大循环次数是4294967295的平方,次数大到惊人。 【51.5 例程练习和分析。】 现在编写一个循环嵌套的练习程序。 程序代码如下: /\*---C语言学习区域的开始。-----------------------------------------------\*/ unsigned char a=0; //观察这个数最后的变化 unsigned char b=0; //观察这个数最后的变化 unsigned char c=0; //观察这个数最后的变化 unsigned char i; //控制大循环体的条件判断变量 unsigned char k; //控制内嵌小循环体的条件判断变量 void main() //主函数 { for(i=0;i<2;i++) //大循环 { a=a+1; //被执行了2次 for(k=0;k<3;k++) //内嵌小循环 { b=b+1; //被执行了6次,也就是i乘以k,2乘以3等于6. } c=c+1; //被执行了2次 } View(a); //把第1个数a发送到电脑端的串口助手软件上观察。 View(b); //把第2个数b发送到电脑端的串口助手软件上观察。 View(c); //把第3个数c发送到电脑端的串口助手软件上观察。 while(1) { } } /\*---C语言学习区域的结束。-----------------------------------------------\*/ 在电脑串口助手软件上观察到的程序执行现象如下: 开始... 第1个数 十进制:2 十六进制:2 二进制:10 第2个数 十进制:6 十六进制:6 二进制:110 第3个数 十进制:2 十六进制:2 二进制:10 分析: 变量a为2。 变量b为6。 变量c为2。 【51.6 如何在单片机上练习本章节C语言程序?】 直接复制前面章节中第十一节的模板程序,练习代码时只需要更改“C语言学习区域”的代码就可以了,其它部分的代码不要动。编译后,把程序下载进带串口的51学习板,通过电脑端的串口助手软件就可以观察到不同的变量数值,详细方法请看第十一节内容。