单片机C语言程序设计教学课件侯殿有2.4

上传人:公**** 文档编号:567308847 上传时间:2024-07-19 格式:PPT 页数:77 大小:421KB
返回 下载 相关 举报
单片机C语言程序设计教学课件侯殿有2.4_第1页
第1页 / 共77页
单片机C语言程序设计教学课件侯殿有2.4_第2页
第2页 / 共77页
单片机C语言程序设计教学课件侯殿有2.4_第3页
第3页 / 共77页
单片机C语言程序设计教学课件侯殿有2.4_第4页
第4页 / 共77页
单片机C语言程序设计教学课件侯殿有2.4_第5页
第5页 / 共77页
点击查看更多>>
资源描述

《单片机C语言程序设计教学课件侯殿有2.4》由会员分享,可在线阅读,更多相关《单片机C语言程序设计教学课件侯殿有2.4(77页珍藏版)》请在金锄头文库上搜索。

1、在线教务辅导网:在线教务辅导网: :/教材其余课件及动画素材请查阅在线教务辅导网教材其余课件及动画素材请查阅在线教务辅导网QQ:349134187 或者直接输入下面地址:或者直接输入下面地址:第四章第四章 C51根本语句根本语句n n用用C C语言编写语言编写MCS-51MCS-51单片机程序与用汇编语言编写单片机程序与用汇编语言编写MCS51MCS51单片机程序不一样,用汇编语言编写单片机程序不一样,用汇编语言编写MCS51MCS51单单片机程序必须要考虑其存储器结构,尤其必须考虑其片内片机程序必须要考虑其存储器结构,尤其必须考虑其片内数据存储器与特殊功能存放器的使用以及按实际地址处理数据存

2、储器与特殊功能存放器的使用以及按实际地址处理端口数据。用端口数据。用C C语言编写的语言编写的MCS51MCS51单片机应用程序,那单片机应用程序,那么不用像汇编语言那样须具体组织、分配存储器资源和处么不用像汇编语言那样须具体组织、分配存储器资源和处理端口数据,但用理端口数据,但用C C语言编程时,对数据类型与变量的定语言编程时,对数据类型与变量的定义,必须要与单片机的存储结构相关联,否那么编译器不义,必须要与单片机的存储结构相关联,否那么编译器不能正确地映射定位。所以我们把这种和能正确地映射定位。所以我们把这种和MCS-51MCS-51单片机硬单片机硬件有关联的件有关联的C C语言也叫语言也

3、叫C51C51语言,它和标准的语言,它和标准的C C语言有一语言有一些不同。些不同。n n用用C51C51语言编写单片机应用程序与标准的语言编写单片机应用程序与标准的C C语言程序也有语言程序也有相应的区别:相应的区别:C51C51语言编写单片机应用程序时,需根据单语言编写单片机应用程序时,需根据单片机存储结构及内部资源定义相应的数据类型和变量,而片机存储结构及内部资源定义相应的数据类型和变量,而标准的标准的C C语言程序不需要考虑这些问题;语言程序不需要考虑这些问题;C51C51包含的数据包含的数据类型、变量存储模式、输入输出处理、函数等方面与标准类型、变量存储模式、输入输出处理、函数等方面

4、与标准的的C C语言有一定的区别。其它的语法规那么、程序结构及语言有一定的区别。其它的语法规那么、程序结构及程序设计方法等与标准的程序设计方法等与标准的C C语言程序设计相同。语言程序设计相同。n n现在支持MCS-51系列单片机的C语言编译器有很多种,如American Automation、Avocet、BSO/TASKING、DUNFIELD SHAREWARE、KEIL/Franklin等。各种编译器的根本情况相同,但具体处理时有一定的区别,其中Keil C 以它的代码紧凑和使用方便等特点优于其它编译器,现在使用特别广泛。本书以Keil C编译器介绍MCS-51单片机C语言程序设计。4

5、.1.1 C语言的特点n n1. 1. 语言简洁、紧凑,使用方便、灵活。语言简洁、紧凑,使用方便、灵活。n n2. 2. 运算符丰富。运算符丰富。n n3 3数据结构丰富。具有现代化语言的各种数据数据结构丰富。具有现代化语言的各种数据结构。结构。n n4 4可进行结构化程序设计。可进行结构化程序设计。n n5 5可以直接对计算机硬件进行操作。可以直接对计算机硬件进行操作。n n6 6生成的目标代码质量高,程序执行效率高。生成的目标代码质量高,程序执行效率高。n n7 7可移植性好。可移植性好。4.1.2 C语言和C51的程序结构n n C C语言程序采用函数结构,每个语言程序采用函数结构,每个

6、C C语言程序由一语言程序由一个或多个函数组成,在这些函数中至少应包含一个或多个函数组成,在这些函数中至少应包含一个主函数个主函数main()main(),也可以包含一个,也可以包含一个main()main()函数和函数和假设干个其它的功能函数。不管假设干个其它的功能函数。不管main()main()函数放于函数放于何处,程序总是从何处,程序总是从main()main()函数开始执行,执行到函数开始执行,执行到mainmain() ()函数结束。在函数结束。在main()main()函数中调用其它函数,其函数中调用其它函数,其它函数也可以相互调用,但它函数也可以相互调用,但main()main

7、()函数只能调用函数只能调用其它的功能函数,而不能被其它的函数所调用。其它的功能函数,而不能被其它的函数所调用。功能函数可以是功能函数可以是C C语言编译器提供的库函数,也语言编译器提供的库函数,也可以是由用户定义的自定义函数。在编制可以是由用户定义的自定义函数。在编制C C程序程序时,程序的开始局部一般是预处理命令、函数说时,程序的开始局部一般是预处理命令、函数说明和变量定义等。明和变量定义等。 n nC C语言程序结构一般如下:语言程序结构一般如下:n n预处理命令 includen n函数定义 int fun1();n n float fun2();n n变量说明 int x,y;n n

8、 float z;n n主函数mainn n函数体fun1n nfun2n n其中,函数往往由其中,函数往往由“ “函数定义和函数定义和“ “函数体两个局部组函数体两个局部组成。函数定义局部包括有函数类型、函数名、形式参数说成。函数定义局部包括有函数类型、函数名、形式参数说明等,函数名后面必须跟一个圆括号,形式参数在明等,函数名后面必须跟一个圆括号,形式参数在内定义。函数体由一对花括号内定义。函数体由一对花括号“组成,在组成,在“的的内容就是函数体。如果一个函数内有多个花括号,那么最内容就是函数体。如果一个函数内有多个花括号,那么最外层的一对外层的一对“为函数体的内容。函数体内包含假设干为函数

9、体的内容。函数体内包含假设干语句,一般由两局部组成:声明语句和执行语句。声明语语句,一般由两局部组成:声明语句和执行语句。声明语句用于对函数中用到的变量进行定义。也可能对函数体中句用于对函数中用到的变量进行定义。也可能对函数体中调用的函数进行声明。执行语句由假设干语句组成,用来调用的函数进行声明。执行语句由假设干语句组成,用来完成一定功能。当然也有的函数体仅有一对完成一定功能。当然也有的函数体仅有一对“,其中,其中内部既没有声明语句,也没有执行语句。这种函数称为空内部既没有声明语句,也没有执行语句。这种函数称为空函数。函数。n nC C语言程序在书写时格式十分自由,一条语句可以写成一语言程序在

10、书写时格式十分自由,一条语句可以写成一行,也可以写成几行;还可以一行内写多条语句;但每条行,也可以写成几行;还可以一行内写多条语句;但每条语句后面必须以分号语句后面必须以分号“ “;作为结束符。;作为结束符。C C语言程序对大语言程序对大小写字母敏感,在程序中,同一个字母的大小写系统是作小写字母敏感,在程序中,同一个字母的大小写系统是作不同的处理。在程序中可以用不同的处理。在程序中可以用“/*/“/*/或或“/“/对对C C程序中的任何局部作注释,以增加程序的可读性。程序中的任何局部作注释,以增加程序的可读性。n nC C语言也是一种较好和应用很广的程序控制语言,语言也是一种较好和应用很广的程

11、序控制语言,如果我们说汇编语言是底层语言,那么如果我们说汇编语言是底层语言,那么C C语言就语言就是高级语言,它通用性比汇编语言要好,为了实是高级语言,它通用性比汇编语言要好,为了实现对底层设备的驱动,现对底层设备的驱动,C C语言也有一些端口驱动语言也有一些端口驱动函数,例如对屏幕输出的格式控制输出函数函数,例如对屏幕输出的格式控制输出函数printf(),printf(),键盘输入的键盘输入的scanf()scanf()函数等。此外还有一组函数等。此外还有一组在在dos.hdos.h中定义的直接对设备端口进行操作的函数:中定义的直接对设备端口进行操作的函数:int inport (int

12、portid),unsigned char inportb (int int inport (int portid),unsigned char inportb (int portid),void outport (int portid,int value),void portid),void outport (int portid,int value),void outportb (int portid,unsigned char value )outportb (int portid,unsigned char value ),C C语语言中的位操作使用户可以通过言中的位操作使用户可以通过

13、bitbit对设备进行控制。对设备进行控制。所有这些特点,使所有这些特点,使C C语言在嵌入式控制系统中得语言在嵌入式控制系统中得到广泛应用。到广泛应用。n nC51C51的语法吸收了的语法吸收了C C语言的全部特点,程序结构语言的全部特点,程序结构及程序设计方法都与标准的及程序设计方法都与标准的C C语言程序设计相同,语言程序设计相同,但但C51C51程序与标准的程序与标准的C C程序仅在以下几个方面不程序仅在以下几个方面不一样:一样:n n1 1C51C51中定义的库函数和标准中定义的库函数和标准C C语言定义的库函语言定义的库函数不同。标准的数不同。标准的C C语言定义的库函数是按通用微

