第2章(3)C51程序设计语言_第1页
第2章(3)C51程序设计语言_第2页
第2章(3)C51程序设计语言_第3页
第2章(3)C51程序设计语言_第4页
第2章(3)C51程序设计语言_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

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

文档简介

1、KEIL C编译器所支持的数据类型编译器所支持的数据类型数据类型数据类型长长 度度值值 域域unsigned char单字节单字节0255signed char单字节单字节-128+127unsigned int双字节双字节065535signed int双字节双字节-32768+32767unsigned long四字节四字节04294967295signed long四字节四字节-2147483648+2147483647float四字节四字节1.175494E-383.402823E+38*13 字节字节对象的地址对象的地址bit位位0 或或 1sfr单字节单字节0255sfr16双字节

2、双字节065535sbit位位0 或或 12.3.1.2 2.3.1.2 数据类型数据类型一字符型一字符型charchar有有signed charsigned char和和unsigned charunsigned char之分,默认为之分,默认为signed charsigned char。它们的长度均为它们的长度均为一个字节一个字节,用于存放一个单字节的数据。对,用于存放一个单字节的数据。对于于signed charsigned char,它用于定义带符号字节数据,其字节的最高,它用于定义带符号字节数据,其字节的最高位为符号位,位为符号位,“0”0”表示正数,表示正数,“1”1”表示负数

3、,补码表示,表示负数,补码表示,所能表示的数值范围是所能表示的数值范围是-128+127;对于;对于unsigned charunsigned char,它,它用于定义无符号字节数据或字符,可以存放一个字节的无符用于定义无符号字节数据或字符,可以存放一个字节的无符号数,其取值范围为号数,其取值范围为0255。unsigned charunsigned char可以用来存放无可以用来存放无符号数,也可以存放西文字符,一个西文字符占一个字节,符号数,也可以存放西文字符,一个西文字符占一个字节,在计算机内部用在计算机内部用ASCIIASCII码存放。码存放。 二二int整型整型分分singed in

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

5、数据。对于的长度均为四个字节,用于存放一个四字节数据。对于signed long,用于存放四字节带符号数,补码表示,数的范畴为,用于存放四字节带符号数,补码表示,数的范畴为-2147483648+2147483647。对于。对于unsigned long,用于存放四字,用于存放四字节无符号数,数的范围为节无符号数,数的范围为04294967295。四四floatfloat浮点型浮点型 floatfloat型数据的长度为四个字节,包含指数和尾数两部分,型数据的长度为四个字节,包含指数和尾数两部分,最高位为符号位,最高位为符号位,“1”1”表示负数,表示负数,“0”0”表示正数,其次的表示正数,其

6、次的8 8位为阶码,最后的位为阶码,最后的2323位为尾数的有效数位。位为尾数的有效数位。 五五* * 指针型指针型 指针型变量中存放的是指向另一个数据的地址。这个指针指针型变量中存放的是指向另一个数据的地址。这个指针变量要占用一定的内存单元,一般为变量要占用一定的内存单元,一般为1313个字节。个字节。六六位类型位类型是是C51C51中扩充的数据类型,用于访问中扩充的数据类型,用于访问5151单片机中的可寻址的位单单片机中的可寻址的位单元。在元。在C51C51中,支持两种位类型:中,支持两种位类型:bitbit型和型和sbitsbit型。它们在内存型。它们在内存中都只占一个二进制位,其值可以

7、是中都只占一个二进制位,其值可以是“1”1”或或“0”0”。其中用。其中用bitbit定义的位变量在定义的位变量在C51C51编译器编译时,在不同的时候位地址是可以编译器编译时,在不同的时候位地址是可以变化的,而用变化的,而用sbitsbit定义的位变量必须与定义的位变量必须与5151单片机的一个可以位单片机的一个可以位寻址的字节单元中的某一位联系在一起,在寻址的字节单元中的某一位联系在一起,在C51C51编译器编译时,编译器编译时,其对应的位地址是不可变化的。其对应的位地址是不可变化的。bit位类型符用于定义一般的位变量。它的格式如下: bit 位变量名;在格式中可以加上各种修饰,但注意存储

8、器类型只能是在格式中可以加上各种修饰,但注意存储器类型只能是bdata、data、idata。只能是片内。只能是片内RAM的可位寻址区,严格来说只能是的可位寻址区,严格来说只能是bdata。七七特殊功能寄存器型特殊功能寄存器型 这是这是C51扩充的数据类型,用于访问扩充的数据类型,用于访问51单片机中的特殊功能单片机中的特殊功能寄存器数据,它分寄存器数据,它分sfr和和sfr16两种类型,其中两种类型,其中sfr为字节型特殊功能为字节型特殊功能寄存器类型,占一个内存单元,利用它可以访问寄存器类型,占一个内存单元,利用它可以访问51内部的所有特内部的所有特殊功能寄存器;殊功能寄存器;sfr16为

