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程序通用。
|