[技术问答] bit 变量应该定义在哪个区域?

[复制链接]
136|7
| 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,当你定义位变量时候,编译器会自动将该变量定义到该位置,如果用汇编,那么你指定变量地址到该范围即可。
| 2018-12-6 19:45 | 显示全部楼层
不知道你定义这个BIT变量是干啥的,一般自动吧,BIT好像用于结构体里面的多。
| 2018-12-7 09:01 | 显示全部楼层
你说是的BIT还是SBIT?
  1. /*  BIT Registers  */
  2. /*  SCON_1  */
  3. sbit SM0_1      = SCON_1^7;
  4. sbit FE_1       = SCON_1^7;
  5. sbit SM1_1      = SCON_1^6;
  6. sbit SM2_1      = SCON_1^5;
  7. sbit REN_1      = SCON_1^4;
  8. sbit TB8_1      = SCON_1^3;
  9. sbit RB8_1      = SCON_1^2;
  10. sbit TI_1       = SCON_1^1;
  11. sbit RI_1       = SCON_1^0;

  12. /*  ADCCON0  */
  13. sbit ADCF       = ADCCON0^7;
  14. sbit ADCS       = ADCCON0^6;
  15. sbit ETGSEL1    = ADCCON0^5;
  16. sbit ETGSEL0    = ADCCON0^4;
  17. sbit ADCHS3     = ADCCON0^3;
  18. sbit ADCHS2     = ADCCON0^2;
  19. sbit ADCHS1     = ADCCON0^1;
  20. sbit ADCHS0     = ADCCON0^0;

  21. /*  PWMCON0  */
  22. sbit PWMRUN     = PWMCON0^7;
  23. sbit LOAD       = PWMCON0^6;
  24. sbit PWMF       = PWMCON0^5;
  25. sbit CLRPWM     = PWMCON0^4;


  26. /*  PSW */
  27. sbit CY         = PSW^7;
  28. sbit AC         = PSW^6;
  29. sbit F0         = PSW^5;
  30. sbit RS1        = PSW^4;
  31. sbit RS0        = PSW^3;
  32. sbit OV         = PSW^2;
  33. sbit P          = PSW^0;

  34. /*  T2CON  */
  35. sbit TF2        = T2CON^7;
  36. sbit TR2        = T2CON^2;
  37. sbit CM_RL2     = T2CON^0;

  38. /*  I2CON  */
  39. sbit I2CEN      = I2CON^6;
  40. sbit STA        = I2CON^5;
  41. sbit STO        = I2CON^4;
  42. sbit SI         = I2CON^3;
  43. sbit AA         = I2CON^2;
  44. sbit I2CPX        = I2CON^0;

  45. /*  IP  */  
  46. sbit PADC       = IP^6;
  47. sbit PBOD       = IP^5;
  48. sbit PS         = IP^4;
  49. sbit PT1        = IP^3;
  50. sbit PX1        = IP^2;
  51. sbit PT0        = IP^1;
  52. sbit PX0        = IP^0;

  53. /*  P3  */  
  54. sbit P30                = P3^0;


  55. /*  IE  */
  56. sbit EA         = IE^7;
  57. sbit EADC       = IE^6;
  58. sbit EBOD       = IE^5;
  59. sbit ES         = IE^4;
  60. sbit ET1        = IE^3;
  61. sbit EX1        = IE^2;
  62. sbit ET0        = IE^1;
  63. sbit EX0        = IE^0;

  64. /*  P2  */
  65. sbit P20        = P2^0;

  66. /*  SCON  */
  67. sbit SM0        = SCON^7;
  68. sbit FE         = SCON^7;
  69. sbit SM1        = SCON^6;
  70. sbit SM2        = SCON^5;
  71. sbit REN        = SCON^4;
  72. sbit TB8        = SCON^3;
  73. sbit RB8        = SCON^2;
  74. sbit TI         = SCON^1;
  75. sbit RI         = SCON^0;

  76. /*  P1  */     
  77. sbit P17        = P1^7;
  78. sbit P16        = P1^6;
  79. sbit TXD_1        = P1^6;
  80. sbit P15        = P1^5;
  81. sbit P14        = P1^4;
  82. sbit SDA        = P1^4;   
  83. sbit P13        = P1^3;
  84. sbit SCL        = P1^3;  
  85. sbit P12        = P1^2;
  86. sbit P11        = P1^1;
  87. sbit P10        = P1^0;

  88. /*  TCON  */
  89. sbit TF1                                = TCON^7;
  90. sbit TR1                                = TCON^6;
  91. sbit TF0                                = TCON^5;
  92. sbit TR0                                = TCON^4;
  93. sbit IE1                                = TCON^3;
  94. sbit IT1                                = TCON^2;
  95. sbit IE0                                = TCON^1;
  96. sbit IT0                                = TCON^0;

  97. /*  P0  */  

  98. sbit P07                                = P0^7;
  99. sbit RXD                                = P0^7;
  100. sbit P06                                = P0^6;
  101. sbit TXD                                = P0^6;
  102. sbit P05                                = P0^5;
  103. sbit P04                                = P0^4;
  104. sbit STADC                                = P0^4;
  105. sbit P03                                = P0^3;
  106. sbit P02                                = P0^2;
  107. sbit RXD_1                                = P0^2;
  108. sbit P01                                = P0^1;
  109. sbit MISO                                = P0^1;
  110. sbit P00                                = P0^0;
  111. sbit MOSI                                = P0^0;
复制代码
| 2018-12-7 09:01 | 显示全部楼层
SBIT是设置位的一种宏。
C51有,其他没有的。
| 2018-12-7 09:04 | 显示全部楼层
sbit只是一个宏,因为C51可以对位操作,用这个方法可以给每个位起个名字。
| 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位寄存器是可位寻址的绝对地址目标,定义后编译器是不会改变位置的。
 楼主 | 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 变量存储的位置谢谢大佬们
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

快速回复 返回顶部 返回列表