1、学习情境3 变化点亮LED彩灯知识点:1.C51程序的if语句形式及选择结构程序设计方法;2. C51程序中的关系运算符及表达式;3. C51程序中的逻辑运算符及表达式;4. C51程序中的switch语句;5. C51程序中的位逻辑运算符及表达式;6. C51程序中的数字表示形式。技能点:1.能熟练运用Keil51软件调试源程序;2.能熟练运用proteus仿真软件;3.能应用if语句的嵌套形式设计多分支程序;4.能应用switch设计多分支程序;5.能熟练应用C51中的关系运算符、逻辑运算符、位逻辑运算符及表达式完成控制程序的编写;6.能设计开关量的输入电路。学习情境目标 本学习情境是以8
2、只发光二极管显示为例,用单片机控制发光二极管,实现8只发光二极管有规律的变化点亮。从而学习C51的分支结构程序设计、关系运算符和逻辑运算符及表达式。学习情境分析 为了让单片机控制发光二极管,将8只发光二极管接在单片机P1口上,根据P2口外接的组合开的状态有规律的控制P1口的任意管脚上为低电平,则接在它上面的发光二极管就被点亮;反之,如果P1口的任意管脚上为高电平,则接在它上面的发光二极管就不会被点亮。连接电路图如图3-1所示。图3-1 连接电路图任务一 简单变化点亮8路彩灯任务目标 本任务是用P2口外接8位组合开关,根据P2口的开关组合状态,单片机的P1口控制外接的8个发光二极管固定显示。掌握
3、利用ifelse语句实现分支结构程序设计的方法。任务程序分析在这里,要编写C51程序,首先读取P2口的开关组合状态,利用ifelse控制语句实现将一个不同的8位无符号数通过P1口输出并能通过8个发光二极管观察结果。从输出的具体数据来看,D1灯亮需要的数据是P1.0的位为0,D2灯亮需要的数据是P1.1的位为0,依此类推。源程序#include reg51.h /包含头文件#define uint unsigned int /宏定义#define uchar unsigned char /宏定义void main(void) uchar i;/ 定义i为无符号字符型变量while(1)/无限循环
4、 i=P2;/将P2口外接开关状态读进来送给i变量 if(i=0xff) P1=i;/判i变量的值如果为0xff,则P1输出00,二极管全亮 else if(i=0xfe) P1=0xfe;/ 判i变量的值如果为0xfe,则P1输出0xfe,只有D1二极管亮 else if(i=0xf0) P1=0xf0; /判i变量的值如果为0xf0,则P1输出0xf0,D1、D2、D3、D4二极管亮 else if(i=0x0f) P1=0x0f;/ 判i变量的值如果为0x0f,则P1输出0x0f,D5、D6、D7、D8二极管亮 else if(i=0x55) P1=0x55;/ 判i变量的值如果为0x5
5、5,则P1输出0x55,D2、D4、D6、D8二极管亮 else if(i=0xaa) P1=0xaa;/ 判i变量的值如果为0xaa,则P1输出0xaa,D1、D3、D5、D5二极管亮 else P1=0xff;/否则,全不亮 任务实施1.利用proteus仿真软件绘制电路原理图按照情景一proteus仿真软件绘制电路过程绘制原理图3.1,绘制原理图时的添加器件有:AT89S51,LED-BLUE,RESPARK-8,DIPSW_8等,注意电源器件的放置于连线。2. C51程序的编译按照情景一Keil C51编译软件的操作步骤对源程序进行编译和调试。3.执行程序观察效果将编译成功后的.HEX
6、文件加载到CPU,根据程序设置DIPSW_8组合开关的状态,执行程序观察效果。相关知识1. C51程序的选择结构程序设计在结构化的程序设计中,程序由三种基本结构组成。它们分别是顺序结构,选择结构和循环结构。已经证明,由三种基本结构组成的算法结构可以解决任何复杂的问题。由三种基本结构组成的程序可以称为结构化程序。其中:顺序结构流程图如图3.2所示。由图我们不难看出,程序执行时先执行语句1再执行语句2,两者是顺序执行的关系,我们前面介绍的源程序中,赋值语句都可以实现该结构。选择结构流程图如图3.3所示。当判断表达式P为真时,执行语句1部分,否则执行语句2部分。尤其要注意的是语句1和语句2在程序的执
7、行中只有一个被执行。循环结构将在情景4中介绍。语句2语句1真假语句2语句1P表达式图3.2 顺序结构流程图 图3.3 选择结构流程图2. C51程序中的if语句的三种形式C语言提供了三种形式的if语句。(1)if(表达式) 语句例如:if(ab) t=a; a=b; b=t; (2)if (表达式) 语句1 ; else 语句2;例如:if(i=0xaa) P1=0xaa;else P1=0xff;(3)if(表达式1) 语句1; else if(表达式2) 语句2; else if(表达式3) 语句3; else if(表达式m) 语句m; else 语句n;源程序中采用了这种形式。这种形式
8、实际上是一种嵌套的if形式,用于多分支结构程序设计。3.关系运算符和关系表达式关系运算是一种简单的逻辑运算,关系运算符中的“关系”二字指的是一个值与另一个值之间的关系。(1)关系运算符及优先级关系运算符就是关系比较符,C语言共有6种关系运算符,见表3-1。表3-1 关系运算符关系运算符作 用结 合 性小于左结合性小于等于大于大于等于等于左结合性!不等于注意:1)关系运算符共分两级,其中,的优先级相同,且高于和!(二者优先级相同)。2)关系运算符的优先级低于算术运算符,高于赋值运算符。例:abc等价于 (ab)c abc等价于 (a B) & (XY)。“逻辑非”是单目运算符,只要求有一个运算量
9、。如 !(AB)。逻辑运算符及其他运算符之间的优先级关系见表3-2所示。表3-2 逻辑运算符优先级运算符优先级!(逻辑非)(高)算术运算符关系运算符& 和 |赋值运算符(低)“逻辑与”相当于生活中说的“并且”,就是两个条件都成立的情况下“逻辑与”的运算结果才为 “真”。例如:“明天又下雨并且又刮风”这是一个预言,到底预言的对不对呢?如果明天只下了雨或者只刮了风或者干脆就是大晴天,那么这个预言就错,或者说是假的。只有明天确实是又下雨并且又刮风,这个预言才是对的,或者是真的。 “逻辑或”相当于生活中的“或者”,当两个条件中有任一个条件满足,“逻辑或”的运算结果就为“真”。例如:“明天不是刮风就是下
10、雨”,这也是一个预言了。如果明天下了雨或者明天刮了风或者明天又下雨又刮风,那么这个预言是对的。只有明天又不刮风又不下雨,这个预言才是错的。“逻辑非”相当于生活中的“不”,当一个条件为真时,“逻辑非”的运算结果为“假”。表3-3为逻辑运算真值表:它表示当条件A是否成立与条件B是否成立形成不同的组合时,各种逻辑运算所得到的值。A、B的值为0表示条件不成立,为1表示条件成立。表3-3 逻辑运算真值表AB!A!BA&BA|B001100011001100101(2)逻辑表达式用逻辑运算符连接若干个表达式组成的式子叫逻辑表达式。逻辑表达式的值为一个逻辑值1或0。逻辑运算符不仅可以连接关系表达式,还可以连
11、接常量、变量、算术表达式、赋值表达式甚至逻辑表达式本身。如果一个表达式太复杂,可以通过括号来保证运算次序。 例如: ab | c= =d 等价于: (ab) | (c= =d) 又如: x10&x+y!=20 等价于:(x右移和移位的位数左移: 变量名2表示把000001111右移为00000011(十进制3)。又如 a4指把a的各二进位向左移动4位。如a=00000011(十进制3),左移4位后为00110000(十进制48)。应该说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0,而为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定。Turbo C和很
12、多系统规定为补1。3.计算机中带符号数的表示形式计算机中的数都是以二进制数来表示和存储的,计算机中数的表示形式有3种,即所谓的原码、反码、补码。对带符号数而言,数的最高位为符号位,如果符号位为0表示该数为正数,如果符号位为1表示该数为负数,并且一般用补码来表示带符号数。下面以一个数的三种表示形式来阐述原码、反码、补码的概念。(1)+30的原码、反码、补码+30的原码就是将正数转化为8位二进制数,转换结果为00011110,画线部分为符号位,对于一个正数而言,它的原码、反码、补码是一样的。(2)-30的原码、反码、补码先求-30的绝对值数的原码:00011110将符号位改为1变成: 10011110 即为-30的原码 符号位不变,其它位取反变成:11100001即为-30的反码在最低位加1,符号位为1不变:11100010即为-30的补码注意:-30在计算机存储器里就是以8位二进制数11100010存放的。变一变1.用if语句的第一种形式修改任务1的源程序完成相同功能。2.修改任务1的源程序,当组合开关的状态为00110011、10011001、00001111、11110000、10001001、01110111时,P1口分别输出对应的组合开关的状态。3.修改任务2的源程序完成上一题的功能。10 / 10