第9章单片机C51语言程序设计基础_第1页
第9章单片机C51语言程序设计基础_第2页
第9章单片机C51语言程序设计基础_第3页
第9章单片机C51语言程序设计基础_第4页
第9章单片机C51语言程序设计基础_第5页
已阅读5页,还剩145页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、“十二五”职业教育国家规划教材单片机原理及接口技术(第2版)9.1 C51语言的特点及其程序结构9.2 C51数据类型、常量和变量的定义9.3 C51的运算符、表达式及其语法规则9.4 C51语言的程序流程控制9.5 C51函数第第章章C51程序设计基础 本章内容本章内容Single Chip Microcomputer第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 3学习目标: 了解C51语言在单片机开发中程序的结构特点 掌握C51语言在单片机开发中程序的编制规则 掌握C51程序设计的基本方法及特点第9章 单片机C51语言程序设计基础单片机原理及接口

2、技术(第二版) 10/21/2013 4学习重点: C51语言程序设计的基本方法 C51程序设计的特点 C51语言在单片机应用系统中设计实例的分析和讨论第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 5C语言是一种通用的计算机程序设计语言,在国际上十分流行,它既可以用来编写计算机的系统程序,也可以用来编写一般的应用程序。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 6C语言的特点可以归纳为:语言简洁、紧凑,使用方便、灵活;运算符丰富(有34种运算符),语法限制不严格,程序设计自由度大;编写的程序可移植性好;可

3、直接操作计算机的硬件;可进行结构化程序设计;生成目标代码质量高。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 7基于这些特点,使得C语言在单片机开发领域成为目前较为流行的一种程序设计语言。针对8051单片机开发的C语言,我们通常称其为C51语言。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 89.1 C51语言的特点及其程序结构9.1.1 C51语言的特点C51语言根据单片机存储结构及内部资源定义了相应的C语言中的数据类型和变量,程序结构与一般C语言没有什么差别。一个C51程序大体上是一个函数定义的集合,在

4、这个集合中有且仅有一个名为main()的主函数。主函数是程序的入口,只有当主函数中的所有语句依次执行完毕,则程序执行结束。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 9在C51中,函数定义由类型、函数名、参数表和函数体四部分组合而成。函数名是一个标识符,标识符是大小写可区别的,最长为255个字符。参数表是用圆括号括起来的若干参数,荐与项之间用逗号隔开。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 10函数体是用大括号括起来的若干C语句,语句语句之间用分号隔开,最后一个语句一般是return(在主函数中可以

5、省略)。每一个函数都返回值,该值由return语句中的表达式指定(省略时为零)。函数的类型就是返回值的类型,函数类型(除整型外)均需在函数名前加以指定。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 11以AT89C51单片机最小系统的P1.0口控制一个LED发光二极管的亮和灭为例,我们介绍一下C51程序的一般格式。图9-1为其控制电路图。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 12图9-1 AT89C51控制一个LED的亮灭第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21

6、/2013 13#include #define uchar unsigned char#define uint unsigned intsbit P10=P10;void main()unsigned int n;dodelayms(500);P10=0;delayms(500);P10=1;while(1);void delayms(uint n) uchar i,j; for(i=n;i0;i- ) for(j=110;j0;j-) ; 第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 14通过上面的实例可以得到如下结论:1.C51语言程序是由函数

7、构成;2.函数的组成部分。3.C51程序的书写格式较自由;4.每个语句和数据定义的结束符号;5. 输入/输出语句的函数化;6.关于程序中的注释的形式和作用;7.程序的执行过程。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 159.1.2 C51函数的一般格式C51函数的一般格式如下:函数类型 函数名(函数形式参数表) /函数说明部分 数据说明部分 ; /函数体的部分 执 行 语 句 部 分;其中加时,表示其中的内容可以省略。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 16一个函数在程序中可以以三种不同形态