14、语言定义的库函数是按通用微型计算机来定义的,而型计算机来定义的,而C51C51中的库函数是按中的库函数是按MCS-MCS-5151单片机相应情况来定义的;单片机相应情况来定义的;n n2 2C51C51中的数据类型与标准中的数据类型与标准C C的数据类型也有一的数据类型也有一定的区别,在定的区别,在C51C51中还增加了几种针对中还增加了几种针对MCS-51MCS-51单片机特有的数据类型;单片机特有的数据类型;n n3 3C51C51变量的存储模式与标准变量的存储模式与标准C C中变量的存储模中变量的存储模式不一样,式不一样,C51C51中变量的存储模式是与中变量的存储模式是与MCS-51M

15、CS-51单片机的存储器紧密相关;单片机的存储器紧密相关;n n4 4C51C51与标准与标准C C的输入输出处理不一样,的输入输出处理不一样,C51C51中中的输入输出是通过的输入输出是通过MCS-51MCS-51串并口来完成的,输串并口来完成的,输入输出指令执行前必须要对串行口进行初始化;入输出指令执行前必须要对串行口进行初始化;n n5 5C51C51与标准与标准C C在函数使用方面也有一定的区别,在函数使用方面也有一定的区别,C51C51中有专门的中断函数。中有专门的中断函数。4.2 C51数据类型n nC51的数据类型分为根本数据类型和组合数据类型,情况与标准C中的数据类型根本相同,

16、其中float型与double型相同,另外,C51中还有专门针对于MCS-51单片机的特殊功能存放器型和位类型。4.2.1 字符型(字节型) charn n有有signed charsigned char和和unsigned charunsigned char之分,默认为之分,默认为signed charsigned char。它们的长度为一个字节,用于存放。它们的长度为一个字节,用于存放一个单字节的数据。对于一个单字节的数据。对于signed charsigned char,它用于定,它用于定义带符号字节数据,其字节的最高位为符号位,义带符号字节数据,其字节的最高位为符号位,“0“0表示正数

17、,表示正数,“1“1表示负数,补码表示,所表示负数,补码表示,所能表示的数值范围是能表示的数值范围是-128+127-128+127;对于;对于unsigned unsigned charchar,它用于定义无符号字节数据或字符,可以,它用于定义无符号字节数据或字符,可以存放一个字节的无符号数,其取值范围为存放一个字节的无符号数,其取值范围为02550255。unsigned charunsigned char可以用来存放无符号数,也可以存可以用来存放无符号数,也可以存放西文字符,一个西文字符占一个字节,在计算放西文字符,一个西文字符占一个字节,在计算机内部用机内部用ASCIIASCII码存放

18、。码存放。4.2.2 int整型n n分singed int和unsigned int。默认为signed int。它们的长度均为两个字节,用于存放一个双字节数据。对于signed int,用于存放两字节带符号数,补码表示,数的范畴为-32768+32767。对于unsigned int,用于存放两字节无符号数,数的范围为065535。4.2.3 long长整型n n分singed long和unsigned long。默认为signed long。它们的长度均为四个字节,用于存放一个四字节数据。对于signed long,用于存放四字节带符号数,补码表示,数的范畴为-2147483648+2

19、147483647。对于unsigned long,用于存放四字节无符号数,数的范围为04294967295。4.2.4 float浮点型n nfloat型数据的长度为四个字节,格式符合IEEE-754标准的单精度浮点型数据,包含指数和尾数两局部,最高位为符号位,“1表示负数,“0表示正数,其于的8位为阶码,最后的23位为尾数的有效数位,由于尾数的整数局部隐含为“1,所以尾数的精度为24位。4.2.5 * 指针型n n指针型本身就是一个变量,在这个变量中存放的指向另一个数据的地址。这个指针变量要占用一定的内存单元,对不同的处理器其长度不一样,在C51中它的长度一般为13个字节。4.2.6 特殊

20、功能存放器型n n这是C51扩充的数据类型,用于访问MCS-51单片机中的特殊功能存放器数据,它分sfr和sfr16两种类型,其中sfr为字节型特殊功能存放器类型,占一个内存单元,利用它可以访问MCS-51内部的所有特殊功能存放器;sfr16为双字节型特殊功能存放器类型,占用两个字节单元,利用它可以访问MCS-51内部的所有两个字节的特殊功能存放器。在C51中对特殊功能存放器的访问必须先用sfr或sfr16进行声明。4.2.7 位类型n n这也是这也是C51C51中扩充的数据类型,用于访问中扩充的数据类型,用于访问MCS-MCS-5151单片机中的可寻址的位单元。在单片机中的可寻址的位单元。在

21、C51C51中,支持中,支持两种位类型:两种位类型:bitbit型和型和sbitsbit型。它们在内存中都只型。它们在内存中都只占一个二进制位,其值可以是占一个二进制位,其值可以是“1“1或或“0“0。其。其中用中用bitbit定义的位变量在定义的位变量在C51C51编译器编译时,在不编译器编译时,在不同的时候位地址是可以变化的,而用同的时候位地址是可以变化的,而用sbitsbit定义的定义的位变量必须与位变量必须与MCS-51MCS-51单片机的一个可以寻址位单片机的一个可以寻址位单元或可位寻址的字节单元中的某一位联系在一单元或可位寻址的字节单元中的某一位联系在一起,在起,在C51C51编译

22、器编译时,其对应的位地址是不编译器编译时,其对应的位地址是不可变化的。可变化的。n n在在C51C51语言程序中,有可能会出现在运算中数据语言程序中,有可能会出现在运算中数据类型不一致的情况。类型不一致的情况。C51C51允许任何标准数据类型允许任何标准数据类型的隐式转换,隐式转换的优先级顺序如下:的隐式转换,隐式转换的优先级顺序如下:n nbitbitcharcharintintlonglongfloatfloatn nsignedsignedunsignedunsignedn n也就是说,当char型与int型进行运算时,先自动对char型扩展为int型,然后与int型进行运算,运算结果为

23、int型。C51除了支持隐式类型转换外,还可以通过强制类型转换符“对数据类型进行人为的强制转换。n nC5l编译器除了能支持以上这些根本数据类型之外,还能支持一些复杂的组合型数据类型,如数组类型、指针类型、结构类型、联合类型等这些复杂的数据类型。 4.3.1 常量n n常量是指在程序执行过程中其值不能改变的量。常量是指在程序执行过程中其值不能改变的量。在在C51C51中支持整型常量、浮点型常量、字符型常中支持整型常量、浮点型常量、字符型常量和字符串型常量。量和字符串型常量。n n1 1整型常量整型常量n n整型常量也就是整型常数,根据其值范围在计算整型常量也就是整型常数,根据其值范围在计算机中

24、分配不同的字节数来存放。在机中分配不同的字节数来存放。在C51C51中它可以中它可以表示成以下几种形式:表示成以下几种形式:n n 十进制整数:如十进制整数:如234234、-56-56、0 0等。等。n n 十六进制整数:以十六进制整数:以0x0x开头表示,如开头表示,如0x120x12表示十表示十六进制数,相当十进制六进制数,相当十进制1818。n n长整型数:在长整型数:在C51C51中当一个整数的值到达长整型中当一个整数的值到达长整型数的范围,那么该数按长整型数存放,在存储器数的范围,那么该数按长整型数存放,在存储器中占四个字节,另外,如一个整数后面加一个字中占四个字节,另外,如一个整

25、数后面加一个字母母L L,这个数在存储器中也按长整型存放。如,这个数在存储器中也按长整型存放。如123L123L在存储器中占四个字节。在存储器中占四个字节。n n2 2浮点型常量浮点型常量n n 浮点型常量也就是实型常数。有十进制表示形式和指浮点型常量也就是实型常数。有十进制表示形式和指数表示形式。数表示形式。n n 十进制表示形式又称浮点表示形式,由数字和小数点十进制表示形式又称浮点表示形式,由数字和小数点组成。如组成。如0.1230.123、34.64534.645等都是十进制数表示形式的浮点等都是十进制数表示形式的浮点型常量。型常量。n n 指数表示形式为:指数表示形式为:n n 数字数

26、字 . .数字数字 e e 数字数字n n 例如:例如:123.456e-3123.456e-3、-3.123e2-3.123e2等都是指数形式的浮等都是指数形式的浮点型常量。点型常量。n n3 3字符型常量字符型常量n n字符型常量是用单引号引起的字符,如字符型常量是用单引号引起的字符,如 、aa、11、FF等。可以是可显示的等。可以是可显示的ASCIIASCII字符,也可以是字符,也可以是不可显示的控制字符。对不可显示的控制字符须在前面加不可显示的控制字符。对不可显示的控制字符须在前面加上反斜上反斜“ “组成转义字符。利用它可以完成一些特殊功组成转义字符。利用它可以完成一些特殊功能和输出时

27、的格式控制。常用的转义字符如表能和输出时的格式控制。常用的转义字符如表4.14.1所示。所示。n n4字符串型常量n n字符串型常量由双引号括起的字符组成。如“D、“1234、“ABCD等。注意字符串常量与字符常量是不一样,一个字符常量在计算机内只用一个字节存放,而一个字符串常量在内存中存放时不仅双引号内的字符一个占一个字节,而且系统会自动的在后面加一个转义字符“o作为字符串结束符。因此不要将字符常量和字符串常量混淆,如字符常量A和字符串常量“A是不一样的。4.3.2 变量n n变量是在程序运行过程中其值可以改变的量。一个变量由两局部组成:变量名和变量值。n n在C51中,变量在使用前必须对其

