例: 78H+97H ( 01111000+10010111 )
(2) AC :半进位标志。
例: 57H+3AH ( 01010111+00111010 )
(3) F0 :用户标志位,由我们(编程人员)决定什么时候用,什么时候不用。
(4) RS1 、 RS0 :工作寄存器组选择位。这个我们已知了。
(5) 0V :溢出标志位。什么是溢出我们稍后再谈吧。
(6) P :奇偶校验位:它用来表示 ALU 运算结果中二进制数位“ 1 ”的个数的奇偶性。若为奇数,则 P=1 ,否则为 0。
例:某运算结果是 78H ( 01111000 ),显然 1 的个数为偶数,所以 P=0 。
4 、 DPTR ( DPH 、 DPL ):数据指针,可以用它来访问外部数据存储器中的任一单元,如果不用,也可以作为通用寄存器来用,由我们自已决定如何使用。
5 、 P0 、P1、P2、 P3 :这个我们已经知道,是四个并行输入 / 输出口的寄存器。它里面的内容对应着管脚的输出。
6、SP :堆栈指针。
堆栈介绍:日常生活中,我们都注意到过这样的现象,家里洗的碗,一只一只摞起来,最晚放上去的放在最上面,而最早放上去的则放在最下面,在取的时候正好相反,先从最上面取,这种现象我们用一句话来概括:“先进后出,后进先出”。请大家想想,还有什么地方有这种现象?其实比比皆是,建筑工地上堆放的砖头、材料,仓库里放的货物,都是“先进后出,后进先出”,这实际是一种存取物品的规则,我们称之为“堆栈”。
在单片机中,我们也可以在 RAM 中构造这样一个区域,用来存放数据,这个区域存放数据的规则就是“先进后出,后进先出”,我们称之为“堆栈”。为什么需要这样来存放数据呢?存储器本身不是可以按地址来存放数据吗?对,知道了地址的确就可以知道里面的内容,但如果我们需要存放的是一批数据,每一个数据都需要知道地址那不是麻烦吗?如果我们让数据一个接一个地放置,那么我们只要知道第一个数据所在地址单元就可以了(看图 2 )如果第一个数据在 27H ,那么第二、三个就在 28H 、 29H 了。所以利用堆栈这种方法来放数据可以简化操作
那么51中堆栈什么地方呢?单片机中能存放数据的区域有限,我们不能够专门分配一块地方做堆栈,所以就在内存( RAM )中开辟一块地方,用于堆栈,但是用内存的哪一块呢?还是不好定,因为 51 是一种通用的单片机,各人的实际需求各不相同,有人需要多一些堆栈,而有人则不需要那么多,所以怎么分配都不合适,怎样来解决这个问题 ? 分不好干脆就不分了,把分的权利给用户(编程者),根据自已的需要去定吧,所以 51 单片机中堆栈的位置是可以变化的。而这种变化就体现在 SP 中值的变化,看图 2 , SP 中的值等于 27H 不就相当于是一个指针指向 27H 单元吗?当然在真正的 51 机中,开始指针所指的位置并非就是数据存放的位置,而是数据存放的前一个位置,比如一开始指针是指向 27H 单元的,那么第一个数据的位置是 28H 单元,而不是 27H 单元,为什么会这样,我们在学堆栈命令时再说明。
图2
其它的 SFR ,我们在用到时再介绍。