8、出现。函数定义、函数调用和函数说明。函数定义相当于汇编中的一般子程序。函数调用相当于汇编中调用于程序的CALL语句,在C51语言中,更普遍地规定函数调用可出现在表达式中。函数定义和函数调用不分先后,但若调用在定义之前,那么在调用前必须先进行函数说明。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 17C51中函数分为两大类,一类是库函数,一类是用户定义的函数。库函数是C51在库文件中已定义的函数,其函数说明在相关的头文件中。对于这类函数,用户在编程时只要用include预处理指令将头文件包含在用户文件中,直接调用即可。用户函数是用户自己定义的一类函数。

9、从某种意义上讲,C编程实际上是对一系列用户函数的定义。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 189.2 C51数据类型、常量和变量的定义9.2.1 C51数据类型图9-2 C51语言数据类型及其分类关系图第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 19表9-1 C51所支持的数据类型第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 209.2.2 常量的定义常量就是在程序运行过程中不能改变值的量,常量的数据类型只有整型、浮点型、字符型、字符串型和位标量。第9

10、章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 21常量可用在不必改变值的场合,如固定的数据表,字库等。常量的定义方式有几种,下面加以说明。 #define False 0 x0 /使用预定义可以定义符号常量 #define True 0 x1 /定义常量False为0,Ture为1 unsigned int code a=100; /用code把a 定义在程序存储器中并且赋值 const unsigned int c=100; /用const 定义c为无符号int 常量并赋值以上代码常量的值都保存在程序存储器,而程序存储器在运行中是不允许被修改的,所以如

11、果在这两句后面用了类似a=110,a+这样的赋值语句,编译时将会出错。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 229.2.3 变量的定义变量是一种在程序执行过程中其值能不断变化的量。要在程序中使用变量必须先用标识符作为变量名,并指出所用的数据类型和存储模式,这样编译系统才能为变量分配相应的存储空间。定义一个变量的格式如下:存储种类 数据类型 存储器类型 变量名表;第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 23在定义格式中除了数据类型和变量名表是必要的,其他的都是可选项。存储种类有四种:自动(Aut

12、o);外部(Externad);静态(static);寄存器(Register)。默认为自动(Auto)。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 24存储器类型的说明就是指定该变量在C51硬件系统中所使用的存储区域,并在编译时准确定位。表9-2列出了Keil uVision 3所能识别的存储器类型。注意:在AT89C51芯片中RAM只有低128B,位于80H到FFH的高128B则在52系列芯片中才有用,并和特殊功能寄存器地址重叠。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 25表9-2 C51的存储

13、器类型第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 26当使用DATA、BDATA定义常量和变量时,C51编译器会将其定位在内部数据存储区中(内部RAM),这个存储区根据51系列单片机的型号不同,长度分别为128B、256B等。数据存放在此区域,数据处理速度较快,若数据存放在外部存储器中,在其使用前必须将其移到内部数据存储区中,内部数据存储区是存放临时性传递变量或使用频率较高的变量的区域。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 27IDATA存储类型可以间接寻址内部数据存储器(可以超过128B)。PD

14、ATA存储类型属于XDATA类型,其一个字节地址(高8位)被保存在P2口中,用于I/O操作。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 28当使用XDATA存储类型定义常量、变量时,C5l编译器会将其定位在外部数据存储空间(外部RAH)中,该空间位于片外附加的RAM芯片中,其最大可寻址范围为64KB。在使用外部数据区的信息时,必须用指令将需要的外部数据区的数据转移到内部数据区中,当数据处理完成后,将结果又要写到外部数据存储区中。片外数据存储区主要用于存放不常使用的变量,或收集需要等待处理的数据。第9章 单片机C51语言程序设计基础单片机原理及接口技

15、术(第二版) 10/21/2013 29当使用CODE存储类型定义数据时,C51编译器会将其定义在程序空间(ROM或EPROM),这里存放着指令代码和其他一些不变的信息。调试完成的程序代码被写入MCS-51系列单片机的内部ROM、EPROM或外部的EPROM中。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 30访问内部数据存储区(DATA、BDATA、IDATA)比访问外部数据存储嚣(XDATA、PDATA)相对要快一些,因此可将经常使用的变量置于内部数据存储器中,而将数据量较大或不常使用的数据置于外部数据存储器中。第9章 单片机C51语言程序设计基

