第四章 单片机流程控制
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第四章 Cx51的流程控制
C语言是结构化编程语言,结构化语句有若干模块组成,每个模块中包含着若干个基本结构,每个基本结果中可以又若干调语句。归纳起来,C语言又三种基本结构:
1)顺序结构;
2)选择结构;
3)循环结构。
一、选择控制语句
C51 的选择语句主要有if 语句和switch/case 语句。
1、 if 语句
1)基本结构 if(表达式) {语句}
表达式为真执行花括号中的语句,否则跳过花括号中的语句。如果没有花括号,执行紧随其后的一句。
2)C51 提供三种形式的if 语句:
① if(表达式){语句;}
② if(表达式){语句1;} else {语句2;}
③ if(表达式1){语句1;}
else if(表达式2){语句2;}
else if(表达式3){语句3;}
此外,如果一个if 语句中又含有一个或多个if 语句,则称为if 语句嵌套。在if 语句嵌套中应注意if 与else 的对应关系,else 总是与它前面最近的一个if 语句相对应。
例1:某浮点数的范围在0.000~9999 之间,试编写一个函数返回浮点数的小数点位置。根据小数点的位置,即可在实际的单片机系统中显示出小数。
解:此题的基本思路是根据浮点数的4 种取值范围给出4 种不同的返回值,可以约定当定浮点数的大小在0.000~9.999、10.00~99.99、100.0~999.9、1000~9999 之间时,分别返回0、1、2 和3。参考程序如下:
int ftochar(float valp)
{
int dotno=0;
if(valp<10.0) dotno=0;
else if((valp>=10.0)&&(valp<100.0)) dotno=1;
else if((valp>=100.0)&&(valp<1000.0)) dotno=2;
else if(valp>=1000.0) dotno=3;
return dotno;
}//代码长度298
也可以这样编:
int ftochar(float valp)
{
int dotno=0;
if(valp>=10.0) dotno=1;
if(valp>=100.0) dotno=2;
if(valp>=1000.0) dotno=3;
return dotno;
}//代码长度227
自己体会
例2:if(P1_1!=0) {P1_1=0;}
例3:if(P1&0xf0)!=0xf0) {……}//检查P1高4位中是否有0 2、 switch/case 语句
switch/case 是C51 的多分支选择语句,它的一般形式如下:switch(表达式)
{
case 常量表达式1:语句1; break;
case 常量表达式2:语句2; break;
⋯⋯
case 常量表达式n:语句n; break;
default :语句n+1;
}
switch 括号中的表达式的值与某一case 后面的常量表达式的值相同时,就执行它后面的语句(可以是复合语句),遇到break 语句则退出switch 语句。若所有的case 中的常量表达式的值都没有与表达式的值相匹配时,就执行default 后面的语句。每一个case 的常量表达式必须是互不相同的,否则将出现混乱局面。各个case 和default 出现的次序,不影响程序的执行结果。如果在case 语句中遗忘了break 语句,则程序执行了本行之后,不会按规定退出switch语句,而是将执行后续的case 语句。
例1、 AT89C51 单片机的P1.0 和P1.1 引脚接有两只按键,其4 种逻辑组合分别点亮由P2.0~P2.3 控制的4 只LED(高电平点亮),试编程实现此功能。
解:参考程序如下
#include
void main()
{
data unsigned char a;
do
{
a=P1;
a=a&0x03; //,读低2位
P2=P2&0xf0;//P2低4位置0,关LED switch (a)
{
Case 0:P2=P2|0x01;break;Case 1:P2=P2|0x02;break;Case 2:P2=P2|0x04;break;Case 3:P2=P2|0x08;
}
}while(1);//注意while(1)
}
二、循环语句
循环程序主要有“当型”循环和“直到型”循环两种,C51 对此提供了4 种实现方法。
1、基于 if 和goto 构成的循环
采用if 和goto 可以构成“当型”循环程序,其格式如下:
loop:if(表达式)
{
语句;
goto loop;
}
loop 是语句标号,或称为标识符,原则上任何一条语句都可以有标号,标号和语句用“:”号分开。
采用if 和goto 也可以构成“直到型”循环程序,其格式如下:
loop:{
语句;
if(表达式)goto loop;
}
goto 语句为无条件转向语句,它的一般形式是:
goto 语句标号;
按照软件工程的有关思想,在程序设计中应避免使用或尽量少使用goto,以提高程序的可读性。有时候使用goto语句非常方便,
2、基于while 语句构成的循环
while 语句只能用来实现“当型”循环,其一般格式如下:
while(表达式)
{
语句;//可以是复合语句
}
while 语句首先计算表达式的值;若其值为非0,则执行内嵌语句,若其值为0,则退出while 循环。
例1:串行通信时,每发送1帧,需要等待发送完,经常用下面语句: