![基于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=1739608865-A0YfCGNNdkv7CNgsi5t7gYHJBCcPIkuw-0-543b66036ba6ed5fa234d3b07b933d8a)
3.1.1 任务要求与分析
1.任务要求
键控花样灯电路所用元器件列表及原理图如图3-1所示。按下K1,LED亮;松开K1,LED灭。
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_87_4.jpg?sign=1739608865-UyIEJy0cJDGGMBJMiw3zhfzFblTk6BZH-0-1bc03856df81ab8a006cd78e6c2cc0e4)
图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=1739608865-le9r9NqC9VjZCvvv0TZlsLuRAH4JHIY1-0-b71019345255009ee8db1f86a44e6331)
图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=1739608865-17LeDAkXRfMn5KVQxvyApd2n2TaawbMG-0-9cb3ae939287e14bbe6c3e68227a9260)
如果表达式的值为真,即条件满足,则执行其后的语句,否则不执行该语句。if语句的结构如图3-3所示。
2.双分支
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_88_3.jpg?sign=1739608865-7RzjyD9sJaQMiN0kkW0tb60IIG954Sha-0-5571206125f21bc4d8d3cc066d46ff0b)
如果表达式的值为真,则执行语句1,否则执行语句2。if-else语句的结构如图3-4所示。
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_88_4.jpg?sign=1739608865-qTv3EjTlRBh3qvvN0nB5rswJZaFo9s0x-0-1642a0ea95c19a43f37f38073a37c3d7)
图3-3 if语句的结构
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_88_5.jpg?sign=1739608865-wbVBQdVlqpbNM7MF7IMZx7DIrPXMDoCP-0-b54a1af2eb9705244a02566b722a5620)
图3-4 if-else语句的结构
3.多分支
前两种形式的if语句一般都用于两个分支的情况。当有多个分支选择时,可采用if-else-if语句。
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_89_1.jpg?sign=1739608865-KAvnzrkewcHIzq8EjrQWqOKOl6JAskoT-0-de944ae548a80203df7cfa19375ec171)
依次判断表达式的值,当出现某个值为真时,则执行其对应的语句后,跳到整个if语句之外继续执行程序。如果所有的表达式均为假,则执行语句n后,继续执行后续程序。if-else-if语句的结构如图3-5所示。
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_89_2.jpg?sign=1739608865-K71wHhDzSXUVQq61OykDg0xlWZUAdI1o-0-fac2fb9a815546a29a40d885dc131716)
图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=1739608865-nbC8Pxi5rzHOJSsH4YvK3Xiafg3Cw1lN-0-d4d0d78f3992a75a14c5639b53ce72f5)
if语句总结:if语句的执行是根据if关键字之后表达式的值是0还是1来决定程序走向的。该表达式通常是逻辑表达式或关系表达式、算术表达式、一个变量,甚至是一个常量,也可以是其他表达式,如赋值表达式等。例如:
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_90_1.jpg?sign=1739608865-19lusWmULtCTn4C4DIDhRsr5sLMjtVFn-0-508e940908cd61757ecfa8fa582cb6d0)
都是允许的。只要表达式的值为非0,即为“真”,则其后的语句是要执行的。当然这种情况在程序中不一定会出现,但语法上是合法的。
● 在if语句中,条件判断表达式必须用括号( )括起来,在语句之后不用加分号。
● 在if语句的三种形式中,所有的执行语句最好用大括号{}括起来,表示在某条件下的一个语句块。若执行语句只有一句,则{}可省略。例如:
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_90_2.jpg?sign=1739608865-YKMGzkWNDjDHVcqqJSCMGD1IDiNQduSH-0-b7f57601aec1c62a99773e05d1ec3fd8)
注意:省略{}时,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=1739608865-eZxij7sDBvkeZtPrRbWX9z2FzlD3NUgd-0-7c774ae3248e253b011c25c1fd58f812)
用关系运算符将两个表达式连接起来的式子就是关系表达式。关系表达式结构如下:
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_90_4.jpg?sign=1739608865-R2VYWVlQtD4br7uwgehOhrxrVPLfdri5-0-432e85fb50fdb2dabd4f7bc14341e0b4)
(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=1739608865-IcWino504UCvFb7Qp7FnEyMnYR2McPVf-0-0a0bc3ef621a1c4e9acbb63322407ceb)
键控花样灯1的程序流程图如图3-6所示。程序保存为key1.c。
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_91_2.jpg?sign=1739608865-LG5C43JSctVZzgLREZ7rMvXlPItWTprX-0-f81bcceb8963b627474557507bca46b3)
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_91_3.jpg?sign=1739608865-mcwqJLxZqCXf5YvF2K6bTOcGjtijuwuk-0-88e2a8c79d7108b4b3f375b514f48cf7)
图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=1739608865-D4VssVansPpVXzEdACGG2d4nTcmaGimH-0-6ecb143c6fb1340c5e635149f33f6ee9)
将代码下载到实物板进行测试。