9、双字节型特殊功能寄存器类型,占用两个为双字节型特殊功能寄存器类型,占用两个字节单元,利用它可以访问字节单元,利用它可以访问51内部的所有两个字节的特殊功能寄内部的所有两个字节的特殊功能寄存器。在存器。在C51中对特殊功能寄存器的访问必须先用中对特殊功能寄存器的访问必须先用sfr或或sfr16进行进行声明。声明。2.3.1.4 变量及其存储模式变量及其存储模式 变量是在程序运行过程中其值可以改变的量。一个变量变量是在程序运行过程中其值可以改变的量。一个变量由两部分组成:变量名和变量值。在由两部分组成:变量名和变量值。在C51中,变量在使用前必中,变量在使用前必须对变量进行定义,定义的格式如下:须

10、对变量进行定义,定义的格式如下: 存储种类存储种类 数据类型数据类型 存储器类型存储器类型 变量名表;变量名表;一数据类型说明符一数据类型说明符 在定义变量时,必须通过数据类型说明符指明变量的数据在定义变量时,必须通过数据类型说明符指明变量的数据类型,指明变量在存储器中占用的字节数。可以是基本数据类类型,指明变量在存储器中占用的字节数。可以是基本数据类型说明符,也可以是组合数据类型说明符,还可以是用型说明符,也可以是组合数据类型说明符,还可以是用typedef定义的类型别名。定义的类型别名。 在在C51C51中,为了增加程序的可读性,允许用户为系统固有的数中,为了增加程序的可读性,允许用户为系

11、统固有的数据类型说明符用据类型说明符用typedeftypedef起别名,格式如下:起别名,格式如下: typedef c51typedef c51固有的数据类型说明符固有的数据类型说明符 别名;别名;【例【例3-2】 typedef的使用。的使用。typedef unsigned int WORD;typedef unsigned char BYTE;BYTE a1=0 x12;WORD a2=0 x1234;三、存储器类型三、存储器类型存储器类型是用于指明变量所处的单片机的存储器区域情况存储器类型是用于指明变量所处的单片机的存储器区域情况存储器类型与存储种类完全不同。存储器类型与存储种类完

12、全不同。C51C51编译器能识别的存储器编译器能识别的存储器类型有:类型有:存储器类型存储器类型说说 明明datadata直接访问内部数据存储器(直接访问内部数据存储器(128128字节字节),),访问速度最快访问速度最快bdatabdata可位寻址内部数据存储器(可位寻址内部数据存储器(1616字节),允许位与字节混合访问字节),允许位与字节混合访问idataidata间接访问内部数据存储器(间接访问内部数据存储器(256256字节),对于字节),对于5151子系列,只允许子系列,只允许访问低访问低128B128B,对于,对于5252子系列,允许访问全部子系列,允许访问全部256B256B地

