




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第三章Cx51数据与运算第三章 Cx51数据与运算 3.1 数据与数据类型3.2 常量与变量3.3 Cx51数据的存储结构3.4 SFR及其Cx51定义3.5 并行接口及其Cx51定义3.6 位变量及其Cx51定义3.7 Cx51的运算规则3.1 数据与数据类型 Keil C有有ANSI C的所有标准数据类型,除此之的所有标准数据类型,除此之外为了更加有利地利用外为了更加有利地利用8051的结构,还加入了一些的结构,还加入了一些特殊的数据类型。特殊的数据类型。 除了这些标准数据类型外,编译器还支持一种位除了这些标准数据类型外,编译器还支持一种位数据类型,一个位变量存在于内部数据类型,一个位变量
2、存在于内部RAM的可位寻址的可位寻址区中,可像操作其它变量那样对位变量进行操作,区中,可像操作其它变量那样对位变量进行操作,而位数组和位指针是违法的。而位数组和位指针是违法的。数据类型数据类型大小大小char/unsigned char8 bitint/unsigned int16 bitlong/unsigned long32 bitfloat/double32bit一般指针一般指针generic pointer24 bit Cx51实际上不支持双精度浮点数实际上不支持双精度浮点数double,即便你,即便你定义了定义了double,也是按照,也是按照float处理的。处理的。1、基本数据类
3、型、基本数据类型数组数组(array)结构体结构体(struct)联合体联合体(union)枚举枚举(enum)2、构造数据类型、构造数据类型3、指针类型、指针类型4、空类型、空类型3.2 常量与变量 C语言中的数据有常量和变量之分。语言中的数据有常量和变量之分。 常量常量在程序运行的过程中,其值始终不能改变的量。在程序运行的过程中,其值始终不能改变的量。 变量变量在程序运行的过程中其值可以改变的量。在程序运行的过程中其值可以改变的量。 常量和变量一样可以有不同的数据类型。可以用一个常量和变量一样可以有不同的数据类型。可以用一个标识符标识符const来声明一个量是常量。来声明一个量是常量。un
4、signed char data system_status=0;unsigned int data unit_id2;const char data samp_string16;float data outport_value; 我们还要经常用到使用预编译语句我们还要经常用到使用预编译语句#define定定义的符号常量:义的符号常量:#define CONST100#define NULL0#define TRUE1#define FALSE0 符号常量和变量的区别在于,符号常量的值在符号常量和变量的区别在于,符号常量的值在其作用域其作用域(例如所在的函数例如所在的函数)中不能改变,也不能用
5、中不能改变,也不能用等号赋值,它仅仅是代表某个固定常数的一个符号等号赋值,它仅仅是代表某个固定常数的一个符号而已。而已。 习惯上符号常量通常用大写,而变量着用小写,习惯上符号常量通常用大写,而变量着用小写,注意养成良好的编程习惯。注意养成良好的编程习惯。1、位变量、位变量 位变量位变量(bit)的类型是位,其值可以是的类型是位,其值可以是1(true)或者或者0(false)。这些位变量定义在内。这些位变量定义在内部部RAM的可位寻址区。的可位寻址区。2、字符变量、字符变量字符变量字符变量(char)的类型是一个字节共的类型是一个字节共8位,是带位,是带符号的单字节数,其值范围为符号的单字节数
6、,其值范围为-128+127。无符号字符变量无符号字符变量(unsigned char)也是一个字也是一个字节,但是不带符号,其值范围为节,但是不带符号,其值范围为0+255。3、整型变量、整型变量 整型变量整型变量(int)的类型是双字节共的类型是双字节共16位,其位,其取值范围是取值范围是-32768+32767。 无符号整型变量无符号整型变量(unsigned int)为双字节但为双字节但不带符号,其值范围为不带符号,其值范围为065535。Keil Cx51中整型变量中整型变量(int)的字节存放次序:的字节存放次序:高高8位存放在低地址,低位存放在低地址,低8位则存放在高地址。位则存
7、放在高地址。例如位于地址例如位于地址0 x1100的整数的整数0 x1234:低地址低地址0 x1100存放存放0 x12,高地址高地址0 x1101存放存放0 x34。4、浮点变量、浮点变量 浮点变量浮点变量(float)的类型是的类型是4字节共字节共32位,其位,其存放格式为:存放格式为:地址地址+0+1+2+3内容内容SEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM Keil Cx51中浮点变量中浮点变量(float)采用采用IEEE-754标准,由标准,由1位符号、位符号、8位指数和位指数和23位尾数位尾数(最最高位始终为高位始终为1无需保存无需保存)组成,具有组
8、成,具有24位精度位精度 浮点变量浮点变量(float)的字节次序和编译器及其版的字节次序和编译器及其版本有关。本有关。 Keil C编译器能从你的程序源代码中产生高编译器能从你的程序源代码中产生高度优化的代码,但你可以帮助编译器产生更好的度优化的代码,但你可以帮助编译器产生更好的代码。下面将讨论这方面的一些问题。代码。下面将讨论这方面的一些问题。5、使用、使用Keil C时应做的和应该避免的时应做的和应该避免的 一个提高代码效率的最基本的方式就是减小一个提高代码效率的最基本的方式就是减小变量的长度。使用变量的长度。使用C编程时,我们都习惯于对循编程时,我们都习惯于对循环控制变量使用环控制变量
9、使用int类型,这对类型,这对8位的单片机来位的单片机来说是一种极大的浪费。你应该仔细考虑你所声明说是一种极大的浪费。你应该仔细考虑你所声明的变量值可能的范围,然后选择合适的变量类型。的变量值可能的范围,然后选择合适的变量类型。 很明显,经常使用的变量应该是很明显,经常使用的变量应该是unsigned char,只占用一个字节,只占用一个字节:(1)采用短变量)采用短变量unsigned char data n; 为什么要使用无符号类型呢?为什么要使用无符号类型呢? 原因是原因是8051不支持符号运算,程序中也不要使不支持符号运算,程序中也不要使用含有带符号变量的外部代码。除了根据变量长度用含
10、有带符号变量的外部代码。除了根据变量长度来选择变量类型之外,你还要考虑变量是否会用于来选择变量类型之外,你还要考虑变量是否会用于负数的场合,如果你的程序中可以不需要负数,那负数的场合,如果你的程序中可以不需要负数,那么把变量都定义成无符号类型的变量么把变量都定义成无符号类型的变量:(2)使用无符号类型)使用无符号类型 unsigned int data n1,n2; 在在8位操作系统上使用位操作系统上使用32位浮点数是得不偿位浮点数是得不偿失的。你可以这样做,但会浪费大量的时间。所失的。你可以这样做,但会浪费大量的时间。所以当你要在系统中使用浮点数的时候,你要问问以当你要在系统中使用浮点数的时
11、候,你要问问自己这是否一定需要。可以通过提高数值数量级自己这是否一定需要。可以通过提高数值数量级和使用整型运算来消除浮点指针。处理和使用整型运算来消除浮点指针。处理int和和long比处理比处理double和和float要方便得多,你的要方便得多,你的代码执行起来会更快,也不用连接处理浮点指针代码执行起来会更快,也不用连接处理浮点指针的模块。如果你一定要采用浮点指针的话,你应的模块。如果你一定要采用浮点指针的话,你应该采用西门子该采用西门子80517和达拉斯半导体公司的和达拉斯半导体公司的80320,这些已经对数处理进行过优化的单片,这些已经对数处理进行过优化的单片机。机。 (3)避免使用浮点
12、数)避免使用浮点数(4)使用位变量)使用位变量对于某些标志位应使用位变量而不是对于某些标志位应使用位变量而不是unsigned char,这将节省你的内存。你不用多浪费,这将节省你的内存。你不用多浪费7位存储位存储区,而且位变量在区,而且位变量在RAM中访问他们只需要一个处理中访问他们只需要一个处理周期。周期。 把变量定义成局部变量比全局变量更有效率,把变量定义成局部变量比全局变量更有效率,编译器为局部变量在内部存储区中分配存储空间,编译器为局部变量在内部存储区中分配存储空间,而为全局变量在外部存储区中分配存储空间,这而为全局变量在外部存储区中分配存储空间,这会降低你的访问速度。会降低你的访问
13、速度。 另一个避免使用全局变量的原因是你必须在另一个避免使用全局变量的原因是你必须在你系统的处理过程中调节使用全局变量,因为在你系统的处理过程中调节使用全局变量,因为在中断系统和多任务系统中,不止一个过程会使用中断系统和多任务系统中,不止一个过程会使用全局变量。全局变量。(5)用局部变量代替全局变量)用局部变量代替全局变量 局部变量和全局变量可被定义在你想要的存储局部变量和全局变量可被定义在你想要的存储区中,根据先前的讨论,当你把经常使用的变量放区中,根据先前的讨论,当你把经常使用的变量放在内部在内部RAM中时,可使你的程序的速度得到提高。中时,可使你的程序的速度得到提高。除此之外,你还缩短了
14、你的代码,除此之外,你还缩短了你的代码, 因为外部存储因为外部存储区寻址的指令相对要麻烦一些。区寻址的指令相对要麻烦一些。 考虑到存储速度,按下面的顺序使用存储器:考虑到存储速度,按下面的顺序使用存储器:data、idata、pdata、xdata,但要记得留出,但要记得留出足够的堆栈空间。足够的堆栈空间。(6)为变量分配内部存储区)为变量分配内部存储区3.3 Cx51数据的存储结构 因为因为Keil Cx51是面向是面向8051系列单片机及其硬系列单片机及其硬件控制系统的开发工具,所以在讨论件控制系统的开发工具,所以在讨论Keil Cx51的的数据类型的时候,必须同时提及它的存储类型以数据类
15、型的时候,必须同时提及它的存储类型以及它与及它与8051单片机存储器结构的关系。它定义的单片机存储器结构的关系。它定义的任何数据类型必须以一定的存储类型的方式定位任何数据类型必须以一定的存储类型的方式定位在在8051的某一存储器中,否则便没有任何的实际的某一存储器中,否则便没有任何的实际意义。意义。1、通用寄存器区、通用寄存器区(001FH) 通用寄存器区由通用寄存器区由4个寄存器组个寄存器组构成:构成:0组组(0007H)、 1组组(080FH)、 2组组(1017H)、 3组组(181FH)。 可以通过可以通过PSW中中RS0和和RS1的不同取值来的不同取值来选择不同的寄存器组。在函数定义
16、中则可以使用选择不同的寄存器组。在函数定义中则可以使用关键词关键词using来指明寄存器号。来指明寄存器号。 上电复位后默认使用寄存器组上电复位后默认使用寄存器组0。当其它组不。当其它组不用时,它们都可以当作普通的用时,它们都可以当作普通的RAM使用。使用。2、可位寻址区、可位寻址区(202FH) 这个区共这个区共16个字节个字节128位,分别位,分别占有位地址占有位地址0127;另外内部地址;另外内部地址尾数为尾数为8或者或者0的的SFR共共16字节字节128位,分别占有位地址位,分别占有位地址128255。 内部低内部低128字节的地址字节的地址307FH作为用户存取临时数据作为用户存取临
17、时数据区。区。 许多单片机的高许多单片机的高128字节除字节除了直接寻址的了直接寻址的SFR外还有外还有128字字节间接寻址区节间接寻址区RAM,它们也作为,它们也作为用户区。用户区。 通常堆栈区就设在这里,堆通常堆栈区就设在这里,堆栈指针栈指针SP可以设置这个区域。可以设置这个区域。3、用户、用户 (RAM)区区 Keil允许使用者指定程序变量的存储区,这使使用允许使用者指定程序变量的存储区,这使使用者可以控制存储区的使用。编译器可识别以下存储区:者可以控制存储区的使用。编译器可识别以下存储区:存储区存储区描述描述dataRAM的低的低128个字节,可在一个周期内直接寻址个字节,可在一个周期
18、内直接寻址bdatadata区的区的16个字节的可位寻址区个字节的可位寻址区idataRAM区的高区的高128个字节,必须采用间接寻址个字节,必须采用间接寻址pdata外部存储区的外部存储区的256个字节,一般是片外个字节,一般是片外RAM第一第一页空间;通过页空间;通过P0口的地址对其寻址,使用指令口的地址对其寻址,使用指令MOVX Ri,需要两个指令周期,需要两个指令周期xdata外部存储区,使用外部存储区,使用DPTR寻址寻址code程序存储区,使用程序存储区,使用PC或或DPTR寻址寻址4、存储类型、存储类型unsigned char data system_status=0;unsi
19、gned int data unit_id2;char data inp_string16;float data outp_value;(1)data区区 对对data区的寻址是最快的,所以应该把使用频率区的寻址是最快的,所以应该把使用频率高的变量放在高的变量放在data区。由于空间有限,必须注意使用区。由于空间有限,必须注意使用data区;除了包含程序变量外,还包含了堆栈和寄存区;除了包含程序变量外,还包含了堆栈和寄存器组在器组在data区的声明。区的声明。 标准变量和用户自定义变量都可存储在标准变量和用户自定义变量都可存储在data区区中,只要不超过中,只要不超过data区的范围。区的范围
20、。 因为因为Cx51使用默认的寄存器组来传递参数,使用默认的寄存器组来传递参数,1个工作寄存器组就是个工作寄存器组就是8个单元字节。你至少失去了个单元字节。你至少失去了8个字节。另外要定义足够大的堆栈空间。当你的内个字节。另外要定义足够大的堆栈空间。当你的内部堆栈溢出的时候,你的程序会莫名其妙地复位,部堆栈溢出的时候,你的程序会莫名其妙地复位,实际原因是实际原因是8051系列微处理器没有硬件报错机制,系列微处理器没有硬件报错机制,堆栈溢出只能以这种方式表示出来。堆栈溢出只能以这种方式表示出来。(2)bdata区区 可以在可以在data区的位寻址区定义变量,这个变量区的位寻址区定义变量,这个变量
21、的每个位就可进行位寻址。的每个位就可进行位寻址。 这对状态寄存器来说是十分有用的,因为它需这对状态寄存器来说是十分有用的,因为它需要单独地使用变量的每一位。要单独地使用变量的每一位。 不一定要用位变量名来引用位变量,下面是一不一定要用位变量名来引用位变量,下面是一些在些在bdata段中声明变量和使用位变量的例子:段中声明变量和使用位变量的例子:unsigned char bdata status_byte;unsigned int bdata status_word;unsigned long bdata status_dword;sbit stat_flag=status_byte4;if(
22、status_word15) stat_flag=1; idata区也可存放使用比较频繁的变量,使用寄存器区也可存放使用比较频繁的变量,使用寄存器作为指针进行寻址。在寄存器中设置作为指针进行寻址。在寄存器中设置8位地址进行间接位地址进行间接寻址,和外部存储器寻址比,它的指令执行周期和代寻址,和外部存储器寻址比,它的指令执行周期和代码长度都比较短:码长度都比较短:(3)idata区区unsigned char idata system_status=0;unsigned int idata unit_id2;char idata inp_string16;float idata outp_val
23、ue; 在这两个区声明变量和在其它段的语法是一样的。在这两个区声明变量和在其它段的语法是一样的。pdata段只有段只有256个字节,而个字节,而xdata段可达段可达65536个字个字节。下面是一些例子:节。下面是一些例子:(4)pdata和和xdata区区unsigned char xdata system_status=0;unsigned int pdata unit_id2;char xdata inp_string16;float pdata outp_value; 对对pdata和和xdata的操作是相似的,对的操作是相似的,对pdata段寻段寻址比对址比对xdata段寻址要快,因
24、为对段寻址要快,因为对pdata段寻址只需要段寻址只需要装入装入8位地址,而对位地址,而对xdata段寻址需装入段寻址需装入16位地址,所位地址,所以尽量把外部数据存储在以尽量把外部数据存储在pdata段中。对段中。对pdata和和xdata寻址要使用寻址要使用MOVX 指令,需要两个处理周期。指令,需要两个处理周期。inp_byte=XBYTE0 x8500; /从从8500H读字节读字节inp_word=XWORD0 x4000; /从从4000H读字读字c=*(char xdata *) 0 x0000); /从从0000读字节读字节XBYTE0 x7500=out_val;/写字节到写
25、字节到7500H 在外部地址段中,除了包含存储器地址外,还包在外部地址段中,除了包含存储器地址外,还包含含I/O器件的地址,对外部器件寻址可通过指针或器件的地址,对外部器件寻址可通过指针或Cx51提供的宏。提供的宏。 建议使用宏对外部器件进行寻址,因为这样更有建议使用宏对外部器件进行寻址,因为这样更有可读性,宏定义使得存储段看上去像可读性,宏定义使得存储段看上去像char和和int类型的类型的数组。数组。下面是一些绝对寄存器寻址的例子:下面是一些绝对寄存器寻址的例子:unsigned int code unit_id2=1234;unsigned char code Num= 0 x00, 0
26、 x01, 0 x02, 0 x03, 0 x04, 0 x05, 0 x06, 0 x07, 0 x08, 0 x09, 0 x10, 0 x11, 0 x12, 0 x13, 0 x14, 0 x15;(5)code区区 代码区的数据是不可改变的,代码区的数据是不可改变的,8051的代码段不的代码段不可重写。一般代码段中可存放数据表、跳转向量和可重写。一般代码段中可存放数据表、跳转向量和状态表,对状态表,对code段的访问和对段的访问和对xdata段的访问的时间段的访问的时间是一样的。代码段中的对象在编译的时候初始化,是一样的。代码段中的对象在编译的时候初始化,否则你就得不到你想要的值。下
27、面是代码段的声明否则你就得不到你想要的值。下面是代码段的声明例子:例子:5、存储器模式、存储器模式 Cx51提供了提供了3种存储器模式来存储变量过程参数和种存储器模式来存储变量过程参数和分配再入函数堆栈:分配再入函数堆栈:存储模式存储模式说明说明small参数及局部变量放入参数及局部变量放入data区,默认存储类型区,默认存储类型是是data,栈空间位于片内,栈空间位于片内idata(片内片内RAM)compact参数及局部变量放入参数及局部变量放入pdata区,默认存储类型区,默认存储类型是是pdata(片外片外RAM);栈空间位于片内;栈空间位于片内idata(片内片内RAM)large参
28、数及局部变量放入参数及局部变量放入xdata区,默认存储类型区,默认存储类型是是xdata,模拟堆栈位于片外,模拟堆栈位于片外xdata(片外片外RAM) 一般来说如果系统所需要的内存数小于内部一般来说如果系统所需要的内存数小于内部RAM数时,都数时,都应以应以small模式进行编译。模式进行编译。 在这种模式下,在这种模式下,data段是所有内部变量和全局变量的默认段是所有内部变量和全局变量的默认存储段存储段,所有参数传递都发生在,所有参数传递都发生在data段中段中。 这种这种模式的优势就是数据的存取速度很快,模式的优势就是数据的存取速度很快,但只有但只有1个字个字节寻址的存储空间供你使用
29、节寻址的存储空间供你使用(总共有(总共有128,但至少有,但至少有8个字节个字节被寄存器组使用)。被寄存器组使用)。(1)small模式。模式。 如果你的系统有如果你的系统有256字节或更少的外部字节或更少的外部RAM,你可以,你可以使用使用compact模式,这样一来,如果不加说明,这种模式将模式,这样一来,如果不加说明,这种模式将扩充你能够使用的扩充你能够使用的RAM数量。对数量。对xdata段以外的数据存储仍段以外的数据存储仍然是很快的,然是很快的,变量的参数传递变量的参数传递将在内部将在内部RAM中进行,这样中进行,这样存储速度会比较快。对存储速度会比较快。对pdata段的数据的寻址是
30、通过段的数据的寻址是通过R0和和R1进行间接寻址的,比使用进行间接寻址的,比使用DPTR要快一些。要快一些。(2)compact模式模式 在在large模式中模式中所有变量的默认存储区所有变量的默认存储区是是xdata段,段,Keil C尽量使用尽量使用内部寄存器组进行参数传递内部寄存器组进行参数传递。在寄存器。在寄存器组中可以传递参数的数量和组中可以传递参数的数量和compact模式一样。对模式一样。对xdata段数据的访问是最慢的,所以要仔细考虑变量应存储的段数据的访问是最慢的,所以要仔细考虑变量应存储的位置,使数据的存储速度得到优化。位置,使数据的存储速度得到优化。(3)large模式模
31、式3.4 特殊功能寄存器SFR及其Cx51定义 特殊功能寄存器用关键词特殊功能寄存器用关键词sfr来定义,来定义,sfr16用来定义用来定义16位的特殊功能寄存器,如位的特殊功能寄存器,如DPTR。 通过名字或地址来引用特殊功能寄存器地址必通过名字或地址来引用特殊功能寄存器地址必须高于须高于80H。 可位寻址的字节地址的位变量定义用关键字可位寻址的字节地址的位变量定义用关键字sbit。 对于大多数对于大多数8051成员,成员,Keil提供了一个包含了提供了一个包含了所有特殊功能寄存器和它们的位的定义的头文件,所有特殊功能寄存器和它们的位的定义的头文件,通过包含头文件可以很容易地进行新的扩展。通
32、过包含头文件可以很容易地进行新的扩展。sfr SCON=0 x98; /定义定义 SCONsbit SM0=0 x9F; /定义定义 SCON的各位的各位sbit SM1=0 x9E;sbit SM2=0 x9D;sbit REN=0 x9C;sbit TB8=0 x9B;sbit RB8=0 x9A;sbit TI=0 x99;sbit RI=0 x98; 注意,用注意,用sfr16定义的定义的16位特殊功能寄存器的位特殊功能寄存器的字节顺序,前面的为低字节,后面的为高字节,这个字节顺序,前面的为低字节,后面的为高字节,这个和和8x86中的顺序相同,但是中的顺序相同,但是int的高低字节顺序
33、却正的高低字节顺序却正好相反。(好相反。(P64、P65)3.5 并行接口及其Cx51定义 8051单片机具有单片机具有P0、P1、P2和和P3四个端口,四个端口,许多增强型单片机还有许多增强型单片机还有P4端口。没有针对这些端口端口。没有针对这些端口的专用的专用IO操作指令,操作指令,8051对对IO口的操作是通过设口的操作是通过设置其输出锁存器置其输出锁存器SFR来实现的。来实现的。 部分针对部分针对IO口的读取指令是读取端口锁存器,口的读取指令是读取端口锁存器,部分是读取端口的输入状态,通常那些针对端口的部分是读取端口的输入状态,通常那些针对端口的读读修改修改写指令读取的是端口锁存器(对
34、应写指令读取的是端口锁存器(对应SFR的地址单元)而不是引脚状态,这样可以防止因外的地址单元)而不是引脚状态,这样可以防止因外部环境不稳定而引起的误操作。部环境不稳定而引起的误操作。 P0-3端口的端口的SFR地址的尾数不是地址的尾数不是0就是就是8,所以它,所以它们也是可以位寻址的们也是可以位寻址的SFR。端口在。端口在Cx51中可以直接中可以直接用用sfr来定义:来定义:sfr P0=0 x80;/定义定义IO口口P0sfr P1=0 x90;/定义定义IO口口P1sfr P2=0 xA0;/定义定义IO口口P2sfr P3=0 xB0;/定义定义IO口口P3 端口中的每一个端口中的每一个
35、IO口线还可以用口线还可以用sbit来定义其每来定义其每一个位:一个位:sbit P00=P00;/定义定义IO线线sbit P01=P01;/定义定义IO线线sbit P02=P02;/定义定义IO线线sbit P03=P03;/定义定义IO线线sbit P04=P04;/定义定义IO线线sbit P05=P05;/定义定义IO线线sbit P06=P06;/定义定义IO线线sbit P07=P07;/定义定义IO线线3.6 位变量及其Cx51定义 位变量是位变量是Cx51中针对其硬件特点引入的一种新中针对其硬件特点引入的一种新变量,它并不是标准变量,它并不是标准C语言的变量。语言的变量。
36、内部内部data区地址区地址202FH共共128位占有位地址位占有位地址0-127,而地址尾数为而地址尾数为0或者或者8的的SFR共共128位占有位地址位占有位地址128-255。 使用使用C51编程时,定义了位变量后,就可以用定义了的编程时,定义了位变量后,就可以用定义了的变量来表示变量来表示MCS-51的位寻址单元。的位寻址单元。 位变量的位变量的C51定义的一般语法格式如下:定义的一般语法格式如下: 位类型标识符位类型标识符(bit) 位变量名;位变量名; 这里,这里, bit是一个数据类型是一个数据类型 例如:例如:bit direction_bit ;/* 把把direction_b
37、it定义为位变量定义为位变量 */bit look_pointer ;/* 把把look_pointer定义为位变量定义为位变量 */ (1) 位变量位变量C51定义。定义。(2) 函数可包含类型为函数可包含类型为“bit”的参数,也可以将其作为返回值。的参数,也可以将其作为返回值。例如:例如: bit func(bit b0, bit b1) /* 变量变量b0,b1作为函数的参数作为函数的参数 */ return (b1); /* 变量变量b1作为函数的返回值作为函数的返回值 */ 注意,使用禁止中断注意,使用禁止中断(#pragma disable)或包含明确的寄存器组或包含明确的寄存器
38、组切换切换(using n)的,函数不能返回位值。否则编辑器将会给出一的,函数不能返回位值。否则编辑器将会给出一个错误信息。个错误信息。位变量不能定义成一个指针,如不能定义:位变量不能定义成一个指针,如不能定义: bit * bit_pointer。(错)。(错)不存在位数组,如不能定义:不存在位数组,如不能定义:bit b_array 。 (错)(错) (3) 对位变量定义的限制。对位变量定义的限制。可位寻址字节变量的某一个位使用关键词可位寻址字节变量的某一个位使用关键词sbit定义定义;bdata区(片内区(片内RAM单元单元20-2F)的独立位变量则用关键词)的独立位变量则用关键词bit
39、定义:定义: 关键词关键词sbit和和bit对位变量定义仅仅是形式上的区别,在对位变量定义仅仅是形式上的区别,在实际操作中式完全一样的。实际操作中式完全一样的。例例1 先定义变量的数据类型和存储类型(先定义变量的数据类型和存储类型(P69):):bdata int ibase; /* 定义定义ibase为为bdata整型变量,整型变量,16位位 */bdata char bary4;/* bary4定义为定义为bdata字符型数组字符型数组 */然后可使用然后可使用sbit定义可独立寻址访问的对象位:定义可独立寻址访问的对象位:sbit mybit0 = ibase0 ;/* mybit0定义
40、为定义为ibase的第的第0位位 */sbit mybit15 = ibase15; /* mybit0定义为定义为ibase的第的第15位位 */sbit Ary07 = bary07 ; /* Ary07定义为定义为abry0的第的第7位位 */sbit Ary37 = bary37 ; /* Ary37定义为定义为abry3的第的第7位位 */ 对象对象ibase和和bary也可以字节寻址也可以字节寻址: ary37=0; /* bary3的第的第7位赋值为位赋值为0 */ bary3=a; /* 字节寻址字节寻址,bary3 赋值为赋值为a */问问bary3中放了哪个数据中放了哪个数
41、据? “”操作符后的最大值依赖于指定的数据类型,操作符后的最大值依赖于指定的数据类型, 对于对于char/uchar而言是而言是07; #define uchar unsigned char 对于对于int/uint 而言是而言是015; #define uint unsigned char 对于对于long/ulong而言是而言是031; #define ulong unsigned char3.7 Cx51的运算规则3.7.1 算术运算及其优先级算术运算及其优先级3.7.2 关系运算及其优先级关系运算及其优先级3.7.3 逻辑运算及其优先级逻辑运算及其优先级3.7.4 位操作及其表达式位操
42、作及其表达式3.7.5 自减、自加和复合运算自减、自加和复合运算一、一、Cx51最基本的最基本的5种算术运算符种算术运算符 +:加法运算,或者正值符号;加法运算,或者正值符号; -:减法运算,或者负值符号;减法运算,或者负值符号; *:乘法运算;乘法运算; /:除法运算,取商;除法运算,取商; %:取模取模(求余求余)运算符,取余数运算符,取余数P69。3.7.1 算术运算及其优先级算术运算及其优先级二、算术表达式、优先级与结合性二、算术表达式、优先级与结合性 用算术运算符和括号将运算对象连接起来的用算术运算符和括号将运算对象连接起来的式子称之为算术表达式。式子称之为算术表达式。运算优先级,指
43、当运算对象两侧都有运算符时,运算优先级,指当运算对象两侧都有运算符时,执行运算的先后次序:先乘、除、模执行运算的先后次序:先乘、除、模(3者等同者等同),后加、减后加、减(2者等同者等同),括号最优先。,括号最优先。(a+b)*(c-d)-e运算结合性,指当运算对象两侧的运算符具有运算结合性,指当运算对象两侧的运算符具有相同优先级时,执行运算的先后次序:先左后相同优先级时,执行运算的先后次序:先左后右。右。a+b-c三、数据类型转换三、数据类型转换 如果一个运算符的两侧的数据类型不同,则必须先通如果一个运算符的两侧的数据类型不同,则必须先通过数据类型转换,将两侧的数据转换成位相同类型。转过数据
44、类型转换,将两侧的数据转换成位相同类型。转换的方法有两种:换的方法有两种: 自动自动(缺省缺省)类型转换,即在程序编译时由类型转换,即在程序编译时由C编译器编译器自动从低类型到高类型进行类型转换;自动从低类型到高类型进行类型转换;P70 强制类型转换,需要使用强制类型转换符。强制类型转换,需要使用强制类型转换符。unsigned char a,b,c;c=a+(unsigned int)b; 首先首先(unsigned int)强制把强制把b转换为类型转换为类型unsigned int,编译,编译器在编译加法代码时自动把器在编译加法代码时自动把a转换为转换为unsigned int,最后存放运,最后存放运算结果时,编译器又自动把算结果时,编译器又自动把a转换为转换为unsigned char3.7.2 关系运算及其优先级关系运算及其优先级优先级相同优先级相同(高高)优先级相同优先级相同(低低) 小于小于 小于等于小于等于 大于大于 大于等于大于等于 测试等于测试等于! 测试不等于测试不等于一、关系运算符一、关系运算符二、关系运算符的优先级二、关系运算符的优先级 前前4种关系运算符的优先级相同,后种关系运算符的优先级相同,后2种关系种关系运算符的优先级也相同,前运算符的优先级也相同,前4中关系运算符的优中关系运算符的优先级高于后先级高于后2种。种。 关系运算
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年工业自动化高级操作工技能竞赛题库
- 2024新外研社版英语八年级上单词表(开学版)
- 2025年工业自动化工程师高级面试指南及预测题解析
- 24节气教学课件
- 新解读《GB-T 36785-2018结构用木质覆面板保温墙体试验方法》
- 关雎板块式教学课件
- 2024年全国社会工作者之初级社会工作实务考试重点试卷附答案469
- 2024高层管理人员劳动合同
- 2025年英语四六级考试听力短对话专项突破试卷 考前冲刺
- Ⅰ期糖尿病肾病护理查房记录
- “魅力之光”核电知识竞赛试题答案(二)(110道)
- 外科学课件:食管癌
- 汽机专业设备运行日常点检
- 环保与物业公司合作协议
- GB/T 2820.12-2002往复式内燃机驱动的交流发电机组第12部分:对安全装置的应急供电
- 设备基础知识-动设备课件
- GB/T 12599-2002金属覆盖层锡电镀层技术规范和试验方法
- 2023年西安陕鼓动力股份有限公司招聘笔试题库及答案解析
- 放射源辐射事故专项应急预案
- 微观经济学-范里安varian中级
- (完整)人教版高一英语必修一单词表
评论
0/150
提交评论