




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第4章 C51高级语言程序设计 4.1 C语言高级编程4.1.1 C语言的特点 C语言功能丰富,表达能力强,使用灵活方便,应用面广,目标程序效率高,可移植性好,能直接对计算机硬件进行操作。既有高级语言的特点,也具有汇编语言的特点。语言简洁、紧凑,使用方便、灵活。 运算符丰富。数据结构丰富,拥有现代语言的各种数据结构。 可进行结构化程序设计。可以直接对计算机硬件进行操作。生成的目标代码质量高,程序执行效率高。 可移植性好。4.1.2 C语言与MCS-51单片机 汇编语言优点:执行效率高、速度快、与硬件结合紧密;I/O端口操作时,使用汇编语言快捷、直观。 缺点:编程难度大,可读性差,不便于移植,开
2、发周期长。 C语言优点:程序设计相比照较容易,支持多种数据类型,可移植性强,也能够对硬件直接访问,能够按地址方式访问存储器或I/O端口。 故目前有较多的开发者用C语言开发单机应用系统软件。4.1.3 C51编译器 C51编译器的作用是将C语言源程序翻译成51系列单片机可执行的代码,并且为程序调试提供必要的符号信息。目前使用最广泛的是德国Keil公司的Keil Vision C51编译器 Keil C51 编译器在代码生成方面领先,可产生最少的代码。它支持浮点数和长整型、重入和递归。4.1.4 keil 8051开发工具 采用C51编写的应用程序结构清楚、模块化程度高、可读性强。 应用C51进行
3、软件开发,用户可以不必具体考虑存放器、存储器的分配等工作,而把这局部工作交给编译、连接软件,用户只需了解MCS-51的存储器结构。 C51开发环境一般都提供了数学计算等子程序库,为程序开发带来方便。 对于相对复杂的系统开发或复杂运算,比用汇编语言容易的多,有利于系统的维护和升级。 在实时要求较高的场合,可采用C51汇编混合编程。4.1.5 C51程序结构 C51程序结构与标准的C语言程序结构相同,采用函数结构,一个程序由一个或多个函数组成。 有一个且只有一个为main()函数。 在main( )函数中可调用库函数和用户定义的函数。 程序的开始局部一般是预处理命令、函数说明和变量定义等。预处理命
4、令 #include函数说明 long fun1( ) ; float fun2( );变量定义int x ,y; float z;主函数 main( ) fun1( ); /*调用功能函数 1*/ fun2( ); /*调用功能函数 2*/ 功能函数1 fun1( ); 函数体1 功能函数2 fun2( ); 函数体2 C51程序的结构实例:4.2 C51对标准C语言的扩展4.2.1 存储区域 51系列单片机的内存区域被分为两大类。一类是程序存储区,即ROM;另一类是数据存储区,包括内部数据存储区和外部数据存储区。内部数据存储区中又包含了51的特殊功能存放器。 1.程序存储区 程序存储区由关
5、键字code进行说明。 2.内部数据存储区在C51中可以用以下关键字对变量进行内部存储区的定位。 Data:直接寻址区,内部RAM的低128B,即00H7FH Idata:间接寻址区,整个RAM区,即00H0FFH Bdata:可位寻址区,从20H开始的16个可以位寻址的字节,即20H2FH4.2.1 存储区域 3.外部数据存储区 C51中,可以用以下关键字对变量进行内部存储区的访问。 xdata:可指定多达64KB的外部直接寻址区,地址范围0000H0FFFFH pdata:能访问1页256B的外部RAM,主要用在紧凑模式Compact Modle4.2.1 存储区域4.2.2 C51的数据
6、类型 1字符型char char有signed char和unsigned char之分,默认为signed char。 2整型int int有signed int和unsigned int之分,默认为signed int。 3长整型long long有signed long和unsigned long之分,默认为signed long。 4浮点型float float型数据的长度为4个字节,包含指数和尾数两局部,最高位为符号位,“1表示负数,“0表示正数,其余8位为阶码,最后23位为尾数的有效数位,由于尾数的整数局部隐含为“1,所以尾数的精度为24位。格式似Pentium CPU 浮点数格式
7、符号位+8位阶码+1隐含.23位尾数 5指针型(*) 指针型本身就是一个变量,在这个变量中存放着指向另一个数据的地址。这个指针变量要占用一定的内存单元。对于不同的处理器其长度不一样,在C51中它的长度一般为13个字节。6特殊功能存放器型 这是C51扩充的数据类型,用于访问MCS-51单片机中的特殊功能存放器数据。它分为sfr和sfr16两种类型,其中sfr占一个字节单元,利用它可以访问MCS-51内部的所有特殊功能存放器;sfr16占用两个字节单元,利用它可以访问MCS-51内部所有两个字节的特殊功能存放器。在C51中对特殊功能存放器的访问必须先用sfr和sfr16进行声明。4.2.2 C51
8、的数据类型 7位类型 除了这些标准数据类型外,为了智能仪器仪表和工业自动化系统的需要,C51增加了一种位数据类型,用于访问MCS-51单片机中可寻址的位单元。 在C51中支持两种位类型:bit型和sbit型。其中用bit定义的位变量在C51编译器编译时,在不同的时候位地址是可以变化的。而用sbit定义的位变量必须与MCS-51单片机的一个可以寻址位单元或可位寻址的字节单元中的某一位联系在一起,在C51编译器编译时,其对应的位地址是不可变化的。如:bit lock_pt ; /*将lock_pt定义为位变量*/ 4.2.2 C51的数据类型 特殊功能存放器用sfr 来定义,而sfr16 用来定义
9、16 位的特殊功能存放器如DPTR。通过名字或地址来引用特殊功能存放器,地址必须高于80H 。可位寻址的特殊功能存放器的位变量定义用关键字sbit。 SFR 的定义如下所示:sfr SCON=0X98; /定义 SCONsbit SM0=0X9F; /定义 SCON 的各位sbit SM1=0X9E; sbit SM2=0X9D;sbit REN=0 x9C; sbit TB8=0X9B; sbit RB8=0X9A; sbit TI=0X99;sbit RI=0X98;7位类型4.2.3 C51的常量和变量一、常量 常量是指在程序执行过程中其值不能改变的量。在C51中支持整型常量、浮点型常量
10、、字符型常量和字符串型常量。1整型常量整型常量也就是整型常数,根据其值范围在计算机中分配不同的字节数来存放。 2浮点型常量浮点型常量也就是实型常数,有十进制表示形式和指数表示形式两种。 3字符型常量 字符型常量是用单引号括起的字符,如a、1、F等。它可以是可显示的ASCII字符,也可以是不可显示的控制字符。对不可显示的控制字符,需在前面加反斜杠“组成转义字符。4字符串型常量 字符串型常量由双引号括起的字符组成,如“D、“1234、“ABCD等。注意:一个字符常量在内存中只用一个字节存放,而一个字符串常量在内存中存放时,不仅仅引号内的字符一个要占一个字节,而且系统会自动在后面加一个转义字符“0作
11、为字符串结束符。因此不要将字符常量和字符串常量混淆,如字符常量A和字符串常量A是不一样的。一、常量二、变量1数据类型说明符 在定义变量时,必须通过数据类型说明符指明变量的数据类型,指明变量在存储器中占用的字节数。 2变量名 变量名是C51为了区分不同变量,为变量取的名称。在C51中规定变量名可以由3种字符组成字母、数字和下画线,且第一个字母必须是字母或下画线。变量名有两种:普通变量名和指针变量名。它们的区别是指针变量名前面要带“*号。3存储种类 存储种类是指变量在程序执行过程中的作用范围。C51变量的存储种类有4种,分别是自动(auto)、外部(extern)、静态(static)和存放器(r
12、egister)。4存储器类型 存储器类型是用于指明变量所处单片机的存储器区域情况。存储器类型与存储种类完全不同。 5特殊功能存放器变量 MCS-51系列单片机片内有许多特殊功能存放器,通过这些特殊功能存放器可以控制MCS-51系列单片机的定时器、计数器、串口、I/O及其他功能部件,每一个特殊功能存放器在片内RAM中都对应于一个字节单元或两个字节单元。 6位变量 在C51中,允许用户通过位类型符定义变量。位类型符有两个:bit和sbit。可以定义两种位变量。bit位类型符用于定义一般的可进行位处理的位变量。二、变量4.2.4 存储模式 C51编译器支持3种存储模式:SMALL模式、COMPAC
13、T模式和LARGE模式。不同的存储模式对变量默认的存储器类型不一样。(1)SMALL模式。SMALL模式称为小编译模式,在SMALL模式下,编译时函数参数和变量被默认在片内RAM中,存储器类型为data。(2)COMPACT模式。COMPACT模式称为紧凑编译模式,在COMPACT模式下编译时,函数参数被默认在片外RAM的低256B空间,存储器类型为pdata。(3)LARGE模式。LARGE模式称为大编译模式,在LARGE模式下,编译时函数参数和变量被默认在片外RAM的64B空间,存储器类型为xdata。4.2.5 绝对地址的访问1使用C51运行库中预定义宏 C51编译器提供了一组宏定义来对
14、MCS-51系列单片机的code、data、pdata和xdata空间进行绝对寻址。 2通过指针访问 采用指针的方法,可以实现在C51程序中对任意指定的存储器单元进行访问。3使用C51扩展关键字_at_ 使用_at_是对指定的存储器空间的绝对地址进行访问,一般格式如下:存储器类型 数据类型说明符 变量名 _at_ 地址常数4.3 C51的运算符及表达式 C51有很强的数据处理能力,具有十分丰富的运算符,利用这些运算符可以组成各种表达式及语句。在C51中,运算符按其在表达式所起的作用,可分为赋值运算符、算术运算符、自增与自减运算符、关系运算符、逻辑运算符、位运算符、复合赋值运算符、逗号运算符、条
15、件运算符、指针和地址运算符以及强制类型转换运算符等。另外,运算符按其在表达式中与运算对象的关系,又可分为单目运算符、双目运算符和三目运算符等。表达式那么是由运算符及运算对象所组成的具有特定含义的式子。 4.3.1 算术运算符 C51中支持的算术运算符有:+ 加或取正值运算符; 减或取负值运算符;* 乘运算符;/ 除运算符;% 取余数运算符 加、减、乘运算相比照较简单,而对于除运算,如果相除的两个数为浮点数,那么运算的结果也为浮点数;如果相除的两个数为整数,即为整除。例如,25.0/20.0的结果为1.25,而25/20的结果为1。 对于取余运算,那么要求参加运算的两个数必须为整数,运算结果为它
16、们的余数。例如,x=5%3,结果x的值为2。4.3.2 关系和逻辑运算符 C51中有6种关系运算符,分别如下: 大于;= 大于等于; 3,结果为真(1),而10=100,结果为假(0)。 C51有3种逻辑运算符: 逻辑或;& 逻辑与;! 逻辑非 关系运算符用于反映两个表达式之间的大小关系,逻辑运算符那么用于求条件式的逻辑值,用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式。逻辑“与的格式为:条件式1&条件式2逻辑“或的格式为:条件式1条件式2逻辑“非的格式为:! 条件式4.3.2 关系和逻辑运算符4.3.3 位运算符 C51语言能对运算对象按位进行操作,它与汇编语言使用一样方便。位
17、运算是按位对变量进行运算的,但并不改变参与运算的变量的值。如果要求按位改变变量的值,那么要利用相应的赋值运算。C51中位运算符只能对整数进行操作,不能对浮点数进行操作。C51中的位运算符有: & 按位与; 按位或; 按位异或; 按位取反; 右移4.3.4 逗号运算符 在C51语言中,逗号“,是一个特殊的运算符,可以用它将两个或两个以上的表达式连接起来,称为逗号表达式。逗号表达式的一般格式为: 表达式1,表达式2,表达式n 程序执行时对逗号表达式的处理:按从左至右的顺序依次计算出各个表达式的值,而整个逗号表达式的值是最右边的表达式(表达式n)的值。 例如: x=(a=3,6*3) 结果x的值为1
18、8。4.3.5 赋值运算符 在C51中,赋值运算符“=的功能是将一个数据的值赋给一个变量,如x=10。利用赋值运算符将一个变量与一个表达式连接起来的式子称为赋值表达式。在赋值表达式的后面加一个分号“;就构成了赋值语句,一个赋值语句的格式为:变量=表达式; 执行时先计算出右边表达式的值,然后赋值给左边的变量。例如: x=8+9; /* 将8+9的值赋给变量x */ x=y=5; /* 将常数5同时赋值给变量x和y */ 在C51中,允许在一个语句中同时给多个变量赋值,赋值顺序自右向左。 C51语言中支持在赋值运算符“=的前面加上其他运算符,组成复合赋值运算符。下面是C51中支持的复合赋值运算符:
19、 += 加法赋值;= 减法赋值; *= 乘法赋值;/= 除法赋值; %= 取模赋值;&= 逻辑与赋值; = 逻辑或赋值; = 逻辑异或赋值; = 逻辑非赋值;= 右移位赋值; b)?a:b的执行结果是将a和b中较大的数赋给变量max。4.3.7 指针与地址运算符指针是C51语言中一个十分重要的概念,在C51中的数据类型中专门有一种指针类型。 指针为变量的访问提供了另一种方式,变量的指针就是该变量的地址,还可以定义一个专门指向某个变量的地址指针变量。为了表示指针变量和它所指向的变量地址之间的关系,C51中提供了两个专门的运算符:* 指针运算符;& 取地址运算符指针运算符“*放在指针变量前面,通过
20、它可以访问以指针变量的内容为地址所指向的存储单元。取地址运算符“&放在变量的前面,通过它取得变量的地址,变量的地址通常送给指针变量。 4.3.8 表达式和表达式语句 C51语言是一种结构化的程序设计语言,它提供了十分丰富的程序控制语句,表达式语句是最根本的一种语句。在表达式的后边加一个分号“;就构成了表达式语句,下面的语句都是合法的表达式语句: a=+b*3;x=4;y=7;+k;复合语句是由假设干条语句组合而成的一种语句。在C51中,用一个大括号“ 将假设干条语句括在一起就形成了一个复合语句。复合语句最后不需要以分号“;结束,但它内部的各条语句仍需以分号“;结束。复合语句的一般形式为:局部变
21、量定义;语句1;语句2;4.3.8 表达式和表达式语句4.4 C51函数在程序设计过程中,对于较大的程序一般采用模块化结构。通常将其分成假设干个子程序模块,每个子程序模块完成一种特定的功能。在C51中,子程序模块是用函数来实现的。在前面介绍C51的程序结构中,C51的程序是由一个主函数和假设干个子函数组成的,每个子函数完成一定的功能。在一个程序中只能有一个主函数,主函数不能被调用。程序执行时从主函数开始,到主函数最后一条语句结束。子函数可以被主函数调用,也可以被其他子函数或其本身调用形成子程序嵌套。在C51中,系统提供了丰富的功能函数放于标准函数库中,以供用户调用。如果用户需要的函数没有包含在
22、函数库中,用户也可以根据需要自己定义函数以便使用。从C51程序结构上划分主函数main( )和普通函数两种。一个程序只需要一个主函数,可以有很多个普通函数。1对于普通函数,从用户的角度看,有两种类型:标准库函数标准库函数由C51编译系统提供,用户不必自己定义,可以直接使用。一般库函数都是具有一定独立功能的公用函数,在编译系统设计时,设计者将它们放在系统的库函数中,所以称作库函数。不同系统提供的库函数的数量和功能都有所不同,作为用户,在进行程序设计时应该善于使用这些资源,以便提高效率,节省开发时间。用户自定义函数用户自定义函数是用户根据自己的需要在程序中自己编写的函数。一、函数的分类2从函数定义
23、形式划分 对于普通函数,从函数定义的形式上,可划分为:无参数函数 该函数在调用时没有参数,主调函数并不将数据传送给被调用函数,一般用来执行指定的一组操作。无参数函数可以带回也可以不带回函数值。有参数函数 调用该函数时,在主调函数和被调函数之间有参数传递,主调用函数名后面括号中的变量称为“实际参数简称实参。 实参和形参的类型必须一致,否那么会发生错误,形参在被调用之前,并不占用实际内存单元。只有当函数被调用后,被调用函数的形参才被分配给内存单元。 空函数该函数没有语句,调用该函数,什么工作也不做。二、函数的定义 用户用C51进行程序设计的过程中,既可以用系统提供的标准库函数,也可以使用用户自己定
24、义的函数。对于系统提供的标准库函数,用户使用时需在之前通过预处理命令#include将对应的标准函数库包含到程序开始。而对于用户自定义函数,在使用之前必须对它进行定义,定义之后才能调用。函数定义的一般格式如下:函数类型 函数名(形式参数表) reentrantinterrupt musing n形式参数说明局部变量定义;函数体;三、函数的调用与声明1函数的调用 函数调用的一般形式为:函数名;2自定义函数的声明 在C51程序设计中,如果一个自定义函数的调用在函数的定义之后,在使用函数时可以不对函数进行说明;如果一个函数的调用在定义之前,或调用的函数不在本文件内部,而是在另一个文件中,那么在调用之
25、前需对函数进行声明,指明所调用的函数在程序中有定义或在另一个文件中,并将函数的相关信息通知编译系统。函数的声明是通过函数的原型来指明的。四、函数的嵌套与递归1函数的嵌套 在C51语言中,函数的定义是相互平行、独立的。在函数定义时,一个函数体内不能包含另一个函数,即函数不能嵌套定义。但是在一个函数的调用过程中可以调用另一个函数,即允许嵌套调用函数。C51编译器通常依靠堆栈来进行参数传递,由于C51的堆栈设在片内RAM中,而片内RAM的空间有限,因而嵌套的深度比较有限,一般在几层以内。如果层数过多,就会导致堆栈空间不够而出错。2函数的递归 递归调用是嵌套调用的一个特殊情况。如果在调用一个函数过程中
26、又出现了直接或间接调用该函数本身,那么称为函数的递归调用。 在函数的递归调用中要防止出现无终止的自身调用,应通过条件控制结束递归调用,使得递归的次数有限。四、函数的嵌套与递归4.5 C51构造数据类型 前面介绍了C51语言中字符型、整型、浮点型、位型和存放器型等根本数据类型。另外,C51中还提供指针类型和由根本数据类型构造的组合数据类型,组合数据类型主要有数组、指针、结构、联合和枚举。4.5.1 数组和指针一、数组 数组是一个由假设干同类型变量组成的集合,数组中的各个元素可以用数组名和下标来唯一确定。数组在使用之前必须先对其进行定义。1一维数组 一维数组只有一个下标,定义的形式如下: 数据类型
27、说明符 数组名常量表达式=初值1,初值2,2字符数组 用来存放字符数据的数组称为字符数组。字符数组中的每一个元素都用来存放一个字符,也可用字符数组来存放字符串。在定义时把数据类型定义为char型。二、指针1指针的概念指针就是数据在内存单元的地址。要理解指针,先要了解数据在内存中的存储和读取方法。2指针变量的定义在C51语言中,指针变量使用之前必须对它进行定义,指针变量的定义与一般变量的定义类似,定义的一般形式为:数据类型说明符 存储器类型 *指针变量名;3指针变量的引用 指针变量是存放另一变量地址的特殊变量的,指针变量只能存放地址。指针变量在使用时应注意两个运算符:&和*。这两个运算符在前面已
28、经介绍,其中,“&是取地址运算符,“*是指针运算符。通过“&取地址运算符可以把一个变量的地址送给指针变量,使指针变量指向该变量;通过“*指针运算符可以实现通过指针变量访问它所指向的变量的值。4.5.2 结构、共同体和枚举一、结构1结构与结构变量的定义 结构与结构变量是两个不同的概念,结构是一种组合数据类型,结构变量是取值为结构这种组合数据类型的变量,相当于整型数据类型与整型变量的关系。对于结构与结构变量的定义有两种方法。2结构变量的引用 在定义一个结构变量之后,就可以对它进行引用,即可以进行赋值、存取和运算。一般情况下,结构变量的引用是通过对其结构元素的引用来实现的,结构元素引用的一般格式如下
29、:结构变量名.结构元素名 或 结构变量名-结构元素名二、结构数组 C51允许将具有相同结构类型的变量定义为结构数组,结构数组与一般变量数组的不同在于结构数组的每一个元素都具有同一个结构类型的变量,它们具有同一个结构类型,含有相同的成员项。例 结构数组的定义和引用struct document unsigned int number; unsigned int age; bit sex; ; /*定义document的结构类型*/struct document student20; /*定义20个数组元素的结构数组*/ /* student,每个数组元素都是document结构类型*/stude
30、nt5.age =18; /*对结构数组成员进行赋值*/三、共同体1共同体的定义 共同体的定义与结构的定义类似,可以先定义共同体类型再定义共同体变量,也可以在定义共同体类型的同时定义共同体变量。(1) 先定义共同体类型再定义共同体变量。 定义共同体类型的格式如下: union共同体类型名 成员列表; 定义共同体变量的格式如下: union共同体类型名 变量列表 2共同体变量的引用 与结构变量一样,在定义了一个共同体变量之后,就可以对它进行引用,可以对它进行赋值、存取和运算。同样,共同体变量的引用是通过对其元素的引用来实现的,共同体变量中元素的引用与结构变量中元素的引用格式相同,格式如下: 共同
31、体变量名.共同体元素 或 共同体变量名-共同体元素三、共同体四、枚举 枚举数据类型是一个有名字的某些整型常量的集合。这些整型常量是该类型变量可取的所有合法值。枚举定义时应当列出该类型变量的所有可取值。 枚举定义的格式与结构和联合根本相同,也有两种方法。先定义枚举类型再定义枚举变量,格式如下: enum 枚举名 枚举值列表; enum 枚举名 枚举变量列表;或在定义枚举类型的同时定义枚举变量,格式如下: enum 枚举名 枚举值列表枚举变量列表;4.6 C51库函数 C51强大功能及其高效率的重要表达之一在于其丰富的可直接调用的库函数,多使用库函数使程序代码简单,结构清晰,易于调试和维护,提高编
32、程效率。由于mcs-51系列本身的特点,某些库函数的参数和调用格式与标准的C有所不同,例如函数isdigit返回的类型就是bit,而不是其它类型。每个库函数都在相应的头文件中给出了函数原型说明,用户如果需要使用库函数,必须在源程序的开始处采用预处理器指令include将有关的头文件包含其中。如果省略了头文件,将不能保证函数的正常运行。C51库函数中,类型的选择考虑到了mcs-51系列单片机的结构特征,用户在自己的应用程序中应尽可能的使用最小的数据类型,以最大限度地发挥mcs-51系列单片机的性能。同时可以减少应用程序的代码长度。4.6.1 本征库函数和非本征证库函数 C51提供的本征函数是指编
33、译时不用调用,直接将固定的代码插入当前行,就可以实现其固有的功能。从而大大提供了函数访问的效率,而非本征函数必须通过调用才能够使用。 C51的本征库函数只有9个,除此之外都为非本征库函数。本征库函数数目虽少,但都非常有用,见表4-10所示。使用时,必须在源程序的开始处采用预处理器指令include将头文件包含其中。例如:#inclucle 4.6 C51库函数4.6.2 访问SFR和位地址的REGxxx.H文件 头文件REGxxx.H 定义了多种mcs-51单片机中所有的特殊功能存放器SFR名,从而可以简化用户的程序,使用时用预处理器指令include将头文件包含其中即可,例如:#includ
34、e /*包含特殊功能存放器库*/4.6.3 C51库函数 C51软件包的库内有标准的应用程序,每个函数在相应的头文件.h中有原型说明。如果要使用库函数,只需在源程序的开始处采用预处理器指令include定义与该函数有关的头文件。例如:#include #include 4.6 C51库函数4.7 C51程序编写4.7.1 C51的根本结构 C51语言是一种结构化设计语言,程序由假设干模块组成,每个模块包含假设干根本结构,每个根本结构中可以有假设干语句。C51语言有3种根本结构:顺序结构、选择结构和循环结构。1、if语句 if语句C51中的一个根本条件选择语句,它通常有以下3种格式:(1)if(
35、表达式) 语句; (2)if(表达式) 语句1; else 语句2;(3)if(表达式1) 语句1; esle if(表达式2) 语句2; else if(表达式3)语句3; else if(表达式n-1) 语句n-1; else 语句n; 2、switch/case语句 if语句通过嵌套可以实现多分支结构,但结构复杂。Switch是C51中提供的专门处理多分支结构的多分支选择语句。它的格式如下:switch (表达式) case 常量表达式1: 语句1;break; case 常量表达式2: 语句2;break; . case 常量表达式n: 语句n;break; default: 语句n+
36、1; 3、while语句 while语句在C51中用于实现当型循环结构,它的格式如下: while(表达式) 语句; /* 循环体 */4、do-while语句 do-whil语句在C51中用于实现直到型循环结构,它的格式如下: do 语句; /* 循环体 */ while(表达式);5、for语句 在C51语言中,for语句是使用最灵活、用得最多的循环控制语句,同时也最为复杂。它可以用于循环次数已经确定的情况,也可以用于循环次数不确定的情况。它完全可以代替while语句,功能最强大。它的格式如下: for(表达式1;表达式2;表达式3) 语句; /*循环体*/例:分别利用while , do
37、-while, for语句编程实现 1100 的累加和,并输出结果。#include /*包含特殊功能存放器库*/ #include /*包含 I/O 函数库*/ void main(void) /*主函数*/ int i,j=0; /*定义整型变量 i和 j*/i=1; SCON=0 x52; /*串口初始化*/TMOD=0 x20; TH1=0 xF3; TR1=1;while (i=100) /*累加 1100 之和在 j 中*/j=j+i; i+;printf(1100 的累加和为:%dn,j); while(1); 一、利用while 语句编程实现二、利用do-while语句编程实现
38、 #include /*包含特殊功能存放器库*/ #include /*包含 I/O 函数库*/void main(void) /*主函数*/ int i,j=0; /*定义整型变量 i 和 j*/i=1; SCON=0 x52; /*串口初始化*/TMOD=0 x20; TH1=0 xF3; TR1=1; do /*累加 1100 之和在 j中*/ j=j+i; i+; while (i=100); printf(1100 的累加和为:%dn,j); while(1); 三、利用for 语句编程实现 #include /*包含特殊功能存放器库*/ #include /*包含I/O 函数库*/
39、 void main(void) /*主函数*/ int i,j=0; /*定义整型变量i和j*/i=1; SCON=0 x52; /*串口初始化*/ TMOD=0 x20; TH1=0 xF3; TR1=1;for(i=1;i=100;i+) j=j+i; /*累加 1100 之和在 j中*/ printf(1100 的累加和为:%dn,j); while(1); 6、循环的嵌套 在一个循环的循环体中允许又包含一个完整的循环结构,这种结构称为循环的嵌套。外面的循环称为外循环,里面的循环称为内循环,如果在内循环的循环体内又包含循环结构,就构成了多重循环。在C51中,允许三种循环结构相互嵌套。7
40、、break和continue语句1break语句 用break语句可以跳出switch结构,使程序继续执行switch结构后面的一个语句。使用break语句还可以从循环体中跳出循环,提前结束循环而接着执行循环结构下面的语句。它不能用在除了循环语句和switch语句之外的任何其他语句中。2continue语句 continue语句用在循环体结构中,用于结束本次循环,跳过循环体中continue下面尚未执行的语句,直接进行下一次是否执行循环的判断。 continue语句和break语句的区别在于:continue语句只是结束本次循环,而不是终止整个循环;break语句那么是结束循环,不再进行条件
41、判断。8、return语句 return语句一般放在函数的最后位置,用于终止函数的执行,并控制程序返回调用该函数时所处的位置。返回时还可以通过return语句带回返回值。return语句的格式有以下两种: (1)return; (2)return (表达式)。 如果return后面带有表达式,那么要计算表达式的值,并将表达式的值作为数的返回值;假设不带表达式,那么函数返回时将返回一个不确定的值。通常用return语句把调用函数取得的值返回给主调用函数。4.8 C51语言与汇编语言接口 汇编语言代码执行效率高,运行速度快,非常适合于编写实时性高的控制程序。但其开发的工作量大,可读性差。相比之下,
42、C51具有可读性强、编程简单和调试方便等特点。C51除具有高级语言使用方便灵活、数据处理能力强、编程简单等优点外,还可实现汇编语言的大局部功能,如可直接对硬件进行操作、生成的目标代码质量较高且执行的速度较快等。所以在工程上对硬件处理速度要求不很高的情况下,根本可以用C51代替汇编语言编写。但C51也不能完全取代汇编语言,如在一些对速度要求很高的实时控制系统中,以及对硬件的特殊控制方面,C51就不能完全胜任,还需要汇编语言。因为汇编语言目标代码更精练,对硬件直接控制能力更强且执行速度更快,但汇编语言编程较繁琐、表达能力较差。比较好的解决方法是C51与汇编语言混合编程。4.8.1 C51与汇编语言
43、的接口 如果要用两种语言混合编写程序,首先要解决的是接口问题。C51与汇编语言之间有以下二种接口方式:1.模块内接口 模块内接口指在C程序中嵌入汇编程序。使用#pragma语句来实现,其格式如下: #pragma ASM ;汇编程序 #pragma ENDASM 由编译控制指令SRC来控制将这些汇编程序存入其中。但使用这种方法,在KeilC51中要做以下设置: 1)将嵌有汇编语句的源文件参加到要编译的工程文件中,然后右击该文件,选择“Option for File name.C,并将“Properties选项卡中的“Generate Asswmbler SRCFile和“Asswmbler S
44、RCFile两项设置为有效, 2)将“Link PubiC Only项设置为无效。这样就可以在C51源代码中任意位置嵌入汇编语言。1.模块内接口2.模块间接口 模块间接口方式是将C和汇编源程序各自编辑、调试,并用各自的语言编译器进行编译,生成obj文件即目标文件,然后用连接程序将obj文件连接起来,在这种接口方式下,最困难的就是如何平安有效的传递参数。否那么在调用汇编子程序时就会从堆栈中取出错误的参数。为保证模块之间的数据交换。C51中提供两种参数的传递方式:1通过存放器进行参数传递 为了能够产生高效代码,C51函数最多可以通过CPU传递三个参数,汇编函数要得到参数值就必须访问这些存放器,如果
45、这些存放器值正被使用或保存在其它地方或已经不再需要了,这些存放器可以用作其它用途。 存放器传递参数的规那么参数数目charintLong,float通用指针1个参数R7R6,R7R4R7R1R32个参数R5R4,R5R4R7R1R33个参数R3R2,R3R1R3例:#include unsigned char val50=0; unsigned char a;unsigned char func(unsigned char n) a=valn; a+=2; return a;main() unsigned char a; while(1) a=func(3); #pragma ASM MOV P1,R7 /参数传递给了R7 NOP NOP NOP MOV P1,#0 #pragma ENDASM 2通过固定存储区进行参数传递 假设在源程序中选了编译控制命令“#pragma NOREGPARMS,那么所有参数的传递都发生在固定的存储器区域。这样参数传递途径非常清楚,但代
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 建筑设计答辩汇报
- 冷链物流行业发展前景分析
- 2025建筑工程合同争议解析
- 2025物流服务外包合同(专业律师审核起草修订)
- 幼儿园假期安全教育指南
- 2025租房合同协议书标准版
- 2025合同管理规章:公章、资质、合同及其它证书的使用与保管办法
- 2025投资合同转让协议书
- 手术室细节护理
- 2025住宅房屋租赁合同协议范本
- SH/T 1673-1999工业用环己烷
- GB/T 9661-1988机场周围飞机噪声测量方法
- GB 29541-2013热泵热水机(器)能效限定值及能效等级
- FZ/T 07019-2021针织印染面料单位产品能源消耗限额
- 重症医学科各项规章制度汇编
- 社会组织培训概述课件
- 春节作文优秀课件
- 三角函数的应用论文Word版
- 农业创业风险控制与防范培训课件
- 生物制造国内外状况课件
- 幼儿园大班数学口算练习题可打印
评论
0/150
提交评论