13、址地址pdatapdata分页访问外部数据存储器(分页访问外部数据存储器(256256字节),相当于用字节),相当于用MOVX RiMOVX Ri指令指令访问访问xdataxdata外部数据存储器外部数据存储器(64KB)(64KB),相当于用,相当于用MOVX DPTRMOVX DPTR指令访问指令访问codecode程序存储器(程序存储器(64KB64KB), ,相当于用相当于用MOVC A+DPTRMOVC A+DPTR指令访问指令访问例:数据类型例:数据类型 存储器类型存储器类型 变量变量 char data var1; bit bdata flags;unsigned char xd

14、ata vextor; 定义变量时如果省略存储器类型,系统则会按编译定义变量时如果省略存储器类型,系统则会按编译模式模式SMALLSMALL、COMPACTCOMPACT或或LARGELARGE所规定的默认存储器类所规定的默认存储器类型去指定变量的存储区域。型去指定变量的存储区域。 2.3.1.5 C51定义特殊功能寄存器定义特殊功能寄存器 对对SFRSFR的操作,只能采用直接寻址方式。为了能直接访问这的操作,只能采用直接寻址方式。为了能直接访问这些特殊功能寄存器,些特殊功能寄存器,Keil C51Keil C51扩充了两个关键字扩充了两个关键字“sfr”sfr”、“sfr16”sfr16”,

15、可以直接对,可以直接对5151单片机的特殊寄存器进行定义。单片机的特殊寄存器进行定义。一、一、 使用关键字使用关键字sfr、sfr16定义特殊功能寄存器定义特殊功能寄存器 sfr 特殊功能寄存器名特殊功能寄存器名= 特殊功能寄存器地址常数特殊功能寄存器地址常数;如:对于如:对于8051片内片内I/O口,定义方法如下:口,定义方法如下:sfr P1 = 0 x90; /定义定义P1口,地址口,地址90H sfr后面是一个要定义的名字,要符合标识符的命名规则,名后面是一个要定义的名字,要符合标识符的命名规则,名字最好有一定的含义字最好有一定的含义 等号后面必须是常数,不允许有带运算符的表达式,而且

16、该等号后面必须是常数,不允许有带运算符的表达式,而且该常数必须在特殊功能寄存器的地址范围之内(常数必须在特殊功能寄存器的地址范围之内(80H-FFH)。)。Sfr16 特殊功能寄存器名特殊功能寄存器名= 特殊功能寄存器地址常数特殊功能寄存器地址常数;如:数据指针如:数据指针DPTR,可以定义为:,可以定义为:sfr16 DPTR = 0 x82; /这里定义数据指针这里定义数据指针DPTR,地址为,地址为DPL=82H,DPH=83H 用用sfr16定义定义16位特殊功能寄存器时,等号后面是它的低位地址,位特殊功能寄存器时,等号后面是它的低位地址,高位地址一定要位于物理低位地址之上。高位地址一

17、定要位于物理低位地址之上。二、用二、用sbit定义特殊功能寄存器的特殊位定义特殊功能寄存器的特殊位1)sbit 位变量名位地址位变量名位地址sbit P1_1 = 0 x91;这样是把位的绝对地址赋给位变量。这样是把位的绝对地址赋给位变量。同同sfr一样,一样,sbit的位地址必须位于的位地址必须位于80HFFH之间。之间。2)Sbit 位变量名特殊功能寄存器名位变量名特殊功能寄存器名位地址位地址sfr P3 = 0 xB0;sbit P3_1 = P3 1; /先定义一个特殊功能寄存器名,先定义一个特殊功能寄存器名,再指定位变量名所在的位置。再指定位变量名所在的位置。当可寻址位位于特殊功能寄

18、存器中时可采用这种方当可寻址位位于特殊功能寄存器中时可采用这种方法。法。3)sbit 位变量名字节地址位变量名字节地址位地址位地址sbit P3_1 = 0 xB01; 三、三、 通过头文件访问通过头文件访问SFRSFR编译器给出的头文件已经给出了常用编译器给出的头文件已经给出了常用51 51 单片机中的单片机中的SFR SFR 及及其可位寻址位的定义。比如其可位寻址位的定义。比如Keil C Keil C 将这些头文件按单片机的将这些头文件按单片机的不同生产公司、不同型号分别存在不同生产公司、不同型号分别存在Keil C Keil C 的的INC INC 子目录下,子目录下,在程序中只需直接

19、引用这些头文件即可实现对在程序中只需直接引用这些头文件即可实现对SFR SFR 的访问和的访问和控制。控制。【例【例3-33-3】头文件引用实例。】头文件引用实例。#include /#include /单片机为单片机为atmel atmel 公司的公司的AT89C51AT89C51main()main() TL0=0 xb0; /TL0=0 xb0; /访问定时器访问定时器0 0,设置时间常数,设置时间常数TH0=0 x3c;TH0=0 x3c;TR0=1; /TR0=1; /启动定时器启动定时器0 0 C51C51包含的头文件包含的头文件reg51.hreg51.h, reg52.hreg

20、52.h, Reg51.h Reg51.h 定义定义5151子系列单片机的特殊功能寄存器和部分子系列单片机的特殊功能寄存器和部分位寄存器位寄存器 Reg52.h Reg52.h 定义定义5252子系列单片机的特殊功能寄存器和部分子系列单片机的特殊功能寄存器和部分位寄存器位寄存器 在程序开始部分使用语句在程序开始部分使用语句 #include #include 即可直接使用特殊功能寄存器及其部分位单元,不需要再即可直接使用特殊功能寄存器及其部分位单元,不需要再作定义。作定义。2.3.1.5 指针指针一指针的概念一指针的概念在在C语言中,数据通常是以变量的形式进行存放和访问的。变语言中,数据通常是