28、进行定义,指出变量的数据类型和存储模式。以便编译系统为它分配相应的存储单元。定义的格式如下:n n 存储种类 数据类型说明符 存储器类型 变量名1=初值,变量名2=初值;n n1 1数据类型说明符数据类型说明符n n在定义变量时,必须通过数据类型说明符指明变在定义变量时,必须通过数据类型说明符指明变量的数据类型,指明变量在存储器中占用的字节量的数据类型,指明变量在存储器中占用的字节数。可以是根本数据类型说明符,也可以是组合数。可以是根本数据类型说明符,也可以是组合数据类型说明符,还可以是用数据类型说明符,还可以是用typedeftypedef定义的类型定义的类型别名。别名。n n在在C51C5

29、1中,为了增加程序的可读性,允许用户为中,为了增加程序的可读性,允许用户为系统固有的数据类型用说明符系统固有的数据类型用说明符typedeftypedef或或#define#define起别名,格式如下:起别名,格式如下:n n typedef c51 typedef c51固有的数据类型说明符固有的数据类型说明符 别名;别名;n n 定义别名后,就可以用别名代替数据类型说定义别名后,就可以用别名代替数据类型说明符对变量进行定义。别名可以用大写,也可以明符对变量进行定义。别名可以用大写,也可以用小写,为了区别一般用大写字母表示。用小写,为了区别一般用大写字母表示。n n 例例4.1 typed

30、ef和#define的使用。n ntypedef unsigned int WORDn n#define BYTE unsigned charn nBYTE a1=0xff;n n WORD a2=0xffff;n n2 2变量名变量名n n变量名是变量名是C51C51区分不同变量,为不同变量取的名称。在区分不同变量,为不同变量取的名称。在C51C51中规定变量名可以由字母、数字和下划线三种字符组中规定变量名可以由字母、数字和下划线三种字符组成,且第一个字母必须为字母或下划线。变量名有两种:成,且第一个字母必须为字母或下划线。变量名有两种:普通变量名和指针变量名。它们的区别是指针变量名前面普通

31、变量名和指针变量名。它们的区别是指针变量名前面要带要带“* “*号。号。n n3 3存储种类存储种类n n存储种类是指变量在程序执行过程中的作用范围。存储种类是指变量在程序执行过程中的作用范围。C51C51变变量的存储种类有四种,分别是自动量的存储种类有四种,分别是自动(auto)(auto)、外部、外部(extern)(extern)、静态静态(static)(static)和存放器和存放器(register)(register)。n n(1) auto: (1) auto: 使用使用autoauto定义的变量称为自动变量,其作用范定义的变量称为自动变量,其作用范围在定义它的函数体或复合语句

32、内部,当定义它的函数体围在定义它的函数体或复合语句内部,当定义它的函数体或复合语句执行时,或复合语句执行时,C51C51才为该变量分配内存空间,结束才为该变量分配内存空间,结束时占用的内存空间释放。自动变量一般分配在内存的堆栈时占用的内存空间释放。自动变量一般分配在内存的堆栈空间中。定义变量时,如果省略存储种类,那么该变量默空间中。定义变量时,如果省略存储种类,那么该变量默认为自动认为自动(auto)(auto)变量。变量。n n(2) extern(2) extern:使用:使用externextern定义的变量称为外部变量。定义的变量称为外部变量。在一个函数体内,要使用一个已在该函数体外或

33、在一个函数体内,要使用一个已在该函数体外或别的程序中定义过的外部变量时,该变量在该函别的程序中定义过的外部变量时,该变量在该函数体内要用数体内要用externextern说明。外部变量被定义后分配说明。外部变量被定义后分配固定的内存空间,在程序整个执行时间内都有效,固定的内存空间,在程序整个执行时间内都有效,直到程序结束才释放。直到程序结束才释放。n n(3) static(3) static:使用:使用staticstatic定义的变量称为静态变量。定义的变量称为静态变量。它又分为内部静态变量和外部静态变量。在函数它又分为内部静态变量和外部静态变量。在函数体内部定义的静态变量为内部静态变量,

34、它在对体内部定义的静态变量为内部静态变量,它在对应的函数体内有效,一直存在,但在函数体外不应的函数体内有效,一直存在,但在函数体外不可见,这样不仅使变量在定义它的函数体外被保可见,这样不仅使变量在定义它的函数体外被保护,还可以实现当离开函数时值不被改变。外部护,还可以实现当离开函数时值不被改变。外部静态变量是在函数外部定义的静态变量。它在程静态变量是在函数外部定义的静态变量。它在程序中一直存在,但在定义的范围之外是不可见的。序中一直存在,但在定义的范围之外是不可见的。如在多文件或多模块处理中,外部静态变量只在如在多文件或多模块处理中,外部静态变量只在文件内部或模块内部有效。文件内部或模块内部有

35、效。n n(4) register(4) register:使用:使用registerregister定义的变量称为存放器定义的变量称为存放器变量。它定义的变量存放在变量。它定义的变量存放在CPUCPU内部的存放器中,内部的存放器中,处理速度快,但数目少。处理速度快,但数目少。C51C51编译器编译时能自编译器编译时能自动识别程序中使用频率最高的变量,并自动将其动识别程序中使用频率最高的变量,并自动将其作为存放器变量,用户可以无需专门声明。作为存放器变量,用户可以无需专门声明。n n(5) (5) 存储器类型存储器类型n n存储器类型是用于指明变量所处的单片机的存储存储器类型是用于指明变量所处

36、的单片机的存储器区域情况。存储器类型与存储种类完全不同。器区域情况。存储器类型与存储种类完全不同。C51C51编译器能识别的存储器类型有以下几种,如编译器能识别的存储器类型有以下几种,如表表4.24.2所示。所示。n n例例例例4.2 4.2 定义变量存储种类和存储器类型定义变量存储种类和存储器类型定义变量存储种类和存储器类型定义变量存储种类和存储器类型 n n char data var1;/ char data var1;/ 定义变量定义变量定义变量定义变量var1var1在片内在片内在片内在片内RAMRAM低低低低128128字节字节字节字节n n int idata var2;/ in

37、t idata var2;/ 定义变量定义变量定义变量定义变量var2var2在片内在片内在片内在片内RAM256RAM256字节内字节内字节内字节内n n int code var3;/ int code var3;/ 定义变量定义变量定义变量定义变量var3var3在片外在片外在片外在片外ROMROMn n unsigned char bdata var4;/ unsigned char bdata var4;/ 定义变量定义变量定义变量定义变量var4var4在在在在片内位寻址区片内位寻址区片内位寻址区片内位寻址区n n (6) (6) 特殊功能存放器变量特殊功能存放器变量特殊功能存放器

38、变量特殊功能存放器变量n nMCS-51MCS-51系列单片机片内有许多特殊功能存放器,系列单片机片内有许多特殊功能存放器,系列单片机片内有许多特殊功能存放器,系列单片机片内有许多特殊功能存放器,通过这些特殊功能存放器可以控制通过这些特殊功能存放器可以控制通过这些特殊功能存放器可以控制通过这些特殊功能存放器可以控制MCS-51MCS-51系列系列系列系列单片机的定时器、计数器、串口、单片机的定时器、计数器、串口、单片机的定时器、计数器、串口、单片机的定时器、计数器、串口、I/OI/O及其它功能及其它功能及其它功能及其它功能部件,每一个特殊功能存放器在片内部件,每一个特殊功能存放器在片内部件,每

39、一个特殊功能存放器在片内部件,每一个特殊功能存放器在片内RAMRAM中都对中都对中都对中都对应于一个字节单元或两个字节单元。应于一个字节单元或两个字节单元。应于一个字节单元或两个字节单元。应于一个字节单元或两个字节单元。n n在在C51C51中,允许用户对这些特殊功能存放器进行访问,访中,允许用户对这些特殊功能存放器进行访问,访问时须通过问时须通过sfrsfr或或sfr16sfr16类型说明符进行定义,定义时须指类型说明符进行定义,定义时须指明它们所对应的片内明它们所对应的片内RAMRAM单元的地址。格式如下:单元的地址。格式如下:n n sfr sfr或或sfr16 sfr16 特殊功能存放

40、器名特殊功能存放器名= =地址;地址;n nsfrsfr用于对用于对MCS-51MCS-51单片机中单字节的特殊功能存放器进行单片机中单字节的特殊功能存放器进行定义,定义,sfr16sfr16用于对双字节特殊功能存放器进行定义。特用于对双字节特殊功能存放器进行定义。特殊功能存放器名一般用大写字母表示,地址一般用直接地殊功能存放器名一般用大写字母表示,地址一般用直接地址形式。址形式。n n例例4.3 4.3 定义变量是特殊功能存放器类型定义变量是特殊功能存放器类型n nsfr PSW=0xd0;sfr PSW=0xd0;n n sfr SCON=0x98; sfr SCON=0x98;n nsf

41、r TMOD=0x89;sfr TMOD=0x89;n nsfr P1=0x90;sfr P1=0x90;n nsfr DPTR=0x82;sfr DPTR=0x82;n nsfr T0=0x8a;sfr T0=0x8a;n n由于由于Keil C51Keil C51在头文件在头文件“reg51.h“reg51.h中已将中已将MCS-51MCS-51单片机单片机中所有特殊功能存放器进行了定义,我们在程序中只要引中所有特殊功能存放器进行了定义,我们在程序中只要引进该头文件,特殊功能存放器就不用定义而直接使用了,进该头文件,特殊功能存放器就不用定义而直接使用了,但要注意特殊功能存放器名要用大写字母

42、表示。但要注意特殊功能存放器名要用大写字母表示。n n(7) (7) 位变量位变量位变量位变量n n在在在在C51C51中,允许用户通过位类型符定义位变量。中,允许用户通过位类型符定义位变量。中,允许用户通过位类型符定义位变量。中,允许用户通过位类型符定义位变量。位类型符有两个:位类型符有两个:位类型符有两个:位类型符有两个:bitbit和和和和sbitsbit。可以定义两种位变。可以定义两种位变。可以定义两种位变。可以定义两种位变量。量。量。量。n nbitbit位类型符用于定义一般的可位处理位变量。它位类型符用于定义一般的可位处理位变量。它位类型符用于定义一般的可位处理位变量。它位类型符用