16、础单片机原理及接口技术(第二版) 10/21/2013 319.2.4 C51定义SFR字节和位单元一、对特殊功能寄存器SFR的定义sfr和sfr16可以直接对51单片机的特殊功能寄存器SFR进行定义,定义方法如下:sfr 特殊功能寄存器名=特殊功能寄存器地址常数;sfr16 特殊功能寄存器名=特殊功能寄存器地址常数;第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 32例 如:sfr P1=0 x90; /定义 P1端口,其对应于内部存储器的地址为90Hsfr16 T2=0 xCC; /定义8052单片机定时器T2,其对应地址为T2L=CCH,T2H=

17、CDH用sfr16定义16位特殊功能寄存器时,等号后面是它的低位地址,高位地址一定要位于物理低位地址之上。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 33二、对位地址单元的定义sbit定义可位寻址对象。如访问特殊功能寄存器中的某位。如要访问P1口中的第2个引脚P1.1。定义方法有三种:第一种方法:sbit 位变量名=位地址;例如:sbit P1.1=0 x91;第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 34这种方法是把位的绝对地址赋给位变量。sbit的位地址必须位于80H-FFH之间。第二种方法:sb

18、it 位变量名=特殊功能奇存器名位位置;例如:sfr P1=0 x90;sbit P11=0 x901;当可寻址位位于特殊功能寄存器中时可采用这种方法。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 35第三种方法:sbit 位变量名=字节地址位位置;例如:sbit P11=0 x901;第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 36在C51存储器类型中提供有一个BDATA的存储器类型,这个是指可位寻址的数据存储器,位于单片机的可位寻址区中,可以将要求可位寻址的数据定义为BDATA,例如:unsigned

19、 char bdata ib; /在可位寻址区定义unsignad char类型的变量ib第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 379.3 C51的运算符、表达式及其语法规则9.3.1 C51算术运算符及其表达式一、C51最基本的算术运算符+:加法运算符,或正值符号。-:减法运算符,或负值符号。*:乘法运算符。/:除法运算符。%:模(求余)运算符,例如:9%5结果是9除以5所得的余数4。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 38二、算术表达式算术表达式是用算术运算符和括号将运算对象连接起来的

20、式子,其中的运算对象包括常量、变量、函数、数组、结构等等。例如:a+b;a+b*c/d;a*(b+c)-(d-e)/f;a+b/c-2.5+b;第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 39三、算术运算符的优先级和结合性优先级:指当运算对象两侧都有运算符时执行运算的先后次序。按运算符优先级别的高低顺序执行运算。结合性:指一个运算对象两侧的运算符优先级别相同时的运算顺序。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 40算术运算符优先级规定为:先乘除取模,后加减,括号优先。即在算术运算符中,乘、除、取模运

21、算符的优先级相同,并高于加减运算符。在表达式中若出现括号,则括号中的内容优先级最高。例如:a+b*c;这个表达式中除号的优先级高于加号,故先运算b/c所得的结果再与a相加。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 41再 如:(a+b)*(c-d)-e;在这个表达式中括号的优先级最高,*运算符次之,减号优先级最低,故先运算(a+b)和(c-d),然后再将两者的结果相乘,最后再与e相减。算术运算符结合性规定为自左至右方向,又称为“左结合性”。即当一个运算对象两侧的算术运算符优先级别相同时,运算对象先与左面的运算符结合。第9章 单片机C51语言程序设

22、计基础单片机原理及接口技术(第二版) 10/21/2013 42例 如:a+b-c;b两边是“+”和“-”,运算符优先级别相同,故按左结合性先执行a+b再与c相减。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 43四、强制类型转换运算符()如果一个运算符两侧的数据类型不同,则须通过数据类型转换将数据转换成同种类型。转换的方式有两种。一种是自动(默认)类型转换,即在程序编译时由C51编译器自动进行数据类型转换。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 44图9-3 自动类型转换规则当运算对象的数据类型不相