21、以变量的形式进行存放和访问的。变量在使用时分清两个概念量在使用时分清两个概念:变量名和变量的值。:变量名和变量的值。变量名变量名是数据的标识符,相当于内存单元的地址是数据的标识符,相当于内存单元的地址变量的值变量的值是数据的内容,变量的值相当于内存单元的内容。是数据的内容,变量的值相当于内存单元的内容。对于变量有两种访问方式:对于变量有两种访问方式:直接访问方式和间接访问方式直接访问方式和间接访问方式。直接访问方式。直接访问方式。对于变量的访问,我们大多数时候是直接给对于变量的访问,我们大多数时候是直接给出变量名。出变量名。间接访问方式。间接访问方式。例如要存取变量例如要存取变量a中的值时,可

22、以先将变量中的值时,可以先将变量a的地址放在另一个变量的地址放在另一个变量b中,访问时先找到变量中,访问时先找到变量b,从变量,从变量b中取出变量中取出变量a的地址,然后根据这个地址从内存单元中取出变的地址,然后根据这个地址从内存单元中取出变量量a的值。这就是间接访问。在这里,从变量的值。这就是间接访问。在这里,从变量b中取出的不是中取出的不是所访问的数据,而是访问的数据(变量所访问的数据,而是访问的数据(变量a的值)的地址,这就的值)的地址,这就是指针,变量是指针,变量b称为指针变量。称为指针变量。 变量的指针和指向变量的指针变量。变量的指针和指向变量的指针变量。变量的指针就是变量变量的指针

23、就是变量的地址。对于变量的地址。对于变量a,如果它所对应的内存单元地址为,如果它所对应的内存单元地址为2000H,它的指针就是,它的指针就是2000H。指针变量是指一个专门用。指针变量是指一个专门用来存放另一个变量地址的变量,它的值是指针。上面变量来存放另一个变量地址的变量,它的值是指针。上面变量b中存放的是变量中存放的是变量a的地址,变量的地址,变量b中的值是变量中的值是变量a的指针,变的指针,变量量b就是一个指向变量就是一个指向变量a的指针变量。的指针变量。二指针变量的定义二指针变量的定义指针变量的定义与一般变量的定义类似,定义的一般形式为:指针变量的定义与一般变量的定义类似,定义的一般形

24、式为:数据类型说明符数据类型说明符 存储器类型存储器类型1 *【存储器类型【存储器类型2 】指针变量名;】指针变量名;其中:其中:“数据类型说明符数据类型说明符”说明了该指针变量所指向的变量的类型。说明了该指针变量所指向的变量的类型。 “存储器类型存储器类型”是可选项,如果带有此选项,指针被定义是可选项,如果带有此选项,指针被定义为基于存储器的指针。无此选项时,被定义为一般指针。为基于存储器的指针。无此选项时,被定义为一般指针。 下面是几个指针变量定义的例子:下面是几个指针变量定义的例子:int * p1; /*定义一个指向整型变量的指针变量定义一个指向整型变量的指针变量p1*/char da

25、ta * p3; /*定义一个指向字符变量的指针变量定义一个指向字符变量的指针变量p3,该指针访问的数据在片内数据存储器中,该指针在内存中占一该指针访问的数据在片内数据存储器中,该指针在内存中占一个字节个字节*/float xdata * p4; /*定义一个指向浮点型变量的指针变量定义一个指向浮点型变量的指针变量p4,该指针访问的数据在片外数据存储器中,该指针在内存中,该指针访问的数据在片外数据存储器中,该指针在内存中占两个字节占两个字节*/Float *xdata p4; /*定义一个指向浮点型变量的指针变量定义一个指向浮点型变量的指针变量p4,该指针存放在片外数据存储器中,该指针在内存中

26、占三个字节该指针存放在片外数据存储器中,该指针在内存中占三个字节*/三指针变量的引用三指针变量的引用 指针变量是存放另一变量地址的特殊变量,指针变量只能指针变量是存放另一变量地址的特殊变量,指针变量只能存放地址。指针变量使用时注意两个运算符:存放地址。指针变量使用时注意两个运算符:&和和*。&”是取地址运算符,是取地址运算符,“*”是指针运算符。是指针运算符。通过通过“&”取地址运算符可以把一个变量的地址送给指针变量,取地址运算符可以把一个变量的地址送给指针变量,使指针变量指向该变量;通过使指针变量指向该变量;通过“*”指针运算符可以实现通过指指针运算符可以实现通过指针

