单片机内外部机构分析
锁存器
锁存器
“锁存器”:数据总线是一根大家公用的线,很多器件和他连在一起,在不同的时候,不同的饿器件需要不同的信号,但是当某一个时刻我们想让某个引脚输出高电平,且保持一段时间不变,但是在这段时间里,计算机忙个不停,在于其他器件进行联络,所以这根线上的电平未必能一直保持不变。为了解决这个问题,因为存储器是可以存放电荷的,所以可以在器件前加一个小的存储器单元,并加一个开关,需要这个一直保持高电平,那么就打开开关,然后当信号进去保存好后立即关闭,这样就使这个状态持续保持了,直到下一次命令让它把开关打开为止。这样,即不耽误CPU和其他器件的交互,也不会影响具体器件的状态。就这样的存储器加开关的单元,称之为“锁存器“。
准双向I/O口
51单片机中输入有两种方式,分别为”读引脚“和”读锁存器“
读引脚:将引脚作为输入,这是真正的从外部引脚读进输入的值
读锁存器:是该引脚处于输出状态时,有时候需要改变这一位的状态,则并不需要真正的读引脚状态,只需要读入锁存器的状态,然后做某种变换后再输出。
”准双向I/O口“:接在外部的开关如果打开,则输入1,如果关闭,则输入0,但是如果单片机内部的开关是闭合的,那么不管外部开关是开还是关闭,接收到的数据都会是0,,所以,想让一端口作为输入使用,要先做一个“准备工作”,就是先让内部的开关断开,也就是让端口输出“1”才行。正因为要做一个准备工作,所以称之为“准双向I/O口”。
51单片机内部结构
CPU:用来控制、计算。
四个并行I/O口:P0、P1、P2、P3,对并行I/O口的读写只要将数据送入到相应的I/O口锁存器即可。
ROM(read only memory 只读存储器):保存程序
RAM(random access memory 随机读写存取器):保存中间结果
定时\计数器
串行I/O口中断系统
内部时钟电路
特殊功能寄存器(SFR)
有一些独立的存储单元是用来控制定时/计数器,串行I/O口等的使用,称之为特殊功能寄存器(SFR),如下表
符号 | 地址 | 功能介绍 |
---|---|---|
B | F0H | B寄存器 |
ACC | E0H | 累加器 |
PSW | D0H | 程序状态字 |
IP | B8H | 中断优先级控制寄存器 |
P3 | B0H | P3口锁存器 |
IE | A8H | 中断允许控制寄存器 |
P2 | A0H | P2口锁存器 |
SBUF | 99H | 串行口锁存器 |
SCON | 98H | 串行口控制寄存器 |
P1 | 90H | P1口锁存器 |
TH1 | 8DH | 定时器/计数器1(高8位) |
TH0 | 8CH | 定时器/计数器1(低8位) |
TL1 | 8BH | 定时器/计数器0(高8位) |
TL0 | 8AH | 定时器/计数器0(低8位) |
TMOD | 89A | 定时器/计数器方式控制寄存器 |
TCON | 88H | 定时器/计数器控制寄存器 |
DPH | 83H | 数据地址指针(高8位) |
DPL | 82H | 数据地址指针(低8位) |
SP | 81H | 堆栈指针 |
P0 | 80H | P0口锁存器 |
PCON | 87H | 电源控制寄存器 |
(1)ACC:累加器,通常用A表示。是一个寄存器,所有运算类指令均需要它。
(2)B:B寄存器,在做乘、除法时放乘数或除数,不做除法时,你可以随意调用。
(3)PSW:程序状态字,很重要的寄存器,里面放了CPU工作时的很多状态。
CPU状态如下表:
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|
CY | AC | F0 | RS1 | RS0 | 0V | P |
CY: 进位标志,8051中的运算器是一种8位的运算器,可以表示到0~255,如果做加法的话,两数相加可能会超过255,这样最高位就会丢失,防止最高位丢失,就会将最高位放进到这里来。
AC:半进位标志。
F0:用户标志位,由编程人员(我们)决定什么时候使用,什么时候不用。
RS1、RS0:工作寄存器组选择位
0V:溢出标志位
P:奇偶校验位,用来表示ALU运算结果中二进制数位“1”的个数的奇偶性。若为奇数,则P=1,否则为0.
例:78H(01111000),因为1的个数为偶数,P=0.
(4)DPTR(DPH、DPL):数据指针,用来访问外部数据存储器中的任一单元,若不用,也可以作为通用寄存器。
(5)P0、P1、P2、P3:是四个并行输入/输出口的寄存器,它里面对应着管脚的输出。
(6)SP:堆栈指针
堆栈:先进后出、后进先出,在单片机中,我们也可以在RAM中构造这样一个区域,用来存放数据,这个区域存放数据规则是“先进后出、后进先出”,我们称之为“堆栈”。之所以这样来存放数据,是因为如果存放一批数据,我们不需要知道每一个数据的地址,只需要知道第一个数据的地址就可以根据这个规则访问所有数据了。
51单片机由于能够存放数据的区域有限,我们不能专门分配一块地方做堆栈,所以只能在RAM中开辟一块地方,用于堆栈,至于具体用那一块地方需要根据用户自己去定义。所以51单片机中的堆栈的位置可以变化,而这种变化就体现在SP中值的变化。如果SP指向一个位置,在真正的51机中,SP指向的位置并非就是数据存放的位置,而是数据存放的前一个位置。