23、同时,先将较低的数据类型转换成较高的数据类型,运算的结果为较高的数据类型。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 45另一种数据类型的转换方式为强制类型转换,需要使用强制类型转换运算符,其形式如下所示:(类型名) (表达式);(double) a; /将a的值强制转换成double类型(int)(x+y); /将x+y的值强制转换成int 类型(float)(5%3); /将模运算5%3的值强制转换成float类型第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 469.3.2 C51关系运算符、表达式及

24、优先级一、C51提供6种关系运算符 :大于 优先级相同(高)= :大于或等于= :测试等于 优先级相同(低)!= :测试不等于第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 47二、关系运算符的优先级前四种关系运算符(,=)优先级相同,后两种也相同;前四种的优先级高于后两者优先级。关系运算符的优先级低于算术运算符。关系运算符的优先级高于赋值运算符。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 48图9-4 各种运算符优先级规则图第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2

25、013 49【例9.1】第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 50关系运算符的结合性为左结合。关系表达式是用关系运算符将两个表达式(算术表达式、关系表达式、逻辑表达式及字符表达式等)连接起来的式子。表达式的结果:由于关系运算符总是二目运算符,它作用在运算对象上产生的结果为一个逻辑值(即真或假)。C语言中以“1”代表真,以“0”代表假。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 51【例9.2】若a=4,b=3,c=1,则:ab 的值为“真”,则表达式的值为1。b+cb)=c 的值为“真”,表达式的

26、值为1。d=ab,d 的值为1。f=abc 由于关系运算符的结合性为左结合,故ab的值为1。而1c值为O,故f的值为0。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 529.3.3 C51逻辑运算符、表达式及优先级一、C51提供三种逻辑运算符&:逻辑与(AND)|:逻辑或( OR)! :逻辑非(NOT)&和|是双目运算符,要求有两个运算对象;而!是单目运算符,只要求一个运算对象。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 53C51逻辑运算符与算术运算符、关系运算符、赋值运算符之间的优先级

27、如图9-5所示。图9-5 运算符优先级比较第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 54二、逻辑表达式逻辑表达式是用逻辑运算符将关系表达式或逻辑量连接起来的式子。逻辑表达式的值应该是一个逻辑量“真”或“假”。逻辑表达式的结合性为自左向右。与关系表达式的值类似,以“1”代表真,以“0”代表假。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 55【例9.3】若a=4,b=5,则因为a =4为真,所以!a为假(0);因为a、b为真,则a|b也为真(1),a&b为真(1)。再看表达式!a&b,其值

28、为假(0)。因为!优先级高于&,故先执行!a,值为假(0),而0&b为假(0)。故结果为假(0)。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 56通过上例可以看出,系统的逻辑运算结果不是0就是1,不可能是其他值。这与后面讲到的按位运算是截然不同的,应该注意区别逻辑运算与按位运算这两个不同的概念。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 57逻辑表达式中不是所有逻辑运算符都被执行,只是在必须执行下一个逻辑运算符后才能求出表达式的值时,才执行该运算符。由于逻辑运算符的结合性是自左向右,所以

29、对于&(逻辑与)运算符来说,只有左边的值不为假(0)才继续执行右边的运算,对于|(逻辑或)运算符来说只有左边的值为假才继续进行右边的运算。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 58【例9.4】若a=1,b=2,c=3,d=4;m,n原值为1,则求表达式(m=ab)&(n=cd)的值时,应按以下方法分析求值。由于ab为假(0),即m=0,故无须再执行右边的&(n=cd)运算,即可确定表达式的值为假(0);而表达式(m=ab)|(n=cd)就不一样,由于ab为假(0),即m=0,故需继续向右执行,又由于cd为假(0),即n