27、变量访问它所指向的变量的值。针变量访问它所指向的变量的值。 例如:例如:int x,* px,* py;/*变量及指针变量定义变量及指针变量定义*/px=&x; /*将变量将变量x的地址赋给指针变量的地址赋给指针变量px,使,使px指向变量指向变量x*/* px=5; /*等价于等价于x=5*/py=px; /*将指针变量将指针变量px中的地址赋给指针变量中的地址赋给指针变量py,使指针变量,使指针变量py也指向也指向x*/2.3.2 C51的运算符及表达式的运算符及表达式1 赋值运算符赋值运算符 赋值运算符赋值运算符“=”,在,在C51中,它的功能是将一个数据的值赋中,它的功能是将一

28、个数据的值赋给一个变量,如给一个变量,如x=10。一个赋值语句的格式如下:。一个赋值语句的格式如下: 变量变量=表达式表达式;执行时先计算出右边表达式的值,然后赋给左边的变量。例如:执行时先计算出右边表达式的值,然后赋给左边的变量。例如: x=8+9; /*将将8+9的值赋绐变量的值赋绐变量x*/ x=y=5; /*将常数将常数5同时赋给变量同时赋给变量x和和y*注意:注意: 在赋值运算中,当在赋值运算中,当“=”两侧的类型不一致时,要将数据转两侧的类型不一致时,要将数据转换成同一数据类型,转换的方式有两种。换成同一数据类型,转换的方式有两种。1系统自动转换系统自动转换 编译时,将右边表达式的

29、值转换成左侧变量的类型,再赋编译时,将右边表达式的值转换成左侧变量的类型,再赋给该变量。给该变量。2.强制转换强制转换 使用强制类型转换运算符转换使用强制类型转换运算符转换: (类型名类型名) (表达式),将(表达式),将表达式的数据类型转换为前面要求的类型名。表达式的数据类型转换为前面要求的类型名。 【例【例3-8】类型转换应用。】类型转换应用。 unsigned char x,y; unsigned int z,a; x=(float)a; y=(int)(x+y); z=x+(unsigned int)y;2 算术运算符算术运算符+ 加或取正值运算符加或取正值运算符- 减或取负值运算符减

30、或取负值运算符 * 乘运算符乘运算符/ 除运算符除运算符% 取余运算符取余运算符加、减、乘运算相对比较简单,而对于除运算,如相除的两加、减、乘运算相对比较简单,而对于除运算,如相除的两个数为浮点数,则运算的结果也为浮点数,如相除的两个数为个数为浮点数,则运算的结果也为浮点数,如相除的两个数为整数,则运算的结果也为整数,即为整除。如整数,则运算的结果也为整数,即为整除。如25.0/20.0结果为结果为1.25,而,而25/20结果为结果为1。对于取余运算,则要求参加运算的两个数必须为整数,运算对于取余运算,则要求参加运算的两个数必须为整数,运算结果为它们的余数。例如:结果为它们的余数。例如:x=

31、5%3,结果,结果x的值为的值为2。3 关系运算符关系运算符C51中有中有6种关系运算符:种关系运算符: 大于大于= 大于等于大于等于3,结果为真(结果为真(1),而),而10= =100,结果为假(,结果为假(0)。)。 4 逻辑运算符逻辑运算符C51有有3种逻辑运算符:种逻辑运算符:| 逻辑或逻辑或& 逻辑与逻辑与! 逻辑非逻辑非逻辑运算符用于求条件式的逻辑值,用逻辑运算符将关系表达式或逻辑运算符用于求条件式的逻辑值,用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式。逻辑量连接起来的式子就是逻辑表达式。 逻辑与,格式:逻辑与,格式: 条件式条件式1 & 条件式条

32、件式2当条件式当条件式1与条件式与条件式2都为真时结果为真(非都为真时结果为真(非0),否则为假(),否则为假(0) 逻辑或,格式:逻辑或,格式: 条件式条件式1 | 条件式条件式2 当条件式当条件式1与条件式与条件式2都为假时结果为假(都为假时结果为假(0),否则为真(非),否则为真(非0) 逻辑非,格式:逻辑非,格式: !条件式!条件式 当条件式原来为真(非当条件式原来为真(非0),逻辑非后结果为假(),逻辑非后结果为假(0)。当条件)。当条件式原来为假(式原来为假(0),逻辑非后结果为真(非),逻辑非后结果为真(非0)。)。例如:若例如:若a=8,b=3,c=0,则!,则!a为假,为假,

33、a & b为真,为真,b & c为假。为假。5 位运算符位运算符位运算是按位对变量进行运算,但并不改变参与运算的变量的位运算是按位对变量进行运算,但并不改变参与运算的变量的值。值。C51中位运算符只能对整数进行操作,不能对浮点数进行操中位运算符只能对整数进行操作,不能对浮点数进行操作。作。C51中的位运算符有:中的位运算符有:& 按位与按位与| 按位或按位或 按位异或按位异或 按位取反按位取反 右移右移【例】设【例】设a=0 x45=01000101B,b=0 x3b=00111011B,则,则a&b、a|b、ab、a、a2分别为多少?分别为多少?a&b

34、=00000001b=0 x01。a|b=01111111B=0 x7f。ab=01111110B=0 x7e。a=10111010B=0 xba。a2=00001110B=0 x0e。6 复合赋值运算符复合赋值运算符C51中支持的复合赋值运算符:中支持的复合赋值运算符:+= 加法赋值加法赋值 - = 减法赋值减法赋值*= 乘法赋值乘法赋值 /= 除法赋值除法赋值 %= 取模赋值取模赋值 &= 逻辑与赋值逻辑与赋值 |= 逻辑或赋值逻辑或赋值 = 逻辑异或赋值逻辑异或赋值 = 逻辑非赋值逻辑非赋值 = 右移位赋值右移位赋值 b)?a:b的执行结果是将的执行结果是将a和和b中较中较大的数

35、赋值给变量大的数赋值给变量max。9 指针与地址运算符指针与地址运算符* 指针运算符指针运算符& 取地址运算符取地址运算符指针运算符指针运算符“*”放在指针变量前面,通过它实现访问以指针变放在指针变量前面,通过它实现访问以指针变量的内容为地址所指向的存储单元。例如:指针变量量的内容为地址所指向的存储单元。例如:指针变量p中的地址中的地址为为2000H,则,则*p所访问的是地址为所访问的是地址为2000H的存储单元,的存储单元,x=*p,实,实现把地址为现把地址为2000H的存储单元的内容送给变量的存储单元的内容送给变量x。取地址运算符取地址运算符“&”放在变量的前面,通过它取得

36、变量的地址,放在变量的前面,通过它取得变量的地址,变量的地址通常送给指针变量。例如:设变量变量的地址通常送给指针变量。例如:设变量x的内容为的内容为12H,地址为地址为2000H,则,则&x的值为的值为2000H,如有一指针变量,如有一指针变量p,则通常,则通常用用p=&x,实现将,实现将x变量的地址送给指针变量变量的地址送给指针变量p,指针变量,指针变量p指向指向变量变量x,以后可以通过,以后可以通过*p访问变量访问变量x。2.3.3.2 选择控制语句选择控制语句一、一、if语句语句if语句是语句是C51中的一个基本条件选择语句,它通常有三种格式:中的一个基本条件选择语句,它

37、通常有三种格式:(1)if (表达式)(表达式) 语句;语句;(2)if (表达式)(表达式) 语句语句1; else 语句语句2;(3)if (表达式(表达式1) 语句语句1;else if (表达式(表达式2) 语句语句2;else if (表达式(表达式3) 语句语句3;else if (表达式(表达式n-1) 语句语句n-1;else 语句语句n二、二、switch/case语句语句if语句通过嵌套可以实现多分支结构,但结构复杂。语句通过嵌套可以实现多分支结构,但结构复杂。switch是是C51中提供的专门处理多分支结构的多分支选择语句。它的中提供的专门处理多分支结构的多分支选择语句。

38、它的格式如下:格式如下:switch (表达式)(表达式)case 常量表达式常量表达式1:语句语句1;break;case 常量表达式常量表达式2:语句语句2;break;case 常量表达式常量表达式n:语句语句n;break;default:语句语句n+1;【例【例2-12】 STC89C51 单片机的单片机的P1.0 和和P1.1 引脚接有两只按键,其引脚接有两只按键,其4 种种逻辑组合分别点亮由逻辑组合分别点亮由P2.0P2.3 控制的控制的4 只只LED(高电平点亮),试编程(高电平点亮),试编程实现此功能。实现此功能。解:解: #include void main()data u

39、nsigned char a;doa=P1;a=a&0 x03; /,读低,读低2位位 P2=P2&0 xf0;switch (a)case 0:P2=P2|0 x01;break;case 1:P2=P2|0 x02;break;case 2:P2=P2|0 x04;break;case 3:P2=P2|0 x08;while(1);2.3.3.3 循环语句循环语句一、一、 基于基于 if if 和和goto goto 构成的循环构成的循环采用采用if if 和和goto goto 可以构成可以构成“当型当型”循环程序,其格式如下:循环程序,其格式如下:looploop:if

40、if(表达式)(表达式) 语句;语句;goto loopgoto loop; 采用采用if if 和和goto goto 也可以构成也可以构成“直到型直到型”循环程序,其格式如循环程序,其格式如下:下:looploop: 语句;语句;ifif(表达式)(表达式)goto loopgoto loop; goto goto 语句为无条件转向语句,它的一般形式是:语句为无条件转向语句,它的一般形式是:goto goto 语句标号;语句标号;二、二、while语句语句while语句在语句在C51中用于实现当型循环结构,它的格式如下:中用于实现当型循环结构,它的格式如下: while(表达式)(表达式)

41、 语句;语句; /*循环体循环体*/当表达式为非当表达式为非0(真)时,就重复执行循环体内的语句;当(真)时,就重复执行循环体内的语句;当表达式为表达式为0(假),则中止(假),则中止while循环,程序将执行循环结构之循环,程序将执行循环结构之外的下一条语句。外的下一条语句。三、三、 基于基于do-while 语句构成的循环语句构成的循环do-while 语句只能用来实现语句只能用来实现“直到型直到型”循环,其一循环,其一般格式是:般格式是:do语句;语句;/可以是复合语句可以是复合语句 while (表达式);(表达式);do-while 语句的特点是先执行内嵌的语句;再计算语句的特点是先

