您好,欢迎来电子发烧友网! ,新用户?[免费注册]

当前位置:电子发烧友网 > 图书频道 > 电子 > 《单片机原理与应用》 > 第5章 MCS-51单片机内部资源

第2节 单片机流水灯控制

  5.2.1 硬件电路与工作原理

  1. 硬件电路同模块二中图2.1。

  2. 工作原理

  一旦按下P3.2所接按键后,P3.2口线上会出现这样两个变化,第一,口线上出现由高到低的变化,即出现下降沿。第二,P3.2按住后口线保持低电平直到松键为止。单片机就是利用口线上的这种变化,实现上述各种状态的切换。

  5.2.2 控制程序

  1. 程序流程图

                                                                                                 图 5.8 主程序流程                                                                                    图 5.9 外部中断程序流程

  

图 5.10 定时中断程序流程

  2. 控制程序

  ORG 0000H

  LJMP MAIN

  ORG 0003H

  LJMP INT_0

  ORG 001BH

  LJMP DELAY

  MAIN: SETB IT0

  MOV TMOD,#01H

  MOV TL0,#00H

  MOV TH0,#4CH

  SETB PT0

  SETB EA

  SETB EX0

  SETB ET0

  MOV B,#20

  SETB TR0

  MOV A,#0FEH

  BEGIN: MOV P1,A

  CJNE B,#00,$

  MOV B,#20

  RL A

  SJMP BEGIN

  INT_0: PUSH ACC

  MOV A,#0FBH

  LOOP: MOV P1,A

  CJNE B,#00,$

  MOV B,#20

  RL A

  JNB P3.2,LOOP

  POP ACC

  RETI

  DELAY: MOV TL0,#00H

  MOV TH0,#4CH

  DJNZ B,LOOP1

  LOOP1: RETI

  END

  5.2.3 源程序的编辑、编译、下载

  打开“伟福”模拟仿真软件进行程序的编辑、编译。

  打开“ISP下载软件”将目标文件下载到ISP-4实验开发板上的AT89S51单片机芯片,观察程序运行结果。

  5.2.4 相关知识

  1. 单片机如何中断原来的工作?

  在本任务中当按键S1按下后,原来单片机正在进行的工作被打断,按键松开后单片机又恢复了原来的工作,这就是我们在前面所说的中断。

  对初学者来说,中断这个概念比较抽象,其实单片机的处理系统与人的一般思维有着许多异曲同工之妙,我们举个很贴切的比方,在日常生活和工作中有很多类似的情况。假如你正在上班,例如是编译资料,这时侯电话铃响了,你在书本上做个记号(以记下你现在正编译到某某页),然后与对方通电话,而此时恰好有客人到访,你先停下通电话,与客人说几句话,叫客人稍侯,然后回头继续通完电话,再与客人谈话。谈话完毕,送走客人,继续你的资料编译工作。

  这就是日常生活和工作中的中断现象,类似的情况还有很多,从编译资料到接电话是第一次中断,通电话的过程中引有客人到访,这是第二次中断,即在中断的过程中又出现第二次中断,这就是我们常说的中断嵌套。处理完第二个中断任务后,回头处理第一个中断,第一个中断完成后,再继续你原先的主要工作。

  为什么会出现这样的中断呢?道理很简单,人非三头六臂,人只有一个脑袋,在一种特定的时间内,可能会面对着两、三甚至更多的任务。但一个人又不可能在同一时间去完成多样任务,因此你只能采分析任务的轻重缓急,采用中断的方法穿插去完成它们。那么这种情况对于单片机中的中央处理器也是如此,单片机中CPU只有一个,但在同一时间内可能会面临着处理很多任务的情况,如运行主程序、数据的输入和输出,定时/和计数时间已到要处理、可能还有一些外部的更重要的中断请求(如超温超压)要先处理。此时也得象人的思维一样停下某一样(或几样)工作先去完成一些紧急任务的中断方法。

  这样的一样处理方法上升到计算机理论,就是一个资源面对多项任务的处理方式,由于资源有限,面对多项任务同时要处理时,就会出现资源竞争的现象。中断技术就是为了解决资源竞争的一个可行的方法,采用中断技术可使多项任务共享一个资源,所以有些文献也称中断技术是一种资源共享技术。

  (1) MCS-51的中断结构

  图 5.11 中断系统的结构

  计算机的中断系统能够加强CPU对多任务事件的处理能力。从而使它的应用范围进一步扩大。在MCS-48结构的基础上,MCS-51在增强了I/O的种类、功能和数量的同时,也增强了中断能力。MCS-51提供了5个中断源,两个中断优先级控制,可实现两个中断服务嵌套。当CPU支持中断屏蔽指令后,可将一部分或所有的中断关断,只有打开相应的中断控制位后,方可接收相应的中断请求。程序设置中断的允许或屏蔽,也可设置中断的优先级。

  (2) 中断处理流程

  CPU响应中断请求后,就立即转入执行中断服务程序。不同的中断源、不同的中断要求可能有不同的中断处理方法,但它们的处理流程一般都如下所述。

  1) 现场保护和现场恢复

  中断是在执行其它任务的过程中转去执行临时的任务,为了在执行完中断服务程序后,回头执行原先的程序时,知道程序原来在何处打断的,各有关寄存器的内容如何,就必须在转入执行中断服务程序前,将这些内容和状态进行备份——即保护现场。就象文章开头举的例子,在看书时,电话玲响需传去接电话时,必须在书本上做个记号,以便在接完电话后回来看书时,知道从哪些内容继续往下看。计算机的中断处理方法也如此,中断开始前需将个有关寄存器的内容压入堆栈进行保存,以便在恢复原来程序时使用。

  中断服务程序完成后,继续执行原先的程序,就需把保存的现场内容从堆栈中弹出,恢复积存器和存储单元的原有内容,这就是现场恢复。

  如果在执行中断服务时不是按上述方法进行现场保护和恢复现场,就会是程序运行紊乱,程序跑飞,自然使单片机不能正常工作。

  2) 中断打开和中断关闭

  在中断处理进行过程中,可能又有新的中断请求到来,这里规定,现场保护和现场恢复的操作是不允许打扰的,否则保护和恢复的过程就可能使数据出错,为此在进行现场保护和现场恢复的过程中,

  必须关闭总中断,屏蔽其它所有的中断,待这个操作完成后再打开总中断,以便实现中断嵌套。

  3) 中断服务程序

  既然有中断产生,就必然有其具体的需执行的任务,中断服务程序就是执行中断处理的具体内容,一般以子程序的形式出现,所有的中断都要转去执行中断服务程序,进行中断服务。

  4) 中断返回

  执行完中断服务程序后,必然要返回,中断返回就是被程序运行从中断服务程序转回到原工作程序上来。在MCS-51单片机中,中断返回是通过一条专门的指令实现的,自然这条指令是中断服务程序的最后一条指令。

  (3) MCS-51的中断源

  8051有5个中断源,它们是两个外中断INT0(P3.2)和INT1(P3.3)、两个片内定时/计数器溢出中断TF0和TF1,一个是片内串行口中断TI或RI,这几个中断源由TCON和SCON两个特殊功能寄存器进行控制。

  在前一节,我们已对TCON的控制位进行了说明,现在继续对它的中断控制有关的位进行谈论。TCON寄存器的结构如下:

  表5.1 TCON寄存器结构

  IE1: 外部边沿触发中断1请求标志,其功能和操作类似于TF0。

  IT1: 外部中断1类型控制位,通过软件设置或清楚,用于控制外中断的触发信号类型。IT1=1,边沿触发。IT=0是电平触发。

  IE0: 外部边沿触发中断0请求标志,其功能和操作类似于IE1。

  IT0: 外部中断0类型控制位,通过软件设置或清楚,用于控制外中断的触发信号类型。其功能和操作类似于IE1。

  SCON是串行口控制寄存器,字节地址为98H,SCON的低二位是串行口的发送和接收中断标志,其格式如下:

  

  表5.2 SCON寄存器结构

  TI: MCS-51串行口的发送中断标志,在串行口以方式0发送时,每当发送完8位数据,由硬件置位。如果以方式1、方式2或方式3发送时,在发送停止位的开始时TI被置1,TI=1表示串行发送器正向CPU发出中断请求,向串行口的数据缓冲器SBUF写入一个数据后就立即启动发送器继续发送。但是CPU响应中断请求后,转向执行中断服务程序时,并不清零TI,TI必须由用户的中断服务程序清“0”,即中断服务程序必须有“CLR TI”或“ANL SCON, #0FDH”等指令来清零TI。

  RI: 串行口接收中断标志.若串行口接收器允许接收,并以方式0工作,每当接收到8位数据时,RI被置1,若以方式1、2、3方式工作,当接收到半个停止位时,TI被置1,当串行口以方式2或3方式工作,且当SM2=1时,仅当接收到第9位数据RB8为1后,同时还要在接收到半个停止位时,RI被置1。RI为1表示串行口接收器正向CPU申请中断。同样RI标志栩栩如生由用户的软件清“0”。

  (4) 中断的控制

  对于中断控制,在上一节中我们已经对TCON和SCON进行了分析,其实它们两个寄存器也是中断的控制寄存器,负责对中断的部分功能进行控制。我们这里谈论的是另外两个控制寄存器IE和IP。

  MCS-51的对中断的开放和屏蔽是由中断允许寄存器IE控制来实现的,IE的结构格式如下。

  

  表5.3 IE寄存器结构

  下面我们对IE寄存器的各控制位进行介绍:

  EA: 中断总控制位,EA=1,CPU开放中断。EA=0,CPU禁止所有中断。

  ES: 串行口中断控制位,ES=1允许串行口中断,ES=0,屏蔽串行口中断。

  ET1: 定时/计数器T1中断控制位。ET1=1,允许T1中断,ET1=0,禁止T1中断。

  EX1: 外中断1中断控制位,EX1=1,允许外中断1中断,EX1=0,禁止外中断1中断。

  ET0: 定时/计数器T0中断控制位。ET1=1,允许T0中断,ET1=0,禁止T0中断。

  EX0: 外中断0中断控制位,EX1=1,允许外中断0中断,EX1=0,禁止外中断0中断。

  MCS-51有两个中断优先级,即高优先级和低优先级,每个中断源都可设置为高或低中断优先级。如果有一低优先级的中断正在执行,那么高优先级的中断出现中断请求时,CPU则会响应这个高有限级的中断,也即高优先级的中断可以打断低优先级的中断。而若CPU正在处理一个高优先级的中断,此时,就算是有低优先级的中断发出中断请求,CPU也不会理会这个中断,而是继续执行正在执行的中断服务程序,一直到程序结束,执行最后一条返回指令,返回主程序然后再执行一条指令后才会响应新的中断请求。

  为了实现上述功能,MCS-51的中断系统有两个不可寻址的优先级状态触发器,一个指出CPU是否在执行高优先级中断服务程序,另一个指出CPU是否正在执行低优先级的中断服务程序,这两个中断触发器的1状态分别屏蔽所有中断申请和同一级别的其他中断申请,此外,MCS-51还有一个申请优先级寄存IP,IP的格式如下,字节地址是B8H。

  

  表5.4 IP中断控制寄存器结构

  PS: 串行口中断口优先级控制位,PS=1,串行口中断声明为高优先级中断,PS=0,串行口定义为低优先级中断。

  PT1: 定时器1优先级控制位。PT1=1,声明定时器1为高优先级中断,PT1=0定义定时器1为低优先级中断。

  PX1: 外中断1优先级控制位。PT1=1,声明外中断1为高优先级中断,PX1=0定义外中断1为低优先级中断。

  PT0: 定时器0优先级控制位。PT1=1,声明定时器0为高优先级中断,PT1=0定义定时器0为低优先级中断。

  PX0: 外中断0优先级控制位。PT1=1,声明外中断0为高优先级中断,PX1=0定义外中断0为低优先级中断。

  (5) 中断的响应

  MCS-51CPU在每一个机器周期顺序检查每一个中断源,在机器周期的S6按优先级处理所有被激活的中断请求,此时,如果CPU没有正在处理更高或相同优先级的中断,或者现在的机器周期不是所执行指令的最后一个机器周期,或者CPU不是正在执行RETI指令或访问IE和IP的指令(因为按MCS-51中断系统的特性规定,在执行完这些指令之后,还要在继续执行一条指令,才会响应中断),CPU在下一个机器周期响应激活了的最高级中断请求。

  中断响应的主要内容就是由硬件自动生成一条长调用LCALL addr16指令,这里的addr16就是程序存储器中相应的中断区入口地址,这些中断源的服务程序入口地址如下:

  表 5.5

  生成LCALL指令后,CPU紧跟着便执行之.首先将PC(程序计数器)的内容压入堆栈保护断点,然后把中断入口地址赋予PC,CPU便按新的PC地址(即中断服务程序入口地址)执行程序。

  值得一提的是,各中断区只有8个单元,一般情况下(除非中断程序非常简单),都不可能安装下一个完整的中断服务程序。因此,通常是在这些入口地址区放置一条无条件转移指令,使程序按转移的实际地址去执行真正的中断服务程序。

  2. 单片机中断程序怎样编制?

  从上面的任务程序中,我们来体会以下中断服务程序的编制方法。

  (1) 首先必须对中断系统进行初始化,包括:

  1) 开中断,即设定IE寄存器。

  如上面程序中的 SETB EA ;开总中断控制位

  SETB EX0 ;开外部中断0

  SETB ET0 ;开定时器中断0

  2) 设定中断优先级,即设置IP寄存器。

  如上面程序中的 SETB PT0 ;设定时器0中断为高优先级

  3) 如果是外部中断,还必须设定中断响应方式,即设定IT0、IT1位。

  如上面程序中的 SETB IT0 ;设外部中断0为边沿触发方式

  4) 如果是计数、定时中断必须先设定定时、计数的初始值。

  如上面程序中的 MOV TL0,#00H

  MOV TH0,#4CH

  5) 初始化结束后,对于定时、计数器而言,还应该记得启动定时或计数,即设定TR0、TR1位。串口接收中断,要记得允许接收位REN应该设置。

  如上面程序中的 SETB TR0

  (2) 中断初始化结束后,就可以编制中断服务程序,编制中断服务程序时注意:

  1) 中断服务程序,第一条指令必须安排在相应的中断入口地址,并且应该是转移指令,由于中断响应时,已经由硬件执行了LCALL指令,中断程序断点地址已经入栈,所以不能再用子程序调用指令。

  如任务程序中的 ORG 0003H ;外部中断0入口地址

  LJMP INT_0

  ORG 001BH ;定时器T0中断入口地址

  LJMP DELAY

  2) 由于中断的产生是随机的,所以对程序中的公共单元(其他程序中已经使用,中断程序中也使用了的单元),必须在中断服务程序开始处,采用堆栈进行保护,即入栈。子程序返回前再出栈。

  如任务程序中的 PUSH ACC

  ……

  POP ACC

  3) 中断服务程序必须以RETI结束,因为RETI指令具有两个功能:第一,将断点地址弹回PC指针,以保证能继续原来的程序,第二,能将中断优先级状态触发器清零,以保证新的中断请求能够被相应。