43、于定义一般的可位处理位变量。它的格式如下:的格式如下:的格式如下:的格式如下:n nbit bit 位变量名;位变量名;位变量名;位变量名;n n在格式中可以加上各种修饰,但注意存储器类型在格式中可以加上各种修饰,但注意存储器类型在格式中可以加上各种修饰,但注意存储器类型在格式中可以加上各种修饰,但注意存储器类型只能是只能是只能是只能是bdatabdata、datadata、idataidata。只能是片内。只能是片内。只能是片内。只能是片内RAMRAM的的的的可位寻址区,即只能是可位寻址区,即只能是可位寻址区,即只能是可位寻址区,即只能是bdatabdata。n nsbitsbit位类型符用

44、于定义在可位寻址字节或特殊位类型符用于定义在可位寻址字节或特殊位类型符用于定义在可位寻址字节或特殊位类型符用于定义在可位寻址字节或特殊功能存放器中的位,定义时须指明其位地址,可功能存放器中的位,定义时须指明其位地址,可功能存放器中的位,定义时须指明其位地址,可功能存放器中的位,定义时须指明其位地址,可以是位直接地址,可以是可位寻址变量带以是位直接地址,可以是可位寻址变量带以是位直接地址,可以是可位寻址变量带以是位直接地址,可以是可位寻址变量带bitbit位号,位号,位号,位号,也可以是特殊功能存放器名带也可以是特殊功能存放器名带也可以是特殊功能存放器名带也可以是特殊功能存放器名带bitbit位

45、号。格式如下:位号。格式如下:位号。格式如下:位号。格式如下:n nsbit sbit 位变量名位变量名= =位地址;位地址;n n如位地址为位直接地址,其取值范围为如位地址为位直接地址,其取值范围为0x000xff0x000xff;如位;如位地址是可位寻址变量带地址是可位寻址变量带bitbit位号或特殊功能存放器名带位号或特殊功能存放器名带bitbit位号,那么在它前面须对可位寻址变量或特殊功能存放器位号,那么在它前面须对可位寻址变量或特殊功能存放器进行定义。字节地址与进行定义。字节地址与bitbit位号之间、特殊功能存放器与位号之间、特殊功能存放器与bitbit位号之间一般用位号之间一般用

46、“作间隔。作间隔。n n例例4.4 bit 4.4 bit 和和sbitsbit位变量定义位变量定义n nbit bdata b; /bit bdata b; /定义定义b b是是bdatabdata区位变量区位变量n nsbit P1=0x90; /sbit P1=0x90; /定义特殊功能存放器定义特殊功能存放器P1P1地址地址n nsbit P1_0=P10; /sbit P1_0=P10; /定义特殊功能存放器定义特殊功能存放器P1P1的各位的各位n nsbit P1_1=P11;sbit P1_1=P11;n nsbit P1_2=P12;sbit P1_2=P12;n nsbit

47、P1_3=P13;sbit P1_3=P13;n nsbit P1_4=P14;sbit P1_4=P14;n nsbit P1_5=P15;sbit P1_5=P15;n nsbit P1_6=P16;sbit P1_6=P16;n nsbit P1_7=P17;sbit P1_7=P17;4.3.3 存储模式n nC51C51编译器支持三种存储模式:编译器支持三种存储模式:SMALLSMALL模式、模式、COMPACTCOMPACT模式和模式和LARGELARGE模式。不同的存储模式对变量默认的存储模式。不同的存储模式对变量默认的存储器类型不一样。器类型不一样。n n 1 1SMALLSM

48、ALL模式。模式。SMALLSMALL模式称为小编译模式,在模式称为小编译模式,在SMALLSMALL模式下,编译时,函数参数和变量被默认在片内模式下,编译时,函数参数和变量被默认在片内RAMRAM中,存储器类型为中,存储器类型为datadata。程序代码不能超过。程序代码不能超过2K2K,SMALLSMALL模式常用在教学实验系统的一个具体实验中。模式常用在教学实验系统的一个具体实验中。n n 2 2COMPACTCOMPACT模式。模式。COMPACTCOMPACT模式称为紧凑编译模式,模式称为紧凑编译模式,在在COMPACTCOMPACT模式下,编译时,函数参数和变量被默认在模式下,编译

49、时,函数参数和变量被默认在片外片外RAMRAM的低的低256256字节空间,存储器类型为字节空间,存储器类型为pdatapdata。n n 3 3LARGELARGE模式。模式。LARGELARGE模式称为大编译模式,在模式称为大编译模式,在LARGELARGE模式下,编译时函数参数和变量被默认在片外模式下,编译时函数参数和变量被默认在片外RAMRAM的的64K64K字节空间,存储器类型为字节空间,存储器类型为xdataxdata。在实际嵌入。在实际嵌入式控制系统设计中只能使用式控制系统设计中只能使用LARGELARGE模式。模式。n n在程序中,变量的存储模式的指定通过#pragma预处理命

50、令来实现。函数的存储模式可通过在函数定义时后面带存储模式说明。如果没有指定,那么系统隐含为SMALL模式。但我们大多都是在建立工程时在开发环境中设定参见图1.11 编译选大模式对话框4.3.4 绝对地址的访问n n1使用C51运行库中预定义宏n nIBP-PC机对外部设备进行端口管理,Keil C51也是这样,为了能对外部设备进行I/O操作,C51编译器提供了一组宏定义来对51系列单片机的code、data、pdata和xdata空间进行绝对寻址。规定只能以无符号数方式访问,定义了8个宏定义,其函数原型如下:n n#define CBYTE(unsigned char volatile*)0x

51、50000L)#define CBYTE(unsigned char volatile*)0x50000L)n n#define DBYTE(unsigned char volatile*)0x40000L)#define DBYTE(unsigned char volatile*)0x40000L)n n#define PBYTE(unsigned char volatile*)0x30000L)#define PBYTE(unsigned char volatile*)0x30000L)n n#define XBYTE(unsigned char volatile*)0x10000L)#d

52、efine XBYTE(unsigned char volatile*)0x10000L)n n#define CWORD(unsigned int volatile*)0x50000L)#define CWORD(unsigned int volatile*)0x50000L)n n#define DWORD(unsigned int volatile*)0x40000L)#define DWORD(unsigned int volatile*)0x40000L)n n#define PWORD(unsigned int volatile*)0x30000L)#define PWORD(un

53、signed int volatile*)0x30000L)n n#define XWORD(unsigned int volatile*)0x20000L)#define XWORD(unsigned int volatile*)0x20000L)n n这些函数原型放在这些函数原型放在absacc.habsacc.h文件中。使用时须用预处理命文件中。使用时须用预处理命令把该头文件包含到文件中,形式为:令把该头文件包含到文件中,形式为:#include #include 。n n其中:其中:CBYTECBYTE以字节形式对以字节形式对codecode区寻址,区寻址,DBYTEDBYTE以字节形

54、式对以字节形式对datadata区寻址,区寻址,PBYTEPBYTE以字以字节形式对节形式对pdatapdata区寻址,区寻址,XBYTEXBYTE以字节形式对以字节形式对xdataxdata区寻址,区寻址,CWORDCWORD以字形式对以字形式对codecode区寻址,区寻址,DWORDDWORD以字形式对以字形式对datadata区寻址,区寻址,PWORDPWORD以字以字形式对形式对pdatapdata区寻址,区寻址,XWORDXWORD以字形式对以字形式对xdataxdata区寻址。访问形式如下:区寻址。访问形式如下:n n 宏名宏名 地址地址 n n宏名为宏名为CBYTECBYTE、

55、DBYTEDBYTE、PBYTEPBYTE、XBYTEXBYTE、CWORDCWORD、DWORDDWORD、PWORDPWORD或或XWORDXWORD。地址。地址为存储单元的绝对地址,一般用十六进制形式表为存储单元的绝对地址,一般用十六进制形式表示。示。n n8 8个宏中,使用最多的是个宏中,使用最多的是XBYTEXBYTE,XBYTEXBYTE被定义被定义在在(unsigned char volatile*)0x10000L(unsigned char volatile*)0x10000L,其中的数,其中的数字字1 1代表外部数据存储区,偏移量是代表外部数据存储区,偏移量是0000000

56、0,这样,这样XBYTEXBYTE就成了指向就成了指向xdata 0xdata 0地址的指针。我们在地址的指针。我们在使用这些宏时对此细节不必深究,在程序中引入使用这些宏时对此细节不必深究,在程序中引入absacc.habsacc.h头文件,就可以很简单的使用它们。头文件,就可以很简单的使用它们。n n2 2通过指针访问通过指针访问n n采用指针的方法,可以实现在采用指针的方法,可以实现在C51C51程序中对任意程序中对任意指定的存储器单元进行访问。指定的存储器单元进行访问。n n3 3使用使用C51C51扩展关键字扩展关键字_at_at_n n使用使用_at_at_对指定的存储器空间的绝对地

57、址进行访对指定的存储器空间的绝对地址进行访问,一般格式如下:问,一般格式如下:n n 存储器类型存储器类型 数据类型说明符数据类型说明符 变量名变量名 _at_ _at_ 地址常数;地址常数;n n其中,存储器类型为其中,存储器类型为datadata、bdatabdata、idataidata、pdatapdata等等C51C51能识别的存储能识别的存储器类型,如省略那么按存储模式规定的默认存储器类型确定变量的存器类型,如省略那么按存储模式规定的默认存储器类型确定变量的存储器区域;数据类型为储器区域;数据类型为C51C51支持的数据类型。地址常数用于指定变量支持的数据类型。地址常数用于指定变量

