汉邦问答 / 问答 / 问答详情

51单片机能不能定义位数组? 比如:bit i;//定义一个位变量i

2023-06-11 08:48:28
bikbok

不可。

位寻址,只能使用直接寻址。

就像特殊功能寄存器一样,不可用数组。

墨然殇

干嘛要用位数组呢?直接定义unsigned char或unsigned int不就行了,想用位域也可以啊。

c语言位变量定义

在c语言中定义bit型变量,可以使用位域来自定义。位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为: struct 位域结构名 { 位域列表 };其中位域列表的形式为: 类型说明符 位域名:位域长度;示例:通过位域来计算IEEE754浮点数标准中,单精度浮点数的最大值、最小值以及最小弱规范数。#include <stdio.h>typedef struct FP_SINGLE{unsigned __int32 fraction : 23;unsigned __int32 exp : 8;unsigned __int32 sign : 1;} fp_single;int main(){float x;fp_single * fp_s = (fp_single *)&x;fp_s->sign = 0;fp_s->exp = 0xfe;fp_s->fraction = 0x7fffff;printf ("float 最大数: %le ",(double)x);fp_s->sign = 0;fp_s->exp = 0x1;fp_s->fraction = 0x0;printf ("float 最小数: %le ",(double)x);fp_s->sign = 0;fp_s->exp = 0;fp_s->fraction = 0x1;printf ("float 最小弱规范数:%le ",(double)x);return 0;}
2023-06-10 18:51:021

位变量与字节变量的区别 BIT与EQU的区别

bit用于定义位变量,处于内部RAM的位寻址区,取值为0或1;EQU是将一个常数或汇编符号赋给字符名,相当于C语言的#define。
2023-06-10 18:51:091

位变量bit和sbit有什么用?

定义特殊功能寄存器的位变量,bit和sbit都是C51扩展的变量类型。C语言是一门面向过程、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。尽管C语言提供了许多低级处理的功能,但仍然保持着跨平台的特性,以一个标准规格写出的C语言程序可在包括一些类似嵌入式处理器以及超级计算机等作业平台的许多计算机平台上进行编译。扩展资料:c语言语言特点:1、丰富的数据类型C语言包含的数据类型广泛,不仅包含有传统的字符型、整型、浮点型、数组类型等数据类型,还具有其他编程语言所不具备的数据类型,其中以指针类型数据使用最为灵活,可以通过编程对各种数据结构进行计算。2、丰富的运算符c语言包含34个运算符,它将赋值、括号等均视作运算符来操作,使C程序的表达式类型和运算符类型均非常丰富。3、可对物理地址进行直接操作C语言允许对硬件内存地址进行直接读写,以此可以实现汇编语言的主要功能,并可直接操作硬件。c语言不但具备高级语言所具有的良好特性,又包含了许多低级语言的优势,故在系统软件编程领域有着广泛的应用。4、代码具有较好的可移植性c语言是面向过程的编程语言,用户只需要关注所被解决问题的本身,而不需要花费过多的精力去了解相关硬件,且针对不同的硬件环境,在用C语言实现相同功能时的代码基本一致,不需或仅需进行少量改动便可完成移植,这就意味着,对于一台计算机编写的C程序可以在另一台计算机上轻松地运行,从而极大的减少了程序移植的工作强度。参考资料来源:百度百科-c语言
2023-06-10 18:51:271

plc控制命令中,位变量是什么意思?

移动的电角度所对应的变量位
2023-06-10 18:51:462

单片机中怎么声明位变量?就是仅有一位的变量那种,是bit a吗?

是sbit如sbit led=P0^1;
2023-06-10 18:51:552

位变量是什么

bit 是单片机 C 语言中的一种数据类型bit 位标量是 c51 编译器的一种扩充数据类型,利用它可定义一个位标量,但不能定义 位指针,也不能定义位数组。它的值是一个二进制位,不是 0 就是 1,类似一些高级语 言中的 Boolean 类型中的 True 和 False。数据类型为 bit 的变量就是位变量
2023-06-10 18:52:061

