![基于Proteus和Keil的C51程序设计项目教程(第2版):理论、仿真、实践相融合](https://wfqqreader-1252317822.image.myqcloud.com/cover/785/36511785/b_36511785.jpg)
3.1 任务1:键控花样灯1(用if语句实现)
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_87_3.jpg?sign=1738858697-BfxLTlMLBfVLx1xVD63cPSVLS5TFEvdz-0-dd365be29e0e2a987a7b2ba4725c1078)
3.1.1 任务要求与分析
1.任务要求
键控花样灯电路所用元器件列表及原理图如图3-1所示。按下K1,LED亮;松开K1,LED灭。
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_87_4.jpg?sign=1738858697-KwBNjhbEcoU3pxHXBJ3I4fWrsJUMZj3c-0-28d636bdb689d75060ee8ab98a59b3f5)
图3-1 键控花样灯电路所用元器件列表及原理图
2.任务目标
(1)建立对控制系统输入/输出的认识,掌握独立按键的状态判别。
(2)认识if语句,掌握其初步应用。
3.任务分析
根据电路分析,输入元器件为按键,输出元器件为LED。按键状态决定LED的亮/灭。单片机就是输入与输出元器件间的处理器。按键的状态由与之相连的引脚电平来判断。K1对应P3.2。K2对应P3.3。任务1的控制框图如图3-2所示。
一般的限流电阻用res,它是模拟型的电阻仿真模型,其阻值可修改。上/下拉电阻为Pullup/Pulldown,是数字型电阻仿真模型。为使复位的仿真效果真实,复位电阻可用Pulldown。
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_88_1.jpg?sign=1738858697-ogzMakdryheAjM3qtI1oo2hYsXS2PrWL-0-2fb8ce95df25209ad2d7ed3a9b3fe9b7)
图3-2 键控花样灯1的控制框图
3.1.2 if条件语句的结构
if语句用来判定所给的条件是否满足,从而决定执行的顺序。if语句有以下3种形式。
1.单分支
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_88_2.jpg?sign=1738858697-kt5FO32Iu30mWyl6PBCTOO7oXLYGYz6P-0-349eebb12a381653879ab1e1275956ac)
如果表达式的值为真,即条件满足,则执行其后的语句,否则不执行该语句。if语句的结构如图3-3所示。
2.双分支
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_88_3.jpg?sign=1738858697-QB44sm3XTHqcEW56GB758Y4hNo6DcYBh-0-3af826909ee9197a6eaa6e09a3618517)
如果表达式的值为真,则执行语句1,否则执行语句2。if-else语句的结构如图3-4所示。
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_88_4.jpg?sign=1738858697-7CNLoMfG5lgGZGwbSvAeQG5PHkreGsv9-0-047a20f2f3bd88de6c294a940561c9ad)
图3-3 if语句的结构
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_88_5.jpg?sign=1738858697-jWUcjV12sxkxjAEaXerAaTXptlDAgkwu-0-c45e0a216acc87f5ef0b431b355524ff)
图3-4 if-else语句的结构
3.多分支
前两种形式的if语句一般都用于两个分支的情况。当有多个分支选择时,可采用if-else-if语句。
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_89_1.jpg?sign=1738858697-MQTHvOvQiXxWIuSLHNLapQavPHlhw1pI-0-d34dcc10ae9f80c977c629b383482e3e)
依次判断表达式的值,当出现某个值为真时,则执行其对应的语句后,跳到整个if语句之外继续执行程序。如果所有的表达式均为假,则执行语句n后,继续执行后续程序。if-else-if语句的结构如图3-5所示。
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_89_2.jpg?sign=1738858697-J8YPRG5rOaKklaQjhre4BFdgtDu1VtKu-0-80d8f8435832a67fa351f25223add640)
图3-5 if-else-if语句的结构
举例1:根据不同的工资水平salary,设置其对应的比例系数index。
当工资salary>1000时,index=0.4。
当工资800<salary<=1000时,index=0.3。
当工资600<salary<=800时,index=0.2。
当工资400<salary<=600时,index=0.1。
当工资salary<=400时,index=0.05。
程序语句的实现:
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_89_3.jpg?sign=1738858697-Hpd8m27sQvuOJ85wDZ66Ii5YtXxr0BQw-0-8c69123e0ac962fd28f95eb00b7ac363)
if语句总结:if语句的执行是根据if关键字之后表达式的值是0还是1来决定程序走向的。该表达式通常是逻辑表达式或关系表达式、算术表达式、一个变量,甚至是一个常量,也可以是其他表达式,如赋值表达式等。例如:
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_90_1.jpg?sign=1738858697-vKT52PcHxYwaVosGWHVQB7XOFsr5VNTX-0-6628ba49d7dab69210bd3c09c958d219)
都是允许的。只要表达式的值为非0,即为“真”,则其后的语句是要执行的。当然这种情况在程序中不一定会出现,但语法上是合法的。
● 在if语句中,条件判断表达式必须用括号( )括起来,在语句之后不用加分号。
● 在if语句的三种形式中,所有的执行语句最好用大括号{}括起来,表示在某条件下的一个语句块。若执行语句只有一句,则{}可省略。例如:
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_90_2.jpg?sign=1738858697-HjdqXMF2hZFvwl0pEcpKHyNNpBFKhSul-0-217aea2e1720705ee0458a88f4b3d99b)
注意:省略{}时,else总是和它上面离它最近的未配对的if配对。
3.1.3 关系运算符和关系表达式
所谓“关系运算”实际上是比较两个对象谁大、谁小或等与不等的关系,判断其比较的结果是否符合给定的条件。关系运算的结果只有两种可能,即“真”和“假”。例如,3>2的结果为真,3<2的结果为假。
关系运算符有6个,其含义及优先级见表3-1。
表3-1 关系运算符的含义及优先级
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_90_3.jpg?sign=1738858697-Pk2FmwSdzNkn0guiwwXe7GFVT16zJlod-0-cc0ad3f51df8a02a0892836786c75104)
用关系运算符将两个表达式连接起来的式子就是关系表达式。关系表达式结构如下:
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_90_4.jpg?sign=1738858697-wHVTPga7IM3snTgvK9N5jRqjvVODNmIm-0-ca00629e83c30657952b618a823302ab)
(1)a>b; //若a大于b,则表达式值为1(真)
(2)b+c<a; //(b+c)<a,若a=3、b=4、c=5,则表达式值为0(假)
(3)(a>b)==c; //若a=3、b=2、c=1,则表达式值为1(真)。
(4)c==5>a>b; //c==(5>a>b),若a=3、b=2、c=1,则表达式值为0(假)。
(5)x1=3>2; //结果是x1=1,原因是3>2的结果是“真”,为1,该结果被“=”号赋给了x1。这里须注意,“=”不是等于之意(C语言中等于用“==”表示),而是赋值号,即将该号后面的值赋给该号前面的变量,所以最终结果是x1=1。
(6)自行分析“x2=3<=2;”的结果是__________。
3.1.4 流程及程序设计
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_91_1.jpg?sign=1738858697-KdR2DwZVd6pShqh4cSYT8mnuhVIP5Fct-0-fb2d7a796d9af89e464e3e5bbf9b730d)
键控花样灯1的程序流程图如图3-6所示。程序保存为key1.c。
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_91_2.jpg?sign=1738858697-Z3grSb5T6GlkmtlV8wKOAWKTkdOZ33GC-0-d25ca4c3cf4a876e4af1e29111bc9eaf)
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_91_3.jpg?sign=1738858697-xMqa7YrvFVFn95vs4hzMisHCIWIlG7dV-0-146ce15a24200dfe65db151d535a1d04)
图3-6 键控花样灯1的程序流程图
3.1.5 编译、代码下载、仿真、测判
按项目1所述方法,先在Keil中新建工程key1,然后添加源程序key1.c、设置工程选项并编译,生成代码文件key1.HEX。参考2.1.7节下载代码,设置振荡频率为12MHz,进行仿真调试,填写表3-2,并进行分析和解释说明。
表3-2 键控花样灯1的运行现象分析与记录
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_91_4.jpg?sign=1738858697-gUSTSUBhkMyI9OlwHZWadzlwt1mh9PEO-0-af296672261e674b4fa161356beaa475)
将代码下载到实物板进行测试。