58、的绝对地址,必须位于有效的存储器空间之内;使用的绝对地址,必须位于有效的存储器空间之内;使用_at_at_定义的变量定义的变量必须为全局变量。必须为全局变量。n n例例4.54.5使用使用absacc.habsacc.h文件中宏定义绝对地址访问文件中宏定义绝对地址访问n n#include#includen n#include#includen n#define PortA XBYTEox007c /#define PortA XBYTEox007c /定义并行接口芯片定义并行接口芯片8255A8255A端口端口A A地址地址n n#define PortB XBYTEox007d /#def

59、ine PortB XBYTEox007d /定义并行接口芯片定义并行接口芯片8255A8255A端口端口B B地址地址n n#define PortC XBYTEox007e /#define PortC XBYTEox007e /定义并行接口芯片定义并行接口芯片8255A8255A端口端口C C地地址址n n#define PortCtrl XBYTEox007f /#define PortCtrl XBYTEox007f /定义并行接口芯片定义并行接口芯片8255A8255A控制端口控制端口地址地址n nmain()main()n n n n unsigned char i; unsig

60、ned char i;n nPortCtrl=0x82;/ PortCtrl=0x82;/ 控制端口赋初值控制端口赋初值n nPortA=0x80;/ PortA=0x80;/ 端口端口A A输出输出n ni= PortB;/ i= PortB;/ 端口端口B B输入输入n n n n例例例例4.6 4.6 使用使用使用使用C51C51扩展关键字扩展关键字扩展关键字扩展关键字_at_at_绝对地址访问绝对地址访问绝对地址访问绝对地址访问n nxdata unsigned char PortA _at_ 0x8000 ; xdata unsigned char PortA _at_ 0x8000

61、 ; / /定义并行接口芯片定义并行接口芯片定义并行接口芯片定义并行接口芯片8255A8255A端口端口端口端口A A地址地址地址地址n nxdata unsigned char PortB _at_ 0x8001 ; xdata unsigned char PortB _at_ 0x8001 ; / /定义并行接口芯片定义并行接口芯片定义并行接口芯片定义并行接口芯片8255A8255A端口端口端口端口B B地址地址地址地址n nxdata unsigned char PortC _at_ 0x8002 ; xdata unsigned char PortC _at_ 0x8002 ; / /

62、定义并行接口芯片定义并行接口芯片定义并行接口芯片定义并行接口芯片8255A8255A端口端口端口端口C C地址地址地址地址n n定义之后,就可以对端口进行读写操作,例如,定义之后,就可以对端口进行读写操作,例如,定义之后,就可以对端口进行读写操作,例如,定义之后,就可以对端口进行读写操作,例如,unsigned char i;i=PortA; unsigned char i;i=PortA; 读读读读 PortB=i; PortB=i;写写写写等等。等等。等等。等等。n n在嵌入式控制系统设计中,绝对地址访问是我们在嵌入式控制系统设计中,绝对地址访问是我们在嵌入式控制系统设计中,绝对地址访问是

63、我们在嵌入式控制系统设计中,绝对地址访问是我们常使用的操作。常使用的操作。常使用的操作。常使用的操作。4.4.1 赋值运算符n n赋值运算符赋值运算符“=“=,在,在C51C51中,它的功能是将右侧一个数中,它的功能是将右侧一个数据的值赋给左侧一个变量,如据的值赋给左侧一个变量,如x=10x=10。利用赋值运算符将。利用赋值运算符将一个变量与一个表达式连接起来的式子称为赋值表达式,一个变量与一个表达式连接起来的式子称为赋值表达式,在赋值表达式的后面加一个分号在赋值表达式的后面加一个分号“ “;就构成了赋值语句,;就构成了赋值语句,一个赋值语句的格式如下:一个赋值语句的格式如下:n n 变量变量

64、= =表达式;表达式;n n执行时先计算出右边表达式的值,然后赋给左边的变量。执行时先计算出右边表达式的值,然后赋给左边的变量。例如:例如:n n x=8+9 x=8+9; / /将将8+98+9的值赋绐变量的值赋绐变量x xn n x=y=5 x=y=5; / /将常数将常数5 5同时赋给变量同时赋给变量x x和和y yn n在在C51C51中,允许在一个语句中同时给多个变量赋值,赋值中,允许在一个语句中同时给多个变量赋值,赋值顺序自右向左。顺序自右向左。 4.4.2 算术运算符n nC51C51中支持的算术运算符有:中支持的算术运算符有:n n+ + 加或取正值运算符加或取正值运算符n n

65、- - 减或取负值运算符减或取负值运算符n n* * 乘运算符乘运算符n n/ / 除运算符除运算符n n% % 取余运算符取余运算符n n加、减、乘运算相比照较简单,而对于除运算,如相除的加、减、乘运算相比照较简单,而对于除运算,如相除的两个数为浮点数,那么运算的结果也为浮点数,如相除的两个数为浮点数,那么运算的结果也为浮点数,如相除的两个数为整数,那么运算的结果也为整数,即为整除。如两个数为整数,那么运算的结果也为整数,即为整除。如25.0/20.025.0/20.0结果为结果为1.251.25,而,而25/2025/20结果为结果为1 1。n n对于取余运算,那么要求参加运算的两个数必须

66、为整数,对于取余运算,那么要求参加运算的两个数必须为整数,运算结果为它们的余数。例如:运算结果为它们的余数。例如:x=5%3x=5%3,结果,结果x x的值为的值为2 2。4.4.3 关系运算符n nC51C51中有中有6 6种关系运算符:种关系运算符:n n 大于大于n n = = 大于等于大于等于n n= 353,结果为真,结果为真1 1,而,而10= =10010= =100,结果为假,结果为假0 0。n n注意:关系运算符等于注意:关系运算符等于“= =“= =是由两个是由两个“=“=组成。组成。4.4.4 逻辑运算符n nC51C51有有3 3种逻辑运算符:种逻辑运算符:n n| |

67、 逻辑或逻辑或n n& & 逻辑与逻辑与n n! 逻辑非逻辑非n n关系运算符用于反映两个表达式之间的大小关系,逻辑运算符那么用关系运算符用于反映两个表达式之间的大小关系,逻辑运算符那么用于求条件式的逻辑值,用逻辑运算符将关系表达式或逻辑量连接起来于求条件式的逻辑值,用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式。的式子就是逻辑表达式。 n n逻辑与,格式:逻辑与,格式:n n 条件式条件式1 & 1 & 条件式条件式2 2n n当条件式当条件式1 1与条件式与条件式2 2都为真时结果为真非都为真时结果为真非0 0值,否那么为假值,否那么为假0 0值。值。n n逻辑或,格式:逻辑

68、或,格式:n n 条件式条件式1 | 1 | 条件式条件式2 2n n当条件式当条件式1 1与条件式与条件式2 2都为假时结果为假都为假时结果为假0 0值,否那么为真非值,否那么为真非0 0值。值。n n逻辑非,格式:逻辑非,格式:n n !条件式!条件式n n当条件式原来为真非当条件式原来为真非0 0值,逻辑非后结果为假值,逻辑非后结果为假0 0值。当条件值。当条件式原来为假式原来为假0 0值,逻辑非后结果为真非值,逻辑非后结果为真非0 0值。值。n n例如:假设例如:假设a=8a=8,b=3b=3,c=0c=0,那么!,那么!a a为假,为假,a & ba & b为真,为真,b & cb

69、& c为为假。假。 4.4.5 位运算符n nC51C51语言能对运算对象按位进行操作,它与汇编语言使用语言能对运算对象按位进行操作,它与汇编语言使用一样方便。位运算是按位对变量进行运算,但并不改变参一样方便。位运算是按位对变量进行运算,但并不改变参与运算的变量的值。如果要求按位改变变量的值,那么要与运算的变量的值。如果要求按位改变变量的值,那么要利用相应的赋值运算。利用相应的赋值运算。C51C51中位运算符只能对整数进行操中位运算符只能对整数进行操作,不能对浮点数进行操作。作,不能对浮点数进行操作。C51C51中的位运算符有:中的位运算符有:n n& & 按位与按位与n n| | 按位或按位

70、或n n 按位异或按位异或n n 按位取反按位取反n n 右移右移4.4.6 复合赋值运算符n nC51C51语言中支持在赋值运算符语言中支持在赋值运算符“=“=的前面加上其它运算的前面加上其它运算符,组成复合赋值运算符。下面是符,组成复合赋值运算符。下面是C51C51中支持的复合赋值中支持的复合赋值运算符:运算符:n n+= += 加法赋值加法赋值 + + 减法赋值减法赋值n n*= *= 乘法赋值乘法赋值 /= /= 除法赋值除法赋值n n%= %= 取模赋值取模赋值 &= &= 逻辑与赋值逻辑与赋值n n|= |= 逻辑或赋值逻辑或赋值 = = 逻辑异或赋值逻辑异或赋值n n= = 逻辑

71、非赋值逻辑非赋值 = = 右移位赋值右移位赋值n n= =2x=2相当于相当于x=x2x=x2。4.4.7 逗号运算符n n在在C51C51语言中,逗号语言中,逗号“ “,是一个特殊的运算符,是一个特殊的运算符,可以用它将两个或两个以上的表达式连接起来,可以用它将两个或两个以上的表达式连接起来,称为逗号表达式。逗号表达式的一般格式为:称为逗号表达式。逗号表达式的一般格式为:n n 表达式表达式1 1,表达式,表达式2 2,表达式,表达式n nn n 程序执行时对逗号表达式的处理:按从左至右程序执行时对逗号表达式的处理:按从左至右的顺序依次计算出各个表达式的值,而整个逗号的顺序依次计算出各个表达

72、式的值,而整个逗号表达式的值是最右边的表达式表达式表达式的值是最右边的表达式表达式n n的值。的值。例如:例如:x=(a=3,6*3)x=(a=3,6*3)结果结果x x的值为的值为1818。4.4.8 条件运算符n n条件运算符条件运算符“ “?:是?:是C51C51语言中唯一的一个三语言中唯一的一个三目运算符,它要求有三个运算对象,用它可以将目运算符,它要求有三个运算对象,用它可以将三个表达式连接在一起构成一个条件表达式。条三个表达式连接在一起构成一个条件表达式。条件表达式的一般格式为:件表达式的一般格式为:n n 逻辑表达式?表达式逻辑表达式?表达式1 1:表达式:表达式2 2n n其功