什么是位变量

编程简述:返回指定套接口上一个重叠操作的结果。 #include <winsock2.h> BOOL WSAAPI WSAGetOverlappedResult( SOCKET s, LPWSAOVERLAPPED lpOverlapped, LPDWORD lpcbTransfer, BOOL fWait, LPDWORD lpdwFlags );s:标识套接口。这就是调用重叠操作(WSARecv()、 WSARecvFrom()、WSASend()、WSASendTo() 或 WSAIoctl())时指定的那个套接口。lpOverlapped:指向调用重叠操作时指定的WSAOVERLAPPED结构。lpcbTransfer:指向一个32位变量,该变量用于存放一个发送或接收操作实际传送的字节数,或WSAIoctl()传送的字节数。fWait:指定函数是否等待挂起的重叠操作结束。若为真TRUE则函数在操作完成后才返回。若为假FALSE且函数挂起,则函数返回FALSE,WSAGetLastError()函数返回 WSA_IO_INCOMPLETE。lpdwFlags:指向一个32位变量,该变量存放完成状态的附加标志位。如果重叠操作为 WSARecv()或WSARecvFrom(),则本参数包含lpFlags参数所需的结果。返回值: 如果函数成功,则返回值为真TRUE。它意味着重叠操作已经完成,lpcbTransfer所指向的值已经被刷新。应用程序可调用WSAGetLastError()来获取重叠操作的错误信息。 如果函数失败,则返回值为假FALSE。它意味着要么重叠操作未完成,要么由于一个或多个参数的错误导致无法决定完成状态。失败时,lpcbTransfer指向的值不会被刷新。应用程序可用WSAGetLastError()来获取失败的原因。错误代码:WSANOTINITIALISED 在调用本API之前应成功调用WSAStartup()。WSAENETDOWN 网络子系统失效。WSAENOTSOCK 描述字不是一个套接口。WSA_INVALID_HANDLE WSAOVERLAPPED结构的hEvent域未包含一个有效的事件对象句柄。WSA_INVALID_PARAMETER 有不可接受的参数。WSA_IO_INCOMPLETE fWait假FALSE且输入/输出操作尚未完成。另请参阅: WSACreateEvent(), WSAWaitForMultipleEvents(),WSARecv(), WSARecvFrom(), WSASend(), WSASendTo(),WSAConnect(), WSAAccept(), WSAIoctl().
2023-06-10 18:52:152

单片机(仅有一位的那种)怎么声明位变量?

是的,对于C51单片机来说,以下有以下类型变量:bit a 1位unsigned char a,或者char a 8位unsigned short a 或者 short a 16位unsigned long a或者 long a 32位unsigned int a 或者 int a 16位,注意,int是与编译器有关的,对于 C51,int等效于shortfloat 或者 double 对于 51来说,都是一样的,32位。
2023-06-10 18:52:431

单片机c语言位变量取反

a=~a;
2023-06-10 18:52:534

位变量和特殊功能寄存器变量有什么作用?

作用是对片内各功能模块进行管理、控制和监视。通过特殊功能寄存器变量可访问MCS51系列单片机的特殊功能寄存器,访问时需通过sfr或sfr16类型说明符进行定义,定义时需指明它们所对应的特殊功能寄存器的地址即可。
2023-06-10 18:53:001

sbit led1 = P1^0是什么意思

sbit led1 = P1^0 位设置,将发光二极管 led1 接 P1口 0 位端,用以控制 led1 的亮灭。
2023-06-10 18:53:233

单片机汇编中,flag bit 00H是什么意思?

地址设为0
2023-06-10 18:53:396

c 语言中 bit与sbit的区别

C51编程中有两个位变量的申明语句即:sbit 和 bitsbit申明一个特殊功能的位变量,该位变量地址是确定的,比如sbit p10=P1^0;bit申明一个通用的位变量,该位变量的地址是可变的,范围在20H~2FH(十六进制)之间,其位地址范围为:00H~FFH
2023-06-10 18:54:077

单片机C51编程中bdata的问题