30、=0,两者相或(|)结果为0,故表达式的值为0。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 599.3.4 C51位操作及其表达式一、C51提供了如下位操作运算符& :按 位 与。| :按 位 或。 :按位异或。 :按位取反。:按位右移。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 60二、“按位与”运算符&运算规则:参加运算的两个运算对象,若两者相应的位都为1,则该位结果值为1,否则为0,即:0 & 0 = 0 0 & 1 = 0 1 & 0 = 0 1 &

31、; 1 = 1第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 61【例9.5】若a=54h=01010100B,b=3BH=00111011B,则表达式c=a&b值为10H,即:第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 62三、“按位或”运算符|运算规则:参加运算的两个运算对象,若两者相应的位中只要有个为1,则该位结果为1。即:0 | 0 = 0 0 | 1 = 1 1 | 0 = 1 1 | 1 = 1第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 63

32、【例9.6】若a=30H=00110000B,b=0FH=00001111B。则表达式c=a|b值为3FH,即:第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 64四、“异或”运算符 运算规则:参加运算的两个运算对象,若两者相应的位值相同,则结果为0;若两者相应的位相异,结果为1。0 0 = 0 0 1 = 1 1 0 = 1 1 1 = 0第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 65【例9.7】若a=A5H=10100101B,b=37H=00110111B。则表达式c=ab值为92H。即:第9章 单

33、片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 66五、“位取反”运算符是一个单目运算符,用来对一个二进制数按位进行取反,即0变1,1变0。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 67【例9.8】若a=0F0H=11110000B,则表达式a =a值为0FH,即:第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 68运算符的优先级比别的算术运算符、关系运算符和其他运算符都高。例如,a&b的运算顺序为先作a的运算,再作&运算。第9章 单片机C51语言程序设计基

34、础单片机原理及接口技术(第二版) 10/21/2013 69六、“位左移”和“位右移”运算符()位左移、位右移运算符用来将一个数各二进制位的全部左移或右移若干位,移位后,空白位补0,而溢出的位舍弃。移位运算并不能改变原变量本身,除非我们将移的结果赋给另一变量。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 70【例9.9】a=6AH=01101010B,则表达式a=a2将a值右移两位,结果为1AH。即:第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 72【例9.10】若a=11000011B=0C3H,将a值右

35、循环位移两位。其实现过程分析如下:a右循环n位,即将a中原来左面(8-n)位右移n位,而将原来右端的n位移到最左面n位。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 739.3.5 自增减运算符、复合运算符及其表达式一、自增减运算符自增减运算符的作用是使变量值自动加1或减1。例如:+i,-i:在使用之前,先使i值加(减)1。i+,i-:在使用之后,再使i值加(减)1。粗略地看,+i和i+的作用都相当于i=i+1,但不同之处在于+i先执行i=i+1,再使用i的值,而i+则是先使用i的值,再执i=i+1。第9章 单片机C51语言程序设计基础单片机原理及接

36、口技术(第二版) 10/21/2013 74【例9.12】若i值原来为5,则执行j=+i;语句后,j的值为6,i的值也为6。i值原来为5,执行j=i+;语句后,j的值为5,i的值为6。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 75【 例 9 . 1 3 】 若 i 原 值 为 3 , 则 表 达 式k=(+i)+(+i)+(+i)的值为18。这是因为,+i最先执行,先对表达式进行扫描,对i进行三次自加(+1)则此时i=6,然后执行k= 6+6+6=18,故k值为18。而表达式k=(i+)+(i+)+(i+)其结果是:k值为9,而i值为6。因为先对

37、i进行三次相加,再执行三次i的自加。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 76二、复合运算符及其表达式凡是二目运算符,都可以与赋值运算符“=”一起组成复合赋值运算符。C51提供了10种复合赋值运算符。即:+=,-=,*=,/=,%=,=,&=,=,|=采用这种复合赋值运算的目的,是为了简化程序,提高C程序编译效率。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 77a+=c 相当于a=a+c a %=b 相当于a=a %ba-=d 相当于a=a-d a=2 相当于a=a=4 相当于a=a4a/

