51单片机的延时及时序分析

51单片机工作时,是在统一的时钟脉冲控制下一拍一拍地进行的 。这个脉冲是由单片机控制器中的时序电路发出的 。单片机的时序就是CPU在执行指令时所需控制信号的时间顺序,为了保证各部件间的同步工作,单片机内部电路应在唯一的时钟信号下严格地控时序进行工作,在学习51单片机的时序之前,我们先来了解下时序相关的一些概念 。
既然计算机是在统一的时钟脉冲控制下工作的,那么,它的时钟脉冲是怎么来的呢?
要给我们的计算机CPU提供时序,就需要相关的硬件电路,即振荡器和时钟电路 。我们学习的8051单片机内部有一个高增益反相放大器,这个反相放大器的作用就是用于构成振荡器用的,但要形成时钟,外部还需要加一些附加电路 。8051单片机的时钟产生有以下两种方法:
一、内部时钟方式:
利用单片机内部的振荡器,然后在引脚XTAL1(18脚)和XTAL2(19脚)两端接晶振,就构成了稳定的自激振荡器,其发出的脉冲直接送入内部时钟电路,外接晶振时,晶振两端的电容一般选择为30PF左右;这两个电容对频率有微调的作用,晶振的频率范围可在1.2MHz-12MHz之间选择 。为了减少寄生电容,更好地保证振荡器稳定、可靠地工作,振荡器和电容应尽可能安装得与单片机芯片靠近 。(提示一下,本站提供的学习套件全部采用的就是这种时钟方式) 。
二、外部时钟方式:
此方式是利用外部振荡脉冲接入XTAL1或XTAL2 。HMOS和CHMOS单片机外时钟信号接入方式不同,HMOS型单片机(例如8051)外时钟信号由XTAL2端脚注入后直接送至内部时钟电路,输入端XTAL1应接地 。由于XTAL2端的逻辑电平不是TTL的,故建议外接一个上接电阻 。对于CHMOS型的单片机(例如80C51),因内部时钟发生器的信号取自反相器的输入端,故采用外部时钟源时,接线方式为外时钟信号接到XTAL1而XTAL2悬空 。如下图
 
外接时钟信号通过一个二分频的触发器而成为内部时钟信号,要求高、低电平的持续时间都大于20ns,一般为频率低于12MHz的方波 。片内时钟发生器就是上述的二分频触发器,它向芯片提供了一个2节拍的时钟信号 。
前面已提到,计算机工作时,是在统一的时钟脉冲控制下一拍一拍地进行的 。由于指令的字节数不同,取这些指令所需要的时间也就不同,即使是字节数相同的指令,由于执行操作有较大的差别,不同的指令执行时间也不一定相同,即所需的拍节数不同 。为了便于对CPU时序进行分析,一般按指令的执行过程规定了几中周期,即时钟周期、机器周期和指令周期,也称为时序定时单位,下面分别予以讲解 。
时钟周期
时钟周期也称为振荡周期,定义为时钟脉冲的倒数(可以这样来理解,时钟周期就是单片机外接晶振的倒数,例如12M的晶振,它的时间周期就是1/12us),是计算机中最基本的、最小的时间单位 。
在一个时钟周期内,CPU仅完成一个最基本的动作 。对于某种单片机,若采用了1MHZ的时钟频率,则时钟周期为1us;若采用4MHZ的时钟频率,则时钟周期为250us 。由于时钟脉冲是计算机的基本工作脉冲,它控制着计算机的工作节奏(使计算机的每一步都统一到它的步调上来) 。显然,对同一种机型的计算机,时钟频率越高,计算机的工作速度就越快 。但是,由于不同的计算机硬件电路和器件的不完全相同,所以其所需要的时钟周频率范围也不一定相同 。我们学习的8051单片机的时钟范围是1.2MHz-12MHz 。
在8051单片机中把一个时钟周期定义为一个节拍(用P表示),二个节拍定义为一个状态周期(用S表示) 。请大家参考后面的时序图 。
机器周期
在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段,每一阶段完成一项工作 。例如,取指令、存储器读、存储器写等,这每一项工作称为一个基本操作 。完成一个基本操作所需要的时间称为机器周期 。一般情况下,一个机器周期由若干个S周期(状态周期)组成 。8051系列单片机的一个机器周期同6个S周期(状态周期)组成 。前面已说过一个时钟周期定义为一个节拍(用P表示),二个节拍定义为一个状态周期(用S表示),8051单片机的机器周期由6个状态周期组成,也就是说一个机器周期=6个状态周期=12个时钟周期 。参见后面的时序图 。
指令周期
【51单片机的延时及时序分析】指令周期是执行一条指令所需要的时间,一般由若干个机器周期组成 。指令不同,所需的机器周期数也不同 。对于一些简单的的单字节指令,在取指令周期中,指令取出到指令寄存器后,立即译码执行,不再需要其它的机器周期 。对于一些比较复杂的指令,例如转移指令、乘法指令,则需要两个或者两个以上的机器周期 。
时钟周期、机器周期、指令周期之间的关系图如下 。
 