在51中的位变量包含2类,一类是特殊功能寄存器中的可位寻址的位,比如EA,TR0等;这部分位在C中通过sbit来特殊声明,比如sbit Beep=P1^0; ;另一种即为bdata存储模式的位变量。 bdata是布尔变量的存储方式,表示位变量存储在位于单片机内部RAM字节地址0x20~0x2F的16个字节中,每个字节8位,共计16x8=128个可寻址位,位地址从0x00~0x7F。bdata所指只包含这个区域。 其实一般而言不用去特别声明位变量存储模式,比如bit bdata flag; ,在C51中普通的bit变量只能存放在bdata中,所以只需要bit flag这样去定义变量就行了。关于bit型变量的应用,:1、可以作为参数传递:比如uchar test(bit flag){ if(flag) {//传递来的是真则返回3, return 3; } else {//是假则返回2 return 2; }}main(){ uchar x; bit flag = 1; x = test(falg);}2、可以作为函数的返回值bit test1(uchar a,uchar b){ if(a>b) {//如果a>b则返回真,否则返回假 return 1; } else { return 0; }}main(){ bit flag; flag = test1(2,3);}3、不能使用的场合:C51中没有位变量指针一说,比如 bit bdata *flag1;的定义就是非法的。位变量也不能定义位数组,比如 bit bdata flag[8]也不允许。 另外,返回值采用位变量有两种情况也是不允许的:一种是在函数中禁止使用中断时,第二则是函数中有类似using x这种寄存器组切换时。关于这两种情况我没验证过,没有感性认识,所以不能给你举例说明了,总之在使用中断时慎用返回位变量的函数。 bit变量应用最多的情况:执行一个函数,只是想知道操作是否成功,这时就可以用bit变量作为返回值,这样占用资源少,判断起来也快。当然,如果返回值是char型,判断速度上和bit型差不多,但如果是int型,由于是双字节,就要多花些时间了。
2023-06-10 18:54:461

如何定义内部RAM的可位寻址区的字符变量? 有什么意义

1、C51中要定义内部RAM的位寻区的位作字符变量,用bit语句,bit work;程序中就可以用work变量了,而变量的位地址是系统自动分配,但要清楚,这个位变量取值只有0和1,一般可作为标志位。 2、8051本身包含数据RAM,所以叫片内RAM,另外,51可以外挂 RAM芯片来扩展 RAM ,那是片外RAM。
2023-06-10 18:55:131

西门子PLC 中的IB、QB、VB、MB、SMB、SB、LB、AC各代表什么意思啊?特别是AC可以存储什么样的数据?

楼上的回答正确
2023-06-10 18:55:246

bit定义的位变量地址空间是多少

比如:typedef union aa{ struct { char bit0:1; char bit1:1; char bit2:1; char bit3:1; char bit4:1; char bit5:1; char bit6:1; char bit7:1; }; char bit;}AA;这样 位变量的地址空间就是你定义一个AA联合体变量的空间AA union_aa; 那么位变量的地址空间就是union_aa 了啊。
2023-06-10 18:56:011

51单片机有没有位变量?

操,学汇编还TM将什么变量变量是高级语言的产物,汇编中只有数据
2023-06-10 18:56:115

sbit是char型变量?

不是,sbit是位定义
2023-06-10 18:56:402

位地址和字节地址有何区别

通俗易懂而不严谨的回答:一个单元=一个字节,一个字节包含八个位,一个位的内容可以是0或1(这一段不严谨勿喷,以下举例)比如:累加器A是个八位寄存器,也就是可以存一个八位二进制数AT89S52单片机中规定,累加器A的字节地址是E0H,规定它的八个位地址是E7H~E0H如果累加器A此时存数00001011那么,字节地址E0H内容是00001011。位地址E0H的内容是1,位地址E1H的内容是1,位地址E2H的内容是0,位地址E3H的内容是1,位地址E4H,E5H,E6H,E7H的内容都是0
2023-06-10 18:56:507

请问STM32 中,如何设置一个位变量? ? keil51中是用 bit 加上 变量名字 就可以了!!STM32中呢?

KEIL51使用的不是标准C,而是在C基础上针对51单片机的硬件做了修改的C51。因为51单片机对某些地址可以位寻址,并且要节约每一个资源,所以才有bit这个类型。ARM的资源比51多得多,所以没有对BIT做特别的处理,你可以把普通的字符型变量作为布尔型使用。
2023-06-10 18:57:271

8051的内部ram中安排了多少位变量

位变量在20H~2FH(一共16个单元每个单元有8个可位定址的,从00H~7FH),以及SFR里面从80H~F0H都可以
2023-06-10 18:57:421

程序中u8是uchar,u16是uint,stm32中bit不识别啊,定义一个bit变量怎么办?

stm32不能定义位变量,虽然有个“位带”但也麻烦,如果你真的想用到位,那就试试“位域”。
2023-06-10 18:57:501

单片机C程序模块化的写法,用sbit定义位变量的时候写在写哪个位置?全局变量写在哪?局部变量写在哪?

sbit声明位成员,视作全局。sbit声明位成员建议放在头文件中。全局变量声明在函数体外,引用之前。局部变量声明在函数体内,引用之前。不同编译器采用不同版本的C标准,因此细微之处有些差别。例如Keil C51是基于C90的,局部变量声明只允许放在函数实体语句之前;而其他一些编译器基于较新的C99版本,使用起来较灵活,局部变量可随时声明随时使用;至于C11,目前尚未普及……
2023-06-10 18:57:592

请问STM32 中,如何设置一个位变量? ? keil51中是用 bit 加上 变量名字 就可以了!!STM32中呢?

KEIL51使用的不是标准C,而是在C基础上针对51单片机的硬件做了修改的C51。因为51单片机对某些地址可以位寻址,并且要节约每一个资源,所以才有bit这个类型。ARM的资源比51多得多,所以没有对BIT做特别的处理,你可以把普通的字符型变量作为布尔型使用。
2023-06-10 18:58:212

单片机C语言怎么声明一个可以位寻址的变量

int *cc;cc=(int*)0X6300 ;*cc=3;
2023-06-10 18:58:314

DGUS组态软件中位变量图标怎么用?

控件使用之位变量图标显示1、用到的控件2、添加控件2.1、添加【位变量图标显示】控件3、保存工程及生成文件4、下载文件 1、用到的控件 要想实现点击触控控件切换图标效果,需要用到的显示控件为【位变量图标显示】控件,用到的触控控件为【增量调节】控件
2023-06-10 18:58:372

主程序中的bit位变量,子程序模块中如何声明

为了这个问题,浪费好长时间,挤进了脑汁,伤透了脑筋,曾一度有个现在看来应该是挺好笑的想法——怀疑keil不向标准c一样,不能很好的支持多c文件工程,在多c文件共享变量时,尚无法很好处理。不过就在要点发送帖子按的一瞬间,偶却有了灵感,并通过验证,知道如何解决了。然后再接着想下去,通过实验,有个更多收获:1)如果两个或更多c文件都需要使用某非bit型变量,那么声明是应将相应存储类型同时注明,即如果定义“uchar idata cntembuf;”,那么应声明为“extern uchar idata cntembuf;”或者“extern idata cntembuf;”;2)如果是bit型变量,则数据类型“bit”必须注明,而存储类型可以省略;LN认为,keil里之所以将bit变量和其他类型变量分开处理,是keil面向的处理器都是51内核的,而51内核bit变量只存在于特殊功能寄存器和内存的位寻址区(bdata区),而特殊功能寄存器中的位变量若在两个以上文件中使用各各文件都只能用类似于sbit abcd = P1^6;的形式进行声明,并且keil不检测abcd这个位变量在不同文件中是否代替相同位(例如,可以在另一个c文件中声明为:sbit abcd = P0^5;等),这样一来,用extern声明的bit变量就只有在bdata区了,所以,允许在在一个c文件中定义位变量后,在其它c文件中省略“bdata”这个存储类型;而非bit型变量则可以在特殊功能寄存器,内存,外存,所以声明时要使存储类型与定义时的存储类型相同(也可以在定义和声明时都不规定存储类型,而又编译器根据编译模式自动分配)。感觉今天这事真有点搞笑,不过说明:交流是非常有用的。因为尽管帖子未能发出,但是在要跟他人交流时,人会不自觉的将所要描述给他人的问题屡一下头绪,而往往就这么一屡,可能就让自己有了办法。当然很多时候怎么屡也不行,这时候就要靠别人直接教了
2023-06-10 18:59:121

