打印
[技术问答]

bit 变量应该定义在哪个区域?

[复制链接]
2251|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
18576478035|  楼主 | 2018-12-6 16:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
新唐N76E003定义bit变量时要怎么定义,应该定义在哪个区域?定义在data区域还是idata区域还是xdata区域??
沙发
tianxj01| | 2018-12-6 17:32 | 只看该作者
内部RAM的低128字节在所有的80C51设备上都存在。
最低的32字节作为通用寄存器分成四组8个寄存器,程序指令称呼这些寄存器为R0到R7。
程序状态字(PSW[3:4])的两个位RS0 和 RS1用于选择哪一个寄存器组会被使用。这使代码空间更有效率,因为寄存器指令比其他直接寻址的指令更短。
接下来的16个字节(字节地址 20H 到 2FH)是可位寻址的内存空间(位地址 00H 到  7FH)的一部分。
80C51指令集包括各种的单位指令。这个域的128个位可以通过这些指令直接寻址。该域的位地址从00H 到 7FH。
这是官方关于低128直接内存的说明文档。
很明显,定义位变量,应该在20H-2FH物理地址空间,如果你用的是C51,当你定义位变量时候,编译器会自动将该变量定义到该位置,如果用汇编,那么你指定变量地址到该范围即可。

使用特权

评论回复
板凳
heisexingqisi| | 2018-12-6 19:45 | 只看该作者
不知道你定义这个BIT变量是干啥的,一般自动吧,BIT好像用于结构体里面的多。

使用特权

评论回复
地板
huangcunxiake| | 2018-12-7 09:01 | 只看该作者
你说是的BIT还是SBIT?
/*  BIT Registers  */
/*  SCON_1  */
sbit SM0_1      = SCON_1^7;
sbit FE_1       = SCON_1^7;
sbit SM1_1      = SCON_1^6;
sbit SM2_1      = SCON_1^5;
sbit REN_1      = SCON_1^4;
sbit TB8_1      = SCON_1^3;
sbit RB8_1      = SCON_1^2;
sbit TI_1       = SCON_1^1;
sbit RI_1       = SCON_1^0;

/*  ADCCON0  */
sbit ADCF       = ADCCON0^7;
sbit ADCS       = ADCCON0^6;
sbit ETGSEL1    = ADCCON0^5;
sbit ETGSEL0    = ADCCON0^4;
sbit ADCHS3     = ADCCON0^3;
sbit ADCHS2     = ADCCON0^2;
sbit ADCHS1     = ADCCON0^1;
sbit ADCHS0     = ADCCON0^0;

/*  PWMCON0  */
sbit PWMRUN     = PWMCON0^7;
sbit LOAD       = PWMCON0^6;
sbit PWMF       = PWMCON0^5;
sbit CLRPWM     = PWMCON0^4;


/*  PSW */
sbit CY         = PSW^7;
sbit AC         = PSW^6;
sbit F0         = PSW^5;
sbit RS1        = PSW^4;
sbit RS0        = PSW^3;
sbit OV         = PSW^2;
sbit P          = PSW^0;

/*  T2CON  */
sbit TF2        = T2CON^7;
sbit TR2        = T2CON^2;
sbit CM_RL2     = T2CON^0;

/*  I2CON  */
sbit I2CEN      = I2CON^6;
sbit STA        = I2CON^5;
sbit STO        = I2CON^4;
sbit SI         = I2CON^3;
sbit AA         = I2CON^2;
sbit I2CPX        = I2CON^0;

/*  IP  */  
sbit PADC       = IP^6;
sbit PBOD       = IP^5;
sbit PS         = IP^4;
sbit PT1        = IP^3;
sbit PX1        = IP^2;
sbit PT0        = IP^1;
sbit PX0        = IP^0;

/*  P3  */  
sbit P30                = P3^0;


/*  IE  */
sbit EA         = IE^7;
sbit EADC       = IE^6;
sbit EBOD       = IE^5;
sbit ES         = IE^4;
sbit ET1        = IE^3;
sbit EX1        = IE^2;
sbit ET0        = IE^1;
sbit EX0        = IE^0;

/*  P2  */
sbit P20        = P2^0;

