理论教育 用if语句构成选择结构-零点起步PIC单片机常用模

用if语句构成选择结构-零点起步PIC单片机常用模

时间:2023-10-19 理论教育 版权反馈
【摘要】:用if语句可以构成选择结构。因为程序执行到第4行时Data1为2使第4行的if语句内表达式不成立,结果为假,所以接下来要跳过if后的第一条语句向下执行。按下S1时,只有低4位亮,抬起后只有高4位亮。图4-10 S042实验原理图题意分析●S1与RB0相连,通过上拉电阻R9实现高低两种电平状态的输入。

用if语句构成选择结构-零点起步PIC单片机常用模

用if语句可以构成选择结构。它根据给定的条件表达式进行判断,以决定执行某个分支程序段。C语言的if语句有两种基本形式。

1.基本形式一

基本形式只有if,其一般书写形式为

978-7-111-33274-9-Chapter04-79.jpg

978-7-111-33274-9-Chapter04-80.jpg

可以看出来if语句是一种复合语句,由多个部分构成。其功能是如果表达式的值为真,则执行其后的语句,否则跳过语句向下执行。其执行流程如图4-8所示。

由于本书中第一次出现这种流程图,所以解释一下如何看这种流程图,此流程图中只有3种符号,非常容易理解。

●带方向的线段表示下一个要执行的模块是哪一个。

●菱形表示一个条件判断,菱形的出口一般只有两个,即“真”或“假”,各用一个带方向的线表示执行方向。在实际绘制中,为了节省纸张,也有将其绘制为左右两侧带尖的矩形。

978-7-111-33274-9-Chapter04-81.jpg

图4-8 if语句第一种形式的流程图

●方框表示一个顺序执行的模块。

这里有必要说明一下图4-8中语句的范围,当if语句中的表达式不成立时,系统会跳过if后的第一条语句,那么什么是一条语句呢?在C语言中,有两种情况代表一条语句。

●一对大括号括起来的程序块(其中可以有任意多条其他语句)被C语言编译器认为是一条语句。

●如果if后无大括号,则其后的第一个以“;”结尾的语句称为其后的第一条语句。

对第一条语句的理解非常重要,往往是初学者易犯错误的地方,下面通过实例来加深对以上知识的理解。

【例4-12】阅读以下程序,说出此程序执行到第8行之后PORTD的值是什么。所用硬件电路图为图4-1。

978-7-111-33274-9-Chapter04-82.jpg

设计过程

1)修改S041项目中的main.c的内容,将以上代码输入(注释内容可以不输入)。

2)将以上代码编译后用Proteus VSM运行一次,查看PORTD的值。

运行效果分析

运行后是VT1亮,其他灭,也就是说PORTD值是0b00000010。因为程序执行到第4行时Data1为2使第4行的if语句内表达式不成立,结果为假,所以接下来要跳过if后的第一条语句向下执行。由于if后没有紧跟大括号,所以其后的第一条语句就是到第一个以“;”结尾的语句,即if后的第一条语句就是第5行的内容(虽然第5行和第6行都相对于if语句缩进了两个空格书写,但是缩进书写不会影响语句之间的从属关系)。当if语句的表达式不成立时,第5行就被跳过去了,向下执行就执行到了第6行,所以使Data2左移了1位,变为0b00000010。在第8行把Data2向PORTD输出,所以使PORTD输出结果为0b00000010。

【例4-13】阅读以下程序,说出此程序执行到第10行之后PORTD的值是什么。所用硬件电路图为图4-1。

978-7-111-33274-9-Chapter04-83.jpg

运行效果分析

本例设计过程与上例相同,这里就不重写了。直接运行后看结果,答案是0b00000001。因为此程序中if后紧跟了一对大括号,使if后的第一条语句是一个由大括号括起来的复合语句,包括了第6行和第7行。当if的表达式不成立时,跳过if后的第一条语句,包括第6行和第7行,然后执行PORTD=Data2,Data2没有变化,还是初始值1,所以PORTD输出结果是0b00000001。(www.daowen.com)

2.基本形式二

第二种形式为完整的if语句,即if+else,一般书写格式为

978-7-111-33274-9-Chapter04-84.jpg

其语义是,若表达式的值为真,则执行语句1后跳过语句2,否则跳过语句1执行语句2。其具体执行过程如图4-9所示。需要强调的是,if后面表达式的小括号千万不能省略。

978-7-111-33274-9-Chapter04-85.jpg

图4-9 if+else语句流程图

通过图4-9可以看出,当表达式为真时只执行语句1,不执行语句2。if+else语句中的语句1和语句2每次判断表达式后只能执行两者之一,不能全部执行。有了if语句后,单片机就可以进行判断了,通常用if语句实现对外部信号状态的判断。根据外部信号不同状态来完成不同的工作,这就是一种典型的单片机控制方法。下面通过例子来说明这种方法的应用。

【例4-14】硬件电路如图4-10所示,要求编程实现通过按键S1来控制8个LED的状态。按下S1时,只有低4位亮,抬起后只有高4位亮。

电路图在光盘位置:“\Example\Chapter4\S042\sch\led8key1.dsn”。

978-7-111-33274-9-Chapter04-86.jpg

图4-10 S042实验原理图

题意分析

●S1与RB0相连,通过上拉电阻R9实现高低两种电平状态的输入。所以RB0应为输入状态。

●VT0~VT7通过电阻与C口8个引脚相连,可见是用C口控制LED灯。所以C口应为输出状态。

●根据题意要求,如果S1是0,则C口低4位输出高电平;如果S1是1,则C口高4位输出高电平。由于不知道用户何时按S1键,所以判断语句和相应的处理代码应该写在一个死循环中,不断地读取RB0状态,这样才能防止漏掉用户的随机按键。

设计过程

1)用Proteus ISIS软件按图4-10绘制一个新的电路图并保存(推荐自己画,学习就是一个熟能生巧的过程)。

2)用MPLAB新建一个C语言项目,项目命名为S042,并新建一个main.c文件加入到项目中。在main.c中,加入如下内容(注释可以不输入)。

978-7-111-33274-9-Chapter04-87.jpg

978-7-111-33274-9-Chapter04-88.jpg

3)在MPLAB中使用Proteus VSM调试工具,打开本例电路图。将以上代码编译后用Proteus VSM运行一下,观察按与不按S1的情况下,LED的状态如何变化,尽量弄明白代码与运行效果的关系。不明白的地方请看相应语句后的注释内容。

运行效果分析

●本程序运行效果是,当S1未按下时,RB0被上拉电阻R9拉为高电平,RB0的值为1,if语句判断时条件为假执行else分支,即执行语句“PORTC=0xF0;”,所以C口只有高4位亮。

●当S1按下时,RB0接地,导致读取RB0的值为0,if语句判断时条件成立,执行if后的语句“PORTC=0x0F;”,所以C口只有低4位亮。

注意:在书写条件表达式时,不要判断无符号数大于或等于0。

978-7-111-33274-9-Chapter04-89.jpg

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