C语言的基本数据类型和组合数据的区别和应用

语言基础知识,把基础的掌握了在学习复杂的。语言能对运算对象按位进行操作,它与汇编语言使用一样方便。语言中,逗号“,”是一个特殊的运算符,可以用它将两个或两个以上的表达式连接起来,称为逗号表达式。语言中唯一的一个三目运算符,它要求有三个运算对象,用它可以将三个表达式连接在一起构成一个条件表达式。

C 中包含的数据类型如下图所示

C51的数据类型分为基本数据类型和组合数据类型,情况与标准C中的数据类型基本相同,但char类型与短类型相同,float类型与double类型相同,C51中专门针对51单片机有特殊的功能寄存器类型和位类型。

1、C51的基本数据类型如下图所示:

2. *指针类型

指针本身就是一个变量,其中存储了一个指向另一条数据的地址。这个指针变量占用一定的内存单元,不同处理器的长度不同,C51 的长度一般为 1~3 个字节。

3.特殊功能寄存器型

这是C51扩展数据类型,用于访问51单片机中的特殊功能寄存器数据,分为SFR和SFR16两种类型。哪里:

SFR是一个字节型特殊功能寄存器,它占用一个存储单元,允许访问51内部的所有特殊功能寄存器;

SFR16 是一种双字节类型的特殊功能寄存器,它占用两个字节单元,并允许访问 51 内所有两个字节的特殊功能寄存器。

访问

C51 中的特殊功能寄存器必须首先用 sfr 或 sfr16 声明。

4.钻头类型

这也是 C51 中的扩展数据类型,用于访问 51 微控制器中的可寻址位单元。

在 C51 中,支持两种位类型:位和位。它们在内存中都只占用一个二进制位,它们的值可以是“1”或“0”。哪里:

当 C51 编译器编译时,由 bit 定义的位变量可以在不同的时间发生变化,并且由 sbit 定义的位变量必须与 51 微控制器的可寻址位单元或按位字节单元之一相关联,并且相应的位地址在 C51 编译器编译时是不可变的。

KEIL C51 编译器能够识别的基本数据类型:

