![基于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=1739059201-tUUjn756xRPhPh94ODedtfYH31qBLwFP-0-2f45b2f010156050e1519565ee9ca152)
3.1.1 任务要求与分析
1.任务要求
键控花样灯电路所用元器件列表及原理图如图3-1所示。按下K1,LED亮;松开K1,LED灭。
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_87_4.jpg?sign=1739059201-5nNzFFXZpnvi6RFGHVwfcnQH4Afo6fyV-0-3c5705ec210229b39a661ae995609327)
图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=1739059201-tjBKJlMLd9okNjKFdGp9kmobwr9BxxZB-0-ef92bd1a19509855931e1af36505a213)
图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=1739059201-cdEe10jaRXGCDnGzenirwu6eXARkw5NJ-0-bd5748a91cfbc222ee2d7a6147f2bf38)
如果表达式的值为真,即条件满足,则执行其后的语句,否则不执行该语句。if语句的结构如图3-3所示。
2.双分支
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_88_3.jpg?sign=1739059201-RYws3x8bvxcW5KlyIo1Ff37docCnCDsA-0-e94e3c71719fae4b67f64cd7283aa797)
如果表达式的值为真,则执行语句1,否则执行语句2。if-else语句的结构如图3-4所示。
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_88_4.jpg?sign=1739059201-oYXfzfbd6R3EMkOLHE6y4GMXf6ozjhxM-0-38d6dd885ddc8f85863d7b205fb2daa5)
图3-3 if语句的结构
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_88_5.jpg?sign=1739059201-91pfVjaSIXhCGHmTw6krdShu1eKFxibE-0-96348830b2c57345d2d16f252a29f4a0)
图3-4 if-else语句的结构
3.多分支
前两种形式的if语句一般都用于两个分支的情况。当有多个分支选择时,可采用if-else-if语句。
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_89_1.jpg?sign=1739059201-Y1zUr6a1GPRofizhop9I5YEvsTBZAdOs-0-cdbfcb89da4f316458cffa6add39ca93)
依次判断表达式的值,当出现某个值为真时,则执行其对应的语句后,跳到整个if语句之外继续执行程序。如果所有的表达式均为假,则执行语句n后,继续执行后续程序。if-else-if语句的结构如图3-5所示。
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_89_2.jpg?sign=1739059201-52QqTXdLHiz72zwgPnvH5T2qjQsJMBds-0-a4e2b592081e86bc1058599fb9fdae29)
图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=1739059201-aNgCvUSdJUVVaStMV2vxwizywXpSeBuT-0-30ff0f532c061a7fe1bdb6ec912fae37)
if语句总结:if语句的执行是根据if关键字之后表达式的值是0还是1来决定程序走向的。该表达式通常是逻辑表达式或关系表达式、算术表达式、一个变量,甚至是一个常量,也可以是其他表达式,如赋值表达式等。例如:
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_90_1.jpg?sign=1739059201-uPlREM18RpZrMnkGbhF6PVGAqw6Hvw70-0-de4a118f1535e700075115994af56ed4)
都是允许的。只要表达式的值为非0,即为“真”,则其后的语句是要执行的。当然这种情况在程序中不一定会出现,但语法上是合法的。
● 在if语句中,条件判断表达式必须用括号( )括起来,在语句之后不用加分号。
● 在if语句的三种形式中,所有的执行语句最好用大括号{}括起来,表示在某条件下的一个语句块。若执行语句只有一句,则{}可省略。例如:
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_90_2.jpg?sign=1739059201-Rqo95tvAQa8TTKfNRVUjWIh6bf6hKZma-0-71362b37c6b12936c3ce43508b583511)
注意:省略{}时,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=1739059201-La3EOzrhX50MBNhFBcOsObisbfMOpd56-0-e7733b5edfe75fb3c9d0bff9652e2a01)
用关系运算符将两个表达式连接起来的式子就是关系表达式。关系表达式结构如下:
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_90_4.jpg?sign=1739059201-kJSH62iSJKe2J4SLOF1gdtm36W5rEPlG-0-f4dca7e342894deac510e59a1cbe7a34)
(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=1739059201-Hr9TOuFQHNFODspElyRZzqpFhuZUjrSR-0-58e0554c6aecfb087ca0c30019816ed9)
键控花样灯1的程序流程图如图3-6所示。程序保存为key1.c。
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_91_2.jpg?sign=1739059201-FLqZLXv5MKLzdk7oxqSHscrg3r1bPqVU-0-55a5665673b1dd362277d92c5345068f)
![](https://epubservercos.yuewen.com/964F67/19391577901347306/epubprivate/OEBPS/Images/40331_91_3.jpg?sign=1739059201-EGlJUjvwGCS1X6EyMi2KeY1W2pEEglAA-0-09f49b7406792de2a585b0f999e6bd8c)
图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=1739059201-noH09BGEbxAq00q4DdNkrXe6kcYayqaN-0-127f4a7da2c971b58319919151376d8a)
将代码下载到实物板进行测试。