42、执行内嵌的语句;再计算表达式,如果表达式的值为非表达式,如果表达式的值为非0,则继续执行内嵌的语,则继续执行内嵌的语句,直到表达式的值为句,直到表达式的值为0 时结束循环。时结束循环。 四、基于四、基于for 语句构成的循环语句构成的循环for 语句的一般形式为:语句的一般形式为:for (表达式(表达式1;表达式;表达式2;表达式;表达式3)语句;语句;它的执行过程是:它的执行过程是:首先求解初始化表达式首先求解初始化表达式1;其次求解表达式;其次求解表达式2,判断是否满,判断是否满足循环条件,若其值非足循环条件,若其值非0,则执行内嵌语句;否则退出循环;,则执行内嵌语句;否则退出循环;最后

43、求解尺度增量表达式最后求解尺度增量表达式3,并回到第,并回到第2 步。步。在在for 语句中,可以没有表达式语句中,可以没有表达式1、表达式、表达式2 或表达式或表达式3,若,若三个表达式都没有,则相当于一个死循环。如果其后紧跟一三个表达式都没有,则相当于一个死循环。如果其后紧跟一个个“;”,则为空循环,常用于延时;,则为空循环,常用于延时;1break语句语句使用使用break语句可以从循环体中跳出循环,提前结束循环而接语句可以从循环体中跳出循环,提前结束循环而接着执行循环结构下面的语句。着执行循环结构下面的语句。它不能用在除了循环语句和它不能用在除了循环语句和switch语句之外的任何其它

44、语句中语句之外的任何其它语句中【例】下面一段程序用于计算圆的面积,当计算到面积大于【例】下面一段程序用于计算圆的面积,当计算到面积大于100时,由时,由break语句跳出循环。语句跳出循环。for (r=1;r100) break;五、五、break和和continue语句语句continue语句用在循环结构中,用于结束本次循环,跳语句用在循环结构中,用于结束本次循环,跳过循环体中过循环体中continue下面尚未执行的语句,直接进行下一下面尚未执行的语句,直接进行下一次是否执行循环的判定。次是否执行循环的判定。【例】【例】 输出输出100200间不能被间不能被3整除的数。整除的数。for (

45、i=100;i=200;i+)if (i%3= =0) continue;printf(“%d ”;i); 2continue语句语句return语句一般放在函数的最后位置,用于终止函数的执行,语句一般放在函数的最后位置,用于终止函数的执行,并控制程序返回调用该函数时所处的位置。返回时还可以通过并控制程序返回调用该函数时所处的位置。返回时还可以通过return语句带回返回值。语句带回返回值。return语句格式有两种:语句格式有两种:(1)return;(2)return (表达式表达式); 六、六、return语句语句2.3.4 函数函数2.3.4.1 函数的分类与定义函数的分类与定义一、函

46、数的分类一、函数的分类C 语言函数分为语言函数分为主函数主函数main( )和和普通函数普通函数两种,而对于普通两种,而对于普通函数,又可以分为函数,又可以分为标准库函数标准库函数和和用户自定义函数用户自定义函数。1)标准库函数)标准库函数标准库函数是由标准库函数是由C 编译系统提供的,在编译系统提供的,在C 编译系统中将一些编译系统中将一些独立的功能模块编写成公用函数,并将它们集中存放在系统的独立的功能模块编写成公用函数,并将它们集中存放在系统的函数库中,供程序设计时使用,称之为标准库函数。函数库中,供程序设计时使用,称之为标准库函数。字符串操作函数位于字符串操作函数位于“string.h”