!【外链图片转储失败,源站可能有防盗机制,建议保存图片直接上传】(

在 C51 程序中,计算中可能存在不一致的数据类型。

C51 允许任何标准数据类型的隐式转换,隐式转换的优先级顺序如下:Bit→char→int→long→float→signed→unsigned

也就是说,当用int类型计算char类型时,char类型会自动扩展为int类型,然后使用int类型执行操作,结果就是int类型。除了支持隐式类型转换外,C51 还可以通过强制转换器 “()” 人为地转换数据类型。

除了这些基本数据类型外,C5l 编译器还可以支持一些复杂的组合数据类型,例如数组类型、指针类型、结构类型、联合类型和其他复杂数据类型。对于初学者来说,我们需要先掌握C语言的基础知识,在学习复杂之前掌握基础知识。

2. C51 计算 1.常数

常量是一个量,其值在程序执行期间不能更改。C51 支持整数常量、浮点常量、字符常量和字符串常量。

1. 整数常量

整数常量(也称为整数常量)存储在计算机中,根据其值的范围具有不同的字节。在C51中,它可以用以下形式表示:

十进制整数。如234、-56、0等。

十六进制整数。它以 0x 开头,例如十六进制数 12H 的 0x12。

长整数。在 C51 中,当整数的值达到长整数的范围时,该数字存储为长整数,在内存中占四个字节,如果整数后面跟着字母 L,则该数字也作为长整数存储在内存中。例如,123L 在内存中占用 4 个字节。

2. 浮点常数

浮点常数也是一个实常数。有十进制表示和指数表示。十进制表示,也称为定点表示,由一个数字和一个小数点组成。例如,0.123、34.645 等是十进制数表示中的浮点常量。指数表示为: [] 数字 [.number] e [] 数字

例如,123.456e-3、-3.123e2 等是指数浮点常数。

3. 字符常量

字符常量是由单引号引起的字符,例如“a”、“1”、“F”等。它可以是可显示的 ASCII 字符,也可以是不可显示的控制字符。无法显示的控制字符必须以反斜杠“”开头才能形成转义字符。它可用于在导出时完成一些特殊功能和格式控制。下表列出了常用的转义字符。

!【外链图片转储失败,源站可能有防盗机制,建议保存图片直接上传】(

4. 字符串类型常量

字符串常量由用双引号“”括起来的字符组成。如“D”、“1234”、“ABCD”等。请注意,字符常量存储在只有一个字节的计算机中,而字符串常量存储在内存中,不仅双引号中的字符占一个字节,而且系统会自动添加一个转义字符“o”作为字符串终止符。因此,不要将字符常量与字符串常量混淆,例如字符常量“A”和字符串常量“A”是不一样的。

2. 变量

变量是程序运行时其值可以更改的量。变量由两部分组成:变量名称和变量值。

在 C51 中,必须先定义一个变量才能使用,指示变量的数据类型和存储模式。 以便编译系统为其分配相应的存储单元。格式定义如下:

[存储类型] 数据类型规范 [内存类型] 变量名称 1 [= 初始值], 变量名称 2 [初始值]…;

1. 数据类型说明符

定义变量时,必须通过数据类型说明符来指示变量的数据类型,该说明符指示变量在内存中占用的字节数。这可以是基本数据类型说明符、组合数据类型说明符或使用 typedef 定义的类型别名。

在 C51 中,为了提高程序的可读性,允许用户使用以下格式为系统固有的数据类型说明符别名 typedef:

typedef c51 内部数据类型说明符别名;

定义别名后,可以使用别名而不是数据类型说明符来定义变量。别名可以是大写或小写的,通常用大写字母表示,以便区分它们。

示例:使用 typedef。

typedef	unsigned	int	    u8; 
typedef	unsigned	char	u16;
u8 a1=0x12;
u16 a2=0x1234;

2. 变量名称

变量名称是 C51 给出的名称,用于区分不同的变量。在 C51 中,变量名称可以由字母、数字和下划线组成,并且第一个字母必须是字母或下划线。有两种类型的变量名称:普通变量名称和指针变量名称。它们之间的区别在于指针变量的名称前面有一个“*”号。

3. 存储类型

存储类型是指程序执行过程中变量的作用域。C51 变量有四种类型:auto、extern、static 和 register。

自动:

一个

用 auto 定义的变量称为自动变量,其作用域在定义它的函数体或复合语句内部,当执行定义它的函数体或复合语句时,C51 为变量分配内存空间,最后释放占用的内存空间。自动变量通常分配在内存的堆栈空间中。定义变量时,如果省略存储类型,则该变量默认为自动变量。外部:

使用 extern 定义的变量称为外部变量。在函数的主体中,如果要使用已在函数外部或其他程序中定义的外部变量,则函数主体中的变量由 extern 描述。定义外部变量并分配固定数量的内存空间,该内存空间在程序的整个执行时间内有效,直到程序结束才释放。静态的:

使用 static 定义的变量称为静态变量。它进一步分为内部静态变量和外部静态变量。函数体内部定义的静态变量是内部静态变量,在对应的函数体中有效且始终存在,但在函数体外不可见,因此变量不仅在定义它的函数之外受到保护,而且实现值在离开函数时不会改变。在函数外部定义的静态变量,位于外部静态变量上。它存在于整个程序中,但在定义范围之外不可见。例如,在多文件或多模块处理中,外部静态变量仅在文件或模块内部有效。注册:

用寄存器定义的变量称为寄存器变量。它定义的变量存储在 CPU 内部的寄存器中,处理速度很快,但数量很少。C51 编译器编译可自动识别程序中最常用的变量,并自动将它们视为寄存器变量,无需特殊声明。4.内存类型

存储器类型用于指示变量所在的微控制器的存储器区域。内存类型与存储类型完全不同。C51 编译器可以识别以下类型的内存,如表所示。

!【外链图片转储失败,源站可能有防盗机制,建议保存图片直接上传】(

还可以在定义变量时保存 Memory Type,省时的 C51 编译器会按编译模式默认内存类型。

5. 特殊功能寄存器变量

51 系列微控制器具有许多特殊功能寄存器,用于控制 51 系列微控制器的定时器、计数器、串行端口、I/O 和其他功能组件,每个寄存器对应于片上 RAM 中的一个或两个字节单元。

在 C51 中,这些特殊功能寄存器允许用户访问,由 sfr 或 sfr16 类型说明符定义,该说明符指定它们对应的片上 RAM 单元的地址。格式如下:

SFR 或 SFR16 特殊功能寄存器名称 = 地址;

SFR 用于定义 51 微控制器中的单字节特殊功能寄存器,SFR16 用于定义双字节特殊功能寄存器。特殊功能寄存器名称通常用大写字母表示。地址通常采用直接地址的形式。

示例:特殊函数寄存器的定义。

sfr PSW=0xd0;
sfr	SCON=0x98; 
sfr	TMOD=0x89; 
sfr	P1=0x90; 
sfr16		DPTR=0x82; 
sfr16		T1=0X8A

6. 位变量

在 C51 中,允许用户通过位类型字符定义位变量。有两种类型的位:位和位。可以定义两种类型的位变量。

位类型用于定义常规的可位位变量。它具有以下格式:位,变量名称;

格式中可以添加各种修饰,但请注意,内存类型只能是 bdata、data、idata。它只能是片上RAM的可寻址区域,严格来说,它只能是bdata。sbit 类型用于定义可位可寻址字节或特殊函数寄存器中的位,并且必须指定其位地址,该地址可以是位直接地址、带标记的可位可寻址变量或带标记的特殊函数寄存器名称。格式如下:

SBIT 变量名称 = 位地址;

如果位地址是位直接地址,则其取值范围为 0x00~0xff;如果按位地址是带有标记的可寻址变量或带有标记的特殊函数寄存器名称,则按位可寻址变量或特殊函数寄存器前面必须有一个定义。字节地址和标签之间,以及特殊功能寄存器和标签之间的间隔,通常用“^”分隔。如 51 个 MCU 引脚所定义:

位 LED=P1^0;

在C51中,为了方便用户,C51编译器定义了51微控制器的通用专用函数寄存器和特殊位,并将它们放在“reg51.h”或“reg52.h”的头文件中,当用户想要使用它时,他只需要使用预处理命令 #include 在程序中包含这个头文件即可使用, 然后可以使用特殊功能寄存器名称和特殊位名称。三、运营商 1.赋值运算符

赋值运算符 “=”,在 C51 中,其功能是将一段数据的值赋给一个变量,例如 x=10。

使用赋值运算符将变量连接到表达式的方程称为赋值表达式,并在赋值表达式中添加分号“;赋值语句的格式如下:

变量 = 表达式;

执行时,将计算右侧表达式的值,然后将其分配给左侧的变量。

例如:x=8+9; /将 8+9 的值赋给变量 x/

x=y=5; / 将常数 5 分配给变量 x 和 y/

在 C51 中,允许在单个语句中同时为多个变量赋值,从右到左。

2. 算术运算符

C51 中支持的算术运算符包括:

加法、减法、乘法运算比较简单,而对于除法运算,如果两个数被除以是浮点数,则运算的结果也是浮点数,如果两个数被除以整数,则运算的结果也是一个整数,即除法为整数。例如,25.0/20.0 结果为 1.25,25/20 结果为 1。

对于余数运算,参与运算的两个数字必须是整数,运算的结果是它们的余数。例如:x=5%3,结果 x 的值为 2。

3. 关系运算符

C51 中有 6 个关系运算符:

大于

<小

于 = 大于或等于

3,结果为真(1),10 = =100,结果为假(0)。

注意:等于“==”的关系运算符由两个“=”组成。

4. 逻辑运算符

C51 有 3 个逻辑运算符:

||逻辑或

&& 逻辑与

! 逻辑非

关系运算符用于反映两个表达式之间的大小关系,逻辑运算符用于查找条件公式的逻辑值。

逻辑与,格式:

条件 1 > 条件 2

当条件 1 和条件 2 都为 true 时,结果为 true(非 0 值),否则为 false(值 0)。

逻辑或格式:

条件方程 1 ||条件方程 2

当条件 1 和条件 2 都为 false 时,结果为 false(值为 0),否则为 true(不是 0 值)。逻辑非,格式:

!有條件的

当条件最初为 true(非 0 值)时,逻辑非后验结果为 false(0 值)。当条件结果为 false(值为 0)时,逻辑非后验结果为 true(不是 0 值)。

例如:如果 a=8, b=3, c=0, 那么!A是假的,A&&B是真的,B&&C是假的。

5. 按位运算符

C51 语言在按位操作对象方面与汇编语言一样方便。按位运算是对变量的按位运算,但不会更改运算中涉及的变量的值。如果要按位更改变量的值,则需要使用相应的赋值操作。C51 中值运算符只能对整数进行操作,而不能对浮点数进行操作。C51 中的按位运算符为:

& 按位使用

|按位或

^ 按位异或

~ 按位否定

>= 右移分配

=2 等价于 x=x>>2。

7. 逗号运算符

在 C51 语言中,逗号“,”是一个特殊的运算符,可用于连接两个或多个表达式,称为逗号表达式。逗号表达式的一般格式为:

表达式 1、表达式 2,……,表达式 n

程序执行过程中逗号表达式的处理:每个表达式的值按从左到右的顺序计算,整个逗号表达式的值就是最右边的表达式(表达式n)的值。例如:x=(a=3,6*3)结果 x 的值为 18。

8. 条件运算符

条件运算符“? :” 是 C51 语言中唯一一个需要三个运算符将三个表达式连接在一起以形成条件表达式的三目运算符。条件表达式的一般格式为:

逻辑表达式?表达式 1:表达式 2

它的作用是先计算逻辑表达式的值,当逻辑表达式的值为真(不是0)时,求值表达式的值1作为整个条件表达式的值;当逻辑表达式的值为 false(0 值)时。

,计算表达式 2 的值将作为整个条件表达式的值。例如,通过将较大的 a 和 b 数分配给变量 max 来执行条件表达式 max=(a>b)?a:b。

9. 指针和地址运算符

指针是 C51 语言中一个非常重要的概念,C51 中的数据类型中有一个特定的指针类型。指针提供了另一种访问变量的方法,变量的指针是该变量的地址,您可以定义专门指向变量地址的指针变量。

为了表示指针变量与其指向的变量的地址之间的关系,C51 提供了两个专用运算符:

4. 表达和符合性陈述 1.表达式语句

在表达式的末尾加一个分号“;“形成表达式语句,例如,a=++b*9;

x=8;y=7;

++k;

可以将一个表达式放在一行上以形成表达式语句,也可以将多个表达式放在一行上以形成表达式语句,并且每个表达式后必须跟“;此外,它只能由一个分号组成“;“占据一行形成表达式语句,称为空语句。

在编程中,空语句通常用于两种情况:

为程序中的语句提供标签,以标记执行程序的位置。例如,以下语句可用于形成循环。

重复:;

goto 重复; 在由 while 语句形成的循环语句中添加分号,以形成一个不执行其他操作的空循环。这种结构通常用于判断位,不满足条件时等待,满足条件时执行。2. 复合语句

复合语句是由若干语句组成的语句,在C51中,几个语句用大括号“{ }”括起来形成复合语句,复合语句不需要用分号结尾“;“结束,但里面的句子仍然需要半殖民化”;“结束。复合语句的一般形式是:

局部变量定义; 语句 L;

声明2;

当一个复合语句被执行时,其中的单个语句是按顺序执行的,整个复合语句在语法上等同于单个语句,所以在C51中,一个复合语句可以被视为一个单一语句。通常复合语句出现在函数中,实际上,函数的执行部分(即函数体)是复合语句;复合语句中的单个语句通常是可执行语句,但它也可以是变量的定义语句(描述变量的数据类型)。复合语句内语句中定义的变量在复合语句中称为局部变量,仅在当前复合语句中有效。使用复合语句将多个单个语句组合到单个语句中,以及在复合语句中定义局部变量,是 C51 语言的重要特征。

五、基本结构及相关句子 1.基本结构 顺序结构

顺序结构是最基本、最简单的结构,其中程序从低地址到高地址依次执行,如图所示给出了顺序结构的流程图,程序先执行操作A,再执行操作B。 选择结构

选择结构允许程序根据不同的情况选择执行不同的分支,在选择结构中,程序首先判断一个条件。当条件为真时,即当条件语句为“true”时,执行一个分支,当条件不为真时,即当条件语句为“false”时,执行另一个分支。如图所示,当条件 S 为真时,执行分支 A,当条件 P 不为真时,执行分支 B。

在 C51 中,实现选择结构的语句是 if/else, if/else if 语句。此外,C51 还支持多分支结构,可以通过嵌套 if 和 else if 语句来实现,也可以通过 swith/case 语句来实现。圆形结构

在程序处理的过程中,有时程序的某个部分需要重复多次,然后需要一个循环结构来实现它,而循环结构就是可以使程序段重复执行的结构。有两种类型的循环结构:when (while) 类型循环结构和 until (do… while)。循环结构

当前循环的结构如下:当条件P为真(“true”)时,重复执行语句A,当条件不为真(“false”)时,停止重复并执行以下程序。直到流通结构的类型

在类型循环结构之前,先执行语句 A,然后判断条件 P,当条件为真(“true”)时,重复语句 A,停止重复,直到条件不为 true(“false”),执行以下过程。构成循环结构的语句主要包括:while、do while、for 和 goto。1. if 语句

if 语句是 C51 中的基本条件选择语句,通常有三种格式:

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}

示例:如何使用 if 语句。

1if	(x!=y)	printf(“x=%d,y=%dn”,x,y);
执行上面语句时,如果 x 不等于 y,则输出 x 的值和 y 的值。
(2if	(x>y)	max=x; 
else	max=y;
执行上面语句时,如 x 大于 y 成立,则把 x 送给最大值变量 max,如 x 大于 y 不成立,则把 y 送给最大值变量 max。使 max 变量得到 x、y 中的大数。
(3if	(score>=90)	printf(“Your result is an An”);
else if (score>=80) printf(“Your result is an Bn”);
else if (score>=70) printf(“Your result is an Cn”); 
else if (score>=60) printf(“Your result is an Dn”); 
else printf(“Your result is an En”);
执行上面语句后,能够根据分数 score 分别打出 A、B、C、D、E 五个等级。 

2. 开关/案例声明

if 语句可以通过嵌套实现多分支结构,但结构复杂。 switch 是 C51 中提供的多分支选择语句,专门用于处理多分支结构。其格式如下:

switch (表达式)
{
case	常量表达式 1{语句 1}breakcase	常量表达式 2{语句 2}break;
……
case	常量表达式 n:{语句 n;}breakdefault{语句 n+1}
}
说明如下:
(1switch 后面括号内的表达式,可以是整型或字符型表达式。
(2)当该表达式的值与某一“case”后面的常量表达式的值相等时,就执行该“case”后面的语句,然后遇到 break 语句退出 switch 语句。若表达式的值与所有 case 后的常量表达式的值都不相同,则执行 default 后面的语句,然后退出 switch 结构。
(3)每一个 case 常量表达式的值必须不同否则会出现自相矛盾的现象。
(4case 语句和 default 语句的出现次序对执行过程没有影响。
(5)每个 case 语句后面可以有“break”,也可以没有。有 break 语句,执行到 break 则退出 switch 结构,若没有,则会顺次执行后面的语句,直到遇到 break 或结束。
(6)每一个 case 语句后面可以带一个语句,也可以带多个语句,还可以不带。语句可以用花括号括起,也可以不括。
(7)多个 case 可以共用一组执行语句。

示例:如何使用 switch/case 语句。

对学生成绩划分为 A~D,对应不同的百分制分数,要求根据不同的等级打印出它的对应百分数。可以通过下面的 switch/case 语句实现。
…… switch(grade)
{
case    ‘A’;printf(”90~100n”);breakcase	‘B’;printf(”80~90n”);breakcase	‘C’;printf(”70~80n”);breakcase	‘D’;printf(”60~70n”);breakcase	‘E’;printf(”<60n”);breakdefault;printf(”error”n)
}

3. while 语句

while 语句在 C51 中用于实现等效循环结构,其格式如下:

while(表达式)
{语句;}	/*循环体*/

while 语句后面的表达式是它是否可以循环的条件,后面的语句是循环体。当表达式为非 0 (true) 时,循环中的语句重复;当表达式为 0 (false) 时,while 循环将中止,程序将执行循环结构之外的下一个语句。它的特点是先判断条件,然后执行循环体。改变循环中的条件,然后判断条件,如果条件为真,则执行循环,如果条件不为真,则退出循环。如果条件第一次不为真,则循环不会执行一次。

4. 做…while 语句

做。。。while 语句在 C51 中用于实现 until-loop 结构,其格式如下:

 do
{语句;}	/*循环体*/ while(表达式);

它的特点是首先执行循环中的语句,然后判断表达式。如果表达式为 true(true),则执行循环体,然后再次判断,直到存在不为 true (false) 的表达式,然后退出并执行循环

do while 结构。执行 do while 语句时,循环体中的语句将至少执行一次。

5. 对于声明

for(表达式 1;表达式 2;表达式 3{语句;}	/*循环体*/

for 语句后面跟着三个表达式,其执行过程如下:

(1) 首先求解表达式 1 的值。

(2)求解表达式2的值,如果表达式2的值为真,则在循环中执行语句,然后执行下一步(3)的操作,如果表达式2的值为假,则结束for循环,进入最后一步。

(3) 如果表达式 2 的值为 true,则在循环中执行语句后,求解表达式 3 并继续执行步骤 4。

(4) 转到 (2) 继续。

(5) 退出 for 循环并执行以下语句之一。

在 for 循环中,一般表达式 1 是初始值表达式,用于将初始值分配给循环变量;表达式 2 是一个条件表达式,它决定了循环变量;表达式 3 是循环变量的更新表达式,用于更新循环变量的值,以便循环变量可以在不满足条件的情况下退出循环。

6. 循环嵌套

循环体允许包含完整的循环结构,这称为循环嵌套。外循环称为外循环,内循环称为内循环,如果循环结构包含在内循环的循环体中,则构成多重循环。在C51中,允许三个循环结构相互嵌套。

示例:构造具有嵌套结构的延迟程序。

void	delay(unsigned	int	x)
{
unsigned	char j; while(x--)
{for (j=0;j<125;j++);}
}

这里利用内环构造基准时延,调用时由参数设置外环数,从而形成各种时延关系。

7. 中断和继续语句

break 和 continue 语句通常用于循环结构中,以打破循环结构。但是,两者之间存在差异,下面将单独描述。

break 语句

如前所述,可以使用 break 语句跳出 switch 结构,让程序在 switch 结构之后继续执行语句。也可以使用 break 语句跳出循环体,提前结束循环,然后在循环结构下方执行语句。它不能用于 loop 和 switch 语句以外的任何语句中。

示例:以下程序用于计算圆的面积,当面积大于 100 时,break 语句跳出循环。

for (r=1;r<=10;r++)
{
area=pi*r*r;
if (area>100) breakprintf(%fn”,area)}

继续语句

在循环结构中使用 continue 语句结束循环,跳过循环体中 continue 下的未执行语句,直接确定下次是否执行循环。

continue 语句和 break 语句的区别在于,continue 语句只结束当前循环,而不是整个循环;break 语句结束循环,不再做出条件判断。

示例:输出 100~200 个不能被 3 整除的数字。

for (i=100;i<=200;i++)
{
if	(i%3= =0)	continue; printf(%d	”;i);
}

在程序中,当 i 能被 3 整除时,执行 continue 语句结束循环,跳过 printf 函数,仅当它能被 3 整除时才执行 printf 函数。

8. 退货声明

return 语句通常放在函数的末尾,用于终止函数的执行,控制调用函数时程序返回的位置。您还可以使用 return 语句带回返回值。有两种返回语句格式:

(1)退货;

(2)返回(表达式);

如果 return 语句后面跟着表达式,则计算表达式的值,并将表达式的值用作函数的返回值。如果没有表达式,该函数将返回不确定的值。通常我们使用 return 语句将调用函数获得的值返回给主调用函数。

6. 功能 1.函数定义

函数定义的一般格式如下:

函数类型 函数名称(形式参数表) [重入][中断 m][使用 n]形式参数说明

局部变量定义函数的主体

前部称为函数的头部,后部称为函数的尾部

函数的类型

函数类型描述函数返回的值的类型。函数的名称

函数名称是用户为自定义函数提供的名称,用于调用函数时使用。形式参数表

形式参数表用于列出主音函数和被调用函数之间数据传输的形式参数。

示例:定义一个函数 max(),该函数返回两个整数的最大值。

int	max(int	x,int	y)
{
int	z; z=x>y?x:y; 
return(z);
}

reentrant 修饰符

此修饰符用于将函数定义为可重入函数。可重入函数是允许递归调用的函数。函数的递归调用是指在函数被调用且尚未返回时对函数本身的直接或间接调用。这在普通函数中是不可能的,只有重入函数才允许递归调用。

关于重入函数,请注意以下几点:

(1)当调用可重入函数时,参数表中不允许使用位类型的参数。函数体也不允许对位变量进行任何操作,更不用说返回 bit 类型的值了。

(2)在编译时,系统在内部或外部存储器中为重入函数创建一个模拟堆栈区域,称为重入堆栈。将重入函数的局部变量和参数放在重入堆栈中,以便可以递归调用重入函数。

(3)在参数的传递方面,可以将实际参数传递给间接调用的重入函数。没有可重入属性的间接调用函数不能包含调用参数,但可以使用定义的全局变量进行传递。中断 M 修饰符

中断 m 是 C51 函数中非常重要的修饰符,因为中断函数必须由它修改。在C51程序设计中,当在函数定义中使用中断m修饰符时,系统将相应的函数编译成中断函数,自动添加程序头和结尾,并根据51系统中断处理自动将其排列在程序存储器中的相应位置。

在此修饰符中,m 的值为 0~31,对应的中断如下:

0 – 外部中断 0

1 – 定时器/计数器 T0

2 – 外部中断 1

3 – 定时器/计数器 T1

4 – 串行端口中断

5 – 定时器/计数器 T2 保留其他值。2. 函数调用和声明 1.功能

函数调用的一般形式如下:

函数名称(参数列表);

对于带参数的函数调用,如果参数列表包含多个参数,则参数用逗号分隔。有

三种方法可以调用函数,具体取决于它在音调函数中的显示位置:

函数语句。将调用的函数视为主调用函数的语句。函数表达式。函数放置在表达式中,并显示为操作对象。在这种情况下,调用的函数需要 return 语句来返回显式值才能参与表达式的操作。函数参数。调用的函数用作另一个函数的参数。2. 声明自定义函数

在 C51 中,函数原型如下所示:

[extern] 函数类型函数名(形式参数表);

函数的声明将函数的名称、函数类型以及函数的类型、编号和顺序通知编译系统,以便系统在调用函数时可以相互检查。分号将添加到函数的声明中。

如果声明的函数在文件中,则应在不使用 extern 的情况下声明它,如果声明的函数不在文件中而在另一个文件中,则必须使用 extern 进行声明,表明使用的函数在另一个文件中。

7. 构建数据类型 1.数组 1.一维数组

一维数组只有一个下标,其定义形式为:

数据类型说明符数组名称 [常量表达式][={初始值,初始值……}]这些部分描述如下:

数据类型说明符描述数组中各个元素存储的数据类型。“数组名称”是整个数组的标识符,它的命名方式与变量相同。“常量表达式”,常量表达式的值必须是整数常量,并且必须用方括号“[]”括起来。它用于描述数组的长度,即数组中的元素数。“初始值部分”用于为数组的元素分配初始值,这在定义数组时是可选的。可以在定义时或定义之后将值分配给数组元素。定义时必须赋值,后跟等号,初始值必须用大括号括起来,括号中的初始值必须用逗号分隔,并且可以赋值数组的所有元素,也可以赋值部分元素。初始值为 0 的元素只能占用带有逗号的位置,而不写入初始值 0。

例如,下面是定义数组的两个示例。

unsigned	char x[5];
unsigned	int	 y[3]={1,2,3};

第一句话定义了一个无符号字符数组,该数组名为 x,数组中的元素数为 5。第二句定义一个无符号整数数组,数组命名为 y,数组中的元素数为 3,定义为数组中的三个元素分配初始值,分别为 1、2 和 3。

需要注意的是,C51 中数组的下标从 0 开始,因此上面第一句话中定义的 5 个元素是:x[0]、x[1]、x[2]、x[3]、x[4]。第二句中定义的 3 个元素是:y[0]、y[1]、y[2]。赋值如下:y[0]=1;y[1]=2;y[2]=3。

C51 指定在引用数组时,只能引用数组中的单个元素,而不能一次引用整个数组。但是,如果它是一个字符数组,则可以一次引用整个数组。

2. 字符数组

用于存储字符数据的数组称为字符数组,它是 C 语言中常用的一种数组。字符数组中的每个元素都用于保存一个字符,字符数组也可用于保存字符串。字符数组的定义大致相同,但在定义时将数据类型定义为 char。

例如:

char string1[10];
char string2[20];

上面定义了两个字符数组,分别定义了 10 个和 20 个元素。

在 C51 语言中,字符数组用于保存一组字符或字符串,字符串以“”结尾,仅包含普通字符的字符数组的赋值与普通数组的赋值完全相同。用于保存字符串的字符数组。您可以逐个访问字符数组的元素,也可以将整个数组视为字符串。

单片机

如何判断单片机是否起振以及晶振的好坏?

2024-5-10 21:06:21

单片机

如何选择合适的晶振?时候需要注意哪些细节?

2024-5-10 22:03:15

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索