找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4481|回复: 7
收起左侧

51单片机汇编语言伪指令BIT的功能是什么?

[复制链接]
ID:1021566 发表于 2022-4-25 15:32 | 显示全部楼层 |阅读模式
BIT的作用是:在51单片机中有特殊的地址对应的字节可以进行位寻址,当需要使用标志位或者位查询的时候可以将对应的位进行重命名
例如:在20h的地址当中存放着 编号为00h~07h位地址,那么如果定义 abc BIT 00h 则代表在20h的地址上有8个位其中0位定义名称为abc
在后续使用abc时候可以直接 SETB abc 或者CLR ab
回复

使用道具 举报

ID:121859 发表于 2022-4-25 17:45 | 显示全部楼层
BIT 声明一个“位”变量,范围是:00H~FF,其中00H~7FH是位寄存器20H~2FH的位,80H~FFH,是从80H开始的能被8整除的寄存器
回复

使用道具 举报

ID:123289 发表于 2022-4-26 16:26 | 显示全部楼层
8位及以上的单片机都是以字节为单位,作为基本操作的。
一个字节为8位二进制数,这样指令及操作方便。
但许多情况下程序需要根据某个东东的0、1决定程序的分支,这时只要将这个东东设计成一个位就可以了。
51系统为此,在指令系统上下足了文章,也是51比其它单片机灵活的特点。
由于是8位机,一个字节有256种变化,51就在有限的内存中给出了256个位,并在指令系统中设计了相应的位操作指令,可对这256个位直接进行操作(与、或、非、置1、清0、取存、分支),指令丰富。
这256个位占用32个字节,当然也可以对这32个单元按字节进行操作,也即一条指令一次可以操作8个位标志,用汇编写程序的人,常常可以利用这个特点,分配位标记,以利多位同时操作或单位操作。
这256个位,系统自己用了128个,如P0-P3口、A、B、PSW、IE、IP……,都在特殊寄存器中,它们的地址有个特点,就是能被8整除!
另外128个是留给用户自由使用的,放在内存的20H-2FH,共16个字节。
楼主提到【20h的地址当中存放着 编号为00h~07h位地址】,在向下21H-2FH,对应编号是08H-7FH。
而系统用到的128个编号是:80H-FFH。
例如:P0.0的编号就是80H,而TF1的编号是81H,P1.0的编号是82H......
明白以上,就可以知道如下:
1、你定义的BIT位标记,只能放在20H-2FH之间。[编号在00-7F之间]
2、可以对它进行:与、或、非、置1、清0、取存、分支操作。[按位操作]
3、一条指令可以同样操作8个在同一个字节中的位标记。[按字节操作]
4、[80H以上的编号]被系统占用了,系统不阻止你对这个区域进行定义!当心你与系统发生冲突,系统会提示你的定义发生了重复定义。
5、标准51系统没有用完[80H以上的编号],而改进型的51如STC系列,可能有所利用,所以看手册是重要的。
例如:STC的串口中断发送标记TI2位,它在9AH.1上,由于9AH不能被8整除,即它不能被BIT所定义。因为清TI2时,只能用:ANL 9AH, #11111101B,而无法用 CLR TI2。为此用串口2还是麻烦一点的。
俺是这样用的(不能直接进行位操作):
S2CON           EQU     09AH                            ;串口2控制寄存器
TI2             EQU     ACC.1
......
                MOV     A, S2CON                        ;取中断标记
                JNB     TI2, IIUART2_R                  ;TI2=ACC.1=0,非发送则接收
                ANL     S2CON, #11111101B               ;11111101B清TI2
举此例说明,STC51的程序不一定与其它51程序通用。

回复

使用道具 举报

ID:983641 发表于 2022-4-27 11:30 | 显示全部楼层
终于把BIT搞懂了。
回复

使用道具 举报

ID:61140 发表于 2022-5-8 15:38 | 显示全部楼层
简单的说就是引脚赋值,比如你想让P1.0驱动LED,直接写LED  BIT   P1.0(LED就是P1.0),当然,这里的LED也可以换成KEY等等.
回复

使用道具 举报

ID:883242 发表于 2022-5-8 18:05 | 显示全部楼层
包括楼主在内的所有人都没有注意到BIT这个关键字的核心思想,这个关键字是给L51.exe(高版本的Keil里面的BL51.exe)看的!!!

如果是纯汇编,楼主的代码可以这么写:
  1. abc EQU 00h
  2.      setb abc
  3.      clr  abc
复制代码

反正所有的地址都是作者管理的,出了地址冲突也是作者的错误,怪不到编译器上。这种代码也不需要L51来链接,出来的.obj文件可以直接转hex用于烧写。

但是如果汇编和c语言混合编程,BIT这样的关键字就非常重要了,因为c51.exe编译出来的obj文件是浮动(relocatable)地址的,所有的变量和代码地址都是不确定的,只有通过L51链接之后,才确定。像我上面那个代码里面的EQU,相当于c语言的#define,编译器只是简单替换,obj文件里面并不知道00h这个位地址被占用了,L51自然也不知道,会分配relocatable bit给00h,这样就冲突了!代码也不可能正常执行。

所以正规严肃的代码应该这么写:
  1. ab  data 20h
  2. abc bit ab.0
复制代码

这样L51就明白了20h这个ram地址被ab占用,而abc则是00h这个位地址,L51给其他变量分配地址的时候,会让开这两个位置,不会发生冲突。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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