您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 第二章:单片机的核心
第二章:单片机的核心——时间、中断、逻辑一、单片机核心之Timer1.1单片机的Timer图一AT89S51单片机有两个Timer——Timer0和Timer1。当Timer工作于定时功能下时,模拟开关打到T位置上,Timer计数电路计算的是单位时间脉冲。单位时间脉冲的周期与单片机的机器周期相等,如果晶振的频率是12MHz,则1个机器周期=1µs,于是单位时间脉冲的周期为1µs。也就是说,晶振频率=12MHz,Timer计数电路每过1µs计数值增加1。所以,在定时结束时Timer计数电路的计数值乘以1µs就能知道流逝了多少时间,从而起到定时的功能。AT89S51单片机有两个Timer——Timer0和Timer1。当Timer工作于定时功能下时,模拟开关打到T位置上,Timer计数电路计算的是单位时间脉冲。单位时间脉冲的周期与单片机的机器周期相等,如果晶振的频率是12MHz,则1个机器周期=1µs,于是单位时间脉冲的周期为1µs。也就是说,晶振频率=12MHz,Timer计数电路每过1µs计数值增加1。所以,在定时结束时Timer计数电路的计数值乘以1µs就能知道流逝了多少时间,从而起到定时的功能。如果图中模拟开关打到C位置上,进入Timer计数电路的则是外部事件脉冲。这样Timer计数电路的计数值就是外部事件脉冲的个数,这也就是单片机Timer的计数功能。1.2.Timer模式控制寄存器TMODTMOD是“timermode”的缩写,用于设置Timer的工作模式。TMOD在特殊功能寄存器的地址89H上,如下图所示。AT89S51单片机有两个Timer——Timer0和Timer1,它们的工作模式由TMOD中的对应位来分别设置。TMOD的长度为1个字节(8位),高4位和低4位分别控制Timer1和Timer0。其中由M11、M01控制Timer1的工作模式,M10、M00控制Timer0的工作模式。举个例子,我们想令Timer0工作在定时器的模式0下(软件启动),而Timer1工作在计数器的模式1下(软件启动),则设置Timer的指令为“MOVTMOD,#01010000B”。Timer寄存器里保存的是计数值,当Timer启动后每过一个机器周期(定时模式)或输入一个外部事件脉冲(计数模式),计数值会自动增加1。通过计数值我们可知道Timer启动之后流逝了多少时间(定时模式)或收到多少个外部事件脉冲。AT89S51单片机有两个Timer,它们有各自的Timer寄存器,且每个Timer寄存器由高位字节寄存器THx和低位字节寄存器TLx组成。即Timer0寄存器由TH0和TL0组成,Timer1寄存器由TH1和TL1组成。这4个寄存器位于特殊功能寄存器的8AH~8DH上。1.3Timer控制寄存器TCONTCON是“timercontrol”的缩写,用于控制Timer的启动或停止,并指示Timer是否溢出。TCON在特殊功能寄存器的地址88H上。TCON的高4位的名称及功能描述:TCON寄存器中,TFx是溢出标志位,当Timer寄存器计数达最大值之后再增加1时产生溢出,TFx位被硬件置1。于是可通过指令“JBCTFx,rel”或“JBTFx,rel”来判断TFx位是否为1,从而判断定时/计数是否完成。另外,TCON寄存器的TRx位控制Timer启动或关闭。1.4Timer用作定时/计数器小结AT89S51单片机中提供了2个通用的16位Timer,分别为Timer0和Timer1,它们可以被独立配置成定时或计数器并工作于不同模式下。注意:AT89S52还提供一个Timer2。当作为定时器时,Timer将在设定好的时间下工作并在计时完成后产生溢出。当作为计数器时,Timer将计算输入T0或T1管脚的脉冲个数,当计数达到预设的值时Timer同样可以产生溢出。1.5定时器的使用步骤①-设置Timer的工作模式。②-往Timer寄存器(TL0和TH0)载入计数初始值。③-启动Timer。④-检测Timer溢出标志(TF0)。⑤-关闭Timer。⑥-清0溢出标志(TF0)。⑦-重新装载计数初始值。1.6计数器的设置在Timer模式控制寄存器TMOD的C/Tx#位用于设置Timer用作定时器或计数器,当C/Tx#=1时,对应的Timer用作计数器。Timer0和Timer1可以被配置成两个独立的计数器,分别对输入单片机T0端(14管脚)和T1端(15管脚)的脉冲进行计数。Timer作计数器使用时,Timer寄存器THx和TLx的计数值记录的是输入单片机的脉冲的个数。Timer作计数器时,实际上是在计算计数脉冲下降沿的个数,或者说在计数脉冲的电平由高跳低时Timer寄存器中的计数值增加1,假如原来TL0=33,计数脉冲来到后每次下降沿使TL0增加1。单片机检测下降沿需要一定的时间。所以外部事件发生的最高频率fe应小于晶振频率/24。假设晶振频率=12MHz,则输入T0或T1口的计数脉冲的最高频率fe应小于500kHz。另外,确保脉冲在跳变之前至少被采样一次,则该电平至少要保持一个机器周期,假设使用12MHz的晶振,计数脉冲的电平信号在跳变之前至少应保持1µs。二、单片机核心之中断中断的比喻:任何一件事情的发生都会中断小林看电视的进程而去响应和处理事件。例如,邮递员上门送信,小林必须去开门签收信件,当事件处理完后,小林回去接着看电视。这里,小林比喻的就是单片机,而5个可能发生的事件为单片机的5个中断源——外部中断0、外部中断1、Timer0中断、Timer1中断、串行通信中断。2.1中断服务的指挥——中断向量表AT89S51单片机有5个中断源:外部中断0(/INT0)、外部中断1(/INT1)、Timer0中断(TF0)、Timer1中断(TF1)、串行通信中断(RI/TI)。当中断使能后,任何一个中断发生时单片机都会到下表所示的对应地址上去执行中断服务子程序。2.2中断的响应及处理AT89S51单片机的中断源有5种,也就是说有5种方式使单片机产生中断。当一个中断产生时,单片机会按以下的步骤进行响应与处理。①-立即暂停当前正在执行的任何指令,并把下一条将要执行的指令地址压入堆栈中。②-根据中断的类型在中断向量表中找到对应的地址。③-到该地址上开始执行中断服务子程序,直到遇到指令“RETI”,中断服务子程序结束。④-执行完中断服务子程序后,从堆栈中弹出在中断产生时保存的将要执行的下一条指令的地址到程序计数器PC中,单片机开始从PC指示的地址继续执行程序。一个潜在的问题:每一个中断服务子程序的存放空间都非常有限,例如,外部中断0的中断向量为0003H,而Timer0中断向量地址为000BH,可见外部中断0的中断服务子程序只有000BH-0003H=8个字节的空间来存放,这8个字节的空间实在也放不了几条指令。解决这个问题:可以把指令“ORG”与跳转指令“JMP”结合来实现中断服务子程序的跳转,从而在另一个更为广阔的的空间中来放置中断服务子程序。。2.3中断使能寄存器IE单片机上电复位之后,默认所有中断都被屏蔽(关闭),这意味着即使任何一种中断产生,单片机也不会去响应。为了使单片机能对中断进行响应,或者说使能中断,需要对中断使能寄存器IE进行操作。中断使能寄存器IE是一个特殊功能寄存器,位于特殊功能寄存器区的地址A8H上。中断使能寄存器IE的操作:①-IE的位7是EA,是所有中断的“总开关”。只有EA=1时,中断才会开放,这时IE中的其他位将使能或屏蔽某一个中断。如果EA=0,所有中断都不会被响应(全被屏蔽)。②-如果EA=1时,相应的中断由IE中相应的位来控制。控制位置1使能中断;清0则屏蔽中断2.4外部中断信号输入端/INT0和/INT1外部中断0和外部中断1的中断服务子程序入口地址,即中断向量分别为0003H和0013H。这两个外部中断分别由中断使能寄存器IE中的EX0和EX1位来使能或屏蔽。外部的脉冲信号或按钮开关都可以作为中断信号输入到/INTx端使单片机产生中断。使单片机产生外部中断的信号有两种方式,一是低电平触发,二是下降沿触发。当单片机上电复位后,使能外部中断时就默认以低电平方式触发。在低电平触发模式下,外部中断信号输入端/INT0和/INT1出现低电平就会触发外部中断0或外部中断1。外部中断产生时,单片机会立即停止正在执行的指令,并根据中断向量表中的中断向量转入相应的地址执行外部中断服务子程序。在单片机进入中断服务子程序执行并在中断结束指令“RETI”之前,这个低电平必须撤走,否则将会使单片机执行完指令“RETI”后因/INT0或/INT1仍为低电平而再次进入中断服务子程序。除了低电平触发外,边沿触发也是一种常用的触发外部中断的模式。在该模式下,/INT0端或/INT1端出现下降沿即可使单片机产生中断。与低电平触发不同,下降沿触发方式不是单片机默认的中断触发方式,所以需要指令来设置单片机工作在该模式下。方法是通过Timer控制寄存器TCON中的IT0位和IT1位来分别控制/INT0和/INT1触发方式。见下图:2.5Timer0中断和Timer1中断Timer是单片机中一个很有用的功能结构,Timer可设置作为定时器或计数器。在使用Timer时,先向Timer寄存器中装载一个计数初始值,通过指令“SETBTRx”来启动Timer,并用类似“JNBTFx,$”的指令来不断检测Timer溢出标志位TFx来判断计数是否完成。在Timer计数期间,单片机除了循环执行指令“JNBTFx,$”对标志位TFx进行判断之外一般不做其他操作。如果在Timer计数的同时我们还需要单片机执行其他操作该怎么办呢?使用Timer中断就可以解决这个实际问题。Timer中断作为AT89S51单片机的中断源之一,会在Timer计数结束时向CPU产生中断,这样就不需要程序中使用循环指令“JNBTFx,$”对标志位TFx进行判断了,而是让Timer到一边自己计数,当计数完成通过中断来告诉程序计数结束。这样一来,在Timer计数过程中,单片机就可以腾出空执行其他指令,等Timer中断产生时再服务即可。2.6串行通信中断单片机串行通信:当设置好串行口控制寄存器SCON的相关位和利用Timer1产生一定的波特率后,单片机即可通过串行口接收或发送数据。发送使用指令“MOVSBUF,A”将累加器A的数据装入缓冲区SBUF后自动发送,我们通过检测SCON中的TI位来判断数据是否发送完成。接收则使用指令“MOVA,SBUF”将接收缓冲区中的数据载入累加器A中,并通过检测SCON中的RI位判断接收的完成情况。单片机串行口发送和接收过程存在一个与Timer应用中相似的问题,就是单片机在判断SCON的TI位或RI位时只能“一心一意”地进行而无法再进行其他操作。而串行通信中断的出现较好地解决了系统中既需要单片机响应串行通信的操作,也同时兼顾其他操作。关于串行中断我们会在后面的章节中做具体的练习。2.7中断优先级例如,Timer0中断和外部中断1如果同时产生,单片机会先去响应Timer0中断并处理它的中断服务子程序。完成之后再响应外部中断1,进入相应的中断服务子程序。如果有两个或两个以上的中断同时产生,单片机该先服务方便呢?AT89S51单片机有一个默认的中断优先级,外部中断0的中断优先级最高,串行通信中断优先级最低,其他中断的优先级依次按表中排列依次降低。如果想改变中断优先级顺序,可通过对中断优先级控制寄存器IP设置来完成。寄存器IP位于特殊功能寄存器区的地址B8H上(左图),是专门用于设置单片机中断优先级的寄存器。如果想改变中断优先级顺序,可通过对中断优先级控制寄存器IP设置来完成。寄存器IP位于特殊功能寄存器区的地址B8H上,是专门用于设置单片机中断优先级的寄存器。在单片机上电复位时,中断优先级控制寄存器IP=XXX00000,即所有中断优先控制位均为0。如果想优先响应某个中断,把IP中相应的位置1即可。例如,希望串行通信中断
本文标题:第二章:单片机的核心
链接地址:https://www.777doc.com/doc-3822968 .html