47、中。中。包括拷贝、比较、移动等包括拷贝、比较、移动等函数如函数如memcpy、memcmp、memmove、memset,这些函数,这些函数对缓冲区进行处理很方便。对缓冲区进行处理很方便。流函数输入输出,位于流函数输入输出,位于“stdio.h”中中。流函数缺省为。流函数缺省为8051串口。串口。2)用户自定义函数)用户自定义函数用户自定义函数是用户根据自己的需要而编写的函数。从函用户自定义函数是用户根据自己的需要而编写的函数。从函数定义的形式上可以将其划分无参数函数、有参数函数和空函数定义的形式上可以将其划分无参数函数、有参数函数和空函数。数。二、函数的定义二、函数的定义函数定义的完整形式如

48、下:函数定义的完整形式如下:返回数据类型返回数据类型 函数名函数名(形式参数列表形式参数列表) reentrant interrupt n using m 局部变量定义;局部变量定义; 函数体;函数体;1)函数返回值与数据类型)函数返回值与数据类型如果返回数据,进行说明;如果不返回,一般用如果返回数据,进行说明;如果不返回,一般用void说明,说明,也可以不说明。函数返回值通过也可以不说明。函数返回值通过return x返回,返回值是通过返回,返回值是通过函数名带回的,一个函数只能有一个返回值。函数名带回的,一个函数只能有一个返回值。2) reentrant修饰符修饰符 这个修饰符用于把函数定