c51中位变量能怎么赋值,位变量能比较吗?

格式的问题
2023-06-10 18:59:195

stm8s在iar环境下,怎么定义位变量最为方便

struct BitFlag{ unsigned char db0: 1; unsigned char db1: 1; unsigned char db2: 1;}Flag;Flag.db0= 1;
2023-06-10 18:59:371

keil中结构体变量能定义位变量吗

标准C的结构体只支持位域(Bit Field)。使用起来是通过掩码或移位实现的,代码效率不高。如果你想实现类似于(unsigned char型变量的最高位也是个bit变量、可以直接访问)这样的需求,可以借助Keil扩展的bdata以及sbit功能实现。
2023-06-10 18:59:441

bitflag_1s=01秒的变量什么意思

意思是位变量,定时时间是1秒。bitflag,就是声明了一个位变量。bitflag_1s=01的意思是1秒定时标志,意思是在程序的运行中,让程序能实现不同的操作,不同的操作通常时间先后顺序不等,时间就需要设定,如果时间需要设定为1秒,就用bitflag_1s=01来设定。变量来源于数学,是计算机语言中能储存计算结果或能表示值的抽象概念。
2023-06-10 18:59:501

modbus通信,已知三个位变量,怎么把这三个位变量体现在一个16位的数里。

