【单片机C语言基础入门】第五章:语句的组成(分支、循环结构)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【单片机C语言基础入门】第五章:语句的组成(分支、循
环结构)
首先祝大家国庆快乐,在这举国欢庆的时刻我来帮大家介绍一下单片机C语言中的编程语言中语句的组成。
前面介绍了单片机C语言编程中表达式和运算符的规范以及规则,但是仅仅有表达式和运算符是远不能满足编程的要求。
通常程序在单片机中执行是逐步按照地址的顺序进行的,这样会产生一个问题就是当用户希望程序是按照某种条件来
运行的时候就会变得复杂,接下来要向大家介绍一下单片机C语言中的语句的表达,在编程中经常用的语句表达式主要是条件语句以及循环语句。有了这几种控制语句使得在编程过程中用户可以按照自己的逻辑或者条件或者时序条件来
设计程序执行的顺序。
单片机C语言的条件语句
主要包括if语句和switch语句。If语句在单片机c语言中是极为常用的语句,用来判断某些变量(信号)达到预期的值后,再执行满足条件的指令,或者执行不满足条件的指令。If 语句的基本形式有三种:
直接的if语句;if……else……语句;if……else if……语句;下面对这三种语句逐一进行介绍。
1.直接if语句,其表达式为if(表达式)语句
直接的if语句的执行过程如下图所示:从图中可以看到,如果表达式为真的时候才执行if的语句,否则直接跳过执行if 以外的语句。在单片机的中断延时程序中可以看到:
void INT0_ISR() interrupt 0 //外部中断服务程序
{ Delayms(100);//延时程序100ms一般用于去除抖动,自己编写的延时程序If(INT0)//判断INT0的电平信号,如果是1运行线下面的程序,如果为0则跳出服务程序,也就是判断是不是误动作导致的INT0发生变化。{ ……//用户的程序}}
2.if……else……语句,一般表示为:if(表达式)语句1 else 语句2
if……else……语句是当表达式为真或者假的时候,都会执行相应的程序语句,这样的好处是当判断表达式(或者信号)的真假的时候都会有相应的动作与之对应,其执行的流程图如下:在单片机程序的设计中这样的例子也很多,比如下面的一段程序来自STC15系列单片机库函数的timer 初始化程序
u8 Timer_Inilize(u8TIM, TIM_InitTypeDef
*TIMx){ …… if(TIM == Timer0)
{ TR0 = 0; //停止计数
if(TIMx->TIM_Interrupt== ENABLE) ET0 = 1;
//允许中断else
ET0= 0; //禁止中断
if(TIMx->TIM_Polity== PolityHigh) PT0 = 1; //高优先级中断else
PT0= 0; //低优先级中断
if(TIMx->TIM_Mode> TIM_16BitAutoReloadNoMask) return 2; //错误TMOD =(TMOD & ~0x03) | TIMx->TIM_Mode; //工作模式,0: 16位自动重装, 1: 16位定时/计数, 2: 8位自动重装, 3: 16位自动重装, 不可屏蔽中断if(TIMx->TIM_ClkSource==
TIM_CLOCK_12T) AUXR &= ~0x80; //12T
if(TIMx->TIM_ClkSource== TIM_CLOCK_1T)
AUXR |= 0x80; //1T
if(TIMx->TIM_ClkSource== TIM_CLOCK_Ext)
TMOD |= 0x04; //对外计数或分频
else
TMOD&= ~0x04; //定时
if(TIMx->TIM_ClkOut== ENABLE) INT_CLKO |=
0x01; //输出时钟else
INT_CLKO&= ~0x01; //不输出时钟TH0 =(u8)(TIMx->TIM_Value >> 8); TL0
=(u8)TIMx->TIM_Value;
if(TIMx->TIM_Run== ENABLE) TR0 = 1; //开始
运行return 0; //成功}……//省略下面的部分}
可以看到if……else……在单片机中的应用。
3.if……else if ……。这样的判断语句的基本格式为:if(表达式1)语句1 else if(表达式2)语句2 else if(表达式3)语句3……,其执行的流程如下:这种结构的好处在于,多个判断表达式和多个执行语句,在数学中这可以表示分段函数的取值,在但片中也通常用于判断电压信号灯具有连续变化的数值信号分段取值的对应不同执行程序的场合。并且这种结构的一个好处是当满足其中的某一个条件的时候,就会执行相应的程序,而不再执行后面的程序,这样可以提高程序运行的效率。
4.有了前面三种if语句的基本组成然后就是if语句的嵌套组成的if复合语句。
也就是在if语句中的执行语句中继续嵌入if语句来实现多重if语句的嵌套结构。在这里就不详细介绍了,其用法和基本的if语句相同。
switch语句实现多分支的选择语句,其原理和if……else if……相似,利用多个条件实现多个分支语句的控制,其实也可以从名字看出来switch就是多路开关的意思,即根据变量的取值那然后选择相对应的语句来执行。其表达式如下:
switch(表达式){ case 常量表达式1: 语句1case 常量表达式2: 语句2case 常量表达式3: 语句3……case 常量表达式n: 语句ndefault:语句n+1}
这样会根据表达式的不同常量结果来选择相对应的语句来执行,注意:在这里没有break的时候,执行的顺序会从上往下一直进行,会得到我们并不希望得到的结果,因此在switch语句的case分支语句中增加break来实现真正的分支选择形式,如下:
switch(表达式){ case 常量表达式1: {语句1;break;}case 常量表达式2: {语句2;break;}case 常量表达式3: {语句3;break;}……case 常量表达式n: {语句n;break;}default:语句n+1;break;}
这样增加break以后会得到相应的分支语句,执行完后就会跳出switch语句,其break的用法将在后面介绍。
循环语句
1.goto语句,其表达式为goto lable;lable为程序的标号。goto语句和汇编的Jmp语句类似就是根据程序的标号来进行不会的跳动,结合if语句就构成了循环结构,但是这种语句在单片机C语言中的出现率并不是很高,除非不得已的时候才使用这用语句。
2.while语句,其表达式为while(表达式)语句,执行的流程如下:在单片机中百分之百用到的语句,因为在单片机中