1、第第3 3章章 单片机单片机C51C51语言设计基础语言设计基础3.1 C513.1 C51的数据的数据3.2 C513.2 C51对单片机主要资源的控制对单片机主要资源的控制3.3 C513.3 C51的基本运算与流程控制的基本运算与流程控制3.4 C513.4 C51的数组与指针的数组与指针3.5 C513.5 C51函数函数3.6 C513.6 C51的预处理命令的预处理命令3.1 C513.1 C51的数据的数据 3.1.1 3.1.1 数据类型数据类型 3.1.2 3.1.2 常量与变量常量与变量 3.1.3 3.1.3 数据存储类型数据存储类型 3.1.4 3.1.4 局部变量与全
2、局变量局部变量与全局变量 3.1.1 3.1.1 数据类型数据类型3.1.2 3.1.2 常量与变量常量与变量 1 1常量常量 C51 C51语言中的常量是不接受程语言中的常量是不接受程序修改的固定值,常量可以是任意序修改的固定值,常量可以是任意数据类型。数据类型。C51 C51中的常量有整型常量、实中的常量有整型常量、实型常量、字符型常量、字符串常量型常量、字符型常量、字符串常量符号常量等。符号常量等。(1 1)整型常量)整型常量 在整型常量后加一个字母在整型常量后加一个字母“L”“L”或或“l”“l”,表示该数位长整型。例如表示该数位长整型。例如23L23L、04l04l等。等。如果需要的
3、是负值,则必须将负号如果需要的是负值,则必须将负号“-”“-”放置于常量表达式的最前面,例如放置于常量表达式的最前面,例如-0 x56-0 x56、-9-9等。等。(2 2)实型常量)实型常量 实型常量又称浮点常量,是一个十进制实型常量又称浮点常量,是一个十进制表示的符号实数。实型常量的值包括整表示的符号实数。实型常量的值包括整数部分、尾数部分和指数部分。实型常数部分、尾数部分和指数部分。实型常量的形式如下:量的形式如下:EE 一些实型常量的示例如下:一些实型常量的示例如下:15.7515.75、1.575E11.575E1、1575315753、-0.0025-0.0025、-2.53-2.
4、53、254254。(3 3)字符型常量)字符型常量 字符型常量是指用一对单引号括起字符型常量是指用一对单引号括起来的一个字符。如来的一个字符。如aa、99、!等。等。字符常量中的单引号只起定界作用并不字符常量中的单引号只起定界作用并不表示字符本身。表示字符本身。在在C51C51语言中,字符是按其对应的码语言中,字符是按其对应的码值来存储的,值来存储的,1 1个字符占个字符占1 1个字节个字节 (4 4)字符串常量)字符串常量 字符串常量是指用一对双引号括起来的字符串常量是指用一对双引号括起来的一串字符,双引号只起定界作用,如一串字符,双引号只起定界作用,如、123456123456等。等。(
5、5 5)符号常量)符号常量 C51 C51语言中允许将程序中的常量定义为一语言中允许将程序中的常量定义为一个标识符,称为符号常量。个标识符,称为符号常量。符号常量一般使用大写英文字母表示,符号常量一般使用大写英文字母表示,以区别于一般用小写字母表示的变量。以区别于一般用小写字母表示的变量。符号常量在使用前必须先定义,定义的符号常量在使用前必须先定义,定义的形式是:形式是:标识符标识符 常量常量 3.1415926 3.14159262 2变量变量 变量的定义:变量的定义:数据类型数据类型 变量名变量名;C51 C51中常用的:、中常用的:、(1 1)整型变量()整型变量()16 16位数据位数
6、据 有符号:有符号:-32 768 -32 76832 767 32 767 无符号:无符号:0 065 535 65 535 0 x12340 x1234存储形式存储形式例例3-1 P50(2 2)长整型变量()长整型变量()长整型变量长度是长整型变量长度是3232位,占位,占用用4 4个字节(),其他方面和整型个字节(),其他方面和整型变量()相似。变量()相似。(3 3)实型变量)实型变量 分为单精度()型和双精度()型。分为单精度()型和双精度()型。其定义形式为:其定义形式为:;指定为单精度实数指定为单精度实数 z;z;指定指定z z为双精度实数为双精度实数 在一般系统中,一个型数据
7、在内存中占在一般系统中,一个型数据在内存中占4 4个字节(个字节(3232位),一个型数据占位),一个型数据占8 8个字节(个字节(6464位)。单精度实数提供位)。单精度实数提供7 7位有效数字,双精度位有效数字,双精度实数提供实数提供15151616位有效数字。位有效数字。(5 5)字符变量)字符变量 字符变量用来存放字符常量。注意只能存放字符变量用来存放字符常量。注意只能存放1 1个字符。个字符。字符变量的定义形式如下:字符变量的定义形式如下:变量名变量名;例如:例如:c12;c12;它表示它表示c1c1和和c2c2为字符变量,各存放为字符变量,各存放1 1个字符。可以用个字符。可以用下
8、面的语句对下面的语句对c1c1、c2c2赋值:赋值:c1=a2=b;c1=a2=b;字符变量的长度是字符变量的长度是1 1字节()即字节()即8 8位。这很适合于位。这很适合于80518051单片机,因为单片机,因为80518051单片机每次可以处理单片机每次可以处理8 8位数据。位数据。(6 6)位变量()位变量()变量的类型是位,位变量的值可以是变量的类型是位,位变量的值可以是1 1()或()或0 0()。()。与与80518051硬件特性操作有关的位变量必须硬件特性操作有关的位变量必须定位在定位在80518051单片机片内存储区()的可单片机片内存储区()的可位寻址空间中。位寻址空间中。
9、3 3有符号有符号/无符号问题说明无符号问题说明(1 1)尽量使用无符号变量)尽量使用无符号变量(2 2)在编程时,为了书写方便,经常)在编程时,为了书写方便,经常使用简化的缩写形式来定义变量的数据使用简化的缩写形式来定义变量的数据类型:类型:3.1.3 3.1.3 数据存储类型数据存储类型 数据时存放在数据时存放在5151单片机的存储器中单片机的存储器中的,因此要规定数据的存储类型。的,因此要规定数据的存储类型。P53 P53 表表3-43-4 常用:、常用:、另外:另外:(1 1)区)区 区的寻址是最快的,所以应该把经常使用的区的寻址是最快的,所以应该把经常使用的变量放在区,但是区的空间是
10、有限的,区除变量放在区,但是区的空间是有限的,区除了包含程序变量外,还包含了堆栈和寄存器了包含程序变量外,还包含了堆栈和寄存器组。组。区声明中的存储类型标式符为,通常指片内区声明中的存储类型标式符为,通常指片内的低的低128128字节的内部数据存储的变量,可直接字节的内部数据存储的变量,可直接寻址。寻址。声明举例如下:声明举例如下:0;0;2;2;16;16;(2)实际是中的位寻址区,在这个区中声明变量实际是中的位寻址区,在这个区中声明变量就可以进行位寻址。位变量的声明对状态寄就可以进行位寻址。位变量的声明对状态寄存器来说是十分有用的,因为它可能仅仅需存器来说是十分有用的,因为它可能仅仅需要某
11、一位,而不是整个字节。要某一位,而不是整个字节。区声明中的存储类型标识符为,指内部可位区声明中的存储类型标识符为,指内部可位寻址的寻址的1616字节存储区(字节存储区(20H20H到到2 2),数据类型),数据类型是可位寻址变量的数据类型。是可位寻址变量的数据类型。以下是在区中声明的位变量和使用位变量的以下是在区中声明的位变量和使用位变量的例子:例子:;4;(15)1;(3)区)区 区也可以存放使用比较频繁的变量,使用寄区也可以存放使用比较频繁的变量,使用寄存器作为指针进行寻址。区声明中的存储类存器作为指针进行寻址。区声明中的存储类型标识符为,指内部的型标识符为,指内部的256256字节的存储
12、区,但字节的存储区,但是只能间接寻址,速度比直接寻址慢。是只能间接寻址,速度比直接寻址慢。声明举例如下:声明举例如下:0;0;2;2;16;16;(4)区和区)区和区 区和区属于外部数据存储区,外部数据区和区属于外部数据存储区,外部数据区是可读可写的存储区,最多可以有区是可读可写的存储区,最多可以有6464。在这两个区,变量的声明与在其他区的在这两个区,变量的声明与在其他区的语法是一样的,但区只有语法是一样的,但区只有256256字节而区字节而区可达可达65 53665 536字节。字节。声明举例如下:声明举例如下:0;2;16;外部地址段中除了包含存储器地址外,还包外部地址段中除了包含存储器
13、地址外,还包含器件的地址。对外部器件寻址可以通过指含器件的地址。对外部器件寻址可以通过指针或针或C51提供的宏,使用宏对外部器件口进行提供的宏,使用宏对外部器件口进行寻址更具可读性。寻址更具可读性。(5 5)程序存储区)程序存储区 程序存储区的数据是不可改变的,跳转向量程序存储区的数据是不可改变的,跳转向量和状态表对段访问和对区访问的时间是一样和状态表对段访问和对区访问的时间是一样的。编译的时候要对程序存储区中的对象进的。编译的时候要对程序存储区中的对象进行初始化,否则就会产生错误。程序存储区行初始化,否则就会产生错误。程序存储区声明的标识符为,在声明的标识符为,在C51C51语言编译器中可以
14、用语言编译器中可以用存储区类型标识符来访问程序存储区。下面存储区类型标识符来访问程序存储区。下面是程序存储区声明的例子:是程序存储区声明的例子:a=a=0 x00,0 x01,0 x02,0 x03,0 x04,0 x05,0 x06,0 x00 x00,0 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 x7,0 x08,0 x09,0 x10,0 x11,0 x12,0 x13,0 x14,0 x15;15;变量存储类型定义举例:变量存储类型定义举例:1;1044;3.1
15、.4 3.1.4 局部变量与全局变量局部变量与全局变量 从变量的作用范围来区分,变量可以从变量的作用范围来区分,变量可以被分为全局变量和局部变量;被分为全局变量和局部变量;某些变量在程序运行过程中是始终存某些变量在程序运行过程中是始终存在的全局变量。在的全局变量。某些变量只是在进入某个函数时才开某些变量只是在进入某个函数时才开始存在局部变量。始存在局部变量。1 1局部变量局部变量 局部变量是在某个函数中存在的变量,也可局部变量是在某个函数中存在的变量,也可以称为内部变量,它只在该函数内部有效。以称为内部变量,它只在该函数内部有效。局部变量可以分为动态局部变量和静态局部局部变量可以分为动态局部变
16、量和静态局部变量,使用关键词定义动态局部变量(可以变量,使用关键词定义动态局部变量(可以省略),使用关键词定义静态局部变量,例省略),使用关键词定义静态局部变量,例如:如:a;a;j;j;动态局部变量在程序执行完毕后其存储动态局部变量在程序执行完毕后其存储空间被释放,而静态局部变量在程序执空间被释放,而静态局部变量在程序执行完成后其存储空间并不释放,而且其行完成后其存储空间并不释放,而且其值保持不变。值保持不变。如果该函数再次被调用,则该函数初始如果该函数再次被调用,则该函数初始化后其初始值为上次的数值。化后其初始值为上次的数值。动态局部变量和静态局部变量的区别如动态局部变量和静态局部变量的区
17、别如下:下:动态局部变量在函数被调用时分配存储空间动态局部变量在函数被调用时分配存储空间和初始化,每次函数调用时都需要初始化;和初始化,每次函数调用时都需要初始化;静态局部变量在编译程序时分配存储空间和静态局部变量在编译程序时分配存储空间和初始化,仅初始化一次。初始化,仅初始化一次。动态局部变量存放在动态存储区,在每次退动态局部变量存放在动态存储区,在每次退出所属函数时释放;静态局部变量存放在静出所属函数时释放;静态局部变量存放在静态存储区,每次调用后函数不释放,保持函态存储区,每次调用后函数不释放,保持函数执行完毕之后的数值到下一次调用。数执行完毕之后的数值到下一次调用。如果在建立时动态局部
18、变量不初始为一个不如果在建立时动态局部变量不初始为一个不确定的数,静态局部变量不初始化,则它们确定的数,静态局部变量不初始化,则它们的值为的值为0 0或者是空字符。或者是空字符。2 2全局变量全局变量 全局变量是在整个源文件中都存在的变全局变量是在整个源文件中都存在的变量,又称为外部变量。全局变量的有效量,又称为外部变量。全局变量的有效区间是从定义点开始到源文件结束,其区间是从定义点开始到源文件结束,其中的所有函数都可以直接访问该变量,中的所有函数都可以直接访问该变量,如果定义点之前的函数需要访问该变量,如果定义点之前的函数需要访问该变量,则需要使用关键词对该变量进行声明,则需要使用关键词对该
19、变量进行声明,如果全局变量声明文件之外的源文件需如果全局变量声明文件之外的源文件需要访问该变量,也需要使用关键词进行要访问该变量,也需要使用关键词进行声明。声明。全局变量有以下特点:全局变量有以下特点:全局变量是整个文件都可以访问的变量,可全局变量是整个文件都可以访问的变量,可以用于在函数之间共享大量的数据,存在周以用于在函数之间共享大量的数据,存在周期长,在程序编译时就存在,如果两个函数期长,在程序编译时就存在,如果两个函数需要在不互相调用时共享数据,则可以使用需要在不互相调用时共享数据,则可以使用全局变量进行参数传递;全局变量进行参数传递;C51C51语言程序的函数只支持一个函数返回值,语
20、言程序的函数只支持一个函数返回值,如果一个函数需要返回多个值,除了使用指如果一个函数需要返回多个值,除了使用指针外,还要使用全局变量;针外,还要使用全局变量;使用全局变量进行参数传递可以减少从实际使用全局变量进行参数传递可以减少从实际参数向形式参数传递时所必需的堆栈操作;参数向形式参数传递时所必需的堆栈操作;在一个文件中,如果某个函数的局部变量和在一个文件中,如果某个函数的局部变量和全局变量同名,则在这个局部变量的作用范全局变量同名,则在这个局部变量的作用范围内局部变量不起作用,全局变量起作用;围内局部变量不起作用,全局变量起作用;全局变量一直存在,占用了大量的内存单元,全局变量一直存在,占用
21、了大量的内存单元,并且加大了程序的耦合性,不利于程序的移并且加大了程序的耦合性,不利于程序的移植或复用。植或复用。静态局部变量的作用范围仅仅是在定义的函静态局部变量的作用范围仅仅是在定义的函数内,不能被其他的函数访问,全局变量的数内,不能被其他的函数访问,全局变量的作用范围是整个程序,静态全局变量的作用作用范围是整个程序,静态全局变量的作用范围是该变量定义的文件;范围是该变量定义的文件;静态局部变量是在函数内部定义,全局变量静态局部变量是在函数内部定义,全局变量是在所有函数外定义;是在所有函数外定义;静态局部变量仅仅在第静态局部变量仅仅在第1 1次调用时被初始化,次调用时被初始化,再次调用时使
22、用上次调用结束时的数值,全再次调用时使用上次调用结束时的数值,全局变量在程序运行时建立,值为最近一条访局变量在程序运行时建立,值为最近一条访问该全局变量的语句执行的结果。问该全局变量的语句执行的结果。另外,函数虽然是文件的主文件,但也另外,函数虽然是文件的主文件,但也是一个函数,在其内部定义的变量也属是一个函数,在其内部定义的变量也属于局部变量。全局变量一般在文件的开于局部变量。全局变量一般在文件的开始部分定义或在文件中定义,由文件引始部分定义或在文件中定义,由文件引用。用。C51C51语言程序多使用全局变量传递语言程序多使用全局变量传递参数,因为这样可以降低程序处理的难参数,因为这样可以降低
23、程序处理的难度,加快程序执行的速度,提高程序的度,加快程序执行的速度,提高程序的时效性。时效性。3.2 C513.2 C51对单片机资源的控制对单片机资源的控制 3.2.1 3.2.1 特殊功能寄存器的特殊功能寄存器的C51C51语言语言定义定义 3.2.2 3.2.2 绝对地址的访问绝对地址的访问 3.2.3 3.2.3 位变量的位变量的C51C51语言定义语言定义3.2.1 3.2.1 特殊功能寄存器的特殊功能寄存器的C51C51定义定义 2121个特殊功能寄存器。两种方式:个特殊功能寄存器。两种方式:1 1使用关键字定义使用关键字定义 特功器名字特功器名字=特功器地址特功器地址;0 x9
24、8;0 x98;/*串口控制寄存器地址串口控制寄存器地址98H98H*/0X89;0X89;/*定时器定时器/计数器方式控制寄存器地址计数器方式控制寄存器地址89H89H*/2 2通过头文件访问通过头文件访问 使用的单片机为公司的使用的单片机为公司的5151 ()()0=00;0=00;0=0 x3c;0=0 x3c;0=1;0=1;启动定时器启动定时器0 0.3 3中位定义中位定义33种方式种方式(1 1)第)第1 1种方法种方法 位名位名=特殊功能寄存器名特殊功能寄存器名 位置位置;(2 2)第)第2 2种方法种方法 位名位名=字节地址字节地址 位置位置;(3 3)第)第3 3种方法种方法
25、 位名位名=位地址位地址;例:例:00;2;002;02;00;P1=0 x90;P1_010;P1_111;P1_616;P1_717;P60 P60 例例3-3 3-3 型变量的定义型变量的定义 P60 P60 例例3-4 3-4 片内口及其位的定片内口及其位的定义义3.2.2 3.2.2 绝对地址的访问绝对地址的访问 包括:包括:片内、片外及口片内、片外及口 可以有两种方式:可以有两种方式:1 1、通过宏定义、通过宏定义 2 2、1 1、通过宏定义、通过宏定义 用用可使用其中声明的宏来访问绝对地可使用其中声明的宏来访问绝对地址,址,以字节形式对区寻址;以字节形式对区寻址;以字形式对区寻址
26、;以字形式对区寻址;以字节形式对区寻址;以字节形式对区寻址;以字形式对区寻址;以字形式对区寻址;另外:另外:以字节形式对区寻址;以字节形式对区寻址;以字形式对区寻址;以字形式对区寻址;以字节形式对区寻址;以字节形式对区寻址;以字形式对区寻址。以字形式对区寻址。如:如:00 00/*将定义为外部口,地址为将定义为外部口,地址为0000,长度为,长度为8 8位位*/0 x40 0 x40/*将定义为片内,地址为将定义为片内,地址为40H40H,长度为,长度为8 8位位*/例例3-5(P61)3-5(P61)0 0将定义为外部口,地址为将定义为外部口,地址为0 0 0 x40 0 x40/*将定义为
27、片内,地址为将定义为片内,地址为40H40H,长度为,长度为8 8位位*/()()0 x3A;0 x3A;0 x01;0 x01;2 2、关键词、关键词 可以使用关键字对指定的存储器空间的可以使用关键字对指定的存储器空间的绝对地址进行访问。绝对地址进行访问。一般格式如下:一般格式如下:【存储类型】【存储类型】数据类型符数据类型符 变量名变量名 地地址常数址常数;例例3-63-6(P62)P62)x1 0 x40;/*在区定义字节变在区定义字节变量量x1,它的地址为它的地址为40H*/x2 0 x2000;/*在区定义字变量在区定义字变量x2,它的地址为它的地址为2000H*/()x1=0;x2
28、=0 x1234H;.(1);3.2.3 3.2.3 位变量的位变量的C51C51语言定义语言定义 1 1位变量的位变量的C51C51语言定义语言定义 采用关键字进行定义。例如:采用关键字进行定义。例如:;/*将定义为位变量将定义为位变量 */;/*将定义为位变量将定义为位变量 */;/*将定义为位变量将定义为位变量 */2 2可位寻址对象可位寻址对象 可位寻址对象指可以字节或位寻址的对可位寻址对象指可以字节或位寻址的对象。该对象应位于象。该对象应位于80518051片内可位寻址区中,片内可位寻址区中,C51C51语言编译器允许数据类型为的对象放入语言编译器允许数据类型为的对象放入805180
29、51片内可位寻址区。片内可位寻址区。位变量的存储类型只能是。位变量的存储类型只能是。在程序设计时,对于可位寻址的对象,在程序设计时,对于可位寻址的对象,即可以字节寻址也可以位寻址的变量,但其即可以字节寻址也可以位寻址的变量,但其存储类型只能是。存储类型只能是。使用时应先说明字节变量的数据类型和使用时应先说明字节变量的数据类型和存储类型,然后可使用定义可独立寻址访问存储类型,然后可使用定义可独立寻址访问的对象位。的对象位。例如:例如:;/*定义为整型变量定义为整型变量*/4;/*定义为字符型数组定义为字符型数组*/00;/*0定义为的第定义为的第0位位*/1515;/*15定义位的第定义位的第1
30、5位位*/0707;/*07定义为定义为0的第的第7位位*/3737;/*37定义为定义为3的第的第7位位*/37=0;37=0;/*3 3的第的第7 7位赋值为位赋值为0 0*/3=a;3=a;/*字节寻址:字节寻址:33赋值为赋值为a a*/定义要求基址对象的存储类型为,定义要求基址对象的存储类型为,只有这样其特殊位定义()是合法的。只有这样其特殊位定义()是合法的。位置(位置(操作符)后的最大值依操作符)后的最大值依赖于指定的基类型,对于而言是赖于指定的基类型,对于而言是0 07 7,对于而言是对于而言是0 01515,对于而言是,对于而言是0 03131。3.3 C513.3 C51的
31、基本运算与流程控制的基本运算与流程控制 3.3.1 3.3.1 基本运算基本运算 3.3.2 3.3.2 选择(分支)控制语句选择(分支)控制语句 3.3.3 3.3.3 循环结构流程控制语句循环结构流程控制语句 3.3.4 3.3.4 语句、语句、语句、语句、语句语句3.3.1 3.3.1 基本运算(运算符)基本运算(运算符)运算符是表示特定的算术或逻辑运算的符号,运算符是表示特定的算术或逻辑运算的符号,也称操作符。也称操作符。把需要进行运算的各个量通过运算符连接起把需要进行运算的各个量通过运算符连接起来,便构成表达式。来,便构成表达式。算术运算符、关系运算符、算术运算符、关系运算符、逻辑运
32、算符、位运算符、逻辑运算符、位运算符、赋值运算符、特殊运算符赋值运算符、特殊运算符一、算术运算一、算术运算 算术运算的操作符:算术运算的操作符:+(加法运算符)、(加法运算符)、-(减法运算符)(减法运算符)*(乘法运算符)、(乘法运算符)、/(除法运算符)(除法运算符)(模运算或取余运算符)(模运算或取余运算符)为自增运算符为自增运算符-为自减运算符。为自减运算符。注意:注意:/:结果的整数部分:结果的整数部分%:结果的余数部分:结果的余数部分-:除进行减法外,还可以进行取负操作。:除进行减法外,还可以进行取负操作。:自增。表示操作数加:自增。表示操作数加1 1。等同于等同于1 1。表示先加
33、表示先加1 1,再取值,再取值 表示先取值,再加表示先取值,再加1 1。例例3-83-8:自增和自减运算符的程序:自增和自减运算符的程序 ()x,y,z1,z2;10;21;z1=()+();(“,z1n”,x,z1);z2=()+();(“,z2n”,y,z2);二、关系运算二、关系运算成立或不成立成立或不成立 主要用于比较操作数的大小关系。主要用于比较操作数的大小关系。包括:包括:(小于)、(小于)、=(大于)、(大于)、=(大于等于)、(大于等于)、=(等于)、!(等于)、!=(不等于)(不等于)看关系是否成立。结果:看关系是否成立。结果:0 0或或1 1例例3-9 3-9 关系运算符运
34、算的程序示例关系运算符运算的程序示例 ()a,b,c,d;2.30;7132;70;12=0;(“,n”,a,b,c,d);三、逻辑运算三、逻辑运算结果是真或假结果是真或假 进行逻辑运算的操作符。包括:进行逻辑运算的操作符。包括:(逻辑与)、(逻辑与)、(逻辑或)、(逻辑或)、!(逻辑非)!(逻辑非)看结果是否为真。结果:看结果是否为真。结果:0 0或或1 1。例例3-10 3-10 逻辑运算的程序示例逻辑运算的程序示例 ()a,b,c,d,e;!0;1522;350;17.30;17.32.6;(“,n”,a,b,c,d,e);四、位运算四、位运算 将两个操作数按二进制数展开,然后对应位将两
35、个操作数按二进制数展开,然后对应位进行逻辑运算。包括:进行逻辑运算。包括:&(按位与)、(按位与)、|(按位或)、(按位异(按位或)、(按位异或)、(按位取反)、或)、(按位取反)、(位右移)(位右移)位运算的操作对象只能是整型和字符型数据。位运算的操作对象只能是整型和字符型数据。这些位运算和汇编语言中的位操作指令十分这些位运算和汇编语言中的位操作指令十分类似。位操作指令是单片机的重要特点,所类似。位操作指令是单片机的重要特点,所以位运算在以位运算在C51C51语言控制类程序设计中的应用语言控制类程序设计中的应用比较普遍。比较普遍。例例3-11 3-11 位运算程序示例位运算程序示例 将将a
36、a值循环右移值循环右移2 2位位()()03;03;2;2;(8);n;n;例例3-12 3-12 位运算程序示例位运算程序示例 ()a,;23;217;(“n”,c);(“n”,c);b;(“an”,c);(“n”,c);3;(“a2;(“b2n”,c);五、赋值运算五、赋值运算 变量名变量名=表达式表达式;例如:例如:(4)+(6);(4)+(6);该表达式的值为该表达式的值为1010,变量,变量a a的值为的值为1010。复合赋值运算符:复合赋值运算符:赋值符号前加上其他运算符构成复合运算符。赋值符号前加上其他运算符构成复合运算符。C51C51语言提供以下语言提供以下1010种复合运算符
37、:种复合运算符:,*=,=,=,=,=,=,=例如:例如:;等价于等价于()()x x*;等价于等价于(x(x*()();等价于等价于()()a=4;a=4;等价于等价于(a4)(ay);形式二:形式二:(表达式表达式)语句语句1;1;语句语句2;2;(xy);形式三:形式三:(表达式表达式1)1)语句语句1;1;(表达式表达式2)2)语句语句2;2;(表达式表达式3)3)语句语句3;3;(表达式表达式m)m)语句语句m;m;语句语句n;n;如:如:(x1000)1;(x500)2;(x300)3;(x100)4;5;例例3-13 3-13 分支编程示例分支编程示例 ();();(x0)1;(
38、0)0;1;(dn);例例3-14:();200;321;();(n);例例3-15:();1221;();(n);例例3-16:();45;(=90)A;(=80)B;(=70)C;(=60)D;E;(n);二、语句二、语句 语句是多分支选择语句一般形式如下:语句是多分支选择语句一般形式如下:(表达式表达式)常量表达式常量表达式1:1:语句语句1;1;常量表达式常量表达式2:2:语句语句2;2;.常量表达式常量表达式n:n:语句语句n;n;:语句语句1;1;例例3-173-173.3.3 3.3.3 循环结构流程控制语句循环结构流程控制语句 四种形式:四种形式:一、基于和构成的循环一、基于和
39、构成的循环 1 1、采用和可以构成、采用和可以构成“当型当型”循环循环:(:(表达式表达式)语句语句;2 2、采用和也可以构成、采用和也可以构成“直到型直到型”循环循环程序程序 :语句语句;(表达式表达式););3 3、语句为无条件转向语句、语句为无条件转向语句 语句标号语句标号;二、二、(表达式)语句;例:例:()i,s;100;0;(i0);1;(“1+2+100n”);注意:注意:先判断,后执行;先判断,后执行;如果循环体内只有一个语句,可以如果循环体内只有一个语句,可以不用不用 循环体循环体 后无分号;后无分号;三、三、语句语句;(表达式)(表达式);例:例:()i,s;1000;1;
40、(i0);(“1+2+100n”);注意:注意:先执行先执行,后判断;后判断;如果循环体内只有一个语句,可以如果循环体内只有一个语句,可以不用不用 循环体循环体 后无分号;后无分号;(表达式)后的分号不能省;表达式)后的分号不能省;四、四、(表达式表达式1;1;表达式表达式2;2;表达式表达式3)3)语句语句;(0(0;y=99y=99;3)3)(33);(33);例:例:()i,s;0;(0=100);(“1+2+100n”);注意:注意:3 3个表达式都是可选项,可以任意省略,个表达式都是可选项,可以任意省略,但但“;”不能省。不能省。省省1 1是不对循环变量赋初值;是不对循环变量赋初值;
41、省省2 2是不判断循环条件的真假;是不判断循环条件的真假;省省3 3是不对循环变量操作。是不对循环变量操作。(;)(;)表示无限循环。表示无限循环。无限循环的实现:无限循环的实现:(1 1)(;)(;)代码段;代码段;(2 2)(1)(1)代码段;代码段;(3 3)代码段;代码段;(1 1););3.3.4 3.3.4 语句、语句、语句语句、语句、语句 在循环语句执行过程中,在循环语句执行过程中,如果需要在满足循环判定条件的情如果需要在满足循环判定条件的情况下跳出代码段,可以使用或语句;况下跳出代码段,可以使用或语句;如果要从任意地方跳转到代码的某如果要从任意地方跳转到代码的某个地方,可以使用
42、语句。个地方,可以使用语句。1 1、语句用于从循环代码中退出,然后执行语句用于从循环代码中退出,然后执行循环语句之后的语句,不再进入循环循环语句之后的语句,不再进入循环 。形式:形式:;注意:注意:一个只能跳出一层循环一个只能跳出一层循环例:例:()i,s;0;0;(1);(i100);(“1+2+100n”);2 2、语句用于退出当前循环,不再执行本语句用于退出当前循环,不再执行本轮循环,程序代码从下一轮循环开始执轮循环,程序代码从下一轮循环开始执行,直到判断条件不满足为止。行,直到判断条件不满足为止。与的区别是该语句不是退出整个循环。与的区别是该语句不是退出整个循环。形式:形式:;例:例:
43、()=a,B,c,D,e,F;1;(i=a i=z);(“n”,i,i);3 3、是一个无条件转移语句。是一个无条件转移语句。当执行语句时,将程序指针跳转到当执行语句时,将程序指针跳转到给出的下一条代码,基本格式如下:给出的下一条代码,基本格式如下:标号标号;例:例:()();0;0;:;:;(101)(101);3.4 C513.4 C51的数组与指针的数组与指针 C51 C51语言的构造数据类型主要语言的构造数据类型主要有数组、指针和结构等。在单片机有数组、指针和结构等。在单片机系统中,数组的应用比较广泛,指系统中,数组的应用比较广泛,指针则次之,结构用的相对较少。这针则次之,结构用的相对
44、较少。这里我们只讨论数组和指针。里我们只讨论数组和指针。3.4.1 3.4.1 数组数组 数组是同类型变量的一个有序数组是同类型变量的一个有序集合。集合。数组用一个名字来标识,称为数组用一个名字来标识,称为数组名。数组名。数组中的每个变量称为数组元数组中的每个变量称为数组元素。素。数组有一维、二维、三维和多维数数组有一维、二维、三维和多维数组之分。组之分。C51C51语言中常用的一维、二维语言中常用的一维、二维数组和字符数组。数组和字符数组。数组中各元素的顺序用下标表示,数组中各元素的顺序用下标表示,下标为下标为n n的元素可以表示为数组名的元素可以表示为数组名nn。改变改变 中的下标就可以访
45、问数组中所中的下标就可以访问数组中所有的元素。有的元素。1 1一维数组一维数组 类型说明符类型说明符 数组名数组名 元素个数元素个数;110;110;初始化:初始化:a5=1,2,3,4,5;a5=1,2,3,4,5;b6=1,2,6;b6=1,2,6;例例3-233-23:2 2二维数组或多维数组二维数组或多维数组 类型说明符类型说明符 数组名数组名 行数行数列数列数;234;234;2 2 数组有数组有3 3 行行4 4 列共列共12 12 个实型元素个实型元素 a34=a34=1,2,3,4,5,6,7,8,9,10,11,12;1,2,3,4,5,6,7,8,9,10,11,12;全部
46、初始化全部初始化3 3字符数组字符数组 若一个数组的元素是字符型的,则该数若一个数组的元素是字符型的,则该数组就是一个字符数组。例如:组就是一个字符数组。例如:a12=;a12=;字符数组字符数组 36=36=,;,;字符串数组字符串数组4 4查表查表 =32,34,36,37,39,41;=32,34,36,37,39,41;/*数组数组,设置在中设置在中,长度为实际输入的数值数长度为实际输入的数值数 */()();()()x;x;(5)(5)*得到与得到与55相应的华氏温度值相应的华氏温度值 */共阴极的显示字符段码表共阴极的显示字符段码表 11=0 x3f,0 x06,0 x5b,0 x
47、4f,0 x66,0 x611=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f;d,0 x7d,0 x07,0 x7f,0 x6f;3.5 C513.5 C51函数函数 函数是指能够执行特定功能和任务的程函数是指能够执行特定功能和任务的程序代码段。序代码段。一个完整的一个完整的C51C51程序是由一个主函数和程序是由一个主函数和若干个其他函数组成。若干个其他函数组成。主函数是主函数是()()函数。有且只有一个函数。有且只有一个()()函函数。数。使用函数时注意:使用函数时注意:函数数目不限制;函数数目不限制;()()函数是
48、主函数,可以调用其他函数,函数是主函数,可以调用其他函数,而不允许被其他函数调用。而不允许被其他函数调用。除主函数外,其他函数之间允许互相调除主函数外,其他函数之间允许互相调用。用。一、函数分类一、函数分类 可以从不同的角度分类:可以从不同的角度分类:(1 1)有无返回值角度)有无返回值角度(2 2)数据传送角度)数据传送角度(3 3)函数定义角度)函数定义角度(1 1)有无返回值角度)有无返回值角度 无返回值函数、有返回值函数无返回值函数、有返回值函数 无返回值函数:执行完成后不向主调函无返回值函数:执行完成后不向主调函数返回函数值。类型说明符为:数返回函数值。类型说明符为:有返回值函数:执
49、行完成后向主调函数有返回值函数:执行完成后向主调函数返回一个执行的结果返回一个执行的结果返回值。返回值。(2 2)数据传送角度)数据传送角度 有参函数和无参函数。有参函数和无参函数。无参函数:主调函数和被调函数之间不无参函数:主调函数和被调函数之间不进行参数的传递。进行参数的传递。有参函数:主调函数和被调函数之间存有参函数:主调函数和被调函数之间存在参数的传递。形式参数和实际参数在参数的传递。形式参数和实际参数(3 3)函数定义角度)函数定义角度 主函数、自定义函数、库函数主函数、自定义函数、库函数 自定义函数:是用户根据自己的需要而自定义函数:是用户根据自己的需要而编写的函数。从函数定义的形
50、式上可以编写的函数。从函数定义的形式上可以将其划分无参函数、有参函数和空函数。将其划分无参函数、有参函数和空函数。无参函数无参函数 有参函数有参函数 空函数空函数二、函数定义二、函数定义 有参函数和无参函数定义。有参函数和无参函数定义。(1 1)无参函数的定义方法)无参函数的定义方法P60P60 无参函数的定义形式为:无参函数的定义形式为:返回值类型标识符返回值类型标识符 函数名函数名()()函数体函数体;无参函数一般不带返回值,因此函数返回值无参函数一般不带返回值,因此函数返回值类型标识符可以省略。类型标识符可以省略。(2 2)有参函数的定义方法)有参函数的定义方法 有参函数的定义形式为:有