38、=b 相当于a=a/bPORTA &=0 xf7相当于PORTA=PORTA&Oxf7,作用是使用&位运算,将PORTA.3位置0。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 78【例9.15】使用P1口控制八路LED流水灯。电路图如9-6所示。这里AT89C51的P1引脚为低电平才会点亮LED灯,P1口的八个引脚刚好对应P1口特殊寄存器的八个二进制位,如向P1口送数据OxFE,转换成二进制就是1111111OB,最低位D0为0,这里P1.0引脚输出低电平,LED1被点亮,以此类推,根据自己想要的效果可以给端口送对应的值了。

39、第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 79要求八个LED灯(LED1-LED8)依次点亮,然后又从LED8-LED1依次点亮,如此往返,可按如下方法编写程序。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 80图9-6 八路LED流水灯控制电路图第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 81#include #define uint unsigned int#define uchar unsigned charvoid Delayms(uint coun

40、t) /基于ms的延时函数uint i,j;for(i=0;icount;i+)for(j=0;j120;j+);第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 82main() uchar LEDIndex=0; bit LEDDirection=1;/点亮LED灯的方向标志 while(1) if(LEDDirection) P1=(Ox01LEDIndex);/方向标志为0,从LED8-LED0点亮 if(LEDIndex=7) LEDDirection=!LEDDirection; LEDIndex=(LEDIndex+1)%8; Delaym

41、s(100); 第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 839.4 C51语言的程序流程控制9.4.1 条件语句条件语句是指由关键字if构成,用于需要根据某些条件来控制执行走向的程序。条件语句又被称为if条件语句或者是“分支语句”。条件语句是很重用的程序控制语句,在C51的程序设计中经常会用到。C51语言提供了多种形式的if条件语句。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 84一、单分支条件语句单分支条件语句只有一个语句分支或者语句块分支。if(条件表达式) 分支语句;当条件表达式的值为真,就执

42、行分支语句;当条件表达式的值为假,跳过分支语句。if条件语句执行完后,执行后续程序代码。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 85【例9.16】#include /头 文 件void main() /主 函 数 int a,b; /变量声明 a=10; /初始化变量 b=10; if(a=b) /单分支if条件语句 a+; /分支语句 b+; printf(“a=%d,b=%dn”,a); /输出结果程序可在Keil uVision3环境下运行,运行的结果如下所示:a=11,b=11第9章 单片机C51语言程序设计基础单片机原理及接口技术(第

43、二版) 10/21/2013 86二、双分支条件语句双分支条件语句包含两个语句分支,语句由关键字if和else构成,其一般形式如下:if(条件表达式) 分支语句1;else 分支语句2;第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 87【例9.17】#include /包含头文件void main() /主 函 数 int a,b; /变量声明 a=10; /初始化变量 b=20; if(a=b) /双分支if条件语句 a+; /分支语句1 b+; else a-; /分支语句2 b-; printf(“a=%d,b=%dn”,a); /输出结果程序

44、可在Keil uVision3环境运行,其运行的结果如下所示:a=9,b=19第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 88三、多分支条件语句if(条件表达式1) 分支语句1;else if(条件表达式2) 分支语句2; else if(条件表达式3) 分支语句3; else if(条件表达式n) 分支语句n; else 分支语句n+1; 第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 89多分支条件语句在执行时,从上到下逐个对条件表达式进行判断,一旦某个条件表达式的值为真,就执行相应的分支语句,其余分支

45、语句不再执行;如果没有一个判断条件为真,则执行最后一个else分支,即分支语句n+1。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 90【例9.18】#include /包含头文件void main() /主 函 数 int score; /声明变量 char grade; score=79; /初始化成绩 if(score=90) /多分支条件语句,判断成绩的等级 grade=A; else if(score=80) grade=B; else if(score=70) grade=C; else if(score=60) grade=D; els

