
2.2 单片机工作原理
单片机是通过执行程序来工作的,执行不同的程序就能完成不同的任务。而程序是指令的有序集合,指令是规定计算机执行某种具体操作的命令,中央处理器CPU根据指令控制计算机各部分协调地工作,完成规定操作。因此单片机的工作过程就是单片机执行指令的过程。在执行程序中起关键作用的是CPU,CPU主要由运算器和控制器两部分组成。运算器用于进行运算术、逻辑运算以及位操作处理等;控制器根据指令码产生相应的控制信号,使运算器、存储器、输入/输出端口等各功能部件之间能自动协调地工作。
图2-2是AT89S51/52内部更详细的结构框图,由图中可知,单片机内部除了有中央处理器CPU、数据存储器RAM、程序存储器ROM和定时器、串行口等主要功能部件外,还有驱动器、锁存器、指令寄存器、地址存储器等辅助电路部分,以及各功能模块在单片机中的位置和相互关系。
图2-2 AT89S51/52内部结构框图
2.2.1 运算器
运算器主要用于对数据进行算术运算和逻辑运算,包括算术逻辑单元ALU、累加器ACC、暂存寄存器、程序状态字PSW寄存器、通用寄存器等,运算器具有很强的数据处理和位处理能力。
1.算术逻辑单元ALU(Arithmetic Logic Unit)
ALU用于对二进制数据进行算术运算、逻辑操作、移位操作和位处理等,由加法器和其他逻辑电路等组成。此外,还可以通过对运算结果的测试,影响程序状态字PSW的相关标志位。由图2-2可知,ALU的两个操作数,一个通过暂存器1输入,另一个经由ACC通过暂存器2输入,运算结果的状态影响程序状态字PSW寄存器。
2.暂存寄存器
由图2-2可知,暂存器主要用于暂时保存进入ALU之前的数据。
3.累加器ACC(Accumulator)
累加器ACC为8位寄存器,通常简称为A。由图2-2可知,累加器A通过暂存器与ALU相连。在进行算术或逻辑运算时,大多操作数取自累加器A,而运算的中间结果也多要送到累加器A中,因此,累加器A是CPU中最常用的特殊功能寄存器。
因为单片机中大部分数据操作都是通过累加器进行的,所以累加器的使用十分频繁,很容易出现阻塞现象。因此累加器实际上已成为单片机程序运行的“瓶颈”,制约着单片机执行效率的提高,这就是累加器结构所特有的瓶颈效应。为此,部分单片机已开始使用寄存器阵列来代替累加器,即赋予更多的寄存器具有累加器的功能,形成多累加器结构,从而彻底解决单累加器的“瓶颈”问题,并有助于提高单片机的执行效率。
4.程序状态字PSW(Program Status Word)
程序状态字PSW是一个8位寄存器,用于保存程序运行的状态信息。其中有些位状态是根据指令执行结果,由硬件自动设置的,而有些位状态则可以由程序员进行设定。程序状态字PSW可以进行位寻址,其各位的定义见表2-1。
表2-1 程序状态字PSW各位的定义
(1)CY(PWS.7)——进位/借位标志(Carry)
CY是程序状态字PSW中最常用的标志位,在进行加法或减法运算时,用于表示运算结果最高位(第7位)是否有进位或借位。
CY=1,表示运算结果最高位有进位或借位;
CY=0,表示运算结果最高位无进位或借位。
此外,在进行位操作时,CPU也使用CY作为位传送、位与、位或等操作的操作数。
(2)AC(PSW.6)——辅助进位标志(Auxiliary Carry)
辅助进位标志也称为半进位标志,在加减法运算中,当运算结果低4位向高4位有进位或借位时,AC被相应由硬件置位。
AC=1,表示运算结果低4位向高4位有进位或借位;
AC=0,表示运算结果低4位向高4位无进位或借位。
在进行BCD码运算时,需要进行二进制至十进制数调整运算,要用到AC位的状态进行判断。
(3)F0(PSW.5)——用户标志位
由用户定义的标志位,可以根据需要用软件方法置位或复位,用以控制程序的转向或作为标志位。
(4)RS1和RS0(PSW.4,PSW.3)——当前工作寄存器组选择位
通用工作寄存器组共有4组,其与RS1、RS0两个标志位对应关系见表2-2,与RS1、RS0的值对应的那一组通用工作寄存器组称为当前工作寄存器组。只有当前工作寄存器组才可以通过寄存器寻址的方式访问。
表2-2 RS0、RS1对工作寄存器组的选择
单片机在上电或者复位后,RS1RS0=00B,CPU使用第0组为当前工作寄存器组。用户可以根据需要利用传送指令或位运算指令来改变RS1、RS0的值,以改变当前工作寄存器组,这样的结构对于程序中保护现场提供了方便。
(5)OV(PSW.2)——溢出标志位
OV表示在进行算术运算时,运算结果是否发生了溢出。
OV=1,表示运算结果发生溢出;
OV=0,表示运算结果没有溢出。
在有符号数的加减运算中,OV=1表示加减运算结果超出了累加器A所能表示的有效范围(-128~+127),即产生了溢出;OV=0表示运算结果正确,即无溢出。
在乘法运算中,OV=1表示乘积超过255,即乘积分别在B和A中;OV=0表示乘积只在A中。
在除法运算中,OV=1表示除数为0,除法不能进行;OV=0表示除数不为0,除法可正常进行。
溢出与进位是两个不同的概念。溢出是指两个有符号数运算时,结果超出了所能表示的范围,而进位则是指两个数最高位(第7位)相加减时有进位或借位。
(6)F1(PSW.1)——用户标志位
用法同F0。
(7)P(PSW.0)——奇偶标志位
该位用于表示累加器A中内容的奇偶性。在AT89S51单片机的指令系统中,凡是改变累加器A中内容的指令均会影响奇偶标志P。
P=1,表示累加器A中有奇数个1;
P=0,表示累加器A中有偶数个1。
此标志位在串行通信中可以用来进行奇偶校验,以提高数据传输的可靠性。
运算器中的其他特殊功能寄存器将在下面章节中分别介绍。
2.2.2 控制器
控制器主要用于统一指挥和控制计算机协调地工作,它接收来自存储器中的逐条指令,然后进行指令译码,并通过定时逻辑和控制电路,在规定的时刻发出各种操作所需的全部内部控制信息及CPU外部所需的控制信号,使各部分协调工作,完成指令所规定的各种操作。控制器由程序计数器PC、指令寄存器IR、指令译码器ID和定时控制逻辑电路等几部分组成。
1.程序计数器PC(Program Counter)
程序计数器PC是一个16位计数器,用于存储下一条将要执行的指令的首地址,也称为程序指针或指令指针。PC由两个8位特殊功能寄存器PCH(存储地址的高8位)和PCL(存储地址的低8位)组成。
PC具有自动“加1”的功能,即当一条指令从存储器中取出之后,PC值就会自动改变,指向下一条将要执行的指令的地址。需要说明的是,单片机中取指令的操作是以字节为单位的,由于AT89S51/52单片机的指令长度不是固定的(一般为1~3B),因而实际上PC在自动加上该条指令的字节个数以后,才会指向下一条将要执行的指令地址。
一般情况下,程序的执行过程是顺序地将存储器中的指令依次执行,要取的指令地址是由程序计数器PC提供的,以保证程序顺序执行。而在执行转移指令或者子程序、中断程序时,程序需要进行跳转,此时程序计数器PC将被置入新的地址值即子程序或中断程序入口地址值,则程序将转向相应的入口地址,以完成程序的跳转或调用。
PC没有地址,是不可寻址的,因此用户无法对它进行读写操作。但可以通过转移、调用、返回等指令改变其内容,以改变程序的执行顺序或实现程序的转移。
2.指令寄存器(Instruction Register)
指令寄存器是一个8位寄存器,用于暂时保存从程序存储器中取出来的指令操作码。如图2-2所示,执行程序时,首先根据PC给出的地址从程序存储器中取出指令,送到指令寄存器暂时保存等待译码。
3.指令译码器(Instruction Decoder)
指令译码器用于对送入指令译码器的指令进行译码,译码结果送定时控制逻辑电路。定时控制逻辑电路产生各种定时控制信号,控制计算机正确地执行各种操作。
2.2.3 指令执行过程
单片机指令执行过程可分为3个阶段进行,即取指令、分析指令和执行指令。
如图2-2所示,取指令就是根据程序计数器PC的值,将指令从程序存储器读出来,送到指令寄存器;分析指令则是将暂存在指令寄存器中的指令操作码取出后,送入指令译码器进行译码;执行指令则是将取出的操作数按操作码所规定的控制逻辑进行操作。单片机执行程序的过程实际上就是逐条指令地重复上述操作过程,直到停机。