通常含一个机器周期的指令称为单周期指令,包含两个机器周期的指令称为双周期指令 。
MCS-51指令系统中,按它们的长度可分为单字节指令、双字节指令和三字节指令 。执行这些指令需要的时间是不同的,也就是它们所需的机器周期是不同的,有下面几种形式:
·单字节指令单机器周期·单字节指令双机器周期·双字节指令单机器周期·双字节指令双机器周期·三字节指令双机器周期·单字节指令四机器周期(如单字节的乘除法指令)
下图是MCS-51系列单片机的指令时序图:
 
上图是单周期和双周期取指及执行时序,图中的ALE脉冲是为了锁存地址的选通信号,显然,每出现一次该信号单片机即进行一次读指令操作 。从时序图中可看出,该信号是时钟频率6分频后得到,在一个机器周期中,ALE信号两次有效,第一次在S1P2和S2P1期间,第二次在S4P2和S5P1期间 。
接下来我们分别对几个典型的指令时序加以说明 。
·单字节单周期指令: 单字节单周期指令只进行一次读指令操作,当第二个ALE信号有效时,PC并不加1,那么读出的还是原指令,属于一次无效的读操作 。
·双字节单周期指令: 这类指令两次的ALE信号都是有效的,只是第一个ALE信号有效时读的是操作码,第二个ALE信号有效时读的是操作数 。
·单字节双周期指令:两个机器周期需进行四读指令操作,但只有一次读操作是有效的,后三次的读操作均为无效操作 。单字节双周期指令有一种特殊的情况,象MOVX这类指令,执行这类指令时,先在ROM中读取指令,然后对外部数据存储器进行读或写操作,头一个机器周期的第一次读指令的操作码为有效,而第二次读指令操作则为无效的 。在第二个指令周期时,则访问外部数据存储器,这时,ALE信号对其操作无影响,即不会再有读指令操作动作 。
上页的时序图中,我们只描述了指令的读取状态,而没有画出指令执行时序,因为每条指令都包含了具体的操作数,而操作数类型种类繁多,这里不便列出,有兴趣的读者可参阅有关书籍 。
·外部程序存储器(ROM)读时序
右图8051外部程序存储器读时序图,从图中可看出,P0口提供低8位地址,P2口提供高8位地址,S2结束前,P0口上的低8位地址是有效的,之后出现在P0口上的就不再是低8位的地址信号,而是指令数据信号,当然地址信号与指令数据信号之间有一段缓冲的过度时间,这就要求,在S2其间必须把低8位的地址信号锁存起来,这时是用ALE选通脉冲去控制锁存器把低8位地址予以锁存,而P2口只输出地址信号,而没有指令数据信号,整个机器周期地址信号都是有效的,因而无需锁存这一地址信号 。
从外部程序存储器读取指令,必须有两个信号进行控制,除了上述的ALE信号,还有一个PSEN(外部ROM读选通脉冲),上图显然可看出,PSEN从S3P1开始有效,直到将地址信号送出和外部程序存储器的数据读入CPU后方才失效 。而又从S4P2开始执行第二个读指令操作 。
·外部数据存储器(RAM)读时序
右图8051外部数据存储器读写时序图,从ROM中读取的需执行的指令,而CPU对外部数据存储的访问是对RAM进行数据的读或写操作,属于指令的执行周期,值得一提的是,读或写是两个不同的机器周期,但他们的时序却是相似的,我们只对RAM的读时序进行分析 。
上一个机器周期是取指阶段,是从ROM中读取指令数据,接着的下个周期才开始读取外部数据存储器RAM中的内容 。
在S4结束后,先把需读取RAM中的地址放到总线上,包括P0口上的低8位地址A0-A7和P2口上的高8位地址A8-A15 。当RD选通脉冲有效时,将RAM的数据通过P0数据总线读进CPU 。第二个机器周期的ALE信号仍然出现,进行一次外部ROM的读操作,但是这一次的读操作属于无效操作 。
对外部RAM进行写操作时,CPU输出的则是WR(写选通信号),将数据通过P0数据总线写入外部存储中 。

    推荐阅读