73、能是先计算逻辑表达式的值,当逻辑表达式其功能是先计算逻辑表达式的值,当逻辑表达式的值为真非的值为真非0 0值时,将计算的表达式值时,将计算的表达式1 1的值作的值作为整个条件表达式的值;当逻辑表达式的值为假为整个条件表达式的值;当逻辑表达式的值为假0 0值时,将计算的表达式值时,将计算的表达式2 2的值作为整个条件的值作为整个条件表达式的值。例如:条件表达式表达式的值。例如:条件表达式max=(ab)?a:bmax=(ab)?a:b的执行结果是将的执行结果是将a a和和b b中较大的数赋值给变量中较大的数赋值给变量maxmax。4.4.9 指针与地址运算符n n指针是指针是C51C51语言中的

74、一个十分重要的概念,在语言中的一个十分重要的概念,在C51C51中的数中的数据类型中专门有一种指针类型。指针为变量的访问提供了据类型中专门有一种指针类型。指针为变量的访问提供了另一种方式,变量的指针就是该变量的地址,还可以定义另一种方式,变量的指针就是该变量的地址,还可以定义一个专门指向某个变量的地址的指针变量。为了表示指针一个专门指向某个变量的地址的指针变量。为了表示指针变量和它所指向的变量地址之间的关系,变量和它所指向的变量地址之间的关系,C51C51中提供了两中提供了两个专门的运算符:个专门的运算符:n n* * 指针运算符指针运算符n n& & 取地址运算符取地址运算符n n指针运算符

75、指针运算符“* “*放在指针变量前面,通过它实现访问以放在指针变量前面,通过它实现访问以指针变量的内容为地址所指向的存储单元。例如:指针变指针变量的内容为地址所指向的存储单元。例如:指针变量量p p中的地址为中的地址为0x20000x2000,那么,那么*p*p所访问的是地址为所访问的是地址为0x20000x2000的存储单元,的存储单元,x=*px=*p,实现把地址为,实现把地址为0x20000x2000的存储的存储单元的内容送给变量单元的内容送给变量x x。n n取地址运算符取地址运算符“&“&放在变量的前面,通过它取得变量的放在变量的前面,通过它取得变量的地址,变量的地址通常送给指针变量

76、。例如:设变量地址,变量的地址通常送给指针变量。例如:设变量x x的的内容为内容为0x120x12,地址为,地址为0x20000x2000,那么,那么&x&x的值为的值为0x20000x2000,如,如有一指针变量有一指针变量p p,那么通常用,那么通常用p=&xp=&x,实现将,实现将x x变量的地址变量的地址送给指针变量送给指针变量p p,指针变量,指针变量p p指向变量指向变量x x,以后可以通过,以后可以通过*p*p访问变量访问变量x x。4.5.1 表达式语句n n在表达式的后边加一个分号“;就构成了表达式语句 4.5.2 复合语句n n复合语句是由假设干条语句组合而成的一种语句,在

77、复合语句是由假设干条语句组合而成的一种语句,在C51C51中,用一个中,用一个大括号大括号“将假设干条语句括在一起就形成了一个复合语句,复合将假设干条语句括在一起就形成了一个复合语句,复合语句最后不需要以分号语句最后不需要以分号“ “;结束,但它内部的各条语句仍需以分号;结束,但它内部的各条语句仍需以分号“ “;结束。复合语句的一般形式为:;结束。复合语句的一般形式为:n n n n局部变量定义;局部变量定义;n n语句语句l l;n n语句语句2 2;n n n n复合语句在执行时,其中的各条单语句按顺序依次执行,整个复合语复合语句在执行时,其中的各条单语句按顺序依次执行,整个复合语句在语法

78、上等价于一条单语句,因此在句在语法上等价于一条单语句,因此在C51C51中可以将复合语句视为一中可以将复合语句视为一条单语句。通常复合语句出现在函数中,实际上,函数的执行局部条单语句。通常复合语句出现在函数中,实际上,函数的执行局部即函数体就是一个复合语句;复合语句中的单语句一般是可执行语即函数体就是一个复合语句;复合语句中的单语句一般是可执行语句,此外还可以是变量的定义语句说明变量的数据类型。在复合句,此外还可以是变量的定义语句说明变量的数据类型。在复合语句内部语句所定义的变量,称为该复合语句中的局部变量,它仅在语句内部语句所定义的变量,称为该复合语句中的局部变量,它仅在当前这个复合语句中有

79、效。利用复合语句将多条单语句组合在当前这个复合语句中有效。利用复合语句将多条单语句组合在起,起,以及在复合语句中进行局部变量定义是以及在复合语句中进行局部变量定义是C51C51语言的一个重要特征。语言的一个重要特征。4.6 C51的输入输出n n在在C51C51语言中,它本身不提供输入和输出语句,输入和输语言中,它本身不提供输入和输出语句,输入和输出操作是由函数来实现的。在出操作是由函数来实现的。在C51C51的标准函数库中提供了的标准函数库中提供了一个名为一个名为“stdio.h“stdio.h的一般的一般I/OI/O函数库,它当中定义了函数库,它当中定义了C51C51中的输入和输出函数。当

80、对输入和输出函数使用时,中的输入和输出函数。当对输入和输出函数使用时,须先用预处理命令须先用预处理命令“#include “#include 将该函数库包将该函数库包含到文件中。含到文件中。n n在在C51C51的一般的一般I/OI/O函数库中定义的函数库中定义的I/OI/O函数都是通过串行接函数都是通过串行接口实现,在使用口实现,在使用I/OI/O函数之前,应先对函数之前,应先对MCS-51MCS-51单片机的串单片机的串行接口进行初始化。选择串口工作方式行接口进行初始化。选择串口工作方式1 1,波特率由定时,波特率由定时器器/ /计数器计数器1 1溢出率定时器溢出率定时器/ /计数器计数器

81、1 1工作在工作在8 8位自动重载位自动重载方式决定。方式决定。n nC51C51的输入输出函数主要有两个的输入输出函数主要有两个, ,一个是格式输出函数一个是格式输出函数printf,printf,它主要通过串口向它主要通过串口向CRTCRT输出各种程序运行信息;一输出各种程序运行信息;一个是格式输入函数个是格式输入函数scanf, scanf, 它主要是通过键盘向系统输入数它主要是通过键盘向系统输入数据或命令。但它们仅在程序调试时在据或命令。但它们仅在程序调试时在“ “宿主机上使用。宿主机上使用。在在“ “目标机上,由于嵌入式控制系统大多具有小、巧、目标机上,由于嵌入式控制系统大多具有小、

82、巧、轻、灵、薄的特点,输入设备简单,显示设备大多用轻、灵、薄的特点,输入设备简单,显示设备大多用LCDLCD,LCDLCD驱动有专门的程序,在本书第驱动有专门的程序,在本书第5 5篇对此有详细讨论。篇对此有详细讨论。因此,这两个输入输出函数在实际系统中用的不多。因此,这两个输入输出函数在实际系统中用的不多。4.6.1 格式输出函数printf()n nprintf()printf()函数的的作用是通过串行接口向函数的的作用是通过串行接口向CRTCRT输出假设干任输出假设干任意类型的数据,它的格式如下:意类型的数据,它的格式如下:n nprintf(printf(格式控制,输出参数表格式控制,输

83、出参数表) )n n格式控制是用双引号括起来的字符串,也称转换控制格式控制是用双引号括起来的字符串,也称转换控制字符串,它包括三种信息:格式说明符、普通字符和转义字符串,它包括三种信息:格式说明符、普通字符和转义字符。字符。n n1 1格式说明符,由格式说明符,由“%“%和格式字符组成,它的作用和格式字符组成,它的作用是用于指明输出的数据的格式输出,如是用于指明输出的数据的格式输出,如%d%d、%f%f等,它们的等,它们的具体情况见表具体情况见表4.34.3。n n2 2普通字符,这些字符按原样输出,用来输出某些普通字符,这些字符按原样输出,用来输出某些提示信息。提示信息。n n3 3转义字符

84、,就是前面介绍的转义字符表转义字符,就是前面介绍的转义字符表4.14.1,用来输出特定的控制符,如输出转义字符用来输出特定的控制符,如输出转义字符nn就是使输出换就是使输出换一行。一行。n n输出参数表是需要输出的一组数据,可以是表达式。输出参数表是需要输出的一组数据,可以是表达式。4.6.2 格式输入函数scanfn nscanfscanf函数的作用是通过串行接口实现数据输入,它函数的作用是通过串行接口实现数据输入,它的使用方法与的使用方法与printfprintf类似,类似, scanfscanf的格式如下:的格式如下:n nscanfscanf格式控制,地址列表格式控制,地址列表n n格

85、式控制与格式控制与printfprintf函数的情况类似,也是用双引函数的情况类似,也是用双引号括起来的一些字符,可以包括以下三种信息:空白字符、号括起来的一些字符,可以包括以下三种信息:空白字符、普通字符和格式说明。普通字符和格式说明。n n空白字符,包含空格、制表符、换行符等,这些字符在输空白字符,包含空格、制表符、换行符等,这些字符在输出时被忽略。出时被忽略。n n1 1普通字符,除了以百分号普通字符,除了以百分号“%“%开头的格式说明符开头的格式说明符而外的所有非空白字符,在输入时要求原样输入。而外的所有非空白字符,在输入时要求原样输入。n n2 2格式说明,由百分号格式说明,由百分号