/*  SCON  */
sbit SM0        = SCON^7;
sbit FE         = SCON^7;
sbit SM1        = SCON^6;
sbit SM2        = SCON^5;
sbit REN        = SCON^4;
sbit TB8        = SCON^3;
sbit RB8        = SCON^2;
sbit TI         = SCON^1;
sbit RI         = SCON^0;

/*  P1  */     
sbit P17        = P1^7;
sbit P16        = P1^6;
sbit TXD_1        = P1^6;
sbit P15        = P1^5;
sbit P14        = P1^4;
sbit SDA        = P1^4;   
sbit P13        = P1^3;
sbit SCL        = P1^3;  
sbit P12        = P1^2;
sbit P11        = P1^1;
sbit P10        = P1^0;

/*  TCON  */
sbit TF1                                = TCON^7;
sbit TR1                                = TCON^6;
sbit TF0                                = TCON^5;
sbit TR0                                = TCON^4;
sbit IE1                                = TCON^3;
sbit IT1                                = TCON^2;
sbit IE0                                = TCON^1;
sbit IT0                                = TCON^0;

/*  P0  */  

sbit P07                                = P0^7;
sbit RXD                                = P0^7;
sbit P06                                = P0^6;
sbit TXD                                = P0^6;
sbit P05                                = P0^5;
sbit P04                                = P0^4;
sbit STADC                                = P0^4;
sbit P03                                = P0^3;
sbit P02                                = P0^2;
sbit RXD_1                                = P0^2;
sbit P01                                = P0^1;
sbit MISO                                = P0^1;
sbit P00                                = P0^0;
sbit MOSI                                = P0^0;

使用特权

评论回复
5
huangcunxiake| | 2018-12-7 09:01 | 只看该作者
SBIT是设置位的一种宏。
C51有,其他没有的。

使用特权

评论回复
6
huangcunxiake| | 2018-12-7 09:04 | 只看该作者
sbit只是一个宏,因为C51可以对位操作,用这个方法可以给每个位起个名字。

使用特权

评论回复
7
huangcunxiake| | 2018-12-7 09:07 | 只看该作者
问题:什么是bit和sbit?他们有什么区别?

  bit : 编译时分配空间

       sbit 只能在外部定义全局变量。

       sfr(特殊功能寄存器)的bit。SFR是系统指定的内存地址。

  bit 动态分配的,有编译器来指定内存地址。

  bit和sbit都是C51扩展的变量类型。

  sbit 要在最外面定义,就是说必须定义成外部变量.sbit定义的是SFR(特殊功能寄存器)的bit

  sbit更像是类型定义,不像是变量定义。

  sbit: 指示说明性说明

  bit 可以在外部或内部定义。



  bit和int char之类的差不多,只不过char=8位, bit="1位而已"。都是变量,编译器在编译过程中分配地址。除非你指定,否则这个地址是随机的。这个地址是整个可寻址空间,RAM+FLASH+扩展空间。bit只有0和1两种值,意义有点像Windows下VC中的BOOL。



  bit是编译器在的可寻址区分配的一个位变量,是不定的,不是绝对地址目标。

  所有可位寻址的位都可由sbit指定,这包括可位寻址区和SFR中的位。

  sbit是对应可位寻址空间的一个位,可位寻址区:20H~2FH。一旦用了sbi xxx = REGE^6这样的定义,这个sbit量就确定地址了。sbit大部分是用在寄存器中的,方便对寄存器的某位进行操作的。

  sbit位寄存器是可位寻址的绝对地址目标,定义后编译器是不会改变位置的。

使用特权

评论回复
8
18576478035|  楼主 | 2018-12-7 18:05 | 只看该作者
明白了            TYPE    BASE      LENGTH    RELOCATION   SEGMENT NAME
            -----------------------------------------------------

            * * * * * * *   D A T A   M E M O R Y   * * * * * * *
            REG     0000H     0008H     ABSOLUTE     "REG BANK 0"
            IDATA   0008H     0002H     UNIT         ?ID?LED
                    000AH     0016H                  *** GAP ***
            BIT     0020H.0   0000H.7   UNIT         ?BI?INIT
            BIT     0020H.7   0000H.4   UNIT         ?BI?KEY
            BIT     0021H.3   0000H.1   UNIT         ?BI?INTERRUPT
                    0021H.4   0000H.4                *** GAP ***
m51文件写的有具体的bit 变量存储的位置谢谢大佬们

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

55

主题

187

帖子

2

粉丝