从单片机基础到程序框架(全集 2019pdf版).pdf - 第218页
c=c+1; //被执行了 2 次 } View(a); //把第 1 个数 a 发送到电脑 端的串口助手 软件上观察。 View(b); //把第 2 个数 b 发送到电脑 端的串口助手 软件上观察。 View(c); //把第 3 个数 c 发送到电脑 端的串口助手 软件上观察。 while(1) { } } /*---C 语言学习区 域的结束。 ----- ----------- ---------- ----------- --…

{
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 学习板,通过电脑端的串口助手软件就可以观
察到不同的变量数值,详细方法请看第十一节内容。

第五十二节: 支撑程序框架的 switch 语句。
【52.1 switch 的重要性。】
switch 是非常重要的语句,我所有的单片机项目都是用 switch 搭建程序主框架。如果说 while 和 for
是一对孪生兄弟,那么“if-else if”和 switch 也是一对孪生兄弟,凡是用“if-else if”能实现的功能
都可以用 switch 实现。switch 有条件分支的功能,当条件的分支超过 3 个以上时,switch 会比“if-else if”
更加直观清晰。
【52.2 switch 的语法。】
switch 常见的格式如下:
switch(变量) //根据变量的数值大小从对应的 case 入口进来
{
case 0: //入口 0
语句 0;
break; //switch 程序体的出口之一
case 1: //入口 1
语句 1;
break; //switch 程序体的出口之一
case 2: //入口 2
语句 2;
break; //switch 程序体的出口之一
} //最下面的花括号也是一个 switch 程序体的出口之一
分析:单片机从第一行的 switch(变量)进来,依次往下查询跟变量匹配的 case 入口,然后从匹配的 case
入口进来,往下执行语句,直到遇上 break 语句,或者 return 语句,或者“最下面的花括号”这三种情况
之一,才跳出当前 switch 程序体。上述例子中,假如变量等于 3,单片机从 switch(变量)进来,往下查询跟
3 匹配的 case 入口,因为没有发现 case 3,最后遇到“最下面的花括号”于是结束 switch 程序体,像这种
变量等于 3 的情况,就意味着 switch 里面的有效语句没有被执行到。多补充一句,在 case 2 选项中,“语
句 2”后面紧跟的 break 可以省略,因为 case 2 是最后一个 case,即使没有遇到 break 也会遇到“最下面
的花括号”而结束 switch 程序体。上述程序功能如果用“if-else if”语句来实现,等效于如下:
if(0==变量)
{
语句 0;
}
else if(1==变量)
{
语句 1;
}
else if(2==变量)
{
语句 2;
}