86、“%“%和格式说明符组成,用和格式说明符组成,用于指明输入数据的格式,它的根本情况与于指明输入数据的格式,它的根本情况与printfprintf相同,相同,具体情况参见表具体情况参见表4.44.4。n n3 3地址列表是由假设干个地址组成,它可以是指针地址列表是由假设干个地址组成,它可以是指针变量、取地址运算符变量、取地址运算符“&“&加变量变量的地址或字符加变量变量的地址或字符串名表示字符串的首地址。串名表示字符串的首地址。n n例例例例4.7 4.7 使用格式输入输出函数的例子使用格式输入输出函数的例子使用格式输入输出函数的例子使用格式输入输出函数的例子n nmain()main()n n

87、 n nint a,b,c,d;int a,b,c,d;n nlong m,n;long m,n;n n/ /串口初始化略串口初始化略串口初始化略串口初始化略n nscanf(“%d,%o,%x,%uscanf(“%d,%o,%x,%u,&a,&b,&c,&d);,&a,&b,&c,&d);n nscanf(“%ld,%lxscanf(“%ld,%lx,&m,&n);,&m,&n);n nprintf(“a=%d,b=%d,printf(“a=%d,b=%d,a,b)a,b)n nprintf(“c=%d,d=%dn,printf(“c=%d,d=%dn,c,d);c,d);n nprintf

88、(“m=%ld,n=%ldn,printf(“m=%ld,n=%ldn,m,n);m,n);n n n n程序运行结果:程序运行结果:程序运行结果:程序运行结果:n n运行到第一个和第二个运行到第一个和第二个运行到第一个和第二个运行到第一个和第二个scanfscanf语句停止,等待输入,我们输入:语句停止,等待输入,我们输入:语句停止,等待输入,我们输入:语句停止,等待输入,我们输入:n n100100,100100,100100,6552565525123456789123456789,1000010000显示显示显示显示屏输出:屏输出:屏输出:屏输出:n na=100,b=64,c=256

89、,d=-11a=100,b=64,c=256,d=-11n nm=123456789,n=65536m=123456789,n=65536n n格式输入函数格式输入函数格式输入函数格式输入函数scanfscanf和格式输出函数和格式输出函数和格式输出函数和格式输出函数printfprintf更详细内容可参考更详细内容可参考更详细内容可参考更详细内容可参考C C语言教材相关章节。语言教材相关章节。语言教材相关章节。语言教材相关章节。4.7.1 C51的根本结构n n1 1顺序结构顺序结构n n顺序结构是最根本、最简单的结构,在这种结构中,程序顺序结构是最根本、最简单的结构,在这种结构中,程序由低

90、地址到高地址依次执行。由低地址到高地址依次执行。具体如图具体如图4.14.1所示,程序所示,程序先执行语句先执行语句A A,然后再执行语句,然后再执行语句B B。n n2 2选择结构选择结构n n选择结构可使程序根据不同的情况,选择执行不同的分支,选择结构可使程序根据不同的情况,选择执行不同的分支,在选择结构中,程序先对一个条件进行判断。当条件成立,在选择结构中,程序先对一个条件进行判断。当条件成立,即条件语句为即条件语句为“ “真时,执行一个分支,当条件不成立时,真时,执行一个分支,当条件不成立时,即条件语句为即条件语句为“ “假时,执行另一个分支。假时,执行另一个分支。n n在在C51C5

91、1中,实现选择结构的语句为中,实现选择结构的语句为if/elseif/else,if/else ifif/else if语句。语句。另外在另外在C51C51中还支持多分支结构,多分支结构既可以通过中还支持多分支结构,多分支结构既可以通过if if和和else ifelse if语句嵌套实现,可用语句嵌套实现,可用swith/caseswith/case语句实现。语句实现。n n选择程序结构具体如图选择程序结构具体如图4.24.2所示。所示。n n3 3循环结构循环结构n n在程序处理过程中,有时需要某一段程序重复执行屡次,在程序处理过程中,有时需要某一段程序重复执行屡次,这时就需要循环结构来实

92、现,循环结构就是能够使程序段这时就需要循环结构来实现,循环结构就是能够使程序段重复执行的结构。循环结构又分为两种:当重复执行的结构。循环结构又分为两种:当whilewhile型型循环结构和直到循环结构和直到do.whiledo.while型循环结构。型循环结构。 n n1 1当型循环结构当型循环结构n n 当型循环结构如图当型循环结构如图4.34.3,当条件,当条件P P成立为成立为“ “真真时,重复执行语句时,重复执行语句A A,当条件不成立为,当条件不成立为“ “假时才停止重复,执行后面的程序。假时才停止重复,执行后面的程序。n n2 2直到型循环结构直到型循环结构n n 直到型循环结构如

93、图直到型循环结构如图4.44.4,先执行语句,先执行语句A A,再判,再判断条件断条件P P,当条件成立为,当条件成立为“ “真时,再重复真时,再重复执行语句执行语句A A,直到条件不成立为,直到条件不成立为“ “假时才假时才停止重复,执行后面的程序。停止重复,执行后面的程序。4.7.2 if语句n nif if语句是语句是C51C51中的一个根本条件选择语句,它通常有三种格式:中的一个根本条件选择语句,它通常有三种格式:n n1 1if if 表达式表达式 语句;语句; n n2 2if if 表达式表达式 语句语句1 1; else else 语句语句2 2; n n3 3if if 表达

94、式表达式1 1 语句语句1 1; n nelse if else if 表达式表达式2 2 语句语句2 2;n nelse if else if 表达式表达式3 3 语句语句3 3;n nn nelse ifelse if表达式表达式n-1n-1 语句语句n-1n-1;n nelse else 语句语句nnn n例例4.8 if 4.8 if 语句的使用语句的使用n nif (score=90) printf(“You result is an Anif (score=90) printf(“You result is an An); );n nelse if (score=80) print

95、f(“You result is an Bnelse if (score=80) printf(“You result is an Bn); );n nelse if (score=70) printf(“You result is an Cnelse if (score=70) printf(“You result is an Cn); );n nelse if (score=60) printf(“You result is an Dnelse if (score=60) printf(“You result is an Dn); );n nelse printf(“You result

96、is an Enelse printf(“You result is an En); );n n执行以上程序后,就可以根据分数,分别打出执行以上程序后,就可以根据分数,分别打出A A,B B,C C,D D,E E五个等级。五个等级。4.7.3 switch/case语句n nif if语句通过嵌套可以实现多分支结构,但结构复杂。语句通过嵌套可以实现多分支结构,但结构复杂。switchswitch是是C51C51中提供的专门处理多分支结构的多分支选择中提供的专门处理多分支结构的多分支选择语句。它的格式如下:语句。它的格式如下:n nswitch switch 表达式表达式n ncase cas

97、e 常量表达式常量表达式1 1: 语句语句1 1;breakbreak;n ncase case 常量表达式常量表达式2 2: 语句语句2 2;breakbreak;n nn ncase case 常量表达式常量表达式n n: 语句语句n n;breakbreak;n ndefaultdefault: 语句语句n+1n+1; n n说明如下:说明如下:n n1 1switchswitch后面括号内的表达式,可以是整型或字符后面括号内的表达式,可以是整型或字符型表达式。型表达式。n n2 2当该表达式的值与某一当该表达式的值与某一“case“case后面的常量表达后面的常量表达式的值相等时,就执

98、行该式的值相等时,就执行该“case“case后面的语句,然后遇到后面的语句,然后遇到breakbreak语句退出语句退出switchswitch语句。假设表达式的值与所有语句。假设表达式的值与所有casecase后的常量表达式的值都不相同,那么执行后的常量表达式的值都不相同,那么执行defaultdefault后面的语后面的语句,然后退出句,然后退出switchswitch结构。结构。n n3 3每一个每一个casecase常量表达式的值必须不同否那么会出现自相矛盾的现象。常量表达式的值必须不同否那么会出现自相矛盾的现象。n n4 4casecase语句和语句和defaultdefault语

99、句的出现次序对执行过程没有影响。语句的出现次序对执行过程没有影响。n n5 5每个每个casecase语句后面可以有语句后面可以有“break“break,也可以没有。有,也可以没有。有breakbreak语句,执行到语句,执行到breakbreak那么退出那么退出switchswitch结构,假设没有,那么会顺次执行后面的语句,直到遇到结构,假设没有,那么会顺次执行后面的语句,直到遇到breakbreak或结束。或结束。n n6 6每一个每一个casecase语句后面可以带一个语句,也可以带多个语句,还可以不带。语语句后面可以带一个语句,也可以带多个语句,还可以不带。语句可以用花括号括起,也

100、可以不括。句可以用花括号括起,也可以不括。n n7 7多个多个casecase可以共用一组执行语句。可以共用一组执行语句。n n例例4.9 switch/case4.9 switch/case语句的使用语句的使用n n#include#includen nmain()main()n n n nfloat a,b;float a,b;n nchar c;char c;n nprintf(“input expression:a+(-,*,/)bn);printf(“input expression:a+(-,*,/)bn);); );n nscanf(“%f%c%fscanf(“%f%c%f,&a

101、,&c,&b);,&a,&c,&b);n nswitch(c)switch(c)n n n n case+:printf(“%fn case+:printf(“%fn,a+b);break;,a+b);break;n n case-:printf(“%fn case-:printf(“%fn,a-b);break;,a-b);break;n n case*:printf(“%fn case*:printf(“%fn,a*b);break;,a*b);break;n n case/:printf(“%fn case/:printf(“%fn,a/b);break;,a/b);break;n n

102、default: printf(“input errorn default: printf(“input errorn); );n n n n 4.7.4 while语句n nwhilewhile语句在语句在C51C51中用于实现当型循环结构,它的中用于实现当型循环结构,它的格式如下:格式如下:n n while while表达式表达式n n 语句;语句; / /循环体循环体n nwhilewhile语句后面的表达式是能否循环的条件,后面语句后面的表达式是能否循环的条件,后面的语句是循环体。当表达式为非的语句是循环体。当表达式为非0 0真时,就真时,就重复执行循环体内的语句;当表达式为重复执行