位变量,二进制位吗?那不就是开关量吗,也就是线圈寄存器的数据类型。如果PLC前端设备的三个线圈寄存器连续的话,只写入一个字节八位二进制数就行了,字节的最高位开始的前三个二进制位置0或1就行,写入数量为3。如果不连续,就要三个线圈分别单独写,一次性写入16位数据,可能会改变不需要改变的线圈,从而产生安全隐患。虽然先读取,再更改,再写入可行,但是这样也不安全。
2023-06-10 19:00:091

段变量位变量什么意思

位地址是指可以对某些寄存器或存储器的某一位直接操作,这时这些寄存器的某一位都有一个地址,就叫位地址。编程时用不到位地址,直接写该位的名称即可,如 C语言编程直接写TR0=1,TR0=0,EA=0等 汇编语言写SET B P1.0 CLR EX0. TR0 EA P1.0 等即是特殊功能寄存器中的某一位,是位变量。位变量一位二进制变量,如bit A 结果只能 是1或0,当然它是保存在可位寻址的存储器区域如R0 到 R7中的某一位。
2023-06-10 19:00:451

51单片机中位地址和位变量是什么意思呢

位地址是指可以对某些寄存器或存储器的某一位直接操作,这些这些寄存器的某一位都有一个地址,就叫位地址。编程时用不到位地址,直接写该位的名称即可,如C语言编程直接写TR0=1,TR0=0,EA=0等汇编语言写SETBP1.0CLREX0.位变量一位二进制变量,如bitA结果只能是1或0,当然它是保存在可位寻址的存储器区域如R0到R7中的某一位。
2023-06-10 19:00:541

STM32 C语言中如何定义位变量

可以利用C语言扩展特性定义结构体如下struct {int bit0:1;int bit1:1;...} bitblock;引用 bitblock.bit0
2023-06-10 19:01:031

C51位变量bit定义

sbit led=P2^1;
2023-06-10 19:01:113

c语言中sbit的意思是?

C语言中没有这个关键字,这个是编译器里面的关键字。
2023-06-10 19:01:297

关于bit型变量的用法,说法正确的

什么语言的位变量?
2023-06-10 19:02:122

sbit在单片机中的表示和作用?

