位和sbit的区别?

msc*_*msc 2 embedded 8051

Keil C51 中 8051 微控制器的bit和关键字有什么区别?sbit

何时应该sbit使用以及什么时候使用bit

一些例子会很有帮助。

lsu*_*nny 5

这应该可以帮助你:

\n\n
\n

少量

\n\n

C51 为您提供了位数据类型,可用于变量声明、参数列表和函数返回值。位变量的声明方式与其他 C 数据类型的声明方式相同。对于\n示例:

\n\n
static bit done_flag = 0; /* bit variable */\n\nbit testfunc (    /* bit function */\n  bit flag1,  /* bit arguments */\n  bit flag2)\n{\n.\n.\n.\nreturn (0);   /* bit return value */\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

所有位变量都存储在位于 8051 内部存储区域的位段中。由于该区域只有 16 个字节长,因此在任何一个范围内最多可以声明 128 个位变量。

\n\n

存储器类型可以包含在位变量的声明中。但是,由于位变量存储在 8051 的内部数据区域中,因此只有 data 和 idata 存储器类型可以包含在声明中。任何其他内存类型均无效。

\n\n

以下限制适用于位变量和位\n 声明:

\n\n
    \n
  • 使用禁用中断(#pragma disable)的函数和使用显式寄存器组(使用 n)声明的函数\n 无法返回位值。对于尝试返回位类型的此类函数,C51 编译器会生成错误消息。

  • \n
  • 位不能声明为指针。例如:

    \n\n

    位*ptr

  • \n
  • bit 类型的数组无效。例如:

    \n\n

    位软件 [5]

  • \n
\n\n

SBIT

\n\n

对于典型的 8051 应用,通常需要访问 SFR 中的各个位。C51 编译器使用 sbit 数据类型使这成为可能。sbit 数据类型允许您访问可位寻址的 SFR。例如:

\n\n
sbit EA = 0xAF;\n
Run Code Online (Sandbox Code Playgroud)\n\n

该声明将 EA 定义为地址 0xAF 处的 SFR 位。在 8051 上,这是中断启用寄存器中的启用所有位。

\n\n

笔记:

\n\n

并非所有 SFR 都是可位寻址的。只有那些地址可被 8 整除的 SFR 才是可位寻址的。这些 SFR\xe2\x80\x99 的低半字节\n 将为 0 或 8;例如,0xA8 和 0xD0 处的 SFR 是可位寻址的,而 0xC7 和 0xEB 处的 SFR 则不是。SFR 位\n 地址很容易计算。将位位置与 SFR 字节地址相加即可得到 SFR 位地址。因此,要访问位于 0xC8 的 SFR 中的位 6,SFR 位地址将为 0xCE (0xC8 + 6)。

\n\n

任何符号名称都可以在 sbit 声明中使用。等号 (=) 右侧的表达式指定符号名称的绝对位地址。有三种指定地址的变体。\n

\n\n

变体 1:

\n\n
 sfr_name ^ int_constant\n
Run Code Online (Sandbox Code Playgroud)\n\n

此变体使用先前声明的 sfr (sfr_name) 作为 sbit 的基地址。现有 SFR 的地址必须能被 8 整除。克拉符号 (^)\n 后面的表达式指定要使用此声明访问的位的位置。位位置必须是 0 到 7 范围内的数字。例如:

\n\n
sfr PSW = 0xD0;\nsfr IE = 0xA8;\n\nsbit OV = PSW ^ 2;\nsbit CY = PSW ^ 7;\n\nsbit EA = IE ^ 7;\n
Run Code Online (Sandbox Code Playgroud)\n\n

变体 2:

\n\n
int_constant ^ int_constant\n
Run Code Online (Sandbox Code Playgroud)\n\n

此变体使用整数常量作为 sbit 的基地址。基址值必须能被 8 整除。克拉符号 (^) 后面的表达式指定要使用此声明访问的位的位置。位位置必须是 0 到 7 范围内的数字。例如:

\n\n
sbit OV = 0xD0 ^ 2;\nsbit CY = 0xD0 ^ 7;\n\nsbit EA = 0xA8 ^ 7;\n
Run Code Online (Sandbox Code Playgroud)\n\n

变体 3:

\n\n
int_constant\n
Run Code Online (Sandbox Code Playgroud)\n\n

此变体对 sbit 使用绝对位地址。例如:

\n\n
sbit OV = 0xD2;\nsbit CY = 0xD7;\n\nsbit EA = 0xAF;\n
Run Code Online (Sandbox Code Playgroud)\n\n

注意事项:

\n\n

特殊功能位表示一个独立的声明类,\n 不能与其他位声明或位字段互换。

\n\n

sbit 数据类型声明可用于访问使用 bdata 内存类型说明符声明的变量的各个位\n

\n
\n\n

来源:\n BITSBIT

\n