任务1-3 解剖单片机
1.单片机的结构
通过前面的学习,我们已知单片机的内部有ROM、RAM以及并行I/O口,那么,除了这些东西之外,单片机内部究竟还有些什么?这些零碎的东西怎么连在一起的?让我们来对单片机内部作一个完整的分析吧!请看图1-3-1。
图1-3-1 单片机结构框图
从图中我们可以看出,在51 单片机内部主要有以下几个功能单元:CPU、并行接口(也称I/O口)、存储器(ROM和RAM)、时钟电路、定时计数器、中断系统、串行接口、总线。怎样来理解这些功能单元呢?其实我们可以把单片机来和人作一个类比,大家就明白了。
我们人最重要的器官是什么呢?当然是我们的大脑,我们需要它来进行思考、计算,而单片机也有一个自己的大脑,它就是CPU了。它可以完成计算、控制等操作,就像人的大脑一样。那么人的大脑是怎样与外界进行交流的呢?外界的信息怎样送到大脑里?大脑里想的怎样让别人知道?这些功能是通过我们的眼耳口鼻等感觉器官来实现的,单片机也有自己的眼耳口鼻,就是四个并行I/O口,分别是P0, P1, P2, P3,通过它们,单片机可以将数据传给外部电路,也可以将外部数据送到CPU中。我们人在进行计算时,还要有草稿纸,还需要有笔记本作记录,单片机也有自己的草稿纸和笔记本,那就是存储器(ROM与RAM)。ROM用来存放程序,RAM用来存放中间结果。单片机的总线又是什么呢?它相当于我们人的神经网络,眼耳口鼻与大脑之间的信息交流就靠它了,单片机CPU与I/O口之间的数据信息交流就是由总线来完成的。一个人要正常地做事情,时间观念是很重要的,我们是通过手表来确定时间的,单片机同样需要一块手表,它就是时钟电路,通过时钟电路产生一定周期的矩形波,单片机就是靠这个矩形波来确定时间的。定时计数器就像我们人的闹钟,用来确定时间。串行口就像人的电话,可以实现一个单片机与另一个单片机的相互通信,而中断就相当于报警装置,可以对一些紧急情况进行监控。这些结构我们会在后面的任务中再详细地介绍,这里大家只要基本了解一下就行了。
2.专用寄存器SFR
在单片机中有一些独立的存储单元具有特殊的功能,通过对这些存储器的某些位设置1或0,就可以完成单片机内部一些硬件设备的启动、关闭或对其工作方式的设置,有些还能反映单片机的工作状态。我们称之为特殊功能寄存器(SFR),也叫专用寄存器。我们这本教材实际上很重要的一个内容就是学习这些专用寄存器的功能与应用。事实上,我们已接触过P1这个专用寄存器了,还提到过PSW这个专用寄存器,那么还有哪些SFR呢?请看表1-3-1。
表1-3-1 专用寄存器(SFR)表
当然我们现在不会要求大家全部都记下来,先介绍一下几个常用的SFR,其他的SFR我们在后面的任务中再慢慢地学习。
(1)ACC:累加器,通常用A表示。这是个什么东西?可不能从名字上理解,它是一个寄存器,而不是一个做加法的东西。为什么给它这么一个名字呢?或许是因为在运算器进行运算时其中一个数一定是在ACC中的缘故吧。它的名字特殊,身份也特殊,下一章我们将学到指令,可以发现,所有的运算类指令都离不开它。
(2)B:一个寄存器。在运算乘、除法时放乘数或除数,其他时间随你怎么用。
(3)PSW:程序状态字寄存器。这是一个很重要的寄存器,里面的数据反映了CPU工作时的很多状态,它的各位功能请看表1-3-2。
表1-3-2 PSW存储器结构表
下面我们逐一介绍各位的用途:
① C(有些书上也称为CY):最高位进位标志。8051 中的运算器是一种8 位的运算器,也就是说单片机可以实现两个8 位二进制数的加减运算,在进行加减时,如果最高位向前有进位和借位时,C就会被置为1。
例1-1:78H+97H(01111000B+10010111B)运算后,最高位进位标志C就会被置为1。
② AC:半进位标志。两个8位二进制数的加减运算,在进行加减时,如果第4位向前有进位和借位时,AC就会被置为1。
例1-2:57H+3AH(01010111B+00111010B)运算后,最高位进位标志AC就会被置为1。
③ F0:用户标志位,由我们(编程人员)决定什么时候用,什么时候不用。
④ RS1, RS0:工作寄存器组选择位。
⑤ OV:溢出标志位。什么是溢出我们下章再谈吧。
⑥ P:奇偶校验位:它用来表示累加器ACC中二进制数位“1”的个数的奇偶性。若ACC中1的个数为奇数,则P为1,否则为0。
例1-3:某运算使得ACC中的结果是78H(01111000B),显然1 的个数为偶数,所以P=0。
(4)DPTR(DPH、DPL):数据指针,可以用它来访问外部数据存储器中的任意单元,如果不用,也可以作为通用寄存器来用,由我们自己决定如何使用。
(5)P0, P1, P2, P3:这个我们已经知道,是四个并行输入/输出口的寄存器。它里面的内容对应着管脚的输出。
(6)SP:堆栈指针。
堆栈介绍:日常生活中,我们都注意到过这样的现象:家里洗的碗,一只一只摞起来,最晚放上去的放在最上面,而最早放上去的则放在最下面,在取的时候正好相反,先从最上面取,这种现象我们用一句话来概括:“先进后出,后进先出”。请大家想想,还有什么地方有这种现象?其实比比皆是,建筑工地上堆放的砖头、材料,仓库里放的货物,都是“先进后出,后进先出”,这实际是一种存取物品的规则,在单片机中我们存取的“物品”实际上就是一些数据,这种存取数据的规则我们称之为“堆栈”。
在单片机中,我们也可以在RAM中构造这样一个区域来存放数据,这个区域存放数据的规则就是“先进后出,后进先出”,我们称之为“栈”。为什么需要这样来存放数据呢?存储器本身不是可以按地址来存放数据吗?对,知道了地址的确就可以知道里面的内容,但如果我们需要存放的是一批数据,每一个数据都需要知道地址,那不是麻烦吗?如果我们让数据一个接一个地放置,那么我们只要知道第一个数据所在地址单元就可以了(见图1-3-2)。如果第一个数据在27H,那么第二、三个就在28H, 29H了。所以利用栈这种结构来存取数据可以简化操作。
图1-3-2 SP的作用
那么51 单片机中的栈在什么地方呢?单片机在RAM中开辟一块空间,用于堆栈,但是用RAM的哪一块呢?还是不好定,因为51 单片机是一种通用的单片机,各人的实际需求各不相同,有人需要多一些栈,而有人则不需要那么多,所以怎么分配都不合适,怎样来解决这个问题?分不好干脆就不分了,把分的权利给用户(编程者),根据自己的需要去定吧,所以51单片机中栈的位置是可以变化的。
这种变化就体现在SP中值的变化,SP中的值为多少,单片机就从相应编号(地址)的RAM处开始存储数据,进行堆栈操作,SP就有点像一个指针,它里面专门装存储器的地址(编号),它装的地址为多少,就指向这个地址编号的存储器。例如SP中的值等于27H,不就相当于是一个指针指向27H单元吗?看图1-3-2,单片机执行堆栈时就从这个存储单元开始进行,当然在真正的51 单片机中,开始指针所指的位置并非就是数据存放的位置,而是数据存放的前一个位置,比如一开始指针是指向27H单元的,那么第一个数据的位置是28H单元,而不是27H单元,当然,这些细节性的东西同学们了解一下就可以了。
其他的SFR,我们在用到时再介绍。
3.单片机程序指令的执行
单片机为什么可以一条一条地执行程序指令?我们在前面的任务中给出的一条条指令经过翻译过后,变成二进制数的机器语言,通过编程器放入到单片机的程序存储器中,那么单片机为什么可以自动地、一条条地执行这些指令呢?原来在单片机内部还有一个特殊的指针PC。
“指针”这个词应该还有点印象吧?对了,我们刚才说的SP专用寄存器就是一个指针,其实所谓指针就是一种特殊的存储器,它所存的内容是其他存储单元的地址(也就是我们前面说的编号),它里面放的编号为多少,它就指向对应的存储单元,选中那个存储单元。我们刚才讲的SP指针是指向数据存储器的,在下一章,我们还会接触到几个可以指向数据存储器的指针,它们都可以装入单片机数据存储器(RAM)的地址编号,选中某个数据存储单元,我们会在后面详细介绍。
我们这里讲的PC指针也是一个特殊的存储器,它里面装的也是存储单元的地址编号,但与我们刚才所讲的指针不同的是,它存的是程序存储器(ROM)的地址编号,指向的是某个装指令的程序存储器,当它指向某个ROM存储单元时,单片机就将这个存储单元中存储的指令取出来执行,而且,单片机每执行完一条指令,会自动地增加PC,使PC指针自动地指向下一条要执行的指令,注意这个过程是自动的,不用我们去操心,这样单片机就可以自动地从程序的开头一条一条地执行指令。
小贴士
单片机复位后,PC里的值为00H,也就是指向第一个程序存储单元,从这个存储单元开始执行程序指令。