49、义为可重入函数。所谓可这个修饰符用于把函数定义为可重入函数。所谓可重入函数就是允许被递归调用的函数。函数的递归调用重入函数就是允许被递归调用的函数。函数的递归调用是指当一个函数正被调用尚未返回时,又直接或间接调是指当一个函数正被调用尚未返回时,又直接或间接调用函数本身。用函数本身。3) interrupt m修饰符修饰符在在C51程序设计中,当函数定义时用了程序设计中,当函数定义时用了interrupt m修饰符,系修饰符,系统编译时把对应函数转化为中断函数,按统编译时把对应函数转化为中断函数,按MCS-51系统中断的系统中断的处理方式自动把它安排在程序存储器中的相应位置。处理方式自动把它安排

50、在程序存储器中的相应位置。 在该修饰符中,在该修饰符中,m的取值为的取值为031,对应的中断情况如下:,对应的中断情况如下:0外部中断外部中断01定时定时/计数器计数器T02外部中断外部中断13定时定时/计数器计数器T14串行口中断串行口中断5定时定时/计数器计数器T2其它值预留。其它值预留。4) using n修饰符修饰符修饰符修饰符using n用于指定本函数内部使用的工作寄存器组,用于指定本函数内部使用的工作寄存器组,其中其中n的取值为的取值为03,表示寄存器组号。,表示寄存器组号。对于对于using n修饰符的使用,注意以下几点:修饰符的使用,注意以下几点:(1)加入)加入using

51、n后,后,C51在编译时自动的在函数的开始处在编译时自动的在函数的开始处和结束处加入以下指令。和结束处加入以下指令。PUSH PSW ;标志寄存器入栈;标志寄存器入栈MOV PSW,#与寄存器组号相关的常量与寄存器组号相关的常量POP PSW ;标志寄存器出栈;标志寄存器出栈(2)using n修饰符不能用于有返回值的函数,因为修饰符不能用于有返回值的函数,因为C51函函数的返回值是放在寄存器中的。如寄存器组改变了,返回值就数的返回值是放在寄存器中的。如寄存器组改变了,返回值就会出错。会出错。3.5 绝对地址的访问绝对地址的访问一使用一使用C51运行库中预定义宏运行库中预定义宏C51编译器提供了一组宏定义来对编译器提供了一组宏定义来对51系列单片机的系列单片机的code、data、pdata和和xdata空间进行绝对寻址。空间进行绝对寻址。这些函数原型放在这些函数原型放在absacc.h文件中。使用时须用预处理命令把该文件中。使用时须用预处理命令把该头文件包含到文件中,形式为:头文件包含到文件中,形式为:#include CBYTE以字节形式对以字节形式对code区寻址,区寻址,DBYTE以字节形式对以字节形式对data区寻址,区寻址,PBYTE

温馨提示

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

评论

0/150

提交评论