46、e grade=E; printf(“score=%d,grade=%cn”,score,grade); /输出结果程序可在Keil uVision3环境运行,其运行的结果如下所示:score=79,grade=C第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 91在C51程序设计中,使用多分支条件语句时,需要注意:1.在整个多分支条件语句中,只执行其中的一条语句。2.如果分支语句只有一条语句,则可以省略“”,否则不可以省略“”。3.if和else配对使用,如果少了一个就会出现语法出错,else总是与最临近的if相配对。第9章 单片机C51语言程序设计

47、基础单片机原理及接口技术(第二版) 10/21/2013 92if(条件表达式)if(条件表达式)语句1;else语句2;elseif(条件表达式)语句3;else语句4;第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 93四、switch语句switch(表达式) case 常量表达式1: 分支语句1; break;case 常量表达式2: 分支语句2; break;case 常量表达式3: 分支语句3; break; case 常量表达式n: 分支语句n; break;default: 分支语句n+1; break;第9章 单片机C51语言程序设计

48、基础单片机原理及接口技术(第二版) 10/21/2013 94开关语句在执行时,首先计算switch后的表达式的值,然后与case后面的各个分支常量表达式相比较,如果相等则执行对应的分支语句,再执行break语句跳出switch语句。如分支常量的值没有一个和条件相等,就执行关键字default后面的语句。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 95【例9.19】#include /包含头文件void main() /主 函 数 char ch; /声明字符型变量ch ch=getchar(); /从键盘接受字符赋值给ch switch(ch)

49、/开关语句 case A:printf(“按键A按下”);break; case B:printf(“按键B按下”);break; default:printf(“非按键A和B按下”);break; 该程序可以在Keil uVision3编译环境中直接执行,如果键盘输入“A”,其运行的结果如下所示:按键A按下第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 96使用switch开关语句时,需要注意以下几点:1.switch中的变量可以是整型变量,也可以是字符型变量。这样便于进行值的比较。2.每个分支后break语句必须有,否则将不能跨出开关语句,而将继续

50、执行其他分支。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 973.case和default后面的分支语句可以是多个语句构成的语句体,但是不需要使用“”括起来。 4.当要求没有符合的条件时,可以不执行任何语句,即可以省略default语句,而直接跳出该开关语句。5.开关语句可实现多分支if条件语句相同的功能,但switch开关语句结构更加清晰。 第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 989.4.2 循环语句循环语句用于需要进行反复多次执行若干语句的操作。C51语言中包括3种循环语句:while语句、

51、do-while语句和for语句。虽然3个语句都是进行循环操作,但作用和用法不尽相同。在程序中使用循环语句时,要注意恰当地选择合适的循环语句。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 99一、while语句while循环语句的一般形式为: while(表达式) 语 句; while语句在执行时首先判断表达式值是否为值,如果表达式的值为真,便执行一次语句,然后再次判断表达式的值,直到表达式的值被判定为假时,才结束循环。while语句结束后,程序便可以接着执行循环体外的后续语句。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10

52、/21/2013 100【例9.20】#include /包含头文件void main() /主 函 数 int i,s; /声明变量 i=100;s=0; /初 始 化 while(i0) /while循环,求和 s=s+i; /s累加 i=i-1; /循环次数减1 printf(“1+2+100=%dn”,s); /输出求和结果程序可在Keil uVision3环境运行,其运行的结果如下:1+2+100=5050第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 101使用while循环语句时,要注意以下几点:1.while语句的特点是先判断表达式即条

53、件,后执行语句。这样可能不执行任何语句就退出。2.如果循环体内的语句只有一个,则可以省略。如果由多行构成,即语句是语句体时,必须用括起来。 3.while语句“”后面无分号。4.while语句循环体内允许空语句,此时while语句结尾需要添加分号。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 102while(ch=getchar=()!=X0D);本例等待键盘输入字符,直到键入回车时,循环结束。循环语句只有表达式,作为判定条件,而没有执行语句。5.while语句循环允许多层循环嵌套使用。6.使用while循环语句时,要将表达式或执行语句进行适当的修