我只知道是位定义,如 sbit a=P0^0; 就表示a代表P0^0口a=1; P0^0口就输出高电平
2023-06-10 19:02:445

单片机(仅有一位的那种)怎么声明位变量?

是的,对于C51单片机来说,以下有以下类型变量:x0dx0abita1位x0dx0aunsignedchara,或者chara8位x0dx0aunsignedshorta或者shorta16位x0dx0aunsignedlonga或者longa32位x0dx0aunsignedinta或者inta16位,注意,int是与编译器有关的,对于C51,int等效于shortx0dx0afloat或者double对于51来说,都是一样的,32位。
2023-06-10 19:03:201

单片机汇编中,flag bit 00H是什么意思?

相当于起个小名一般写在程序最前当需要修改时不需要把程序中的所有FLAG都改动只要改00H就好很方便
2023-06-10 19:03:293

数组的数据类型可否是位变量

当然可以,但是后面一定要对变量赋值数组里的内容还有数组长度都可以是变量
2023-06-10 19:03:561

sbit led1 = P1^0是什么意思

sbit led1 = P1^0 含义:是将发光二极管 led1 接 P1口 0 位端,用以控制 led1 的亮灭。sbit是定义特殊功能寄存器的位变量。bit和sbit都是C51扩展的变量类型。典型应用是:sbit P0_0=P0^0;//即定义P0_0为P0口的第1位,以便进行位操作。bit和int char之类的差不多,只不过char=8位, bit=1位而已。都是变量,编译器在编译过程中分配地址。扩展资料在C语言里,如果直接写P1.0,C编译器并不能识别,而且P1.0也不是一个合法的C语言变量名,所以得给它另起一个名字,这里起的名为P1_0,sbit的用法有三种:第一种方法:sbit 位变量名=地址值第二种方法:sbit 位变量名=SFR名称^变量位地址值第三种方法:sbit 位变量名=SFR地址值^变量位地址值如定义PSW中的OV可以用以下三种方法:sbit OV=0xd2 (1)说明:0xd2是OV的位地址值sbit OV=PSW^2 (2)说明:其中PSW必须先用sfr定义好sbit OV=0xD0^2 (3)说明:0xD0就是PSW的地址值因此这里用sbit P1_0=P1^0;就是定义用符号P1_0来表示P1.0引脚,如果你愿意也可以起P10一类的名字,只要下面程序中也随之更改就行了。参考资料:百度百科sbit
2023-06-10 19:04:051

如题,KeilC51位变量能不能定义数组

试试呗我的结论是不行 会报错 error C168: array of bit 手册描述:An array may not have type bit as its basic type. This limitation is imposed by the architecture of the 8051.
2023-06-10 19:04:171

单片机那个sbit是什么意思,位声明是什么

bit和sbit都是C51扩展的变量类型。定义特殊功能寄存器的位变量。bit和sbit都是C51扩展的变量类型。典型应用是:sbit P0_0=P0^0;//即定义P0_0为P0口的第1位,以便进行位操作。在C语言里,如果直接写P1.0,C编译器并不能识别,而且P1.0也不是一个合法的C语言变量名,所以得给它另起一个名字,这里起的名为P1_0,可是P1_0是不是就是P1.0呢?你这么认为,C编译器可不这么认为,所以必须给它们建立联系,这里使用了Keil C的关键字sbit来定义,sbit的用法有三种:第一种方法:sbit 位变量名=地址值第二种方法:sbit 位变量名=SFR名称^变量位地址值第三种方法:sbit 位变量名=SFR地址值^变量位地址值如定义PSW中的OV可以用以下三种方法:sbit OV=0xd2 (1)说明:0xd2是OV的位地址值sbit OV=PSW^2 (2)说明:其中PSW必须先用sfr定义好sbit OV=0xD0^2 (3)说明:0xD0就是PSW的地址值因此这里用sbit P1_0=P1^0;就是定义用符号P1_0来表示P1.0引脚,如果你愿意也可以起P10一类的名字,只要下面程序中也随之更改就行了。单片机学习最好有自己的单片机开发板,这样学习效率会更好,看视频教程,目前比较主流的吴鉴鹰单片机开发板适合学习单片机用
2023-06-10 19:04:351

