控制信号灯null任务6
控制信号灯任务6
控制信号灯任务描述任务描述用C51编程实现用单片机控制LED的点亮方式。
1、用一个开关,控制8个LED按一定频率闪烁。
2、用多个按键,控制8个LED实现多种点亮方式。涉及到的基本知识涉及到的基本知识C51介绍
程序结构
变量定义
运算表达式
流程图
分支语句
循环语句一、C51介绍 C51是一种单片机编程语言。
具有功能强大、结构性、可读性、可移植性好等特点。
与标准C语言基本相同,但有些区别。一、C51介绍二、程序结构二、程序结构示例程序
main函数
书写格式
注释
头文...
null任务6
控制信号灯任务6
控制信号灯任务描述任务描述用C51编程实现用单片机控制LED的点亮方式。
1、用一个开关,控制8个LED按一定频率闪烁。
2、用多个按键,控制8个LED实现多种点亮方式。涉及到的基本知识涉及到的基本知识C51介绍
程序结构
变量定义
运算表达式
图
分支语句
循环语句一、C51介绍 C51是一种单片机编程语言。
具有功能强大、结构性、可读性、可移植性好等特点。
与
C语言基本相同,但有些区别。一、C51介绍二、程序结构二、程序结构示例程序
main函数
书写格式
注释
头文件
1、main函数1、main函数main() 函数是 C 程序处理的起点。 它表示函数的开始,后面是函数的主体在函数定义的后面有一个左大括号,即 {main() 函数可以返回一个值,也可以不返回值。如果某个函数没有返回值,那么在它的前面有一个关键字 void,也可以不写。在函数定义的结尾处有一个右大括号,即 }空的,没有的大括号也可以用于将语句块括起来举例分析 举例分析 有关main函数的一些知识:有关main函数的一些知识:一个C源程序必须包含一个main函数。
一个C源程序只能包含一个main函数。
一个C程序总是从main函数开始执行。
main函数可以放在程序的任何位置。参见教材《单片机的C51应用程序设计》第 53、54 页 2、书写格式2、书写格式C程序书写格式自由
不使用行号,无程序行概念
一行内可以写几个语句
一个语句可以分写在多行上
可使用空行和空格
常用锯齿形书写格式
习惯用小写字母,大小写敏感函数主体中的每个语句都以分号结束。C 程序中的一个语句可以跨越多行,并且用分号通知编译器该语句已结束。 参见教材《单片机的C51应用程序设计》第 54 页 举例分析 举例分析 优秀程序员的素质:
{ }对齐
使用TAB缩进
有合适的空行3、注释/* */
//3、注释C 程序可以包含注释,以便向读者作一般说明编译器并不处理这些注释 在程序中添加注释是一个好的编程习惯,可以增强程序的可读性。单行注释多行注释单行注释参见教材《单片机的C51应用程序设计》第 54 页 举例分析 举例分析 优秀程序员的素质:
有足够的注释4、头文件4、头文件以.h为后缀的文件被称为头文件,可以是 C 程序中现成的标准库文件,也可以是自定义的库文件。head以 # 开始的语句称为预处理器指令#include语句不是必需的,但是,如果程序有该语句,就必须将它放在程序的开始处包含、包括举例分析 举例分析 三、变量定义 数据类型
常量与变量
SFR定义
存储类型三、变量定义1、数据类型1、数据类型
整型 int
基本数据类型 浮点型 float double
字符型 char
数组 以[]为标志
结构 struct 构造类型
复杂数据类型 联合 union
枚举 enum
指针类型 以 * 为标志参见教材《单片机的C51应用程序设计》第 55 页 C51的数据类型C51的数据类型 C51的数据类型与标准C中的数据类型基本相同。
C51中的char型与short型相同。
C51中最常用的是数据类型是unsigned char型。
C51中有专门针对单片机的特殊功能寄存器型和位类型。KEIL C51编译器能够识别的基本数据类型KEIL C51编译器能够识别的基本数据类型2、变量与常量2、变量与常量
常量也是存储在内存中的,但是,常量的
数值在程序执行过程中不会发生改变。参见教材《单片机的C51应用程序设计》第 56 页 (1)变量(1)变量
如:int a;(2)常量(2)常量
1、直接常量
也叫无名常量、文字常量。
如:25
3.14
‘a’ 2、符号常量
用预处理命令#define为常量命名。
通常使用大写字母为常量命名。
如: #define PI 3.1415926举例分析 举例分析 null课
练习:下列哪些常量是不合法的整数?为什么?
(1)1234 (2)-11 (3)01234 (4)077
(5)0x12ed (6)0x4001 (7)09 (8)2f××例:判断下列整数的合法性
123、-456、0 、256、015、0101、0177777 、03A2、5A、0X2A、0XA0、0XFFFF、0X3H、123L、358u ×××null浮点常量构成
:
浮点常数由整数部分、小数部分、指数部分构成。整数部分和小数部分用小数点连接,小数和指数部分用e(或E)连接。
(1) 整数部分可以不写,小数部分可以不写,但不能同时不写。如:.1234、1.
(2) 指数部分可以省略。如: 1.0、123.4
(3) 若有指数部分,e(或E)两边都至少有一位数。如: 4.50E3、-12E7 、.8E4
(4) 指数的数字必须是整数(范围为1到3位的整数),可以为负或正,正号可以省略。
如:4.50E+3、 8.9E-5课题练习:下列哪些常量是不合法的浮点数?为什么?
(1)12E7 (2)12E7.2 (3) 0x3.10 (4).1E-10
(5)0E0 (6)6.6 (7)3E0Xed (8)0x3fE10×××(3)变量定义(3)变量定义 在程序运行过程中其值可以改变的量。
由两部分组成:变量名、变量值。
先定义后使用。
最简定义格式:
数据类型说明符 变量名1,变量名2…;
如:unsigned char score1,score2;null①数据类型说明符
在定义变量时必须通过数据类型说明符说明变量的数据类型,指明变量在存储器中占用的字节数。
基本数据类型说明符(如:char、int、float)
组合数据类型说明符(如:int *)
用预处理命令#define定义的类型别名。
#define c51固有的数据类型说明符 别名
如: #define unsigned char uchar;
用typedef定义的类型别名。
typedef c51固有的数据类型说明符 别名;
如:typedef unsigned int WORD;null②变量名
为区分不同变量,为不同变量取的名称。
由字母、数字和下划线组成,且第一个字符必须是字母或下划线。
注意:
不能使用关键字和特定字。
避免使用容易混淆的字符。
大、小写代表不同的意义。
尽量不要与某个库函数同名。
标识符最好有含义。null例:判断下列用户定义字的合法性
sum Sum M.D.John day Date 3days
student_name #33 lotus_1_2_3
char a>b _above $123××××××课堂练习:下列符号哪些可作为C语言的用户定义字,哪些不可以,为什么?
(1)2m (2)mean (3)c (4)ked (5)var
(6)_n25 (7)exp (8)i*j (9)nn (10)data
(11)finished (12)a+c (13)int (14)n_m (15)-n
(16) n-m (17)ok?×××××××用户按照语法规则定义的标识符。可以用来标识用户自己使用的变量,符号常量、数据类型以及函数等。 3、SFR定义特殊功能寄存器
特殊功能寄存器变量
特殊功能寄存器变量的定义
位变量
位变量的定义
包含SFR定义的头文件3、SFR定义null (1)特殊功能寄存器
SFR (Special Function Register)
51系列单片机共21个SFR
单片机中各功能部件所对应的寄存器参见教材 第 64、65 页 (2)特殊功能寄存器变量(2)特殊功能寄存器变量特殊功能寄存器型是C51扩充的数据类型。
用于访问单片机中的特殊功能寄存器数据。
sfr:占一个内存单元。利用它可以访问所有的特殊功能寄存器。
sfr16:占两个内存单元。利用它可以访问所有两个字节的特殊功能寄存器。
在C51中对特殊功能寄存器的访问必须先用sfr或sfr16进行声明。参见教材《单片机的C51应用程序设计》第 65 页 (3)特殊功能寄存器变量的定义(3)特殊功能寄存器变量的定义定义格式:
sfr 特殊功能寄存器名=地址;
如:sfr PSW=0xd0;
sfr P1=0x90;
sfr16 特殊功能寄存器名=地址;
如:sfr16 DPTR=0x82;参见教材《单片机的C51应用程序设计》第 66 页 (4)位变量(4)位变量位类型是C51扩充的数据类型。
用于访问单片机中的可寻址的位单元。
bit:占一个二进制位,值为1或0。
编译时,位地址可以变化。
sbit:占一个二进制位,值为1或0。
与单片机中的一个位单元联系在一起。编译时,对应的位地址是不可变化的。参见教材《单片机的C51应用程序设计》第 65 页 (5)位变量的定义(5)位变量的定义定义格式:
bit 位变量名;
如:bit a1;
sbit 位变量名=位地址;
如:sbit CY=0xd7;
sbit P1_1=P1^1;请定义:
累加器的D5位
P1口的最低位P2口的最高位参见教材《单片机的C51应用程序设计》第 66 页 (6)包含SFR定义的头文件(6)包含SFR定义的头文件为处理方便,C51编译器将常用特殊功能寄存器和特殊位定义在头文件reg51.h中
用户使用之前只需用预处理命令
#include
将其包含在程序中。4、存储类型存储器类型
存储模式
存储种类
变量定义的完整格式4、存储类型(1)存储器类型用于指明变量所处的单片机的存储器区域情况。
C51编译器能识别的存储器类型
data、bdata、idata、pdata、xdata、code(1)存储器类型参见教材《单片机的C51应用程序设计》第 61 页 null定义举例:char data var1;
bit bdata flags;
可以省略,省略时C51编译器将按编译模式默认存储器类型。参见教材《单片机的C51应用程序设计》第 62、63 页 (2)存储模式(2)存储模式存储模式决定了变量的默认存储类型、参数传递区和无明确存储类型说明的变量的存储器类型。
C51编译器支持三种存储模式:
small模式、compact模式、large模式。
参见教材《单片机的C51应用程序设计》第 63 页 null通过#pragma预处理命令来实现存储器模式的指定。
如: #pragma small
char k1;
如果没有指定,则系统默认为small模式。参数及局部变量放入可直接寻址的片内存储器。(3)存储种类指变量在程序执行过程中的作用范围。
四种类型:
自动(auto)
外部(extern)
静态(static)
寄存器(register)(3)存储种类null①自动(auto)
使用auto定义的是自动变量。
如:auto int a;
作用范围在定义它的函数体或复合语句内部。
定义它的函数体或复合语句执行时,为该变量分配空间,结束时占用的内存空间释放。
在函数体或复合语句内部定义变量时,如果省略存储种类,则该变量默认为自动变量
如:int a;null②外部(extern)
用extern定义的是外部变量。
如:extern float x;
在一个函数体内,要使用一个已在该函数外或别的程序中定义过的外部变量时,该变量在该函数体内要用extern说明。
外部变量被定义后分配固定的内存空间,在程序整个执行时间内都有效,直到程序结束才释放。
可以在函数外部不加标识直接定义外部变量。举例分析 举例分析 外部变量自动变量null③静态(static)
用static定义的是静态变量。
如: static unsigned char b;
内部静态变量:在函数内部定义的静态变量。
在程序中一直存在,但只在函数体内有效,在函数体外看不到。
即使离开函数时值也不会被改变。null外部静态变量:在函数外部定义的静态变量。
外部静态变量在程序中一直存在,但在定义的范围之外是不可见的。
外部静态变量在多文件或多模块处理中,只在文件内部或模块内部有效。
外部静态变量的使用有利于模块化程序设计中数据的隐藏。null④寄存器(register)
使用register定义的是自动变量。
如: register unsigned char data;
定义在内部的寄存器中。
处理速度快,但数目少。
C51编译器编译时能自动识别程序中使用频率最高的变量,并将其作为寄存器变量,用户可以无需专门声明。(4)变量定义的完整格式完整定义格式:
[存储种类] 数据类型说明符 [存储器类型] 变量名1[=初值],变量名2[=初值]…;
如:score1,score2 静态变量,无符号字符型,使用内部数据存储器存储,
static unsigned char data score1=98,score2=79;
(4)变量定义的完整格式第11次 作业第11次 作业 教材《单片机的C51应用程序设计》P79
6、按给定的存储类型和数据类型,写出下列变量的说明形式。四、运算表达式 赋值运算符
算术运算符
关系运算符
逻辑运算符
位运算符
自增减运算符
复合运算符四、运算表达式1、赋值运算符1、赋值运算符
举例分析 举例分析 2、算术运算符2、算术运算符
参见教材《单片机的C51应用程序设计》第 69 页 null
例 5/2 =
-5/2.0 =2-2.5练习:5%2 =
-5%2 =
1%10 =
5%1 =
5.5%21-110()思考:
1、如何取一个三位整数a的个位、十位、百位?
2、如何取一个16位二进制数b的低8位、高8位?答:个位:a%10;十位:(a/10)%10:百位:a/100。
答:低8位:b%256;高8位:b/256。练习:
951/10=?
951%10=?
95/10=?
95%10=?nullnull
优先级参见教材《单片机的C51应用程序设计》第 69 页 null算术运算符的结合性 运算符的结合性是指如果一个操作数左边和右边的两个运算符的优先级相同,应该优先计算的操作符。
如:a+b-c
C语言规定双目算术运算符的结合性是自左至右。
双目运算符的结合性与数学运算并无不同。参见教材《单片机的C51应用程序设计》第 70 页 null
一个运算符对不同类型数据的计算结果有可能不同。如:5/4与5.0/4。
不同类型的数据在一起运算时,需要转换为相同类型的数据。
转换的方式:
1、自动转换,又称隐式转换,由系统提供。
2、强制转换,又称显式转换,由程序员编写。不同数据类型数据间的混合运算参见教材《单片机的C51应用程序设计》第 70 页 null
系统根据规则自动将两个不同数据类型的运算对象转换成同一种数据类型的过程。参见教材《单片机的C51应用程序设计》第 70 页 null
在C语言中,允许程序员根据自己的意愿将一种数据类型强制转换成另一种数据类型。
强制转换的格式为:
(数据类型名)表达式;
如:(int)a;参见教材《单片机的C51应用程序设计》第 70 页 3、关系运算符3、关系运算符关系运算符用于测试两个操作数或两个表达式之间的关系,其中操作数可以是变量、常量或表达式。操作数关系运算符操作数null关系运算符操作数1操作数2参见教材《单片机的C51应用程序设计》第 71 页 举例分析 举例分析 nullnum1=10; num2=5;num3=20;num4=10;
(num1 + num2) > (num3 – num4)num=40;
num/10 != 2gender = ‘m’真假==如果 gender = ‘f’如果 gender = ‘m’例 int a=3,b=2,c=1,d,f;
a>b
(a>b)==c
b+cb
f=a>b>c//表达式值1//表达式值1//表达式值0//d=1//f=0null
参见教材《单片机的C51应用程序设计》第 71 页 第12次 作业第12次 作业 教材《单片机的C51应用程序设计》P79
2、下面给出的数中哪些是错误的表示?在正确表示的数中指出整数或浮点,以及十进制、八进制或十六进制数。4、逻辑运算符
4、逻辑运算符参见教材《单片机的C51应用程序设计》第 72 页 null
null
参见教材《单片机的C51应用程序设计》第 72 页 null参见教材《单片机的C51应用程序设计》第 72 页 null参见教材《单片机的C51应用程序设计》第 72 页 null a=4;b=5;
!a
a&&b
a||b
!a||b
4&&0||2
5>3&&2||8<4-!0
‘c’&&‘d’值为1值为0值为1值为1值为1值为1(5>3)&&2||(8<(4-(!0))) 值为1a<=x && x<=b
a>b&&x>y
a==b||x==y
!a||a>b
// (a<=x) && (x<=b) //(a>b)&&(x>y)//(a==b)||(x==y)//(!a)||(a>b)5、位逻辑运算符5、位逻辑运算符位运算是指在C语言中能进行二进制位的运算。
位运算包括位逻辑运算和移位运算:
位逻辑运算能够方便地设置或屏蔽内存中某个字节的一位或几位,也可以对两个数按位相加等;
移位运算可以对内存中某个二进制数左移或右移几位等。
参见教材《单片机的C51应用程序设计》第 73 页 null
操作数在实现位操作时按二进制进行运算,一般应为无符号型整数。 参见教材《单片机的C51应用程序设计》第 73 页 null
null
null
null
nullnull
null
举例分析 举例分析 null例:x=00010001,x=x<<2,
则:x=01000100 x<<2表示将a的各位依次向左移2位,a的最高2位移出去舍弃,空出的低2位以0填补。
x=x<<2 表示把x进行左移以后赋值给x。
一般不只用x<<2。null例:x=00010001,x=x>>2,
则:x=00000100右移后空出的高位补0还是补1,分两种情况:
对无符号数进行右移时,空出的高位补0。这种右移称为逻辑右移。
对带符号数进行右移时,空出的高位以符号位填补。即正数补0,负数补1。这种右移称为算术右移。 null
null 移位运算符的优先级低于算术优先级,高于关系运算符和逻辑运算符。
按位与、或、异或三个运算符的优先级低于关系运算符,高于逻辑运算符。
按位取反是除圆括号外优先级最高的运算符。
按位与的优先级高于按位异或,按位异或的优先级高于按位或。6、自增减运算符6、自增减运算符
增1运算符:++
功能:将变量自身的内容加1。
如:++i i++
减1运算符:--
功能:将变量自身的内容减1。
如:--i i--
对变量本身而言,前缀表示法与后缀表示法并无区别。前缀表示法前缀表示法后缀表示法后缀表示法参见教材《单片机的C51应用程序设计》第 78 页 举例分析 举例分析 null
注意:
将i++、++i用在表达式中则前缀与后缀是有区别的。
前缀表示法:先将i值增/减1,再在表达式中使用;
后缀表示法:先在表达式中使用i的值,再将i值增/减1。
例如:
i=3; i=3;
j=i++; j=++i;
结果:
j的内容为3 j的内容为4
i的内容为4 i的内容为4课堂练习:P79 8参见教材《单片机的C51应用程序设计》第 78 页 null参见教材《单片机的C51应用程序设计》第 78 页 7、复合运算符7、复合运算符
运算符优先级运算符优先级课堂练习:P79 9第13次 作业第13次 作业 教材《单片机的C51应用程序设计》P79
7、判断下列关系表达式或逻辑表达式的运算结果(1或0)?五、流程图五、流程图程序流程图也称为程序框图,是软件开发者最熟悉的一种算法表达工具。
流程图直观、清晰,更有利于人们设计与理解算法。
流程图是用图的形式将一个过程的步骤表示出来。
流程图由包含具有确定含义的符号、简单的说明性文字和各种连线。 开始/结束处理输入/输出判断/分支连接符流程线1、顺序结构的流程图1、顺序结构的流程图
执行过程:
先执行A操作,
再执行B操作。参见教材《单片机的C51应用程序设计》第 80 页 2、选择结构的流程图2、选择结构的流程图
执行过程:
当条件成立时执行A操作,
当条件不成立时不执行。(1)单分支结构可用语句:if(条件)(2)双分支结构
执行过程:
当条件P成立时执行A操作,
当条件P不成立时执行B操作。(2)双分支结构可用语句:if (条件)
else参见教材《单片机的C51应用程序设计》第 81 页 null
(3)串行多分支结构(3)串行多分支结构可用语句:
if (条件)
else if (条件)
else if (条件)
…
else参见教材《单片机的C51应用程序设计》第 81 页 (4)并行多分支结构(4)并行多分支结构根据同一转移,同时转移到多条分支工作,当所有分支全部执行完成后,汇合到一起继续执行。 可用语句:
switch (变量)
{
case 常量1:
case 常量2:
…
defult:
}参见教材《单片机的C51应用程序设计》第 82 页 3、循环程序的流程图3、循环程序的流程图
(1)当型循环结构先判断,后执行当P成立时,反复执行A操作,
当P不成立时,结束循环。可用语句:
1、while (条件)
2、for(初值;条件;修改)参见教材《单片机的C51应用程序设计》第 82 页 null
(2)直到型循环结构先执行,后判断可用语句:
do
{
}
while (条件) 先执行A,再判断P。若P成立再执行A,直到P不成立结束循环。参见教材《单片机的C51应用程序设计》第 82 页 null直到型循环可以用当型循环的变形来替代。循环次数循环次数
循环次数:循环动作做了几次。
循环执行前无法预知循环次数。
循环执行前已经知道循环次数。4、程序的流程图4、程序的流程图在进行编程之前,应该先画出程序的流程图。
程序的流程图不是一个程序的细节,而只是这个程序关于解决问题的方法概述。
一个流程图应画在一张单页纸上。
当一个流程图复杂到不能放在一页中的时候,可以把它分解成若干个子流程图。参见教材《单片机的C51应用程序设计》第 83 页 null例:等待某键按下启动。参见教材《单片机的C51应用程序设计》第 83 页 最好最差次好null练习:绘制流程图。
设计任务:当开关闭合时,8个LED闪烁。六、分支语句六、分支语句if(单分支)
if else(双分支)
else if(串行多分支)
if语句的嵌套(多分支)
关系运算符(双分支)
switch/case(并行多分支)null
if (表达式)
{ 语句1;}
下一条语句;
if (p1!=0)
{c=20;}
参见教材《单片机的C51应用程序设计》第 83 页 举例分析 举例分析 null
注意:null
(4)语句1既可以是单个语句,也可以是多个语句 。单个语句时,花括号可以省略。多个语句时,花括号不能省略。
超过一条语句就必须使用复合语句,使用复合语句时则要用将花括号{ }将一组带分号的语句括起来。参见教材《单片机的C51应用程序设计》第 85 页 null
if (表达式)
{语句1;}
else
{语句2;}
下一条语句;if (p1!=0)
{c=20;}
else
{c=0;}参见教材《单片机的C51应用程序设计》第 84 页 null
if (表达式1) {语句1;}
else if (表达式2) {语句2;}
else if (表达式3) {语句3;}
…
else if (表达式n) {语句n;}
else {语句n+1;}
下一条语句;if (a>=4)
{c=40;}
else if(a>=3)
{c=30;}
else if(a>=2)
{c=20;}
else if(a>=1)
{c=10;}
else
{c=0;}参见教材《单片机的C51应用程序设计》第 84 页 null
4、if语句的嵌套4、if语句的嵌套
if (表达式1)
{ if (表达式2)
{语句1;}
else
{语句2;}
}
else
{ if (表达式3)
{语句3;}
else
{语句4;}
}C语言规定:在没有用花括号明确地表明嵌套关系的情况下,else与离它最近的if 配对。内部嵌套if语句内部嵌套if语句参见教材第 84 页 null
if (表达式1)
{ if (表达式2)
{语句1;}
}
else
{语句2;}if (a>b)
if (a>d)
c=15;
else
c=0;参见教材《单片机的C51应用程序设计》第 85 页 if (a>b)
{ if (a>d)
c=15;
}
else
c=0;if (表达式1)
if (表达式2)
{语句1;}
else
{语句2;}null
if ((表达式1) && (表达式2) )
语句1;
if (!表达式1)
语句2;if(表达式1)
{ if(表达式2)
语句1;
}
else
语句2; 等效null
if( (表达式1) && (表达式2) )
语句1;
if ((表达式1) && (!表达式2) )
语句2 ;if (表达式1)
{ if (表达式2)
语句1;
else
语句2;
}等效
if (表达式1)
if (表达式2)
语句1;
else
语句2; 5、条件运算符5、条件运算符
表达式1 ? 表达式2 : 表达式3参见教材《单片机的C51应用程序设计》第 86 页 6、switch语句 6、switch语句
switch (表达式)
{
case 常量表达式1:{语句1;}break;
case 常量表达式2:{语句2;}break;
case 常量表达式3:{语句3;}break;
…
case 常量表达式n:{语句n;}break;
default : {语句n+1;}break;
}参见教材《单片机的C51应用程序设计》第 86 页 null
null
注意:null (4) 语句i可以用复合语句,而且允许省略花括号{ }。但是,switch语句语法中的花括号{ }不能省略。null
(5) switch语句可以嵌套,即在一个switch语句中嵌套另一个switch语句,但是要注意break只能跳出最内层的switch语句。第14次 作业第14次 作业 教材《单片机的C51应用程序设计》P93
6、用选择分支编写程序,把输入的一个数字按下列对应关系显示。
输入数字 输出字符的ASCII码
1 A
2 B
3 C
4 D
其他 ?七、循环语句七、循环语句while(当型循环)
do while(直到型循环)
for(最灵活、最复杂的循环)
1、while语句 1、while语句
while (表达式)
{语句;}参见教材《单片机的C51应用程序设计》第 88 页 null int sum=0,i=1;
while (i<=10)
{
sum=sum+i;
i++;
}初值终值修改通过计数控制循环 nullwhile (P1&0x10==0)
{
}结束循环的特殊值根据用户输入的一个特殊值来结束循环 空循环
等待参见教材《单片机的C51应用程序设计》第 88 页 null
while ((P1&0x10)>0&&y++<=5)
{
a=1;
b=45;
x=P1;
}结束循环的特殊值计数终值参见教材《单片机的C51应用程序设计》第 88 页 null(1) 循环次数的控制要正确。 (2) 循环体包含一个以上的语句时,一定要用花括号括起来,否则,可能与程序要求不符。 (3)在循环体内要有使循环趋向于结束的语句,否则,可能引起无限循环。 (4) 循环表达式可以是真,通过在循环体中加if语句对循环进行控制。参见教材《单片机的C51应用程序设计》第 89 页 举例分析 举例分析 2、do while语句 2、do while语句
do
{ 语句;
} while (表达式);参见教材《单片机的C51应用程序设计》第 89 页 null int sum=0,i=0;
do
{
sum+=i;
i++;
} while (i<=10);
初值终值修改通过计数控制循环 参见教材《单片机的C51应用程序设计》第 89 页 null do
{
a=1;
b=45;
x=P1;
} while (x>0&&y++==5);
参见教材《单片机的C51应用程序设计》第 90 页 null
(1)为了避免编译系统把do while 的while 当做while语句的开始,do while循环体中的语句即使只有一句,也需要用分程序结构(用花括号括起)。 (2) 由于do while语句是先做循环体,再判断表达式,所以有些程序不能用do while 语句编写。 3、for 语句3、for 语句for( 表达式1 ; 表达式2 ; 表达式3 )
{
语句;
} for 循环的一般语法:1、计算表达式1的值,通常为循环变量赋初值;
2、计算表达式2的值,即判断循环条件是否为真,若值为真则执行循环体一次, 否则跳出循环;
3、计算表达式3的值,这里通常写更新循环变量的赋值表达式,然后转回第2步重复执行;工作原理1234参见教材《单片机的C51应用程序设计》第 90 页 null
null int i, sum;
sum=0;
for(i=0;i<=10;i++)
sum+=i;初值终值修改通过计数控制循环 参见教材《单片机的C51应用程序设计》第 90 页 null(1) for语句写起来很灵活,表达式1,表达式2,表达式3都可以省略,但是即使是三个表达式都省略了,二个“;”也不可省略。 (2)在表达式1和表达式3中可以使用逗号运算符把执行语句并列在一起,并且循环体可以为空。 null省略三个表达式:即不为循环变量赋初值,不设置循环条件,不修改循环变量的值,无终止地执行循环体。称为死循环,或无限循环。
有时会同时省略循环体,用作等待中断。for ( ; ; )
{ }参见教材《单片机的C51应用程序设计》第 91 页 等效while (1)
{ }for ( ; ; );while (1);null省略表达式1:相当于省去了为循环变量赋初值,此时应在for语句之前给循环变量赋初值。 int i=0,sum=0;
for ( ; i<=100;i++) sum=sum+i;参见教材《单片机的C51应用程序设计》第 91 页 null省略表达式2:即不判断循环条件,也就是认为表达式2始终为真。
可在循环体内设法结束循环。 int i,sum=0;
for ( i=1; ;i++)
sum=sum+i;参见教材《单片机的C51应用程序设计》第 92 页 int i,sum=0;
i=1;
while(1)
{
sum=sum+i;
i++;
}等效null int i,sum;
for (i=0,sum=0; i<=100; )
{
sum=sum+i;
i++;
}省略表达式3:即省去修改循环变量的值,但此时应在循环体内修改循环变量的值,设法结束循环。 null省略表达式1、3:即不为循环变量赋初值,不修改循环变量的值。 int i=0,sum=0;
for ( ; i<=100; )
{
sum=sum+i;
i++;
} int i=0,sum=0;
while(i<=100)
{
sum=sum+i;
i++;
}参见教材《单片机的C51应用程序设计》第 92 页 等效null没有循环体:循环过程中需要进行判断循环条件是否成立、修改循环变量,但不需要做任何其他操作。
由于程序执行需要时间,可用作延时。
一次空循环的执行时间约为2个机器周期。 int t;
int sum=2000;
for ( t=0; t<=sum; t++);参见教材《单片机的C51应用程序设计》第 92 页 4、多重循环4、多重循环 嵌套 for循环的语法for(表达式11;表达式12;表达式13)
{
for(表达式21;表达式22;表达式23)
语句2;
语句1;
} 循环的嵌套:在一个循环体中包含了另一个循环体。举例分析 举例分析 能否改用整型数据实现?第15次 作业第15次 作业 教材《单片机的C51应用程序设计》P93
9、用3种循环方式分别编写程序,计算整数1~100的平方。任务6 控制信号灯任务6 控制信号灯1、用一个开关,控制8个LED按一定频率闪烁。
示例电路:
(1)开关接P1.0引脚。
开关闭合时输入高电平。
开关断开时输入低电平。
(2)LED接P2口。
引脚输出高电平LED亮。
引脚输出低电平LED灭。示例程序示例程序null(1)修改LED连接端口,如:改为P3口。
(2)修改开关输入引脚,如:改为P1.7引脚。
(3)修改开关连接方式,如:去掉电阻,接电源改为接地。
(4)修改闪烁频率,如:减慢闪烁频率。
(5)修改闪烁方式,如:高4位亮时低4位灭;高4位灭时低四位亮。
(6)改变开关的控制效果,如:开关闭合时高4位闪烁,开关断开时低4位闪烁。null2、用多个按键,控制8个LED实现多种点亮方式。
(1)用if语句控制LED的点亮方式。
按下S1时,高4位LED点亮。
按下S2时,低4位LED点亮。
(2)用switch语句控制LED的点亮方式。
按下K1时,只有LED1、LED5点亮。
按下K2时,只有LED2、LED6点亮。
按下K3时,只有LED3、LED7点亮。
按下K4时,只有LED4、LED8点亮。
有开关同时按下时,所有LED都熄灭。实验五
实验科目:单片机应用及C51编程
实验名称:控制信号灯实验五
实验科目:单片机应用及C51编程
实验名称:控制信号灯一、实验目的 一、实验目的 1、学会用的C51语言设计程序。
2、学习使用分支、循环语句。
3、学会用单片机控制LED的点亮方式。二、实验内容二、实验内容1、编程实现开关KEY(P1.7)对8个LED 的控制。
闭合时,LED闪烁(高4位亮时低4位灭;高4位灭时低四位亮);断开时,LED全部点亮。
2、编程实现按键S1(P1.0)、S2(P1.1)对8个LED 的工作方式控制。
按下S1时,高4位LED点亮;
按下S2时,低4位LED点亮。
3、编程实现按键K1(P2.0)、K2(P2.1)、K3(P2.2)、K3(P2.3)、对LED 的工作方式控制。
按下K1时,只有LED1、LED5点亮;
按下K2时,只有LED2、LED6点亮;
按下K3时,只有LED3、LED7点亮;
按下K4时,只有LED4、LED8点亮。三、仪器设备三、仪器设备计算机
Keil uVision3 软件
Proteus软件
四、实验步骤四、实验步骤1、设计、绘制电路原理图。
2、编写源程序。
3、编译、生成.hex文件。
4、加载目标程序文件。
5、调试运行。文件要求文件要求1、在E盘建立一个文件夹(以自己的学号姓名命名),用于保存所有与实验有关的文件。
2、建立一个新设计文件(以姓名拼音命名)。
3、建立一个新工程(以姓名拼音命名)。
4、新建几个C51程序文件(以姓名拼音序号命名),以示每一步的完成情况。但注意后一步的程序编写是在前一步的基础上进行的,最后生成的.hex文件对应的是功能最全的那个C51程序。
本文档为【控制信号灯】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。