54、改,使其可以跳出循环,而不至于造成死循环。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 103二、dowhile语句do-while语句的一般形式为:do 语句;while(表达式); 第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 104do-while执行时,首先执行一次do后面的语句,然后判断while后的表达式值是否为真,如果表达式的值为真,返回再次执行do后面的语句,直到表达式值为假时,才结束循环。do-while循环语句结束后,程序才可以继续执行循环体外的后续语句。第9章 单片机C51语言程序设计

55、基础单片机原理及接口技术(第二版) 10/21/2013 105【例9.21】 #include /包含头文件void main() /主 函 数 int i,s; /声明变量 i=100;s=0; /初 始 化 do /do-while循环,求和 s=s+i; /s累 加 i=i-1; /循环次数减1 while(i0); /表 达 式 printf(“1+2+100=%dn”,s); /输出求和结果程序可在Keil uVision3环境运行,其运行的结果如下:1+2+100=5050第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 106使用do-w

56、hile循环语句时,要注意以下几点:1.do-while语句特点是先执行一次语句,然后判断条件。因此,do-while语句至少执行一次do后面的语句。2.如果do-while循环体内的语句只有一条,可以省略。如果do-while循环体内由多个语句构成语句体时,必须用括起来,表示成复合语句的形式。 第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 1073.do-while语句中的“”后面无分号。4.使用do-while语句时,while(表达式)后的;不能遗漏。5.使用do-while语句循环,需要注意避免构成死循环。 第9章 单片机C51语言程序设计基

57、础单片机原理及接口技术(第二版) 10/21/2013 108三、for语句for语句的一般形式为: for(表达式1;表达式2;表达式3) 语 句; 表达式1一般为赋值语句,给循环变量进行初始化赋值;表达式2是一个关系逻辑表达式,作为判断循环条件的真假;表达式3定义循环变量变化方式。当表达式1初始化循环变量后,由表达式2和表达式3确定循环次数。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 109for语句在执行时,首先应执行表达式1,再判断表达式2是否为真,如果为真,则执行一次循环体内部的语句和表达式3,否则将结束循环。for循环语句结束后,程序才

58、可以继续执行循环体外的后续语句。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 110【例9.22】#include /包含头文件void main() /主 函 数 int i,s; /声 明 变量 i=100;s=0; /初 始 化 for(i=0;i=100;i+) /for循 环 s=s+i; /表达式语句 printf(“1+2+100=%dn”,s); /输出和结果程序可在Keil uVision3环境运行,其运行的结果如下所示:1+2+100=5050第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013

59、 111使用for循环语句时,需要注意以下几点:1.for语句3个表达式都是可选择项,可以任意缺省,但不能省略。例如for( ; ; )表示一个无限循环。省略表达式1,即不对循环控制变量进行初始化赋值。省略表达式2,即不判断循环条件的真假。如果省略表达式3,即不对循环控制变量进行操作。2.如果for语句中省略表达式3,则可以在循环语句体内加入控制循环变量的语句,从而避免构成一个死循环。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 1123.for循环语句循环允许多层循环嵌套。4.for循环体中如果只有一条语句,则可省略“”。如循环体内的语句是多个语句

60、构成的语句体,则必须用括起来。5.for语句“”后面无分号。6.for循环体内允许空语句,for语句结尾需要添加分号。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 1139.4.3 程序跳转语句程序跳转语句主要用于控制程序执行的流程,跳转或转移程序的执行顺序。在C51语言中,主要包括三种跳转语句:goto语句、break语句和continue语句。第9章 单片机C51语言程序设计基础单片机原理及接口技术(第二版) 10/21/2013 114一、goto语句goto语句是一个无条件的转向语句,其一般形式如下: goto 语句标号;其中,语句标号为一个带冒号的有效标识符。在C51中执行到这个语句时,程序指针就会无条件地跳转到goto后面的标号所指向的程序段。第9章 单片机C51语言程序设计基础单片机原理及接口技术(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论