如何定义内部RAM的可位寻址区的字符变量?

C51中要定义内部RAM的位寻区的位作字符变量,用bit语句,例如bit work;程序中就可以用work变量了,而变量的位地址是系统自动分配,但要清楚,这个位变量取值只有0和1,一般可作为标志位。
2023-06-10 19:04:431

51单片机能不能定义位数组? 比如:bit i;//定义一个位变量i

不可。位寻址,只能使用直接寻址。就像特殊功能寄存器一样,不可用数组。
2023-06-10 19:04:521

c语言中bit和sbit的区别哪些

  c语言中bit和sbit的区别哪些1   1.bit和sbit都是C51扩展的变量类型。   bit和int char之类的差不多,只不过char=8位, bit=1位而已。都是变量,编译器在编译过程中分配地址。除非你指定,否则这个地址是随机的。这个地址是整个可寻址空间,RAM+FLASH+扩展空间。bit只有0和1两种值,意义有点像Windows下VC中的BOOL。   sbit是对应可位寻址空间的一个位,可位寻址区:20H~2FH。一旦用了sbi xxx = REGE^6这样的定义,这个sbit量就确定地址了。sbit大部分是用在寄存器中的,方便对寄存器的某位进行操作的。   2.bit位标量   bit位标量是C51编译器的一种扩充数据类型,利用它可定义一个位标量,但不能定义位指针,也不能定义位数组。它的值是一个二进制位,不是0就是1,类似一些高级语言中的Boolean类型中的True和False。   3.sfr特殊功能寄存器   sfr也是一种扩充数据类型,点用一个内存单元,值域为0~255。利用它可以访问51单片机内部的所有特殊功能寄存器。如用sfr P1 = 0×90这一句定P1为P1端口在片内的寄存器,在后面的语句中我们用以用P1 = 255(对P1端口的所有引脚置高电平)之类的语句来操作特殊功能寄存器。   sfr P1 = 0×90; //定义P1 I/O 口,其地址90H   sfr 关键定后面是一个要定义的名字,可任意选取,但要符合标识符的命名规则,名字最好有一定的含义如P1 口可以用P1 为名,这样程序会变的好读好多.等号后面必须是常数,不允许有带运算符的表达式,而且该常数必须在特殊功能寄存器的地址范围之内(80H-FFH),具体可查看附录中的相关表.   sfr 是定义8 位的特殊功能寄存器而sfr16 则是用来定义16 位特殊功能寄存器,   如8052 的T2 定时器,可以定义为:   sfr16 T2 = 0xCC; //这里定义8052 定时器2,地址为T2L=CCH,T2H=CDH   用sfr16 定义16 位特殊功能寄存器时,等号后面是它的低位地址,高位地址一定要位于物理低位地址之上.注意的是不能用于定时器0 和1 的定义.   sbit 可定义可位寻址对象.如访问特殊功能寄存器中的某位.其实这样应用是经常要用的如要访问P1 口中的第2 个引脚P1.1.我们可以照以下的方法去定义:   (1) sbit 位变量名=位地址   sbit P1_1 = Ox91;   这样是把位的绝对地址赋给位变量.同sfr 一样sbit 的位地址必须位于80H-FFH 之间.   (2) sbit 位变量名=特殊功能寄存器名位位置   sft P1 = 0×90;   sbit P1_1 = P1 ^ 1; //先定义一个特殊功能寄存器名再指定位变量名所在的位置,当可寻址位位于特殊功能寄存器中时可采用这种方法   (3) sbit 位变量名=字节地址位位置   sbit P1_1 = 0×90 ^ 1;   这种方法其实和2 是一样的,只是把特殊功能寄存器的位址直接用常数表示. 在C51存储器类型中提供有一个bdata 的存储器类型,这个是指可位寻址的数据存储器,位于单片机的可位寻址区中,可以将要求可位录址的数据定义为bdata,如:   unsigned char bdata ib; //在可位录址区定义ucsigned char 类型的变量ib   int bdata ab[2]; //在可位寻址区定义数组ab[2],这些也称为可寻址位对象   sbit ib7=ib^7 //用关键字sbit 定义位变量来独立访问可寻址位对象的其中一位   sbit ab12=ab[1]^12;   操作符”^”后面的位位置的最大值取决于指定的基址类型,char0-7,int0-15,long0-31.sfr 并标准C 语言的关键字,而是Keil 为能直接访问80C51 中的`SFR 而提供了一个新的关键词,其用法是:   sfrt 变量名=地址值。   2)符号P1_0 来表示P1.0 引脚。   在C 语言里,如果直接写P1.0,C 编译器并不能识别,而且P1.0 也不是一个合法的C语言变量名,所以得给它另起一个名字,这里起的名为P1_0,可是P1_0 是不是就是P1.0呢?你这么认为,C 编译器可不这么认为,所以必须给它们建立联系,这里使用了Keil C的关键字sbit 来定义,sbit 的用法有三种:   第一种方法:sbit 位变量名=地址值   第二种方法:sbit 位变量名=SFR 名称^变量位地址值   第三种方法:sbit 位变量名=SFR 地址值^变量位地址值   如定义PSW 中的OV 可以用以下三种方法:   sbit OV=0xd2 (1)说明:0xd2 是OV 的位地址值   sbit OV=PSW^2 (2)说明:其中PSW 必须先用sfr 定义好   sbit OV=0xD0^2 (3)说明:0xD0 就是PSW 的地址值   因此这里用sfr P1_0=P1^0;就是定义用符号P1_0 来表示P1.0 引脚,如果你愿意也可以起P10 一类的名字,只要下面程序中也随之更改就行了。   4.sfr16 16位特殊功能寄存器   sfr16占用两个内存单元,值域为0~65535。sfr16和sfr一样用于操作特殊功能寄存器,所不同的是它用于操作占两个字节的寄存器,好定时器T0和T1。   5.sbit可录址位   sbit同位是C51中的一种扩充数据类型,利用它可以访问芯片内部的RAM中的可寻址位或特殊功能寄存器中的可寻址位。如先前我们定义了   sfr P1 = 0×90; //因P1端口的寄存器是可位寻址的,所以我们可以定义   sbit P1_1 = P1^1; //P1_1为P1中的P1.1引脚   //同样我们可以用P1.1的地址去写,如sbit P1_1 = 0×91;   这样我们在以后的程序语句中就可以用P1_1来对P1.1引脚进行读写操作了。通常这些可以直接使用系统提供的预处理文件,里面已定义好各特殊功能寄存器的简单名字,直接引用可以省去一点时间,我自己是一直用的。当然您也可以自己写自己的定义文件,用您认为好记的名字。   c语言中bit和sbit的区别哪些2   bit和sbit这两者不是C语言里面的,而是C51里面的;   bit和sbit的区别在于两者功能不同,具体如下:   bit是变量类型,相当于boot 只占一个位,最多可定128个bit变量,而sbit是给可位寻址的变量的某一个位定个别名,不另占空间;   扩展资料:   bit定义:   比特是英文 binary digit的缩写,比特是表示信息的最小单位,是二进制数的一位包含的信息或2个选项中特别指定1个的需要信息量,一般来说,n比特的信息量可以表现出2的n次方种选择;   sbit定义:   sbit是定义特殊功能寄存器的位变量,bit和sbit都是C51扩展的变量类型,应用如sbit P0_0=P0^0;//即定义P0_0为P0口的第1位,以便进行位操作,bit和int char之类的差不多,只不过char=8位, bit=1位而已,都是变量,编译器在编译过程中分配地址;
2023-06-10 19:05:011

51单片机能不能定义位数组? 比如:bit i;//定义一个位变量i

不可。位寻址,只能使用直接寻址。就像特殊功能寄存器一样,不可用数组。
2023-06-10 19:05:141