103、循环体内的语句;当表达式为0 0假,假,那么中止那么中止whilewhile循环,程序将执行循环结构之外的循环,程序将执行循环结构之外的下一条语句。它的特点是:先判断条件,后执行下一条语句。它的特点是:先判断条件,后执行循环体。在循环体中对条件进行改变,然后再判循环体。在循环体中对条件进行改变,然后再判断条件,如条件成立,那么再执行循环体,如条断条件,如条件成立,那么再执行循环体,如条件不成立,那么退出循环。如条件第一次就不成件不成立,那么退出循环。如条件第一次就不成立,那么循环体一次也不执行。立,那么循环体一次也不执行。 n n例例例例4.10 while4.10 while语句的使用语句的

104、使用语句的使用语句的使用n n#include#includen nmain()main()n n n n int sum=0,i=1; int sum=0,i=1;n n while (i=100) while (i=100)n n n n sum=sum+i; sum=sum+i;n n i+; i+;n n n nprintf(“1+2+3+100=%dnprintf(“1+2+3+100=%dn,sum);,sum);n n n n程序运行结果:程序运行结果:程序运行结果:程序运行结果:1+2+3+100=50501+2+3+100=50504.7.5 do while语句n ndo

105、whiledo while语句在语句在C51C51中用于实现直到型循环结构,它的格式如下:中用于实现直到型循环结构,它的格式如下:n n do don n 语句;语句; / /循环体循环体n n while while表达式;表达式;n n它的特点是:先执行循环体中的语句,后判断表达式。如表达式成立真,它的特点是:先执行循环体中的语句,后判断表达式。如表达式成立真,那么再执行循环体,然后又判断,直到有表达式不成立假时,退出循环,那么再执行循环体,然后又判断,直到有表达式不成立假时,退出循环,执行执行do whiledo while结构的下一条语句。结构的下一条语句。do whiledo whi

106、le语句在执行时,循环体内的语句至语句在执行时,循环体内的语句至少会被执行一次。少会被执行一次。n n例例4.11 do while4.11 do while语句的使用语句的使用n n#include#includen nmain()main()n n n nint sum=0,i=1;int sum=0,i=1;n ndodon n n n sum=sum+i; sum=sum+i;n n i+; i+;n n n nwhile(i=100);while(i=100);n nprintf(“1+2+3+100=%dnprintf(“1+2+3+100=%dn,sum);,sum);n n程序

107、运行结果:程序运行结果:1+2+3+100=50501+2+3+100=50504.7.6 for语句语句 n n在在C51C51语言中,语言中,forfor语句是使用最灵活、用得最多语句是使用最灵活、用得最多的循环控制语句,同时也最为复杂。它可以用于的循环控制语句,同时也最为复杂。它可以用于循环次数已经确定的情况,也可以用于循环次数循环次数已经确定的情况,也可以用于循环次数不确定的情况。它完全可以代替不确定的情况。它完全可以代替whilewhile语句,功能语句,功能最强大。它的格式如下:最强大。它的格式如下:n nforfor表达式表达式1 1;表达式;表达式2 2;表达式;表达式3 3n

108、 n 语句;语句; / /循环体循环体n nforfor语句后面带三个表达式,它的执行过程如语句后面带三个表达式,它的执行过程如下:下:n n 1 1先求解表达式先求解表达式1 1的值。的值。n n 2 2求解表达式求解表达式2 2的值,如表达式的值,如表达式2 2的值为真,那的值为真,那么执行循环休中的语句,然后执行下一步么执行循环休中的语句,然后执行下一步3 3的操的操作,如表达式作,如表达式2 2的值为假,那么结束的值为假,那么结束forfor循环,转循环,转到最后一步。到最后一步。n n 3 3假设表达式假设表达式2 2的值为真,那么执行完循环体的值为真,那么执行完循环体中的语句后,求

109、解表达式中的语句后,求解表达式3 3,然后转到第四步。,然后转到第四步。n n 4 4转到转到2 2继续执行。继续执行。n n 5 5退出退出forfor循环,执行下面的一条语句。循环,执行下面的一条语句。n n在在forfor循环中,一般表达式循环中,一般表达式1 1为初值表达式,用于为初值表达式,用于给循环变量赋初值;表达式给循环变量赋初值;表达式2 2为条件表达式,对为条件表达式,对循环变量进行判断;表达式循环变量进行判断;表达式3 3为循环变量更新表为循环变量更新表达式,用于对循环变量的值进行更新,使循环变达式,用于对循环变量的值进行更新,使循环变量能不满足条件而退出循环。量能不满足条

110、件而退出循环。n n例例例例4.12 for4.12 for语句的使用语句的使用语句的使用语句的使用n n#include#includen nmain()main()n n n nint sum=0,i=1;int sum=0,i=1;n nfor (i=1;i=100;i+)for (i=1;i=100;i+)n nsum= sum+i;sum= sum+i;n nprintf(“1+2+3+100=%dnprintf(“1+2+3+100=%dn,sum);,sum);n n程序运行结果:程序运行结果:程序运行结果:程序运行结果:1+2+3+100=50501+2+3+100=5050n

111、 n4.7.7 4.7.7 循环的嵌套循环的嵌套循环的嵌套循环的嵌套n n在一个循环的循环体内又包含一个完整的循在一个循环的循环体内又包含一个完整的循在一个循环的循环体内又包含一个完整的循在一个循环的循环体内又包含一个完整的循环结构,这种两重循环结构叫循环的嵌套,在环结构,这种两重循环结构叫循环的嵌套,在环结构,这种两重循环结构叫循环的嵌套,在环结构,这种两重循环结构叫循环的嵌套,在C51C51中,允许三层循环嵌套,循环嵌套多用在软中,允许三层循环嵌套,循环嵌套多用在软中,允许三层循环嵌套,循环嵌套多用在软中,允许三层循环嵌套,循环嵌套多用在软件延时程序中。件延时程序中。件延时程序中。件延时程

112、序中。n n例例例例4.13 4.13 循环嵌套程序循环嵌套程序n nvoid delay(unsigned char CNT)void delay(unsigned char CNT)n n n n unsigned int i;unsigned int i;n n n n while (CNT- !=0)while (CNT- !=0)n n for (i=20000; i !=0; i-);for (i=20000; i !=0; i-);n n n n4.7.8 break4.7.8 break和和continuecontinue语句语句n nbreakbreak和和continuec

113、ontinue语句通常用于循环结构中,用来跳出循语句通常用于循环结构中,用来跳出循环结构。但是二者又有所不同,下面分别介绍。环结构。但是二者又有所不同,下面分别介绍。n n1 1breakbreak语句语句n n前面已介绍过用前面已介绍过用breakbreak语句可以跳出语句可以跳出switchswitch结构,使程序结构,使程序继续执行继续执行switchswitch结构后面的一个语句。使用结构后面的一个语句。使用breakbreak语句还语句还可以从循环体中跳出循环,提前结束循环而接着执行循环可以从循环体中跳出循环,提前结束循环而接着执行循环结构下面的语句。它不能用在除了循环语句和结构下面

114、的语句。它不能用在除了循环语句和switchswitch语句语句之外的任何其它语句中。之外的任何其它语句中。n n例例例例4.14 break4.14 break语句的应用语句的应用语句的应用语句的应用, ,计算圆的面积计算圆的面积计算圆的面积计算圆的面积, ,当面积大于当面积大于当面积大于当面积大于100100时时时时, ,程序结束。程序结束。程序结束。程序结束。n nfor (r=1;r=10;r+)for (r=1;r100) break; if(area100) break;n n printf(“%fn printf(“%fn, area);, area);n n n n2 2con

115、tinuecontinue语句语句语句语句n ncontinuecontinue语句用在循环结构中,用于结束本次循环,跳过循环体中语句用在循环结构中,用于结束本次循环,跳过循环体中语句用在循环结构中,用于结束本次循环,跳过循环体中语句用在循环结构中,用于结束本次循环,跳过循环体中continuecontinue下面尚未执行的语句,直接进行下一次是否执行循环的判下面尚未执行的语句,直接进行下一次是否执行循环的判下面尚未执行的语句,直接进行下一次是否执行循环的判下面尚未执行的语句,直接进行下一次是否执行循环的判定。定。定。定。n n例例例例4.15 continue4.15 continue语句的

116、应用,输出语句的应用,输出语句的应用,输出语句的应用,输出100200100200间不能被间不能被间不能被间不能被3 3整除的数整除的数整除的数整除的数n nfor (i=100;i=200;i+)for (i=100;iC&B= =Cn n A|B+C&B-Cn n !(AB)&!C|1n n !(A+B)+C-1&B+Cn n1414,写出程序运行结果。,写出程序运行结果。n n#include#includen nextern serial_initial();/extern serial_initial();/串口初始化,省略串口初始化,省略n nmain()main()n n n n

117、int x,y ,z;int x,y ,z;n nserial_initial();serial_initial();n nprintf(“input data x,y?nprintf(“input data x,y?n); );n nscanf (“%d,%d,scanf (“%d,%d,&x,&y);,&x,&y);n nprintf(“n x y xy xy x=y x!=y x= =yprintf(“n x y xy xy x=y x!=y x= =y); );n nprintf(“nprintf(“n); );n nprintf(n%3d,%3dprintf(n%3d,%3d,x,y);,x,y);n nz=xy printf(“%5dz=xy printf(“%5d,z);,z);n nz=x=y printf(“%5dz=xy printf(“%5dz=xy printf(“%5d,z);,z);n nz=x!=y printf(“%5dz=x!=y printf(“%5d,z);,z);n nz=x=y printf(“%5dz=x=y printf(“%5d,z);,z);n nwhile(1);while(1);n n

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号