1、第六章 中断系统原理及应用,2019/6/4,2,中断概念的出现,是计算机系统结构设计中的重大变革。现代计算机中操作系统实现的管理调度,其物质基础就是丰富的中断功能和完善的中断系统。一个CPU资源要面向多个任务,出现资源竞争,而中断技术实质上是一种资源共享技术。单片机的中断系统包括它的硬件和软件编程。,2019/6/4,3,中断系统概述,中断系统的几个概念: 中断:程序执行过程中,允许外部或内部事件通过硬件打断程序的执行,使其转向为处理外部或内部事件的中断服务程序中去;完成中断服务程序后,CPU继续原来被打断的程序,这样的过程称为中断响应过程,如图61所示。,图61中断响应过程,2019/6/
2、4,4, 中断源:能产生中断的外部和内部事件。 中断优先级:当有几个中断源同时申请中断时,或者CPU正在处理某中断源服务程序时,又有另一中断源申请中断,那么CPU必须要确定优先去处理谁的中断,称为中断优先级。 中断嵌套:优先级高的事件可以中断CPU正在处理的低级的中断服务程序,待完成了高级中断服务程序之后,再继续被打断的低级中断服务程序。这是中断嵌套问题。,2019/6/4,5,需要解决的问题主要有三点: 当单片机内部或外部有中断申请时,CPU能及时响应中断,停下正在执行的任务,转去处理中断服务子程序,中断服务处理后能回到原断点处继续处理原先的任务; 当有多个中断源同时申请中断时,应能先响应优
3、先级高的中断源,实现中断优先级的控制; 当低优先级中断源正在享用中断服务时,若这时优先级比它高的中断源也申请中断,要求能停下低优先级中断源的服务程序转去执行更高优先级中断源的服务程序,实现中断嵌套,并能逐级正确返回原断点处。,单片机的中断系统需要解决的问题,2019/6/4,6, 实现CPU与外部设备的速度配合 实现实时控制实时控制要求计算机能及时完成被控对象随机提出的分析和计算任务。在自动控制系统中,要求各控制参量随机地在任何时刻可向计算机发出请求,CPU必须作出快速响应、及时处理。单片机就是依靠中断技术来实现实时控制。 实现故障的及时发现及处理单片机应用中由于外界的干扰、硬件或软件设计中存
4、在问题等因素,在实际运行中会出现硬件故障、运算错误、程序运行故障等,有了中断技术,计算机就能及时发现故障并自动处理。 实现人机联系比如通过键盘向单片机发出中断请求,可以实时干预计算机的工作。,中断的主要功能,2019/6/4,7,8051的中断系统包括中断源、中断允许寄存器IE、中断优先级寄存器IP、中断矢量等。在8051中,只有两级中断优先级。图62是8051的中断系统结构示意图。,8051 的中断系统,2019/6/4,8,图62 8051的中断系统结构示意图,2019/6/4,9,8051中有5个中断源;8052中增加了一个中断源定时器计数器T2,即有6个中断源。每一个中断源都能被程控为
5、高优先级或低优先级。8051五个中断源中包括两个外部中断源和三个内部中断源。两个外部中断源INT0和INT1,外部设备的中断请求信号、掉电等故障信号都可以从INT0或INT1引脚输入。三个内部中断源为T0和T1的定时/计数谥出中断源和串行口发送或接收中断源。,中断源,2019/6/4,10,1. 外部中断外部中断是由外部信号引起的,共有两个外部中断,它们的中断请求信号分别从引脚INT0 (P3.2) 和INT1 (P3.3) 上引入。外部中断请求有两种信号触发方式,即电平有效方式和跳变有效方式,可通过设置有关控制位进行定义。当设定为电平有效方式时,若INT0或INT1引脚上采样到有效的低电平,
6、则向CPU提出中断请求;当设定为跳变有效方式时,若INT0或INT1引脚上采样到有效负跳变,则向CPU提出中断请求。,2019/6/4,11,(P3.2)外部中断0。当IT0(TCON.0)0 时,低电平有效;当IT0(TCON.0)1 时,下降沿有效。(P3.3)外部中断1。当IT1(TCON.2)0 时,低电平有效;当IT1(TCON.2)=1 时,下降沿有效。,2019/6/4,12, 定时中断为满足定时或计数的需要而设置的。当计数器发生计数溢出时,表明设定的定时时间到或计数值已满,这时可以向CPU申请中断。由于定时器/计数器在单片机芯片内部,所以定时中断属于内部中断。8051有两个源,
7、即: TF0T0溢出中断。 TF1T1溢出中断。 串行中断每当串行口发送或接收一组串行数据时,就产生一个中断请求。RXD,TXD串行中断。,2019/6/4,13,当CPU响应中断时,由硬件直接产生一个固定的地址,即矢量地址,由矢量地址指出每个中断源设备的中断服务程序的入口,这种方法通常称为矢量中断。很显然,每个中断源分别有自已的中断服务程序,而每个中断服务程序又有自已的矢量地址。当CPU识别出某个中断源时,由硬件直接给出一个与该中断源相对应的矢量地址,从而转入各自中断服务程序。中断矢量地址见表61。,中断矢量,2019/6/4,14,表6-1 中断矢量地址,2019/6/4,15,INT0,
8、INT1,T0 及 T1的中断标志存放在 TCON(定时器计数器控制)寄存器中;串行口的中断标志存放在 SCON(串行口控制)寄存器中。定时器计数器控制寄存器TCON字节地址为88H,其格式如下:IT1(TCON.2)、IT0(TCON.0)分别为T0、T1的中断申请触发方式控制位。,中断的控制,中断标志,2019/6/4,16,TF1(TCON.7)T1计数溢出,由硬件置位,响应中断时由硬 件复位。不用中断时用软件清0。 TF0(TCON.5)T0计数溢出,由硬件置位,响应中断时由硬 件复位。不用中断时用软件清0。 IE1(TCON.3)IE11时,外部中断1向CPU申请中断。 IE0(TC
9、ON.l)IE01时,外部中断0向CPU申请中断。 串行口控制寄存器SCON字节地址为98H,其格式如下:,2019/6/4,17,低两位锁存接收中断源RI和发送中断源TI。 TI(SCON.1):串行口发送中断源。发送完一帧,由硬件置位。响应中断后,必须用软件清 0。 RI(SCON.0):串行口接收中断源。接收完一帧,由硬件置位。响应中断后,必须用软件清0。,2019/6/4,18,中断允许和禁止由中断允许寄存器IE控制。 中断允许寄存器IE的格式如下:,中断允许控制,IE寄存器中各位设置:为0时,禁止中断;为 1时,允许中断。 系统复位后IE寄存器中各位均为0,此时禁止所有中断。,201
10、9/6/4,19,与中断有关的控制位共6位,即: EX0(IE.0)外部中断0中断允许位。 ET0(IE.1)T0中断允许位。 EX1(IE.2)外部中断1中断允许位。 ET1(IE.3) T1中断允许位。 ES(IE.4)串行口中断允许位。 EA(IE.7)CPU中断允许位。 当EA1,允许所有中断开放,总允许后,各中断的允许或禁止由各中断源的中断允许控制位进行设置;当EA0时,屏蔽所有中断。,2019/6/4,20,在8051中有高、低两个中断优先级,通过中断优先级寄存器IP来设定。 中断优先级寄存器IP的格式如下:,IP寄存器中各位设置:为0时,低中断优先级;为1时,设为高中断优先级。系
11、统复位后IP寄存器中各位均为0,即此时全部设定为低中断优先级。,中断优先级,2019/6/4,21,中断优先级控制,除了中断优先级控制寄存器之外,还有两个不可寻址的优先级状态触发器,其中一个用于指示某一高优先级中断正在进行服务,而屏蔽其它高优先级中断;另一个用于指示某一低优先级中断正在进行服务,从而屏蔽其它低优先级中断,但不能屏蔽高优先级中断。在中断执行过程中,高中断优先级可以中断低中断优先级的中断过程。但是若在中断服务程序中,关掉所有中断(CLR EA)或关掉部分中断时除外。当CPU同时接收到两个不同优先级中断请求时,先响应高优先级的中断,如果CPU同时接收到的是几个同一优先级的中断请求时,
12、则由内部硬件查询序列确定它们的优先服务次序。,2019/6/4,22,在同一优先级内有一个由内部查询序列确定的笫二个优先级结构。其排列如下: 中断源 中断优先级 外部中断0 最高 定时器T0中断 外部中断1 定时器T1中断 串行口中断 最低8051是一个两级中断系统。,2019/6/4,23,INT0,INT1的中断触发方式有两种:电平触发方式,低电平有效;跳变触发方式,电平发生由高到低的跳变时触发。这两种触发方式可由设置TCON寄存器中的IT1(TCON.2)、 IT0(TCON.0)中断申请触发方式控制位来选择:设置IT1、IT00,选择电平触发方式;设置IT1、IT0l,选择跳变触发方式
13、,即当INT0,INT1引脚检测到前一个机器周期为高电平、后一个机器周期为低电平时,则置位IE0、IE1且向CPU申请中断。,外部中断触发方式,2019/6/4,24,由于CPU每个机器周期采样INTO、INT1引脚信号一次,为确保中断请求被采样到,外部中断源送INTO、INT1引脚的中断请求信号应至少保持一个机器周期。如果是跳变触发方式,外部中断源送INT0、INT1引脚的中断请求信号高、低电平应至少各保持一个机器周期,才能确保CPU采集到电平的跳变;如果是电平触发方式,则外部中断源送INT0、INT1引脚请求中断的低电平有效信号,应一直保持到CPU响应中断为止。,2019/6/4,25,C
14、PU响应中断请求,转向中断服务程序执行,在其执行中断返回指令(RETI)之前,中断请求信号必须撤除,否则将会再一次引起中断而出错。中断请求撤除的方式有三种:1 由单片机内部硬件自动复位。对于T0、T1 的溢出中断和采用跳变触发方式的外部中断请求,在CPU响应中断后,由内部硬件自动清除中断标志TF0和TF1、 IE0和IE1,而自动撤除中断请求。,中断请求的撤除,2019/6/4,26,2应用软件清除相应标志。对于串行接收发送中断请求,在CPU响应中断后,必须在中断服务程序中应用软件清除RI、TI,才能撤除中断。 3采用外加硬件结合软件清除中断请求。对于采用电平触发方式的外部中断请求,中断标志的
15、撤消是自动的,但中断请求信号的低电平可能继续存在,在以后机器周期采样时又会把已清“0”的IE0、IE1标志重新置“1”,再次申请中断。保证在中断响应后把中断请求信号从低电平强制改变为高电平。可在系统中加入如图6-3 所示电路。,2019/6/4,27,图63 电平方式外部中断请求的撤消电路,2019/6/4,28,从图6-3 中可看到,用D触发器锁存外部中断请求低电平,并通过触发器输出端Q送/INT0或/INT1,所以D触发器对外部中断请求没有影响。但在中断响应后,为了撤消低电平引起的中断请求,可利用D触发器的直接置位端SD来实现。采用8051的一根I/O口线来控制SD端。只要在SD端输入一个
16、负脉冲即可使D触发器置“1”,从而撤消了低电平的中断请求信号。所需负脉冲可以通过在中断服务程序中增加以下两条指令得到:ANL P1,#0FEH ;Q置1(SD为直接置位端,低电平有效)ORL P1,#01H ;SD无效使P1.0输出一个负脉冲,其持续时间为两个机器周期,足以使D触发器置位,撤除低电平中断请求。第二条指令是必要的,否则D触发器的Q端始终输出“1”,无法再接受外部中断请求。,2019/6/4,29,从中断请求发生直到被响应去执行中断服务程序,这是一个很复杂的过程。而整个过程均在CPU的控制下有规律的进行。中断响应过程的时序如图64所示。,中断响应过程,图44 中断响应过程的时序,2
17、019/6/4,30, 中断查询若查询到某中断标志为1,则按优先级的高低进行处理,即响应中断。8051的中断请求都汇集在TCON和SCON两个特殊功能寄存器中。而CPU则在下一机器周期的S6期间按优先级的顺序查询各中断标志。先查询高级中断,再查询低级中断。同级中断按内部中断优先级序列查询。如果查询到有中断标志位为“1” ,则表明有中断请求发生,接着从相邻的下一个机器周期的S1状态开始进行中断响应。, 中断采样中断采样是针对外部中断请求信号进行的,而内部中断请求都发生在芯片内部,可以直接置位TCON或SCON中的中断请求标志。在每个机器周期的S5P2(笫五状态的第二节拍)期间,各中断标志采样相应
18、的中断源,并置入相应标志。,2019/6/4,31, 中断响应响应中断后,由硬件自动生成长调用指令“LCALL”, 其格式为LCALL addr16,而addr16就是各中断源的中断矢量地址。先将程序计数器PC的内容压入堆栈进行保护,先低位地址,后高位地址,同时堆栈指针SP加2。将对应中断源的中断矢量地址装入PC,去执行中断服务程序。由于各中断矢量区仅8个字节,在中断矢量区中一般安排一条无条件转移指令,使程序转向在其它地址中存放的中断服务程序。中断服务程序由中断矢量地址开始执行,直至遇到RETI为止。 执行RETI,一是撤销中断申请,弹出断点地址进入PC,先弹出高位地址,后弹出低位地址,同时堆
19、栈指针SP减2,恢复原程序的断点地址执行;二是恢复中断触发器原先状态。,2019/6/4,32,中断响应是有条件的,在接受中断申请时,如遇下列情况之一时,硬件生成的长调用指令“LCALL”将被封锁: CPU正在执行同级或高一级的中断服务程序。因为当一个中断被响应时,其对应的中断优先级触发器被置“1”,封锁了同级和低级中断; 查询中断请求的机器周期不是执行当前指令的最后一个周期。目的在于使当前指令执行完毕后,才能进行中断响应,以确保当前指令的完整执行; 当前正在执行RETI指令或执行对IE、IP的读写操作指令。8051中断系统的特性规定,在执行完这些指令之后,必须再继续执行一条指令,然后才能响应
20、中断。,2019/6/4,33,中断的执行过程与调用子程序的相似点: 都是中断当前正在执行的程序,转去执行子程序或中断服务程序。 都是由硬件自动地把断点地址压入堆栈,然后通过软件完成现场保护。 执行完子程序或中断服务程序后,都要通过软件完成现场恢复,并通过执行返回指令,重新返回到断点处,继续往下执行程序。 二者都可以实现嵌套,如中断嵌套和子程序嵌套。,2019/6/4,34,中断的执行与调用子程序的区别: 中断请求信号可以由外部设备发出,是随机的,比如故障产生的中断请求、按键中断等;子程序调用却是由软件编排好的。 中断响应后由固定的矢量地址转入中断服务程序,而子程序地址由软件设定。 中断响应是
21、受控的,其响应时间会受一些因素影响;子程序响应时间是固定的。,2019/6/4,35,一般来说,在单级中断系统中,中断的响应时间最短为3个机器周期,最长为8个机器周期。当中断请求标志位查询占1个机器周期,而这个机器周期又恰好是指令的最后一个机器周期,在这个机器周期结束后,CPU 即响应中断,产生硬件长调用LCALL指令,执行这条长调用指令需要2个机器周期,这样,中断响应时间为3个机器周期。,中断响应时间,2019/6/4,36,中断响应时间最长为8个机器周期。如果CPU正在执行的是RETI指令或访问IP、IE指令,则等待时间不会多于2个机器周期,而中断系统规定把这几条指令执行完必须再继续执行一
22、条指令后才能响应中断,如这条指令恰好是4个机器周期长的指令(比如乘法指令MUL或除法指令DIV) ,再加上执行长调用指令LCALL所需2个机器周期,总共需要8个机器周期。如果中断请求被前面所列三个条件之一所阻止,不能产生硬件长调用LCALL指令,那么所需的响应时间就更长些。如果正在处理同级或优先级更高的中断,那么中断响应的时间还需取决于处理中的中断服务程序的执行时间。,2019/6/4,37,在8051系列单片机中,一般只有两个外部中断请求输入端INT0、INT1 。当某个系统需要多个外部中断源时,可以通过增加“OC门” 结合软件来扩展;当定时器/计数器在系统中有空余时,也可以通过对计数器计数
23、长度的巧妙设置,使定时器/计数器的外部输入脚(T0或T1) 成为外部中断请求输入端。,外部中断源的扩展,2019/6/4,38,引入芯片本身的外部中断请求输入端(INT0、INT1)就可很方便地扩展多个外部中断源。图65 就是占用一个8051的 INT0(或INT1)扩展4个外部中断源的电路。,采用“OC门”经“线或”后实现,2019/6/4,39,图65 外部中断源的扩展电路,2019/6/4,40,4个扩展外部中断源中有一个或几个出现高电平,反相器输出为0,引起INT0低电平触发中断,所以这些中断源都是电平触发方式。当满足外部中断请求条件时,则CPU响应中断,转入0003H单元开始执行中断
24、服务程序。在中断服务程序中,由软件设定的顺序查询外部中断哪一位是高电平,然后进入该中断处理程序。查询的顺序就是外部扩展中断源的中断优先级顺序。外部中断源查询的流程图示于图66。,2019/6/4,41,图66 外部中断源查询流程图,2019/6/4,42,INT0的中断服务程序如下: PINTO:PUSH PSW ;保护现场PUSH ACCJB P1.0, LOOP1 ;转向中断服务程序1JB P1.l,LOOP2 ;转向中断服务程序2JB P1.2,LOOP3 ;转向中断服务程序3JB P1.3,LOOP4 ;转向中断服务程序4 INTEND:POP ACC ;恢复现场 POP PSW RE
25、TI LOOP1: ;中断服务程序1AJMP INTEND LOOP2: ;中断服务程序2AJMP INTEND LOOP3: ;中断服务程序3AJMP INTEND LOOP4: ;中断服务程序4AJMP INTEND,2019/6/4,43,利用T0或T1的外部事件输入引脚T0、T1作为边沿触发的外部中断源。这时应设置定时器/计数器为计数器方式,而计数常数为满刻度值。外部输入的脉冲在负跳变时有效,计数器加1后即溢出,向CPU申请中断。如果以T0、T1的计数脉冲输入作为外部中断请求输入,T0、T1的中断矢量用做第三、笫四个扩展的外部中断矢量,T0、T1的中断服务程序入口地址作为扩展的外部中断
26、服务入口地址,即实现了外部中断的扩展。,通过片内定时器/计数器来实现,2019/6/4,44,例 把外部中断请求信号2连到T1引脚上,T1设为方式2,即8位自动重装载方式,时间常数设为满刻度值FFH其初始化程序段如下:ORG 0000HAJMP MAINORG 001BH ;T1中断矢量用作外部中断2 LJMP INT2ORG 0030H MAIN:MOV TMOD,#60H ;设T1计数器方式2MOV TL1,#0FFH ;置T1计数常数MOV TH1,#0FFHSETB EA ;开中断SETB ET1 ;允许计数器1中断SETB TR1 ;启动计数- INT2: - ;外部中断2服务程序,
27、2019/6/4,45,8051的中断系统中,允许用户单步运行程序。一般是设置一个单步键(STEP) ,用以产生脉冲,按一次STEP键就执行一条指令,通过检查结果来检查每条指令执行的正确与否。8051中断结构有一个重要特性,即执行中断返回指令RETI后,必须至少执行一条其它指令后,才能响应新的中断。典型方法是使用外部中断,并将其设为电平触发方式。硬件上,把按键产生的脉冲连到 INT0(P3.2)引脚,作为外部中断0的中断请求信号,并把电路设计为不按键时为低电平,按一次键产生一个正脉冲。,8051的单步操作,2019/6/4,46,软件上,需编制外部中断0的中断服务程序,在中断服务程序的末尾为J
28、NB P3.2,$ ;INT0 =0 ,则等待RETI ;中断返回在没有按键时,INT0=0 ,中断请求有效,响应中断后执行中断服务程序,在执行到JNB P3.2,$指令时等待。当按下单步键后产生一个正脉冲,执行中断返回,再执行一条指令后, 由于已为低电平,所以单片机再次响应中断,并进入中断服务程序等待。从而实现了按一次键执行一条指令的功能。,2019/6/4,47,8051共有5个中断源,由4个特殊功能寄存器TCON、SCON、IE和IP进行管理和控制。 需要用软件对以下5个内容进行设置: 中断服务程序入口地址的设定。 某一中断源中断请求的允许与禁止。 对于外部中断请求,还需进行触发方式的设
29、定。 各中断源优先级别的设定。 CPU开中断与关中断。,中断服务程序的设计,2019/6/4,48,中断程序一般包含中断控制程序和中断服务程序两部分。中断控制程序即中断初始化程序,一般不独立编写,而是包含在主程序中,根据上述的5点通过编写几条指令来实现。 例 试编写设置外部中断INT0和串行接口中断为高优先级,外部中断INT1为低优先级。屏蔽T0 和T1中断请求的初始化程序段。根据题目要求,只要能将中断请求优先级寄存器IP的第0、4位置“l”。其余位置“0”,将中断请求允许寄存器的第0、2、4、7位置“l”,其余位置“0”就可以了。,2019/6/4,49,编程如下: ORG 0000HSJM
30、P MAINORG 0003HLJMP INT0INT ;设外部中断/INT0中断矢量ORG 0013HLJMP INT1INT ;设外部中断/INT1中断矢量ORG 0023HLJMP SIOINT ;设串行口中断矢量ORG 0030H MAIN:MOV IP,#00010001B ;设外部中断INT0和 ;串行口中断为高优先级 MOV IE#10010101B ;允许INT0、INT1、 ;串行口中断,开CPU中断,2019/6/4,50,中断响应很突出的一点是它的随机性。 保护断点和现场、恢复断点和现场中断服务程序在调用和返回时,也有一个保护断点和现场、恢复断点和现场的问题。在中断响应过
31、程中,断点的保护主要由硬件电路自动实现。它将断点压入堆栈,再将中断服务程序的入口地址送入程序计数器PC,使程序转向中断服务程序,即为中断源的请求服务。,2019/6/4,51,所谓现场是指中断发生时单片机中存储单元、寄存器、特殊功能寄存器中的数据或标志位等。在8051中,现场一般包括累加器 A、工作寄存器 R0R7以及程序状态字PSW等。 保护的方法可以有以下几种: 通过堆栈操作指令PUSH direct; 通过工作寄存器区的切换; 通过单片机内部存储器单元暂存。 现场保护一定要位于中断服务程序的前面。在结束中断服务程序返回断点处之前要恢复现场,与保护现场的方法相对应。而恢复断点也是由硬件电路
32、自动实现的,中断服务程序的最后一条指令必须是RETI指令。,2019/6/4,52, 对中断的控制 8051单片机具有多级中断功能(即多重中断嵌套),为了不至于在保护现场或恢复现场时,由于CPU响应其它中断请求,而使现场破坏。一般规定,在保护和恢复现场时,CPU不响应外界的中断请求,即关中断。因此,在编写程序时,应在保护现场和恢复现场之前,关闭CPU中断;在保护现场和恢复现场之后,再根据需要使CPU开中断。对于重要中断,不允许被其它中断所嵌套。除了设置中断优先级外,还可以采用关中断的方法,彻底屏蔽其它中断请求,待中断处理完之后再打开中断系统。,2019/6/4,53,例 利用定时/计数器T1来
33、代替一个扩展的外部中断请求源。 解 将扩展的外部中断请求源 连接到定时/计数器T1的计数输入端(P3.4),其硬件连接如图6-7所示。置定时/计数器T1为工作模式2、计数方式,TH1和TL1初值均为0FFH,允许T1产生中断。则利用定时/计数器T1溢出中断来扩展外部中断的初始化程序如下:,2019/6/4,54,ORG 0000HAJMP MAINORG 001BHAJMP L0ORG 0000H MAIN: MOV TMOD, #60H ;T1方式2,计数方式MOV TL1, #0FFH ;送时间常数MOV TH1, #0FFHSETB TR1SETB ET1SETB EASJMP $ L0
34、: DEC A ;T1中断处理程序MOV P1, A ;A内容减1送P1口RETI,2019/6/4,55,例: 按照图6-8给出的软件查询扩展外部中断源硬件电路,设扩展的4个外部中断源的优先级由高到低的顺序是INT00 INT03,请写出有关的中断服务程序。,2019/6/4,56,ORG 0013 HLJMP RJCX. RJCX: PUSH PSWPUSH ACCANL P1,#0FHJNB P1.0, NEXT1ACALL INT00 NEXT1: JNB P1.1, NEXT2ACALL INT01 NEXT2: JNB P1.2, NEXT3ACALL INT02 NEXT3: J
35、NB P1.3, NEXT4ACALL BR3 NEXT4: POP ACCPOP PSWRE TI INT00: ; INT00中断服务子程序RET INT01: ; INT01中断服务子程序RET INT02: ; INT02中断服务子程序RET INT03: ; INT03中断服务子程序RET,2019/6/4,57,例 使用外部中断0,当每次响应中断时,P1口依次输出高电平,使8个发光二极管依次循环熄灭闪烁。,ORG 0000HLJMP MAINORG 0003HLJMP LEDORG 1000H MAIN: SETB IT0SETB EX0 SETB EA LOOP: AJMP LO
36、OP,2019/6/4,58,ORG 1050H ;中断程序入口 LED: MOV R2, #0FFH ;置循环次数MOV A, #01H ;灯亮初值 LOOP0: RR A ;右移一位MOV R7, #0 FFH ;定时 LOOP1: MOV R6, #0FFH LOOP2: NOPNOPDJNZ R6, LOOP2DJNZ R7, LOOP1MOV P1, A ;控制灯的亮灭DJNZ R2, LOOP0 ;循环RETI ;中断返回END,2019/6/4,59,例、欲用80C51产生两个方波,一个周期为200s,另一个周期为400s,该80C51同时使用串行口,用定时器计数器作为波特率发生
37、器。 这时T0采用方式3工作,其中,TL0产生100s定时,由 P1.0输出方波;TH0产生200s定时,由Pl.1输出方波;T1设置为方式2作波特率发生器用。fOSC9.216 MHz。,TL0定时常数为 TCL0:tl0100s,TL0B3H。,TH0定时常数为TCH0:定时时间为th0200s,TH066 H。,设TH1的波特率为2400,则定时常数为TC2F6H,2019/6/4,60, 编 程ORG 0000HAJMP MAINORG 000BH ;TL0的中断入口AJMP ITL0ORG 00lBH ;TH0的中断入口AJMP ITH0ORG 0100H MAIN: MOV SP,
38、 60H ;设栈指针MOV TMOD, 23H ;设T0为方式3,T1为2 MOV TL0,0B3H ;设TL0初值(100s定时)MOV TH0,66H ;设TH0初值(200s定时)MOV TL1,0F6H ;设TL1初值(波特率为2400) MOV TH1, 0F6H ;设 TH1初值,2019/6/4,61,SETB TR0 ;启动 TL0 SETB TR1 ;启动TH0SETB ET0 ;允许TL0中断SETB ET1 ;允许TH0中断SETB EA ;CPU中断开放AJMP ORG 0200H ITL0:MOV TL0, 0B3H ;重装定时常数CPL P1.0 ;输出方波(200
39、s)RETI ITH0:MOV TH0,66H ;重装定时常数CPL P1.1 ;输出方波(400s)RETI,2019/6/4,62,例、假如一个用户系统已使用了两个外部中断源,即INT0和INT1,用户系统要求从P1.0引脚上输出一个5KHz的方波,并要求采用定时器/计数器作为串行口的波特率发生器,另外还需要再增加一个外部中断源。,2019/6/4,63,把T0设置为方式3,把单片机的引脚T0作为外部中断源,TL0设置为计数器,计数器的定时常数设为FFH,相当于一个边沿触发的外部中断源。而T0方式3下,TH0只能做8位定时器,用来产生5KHz方波的定时。当T0设置为方式3之后,T1就作为串
40、行口的波特率发生器,设为方式2。由P1.0引脚上输出5KH频率的方波,而方波周期为200s,则要求定时时间为100s,若采用12MHz的晶体振荡器,则机器周期为1s。 计算时间常数: (28TC)1s100sTC256100156=9CH,2019/6/4,64, 编程: ORG 0000HSJMP MAINORG 000BHAJMP TL0INT ;TL0中断入口ORG 001BHAJMP TH0INT ;TH0中断入口ORG 0030H MAIN: MOV TMOD,#27H ;设T0为方式3,TL0为计数 ;器方式,TH0为定时器方式,T1作波特率发生器,方式2MOV TH0,#156
41、;TH0定时常数MOV TL0, #0FFH ;TL0计数常数MOV TL1,#BAUD ;BAUD根据波特率算出 ;的时间常数,2019/6/4,65,MOV TH1,#BAUD MOV TCON,#55H ;置TR0和TR1为“1”,启 ;动TL0和TH0SETB ET0 ;允许TR0中断SETB ET1 ;允许TR1中断SETB EA ;允许CPU中断SJMP $ ;中断等待ORG 0100H TL0INT: MOV TL0,#0FFH ;重置计数长度(中断处理)RETI TH0INT: MOV TH0,#156 ;重置定时常数CPL P1.0 ;P1.0引脚输出方波RETI,2019/
42、6/4,66,例 MCS-51系统多机通信软件设计。 (1) 软件协议通信系统都要制定相关的通信协议,在MCS-51系统中,进行通信软件设计时要注意以下几个方面: MCS-51系统中允许有255台从机,其地址范围为00HFEH; 地址FFH是对所有从机都起作用的一条控制命令,命令各从机恢复SMl状态; 主机和从机的联络过程:主机首先发送地址帧,被寻址从机向主机回送本机地址,主机在判断地址相符后给被寻址的从机发送控制命令,被寻址的从机根据其命令向主机回送自己的状态,若主机判断状态正常,主机即开始发送或接收数据,发送或接收的第一个字节为数据块长度。若从机状态不正常,主机则要求进行重新联络。,201
43、9/6/4,67, 设主机发送的控制命令代码为: 00H:要求从机接收数据块; 0lH:要求从机发送数据块; 其他:非法命令。 从机状态字格式为:其中,若ERR1,从机接收到非法命令; 若TRDY1,从机发送准备就绪; 若RRDYl,从机接收准备就绪。,2019/6/4,68,(2) 主机、从机多机通信软件设计采用主机查询、从机中断的通信方式。主机通信程序部分以子程序的方式给出,要进行串行通信,可直接调用这个子程序;从机通信部分以串行口中断服务程序的方式给出,若从机未做好接收或发送的准备,就从中断程序中返回,在主程序中做好准备。主机在这种情况下不能简单地等待从机准备就绪,而要重新与从机联络,使
44、从机再次执行串行口中断服务程序。 主机串行通信子程序 主机查询方式程序流程图如图6-12所示,串行通信子程序如下: 入口参数:(R0)主机发送的数据块首地址;(R1)主机接收的数据块首地址;(R2)被寻址的从机地址;(R3)主机发出的命令;(R4)数据块长度。,2019/6/4,69,2019/6/4,70,2019/6/4,71, 主机串行通信子程序入口参数: (R0)主机发送的数据块首址(R1)主机接收的数据块首址(R2)被寻址从机地址(R3)主机命令(R4)一一数据块长度 MSIO:MOV SCON,#0D8H ;设串行口模式3,允许接收, ;TB8置1 MSIO1: MOV A,R2
45、;发送地址帧MOV SBUF,AJNB RI,$ ;等待从机应答CLR RI,2019/6/4,72,MOV A,SBUFXRL A,R2 ;判应答地址是否相符JZ MSIO3 MSIO2:MOV SBUF,#0FFH ;重新联络SETB TB8SJMP MSIO1 MSIO3:CLR TB8 ;地址符合,准备送命令MOV SBUF,R3 ;送命令JNB RI,$ ;等待从机应答CLR RIMOV A,SBUF,2019/6/4,73,JNB ACC7,MSI04 ;判命令是否出错 SJMP MSIO2 ;若从机接收命令出错,重 ; 新联络 MSIO4:CJNE R3,#00,MSIO5;不是
46、要求从机接收数据, ; 则跳转JNB ACC0,MSIO2 ;从机接收数据准备就绪否? LPTX:MOV SBUF,R0 ;主机发送数据块JNB TI,$ ;等待发送完一帧CLR TIINC R0DJNZ R4,LPTXRET,2019/6/4,74,MSIO5:JNB ACC.1,MSIO2 ;从机发送数据准备就绪否? LPRX:JNB RI,$ ;主机接收数据块CLR RI MOV A,SBUFMOV R1,AINC R1DJNZ R4,LPRXRET,2019/6/4,75,若主机向10号从机发送数据块,数据块放置在内部RAM区的40H4FH单元中,则调用上述子程序MSIO的方法是:MO
47、V R2,#0AHMOV R3,#0 MOV R4,#10HMOV R0,#40HLCALL MSIO,2019/6/4,76, 从机串行通信子程序从机的串行通信采用中断控制起动方式。 在串行通信启动后,仍采用查询方式来接收或发送数据块。从机的程序中还包括定时器1和串行口的初始化以及开中断程序。程序中用F0作发送准备就绪标志,PSW.l作接收准备就绪标志。背景程序的其它有关部分如下MOV SP,#1FH ;设置堆栈指针MOV SCON,#0F0H ;置串行口方式3,SM2=1, ;允许接收MOV 08H,#40H ;接收缓冲区起址送1区R0 MOV 09H,#50H ;发送缓冲区起址送1区R1
48、 MOV 0AH,10H ;发送或接收字节数送1区R2 ,2019/6/4,77,ORG 0023HAJMP SSIO ;串行口中断服务程序入口ORG 0100H SSIO:CLR RIPUSH A ;保护现场PUSH PSW SETB RS0 ;选1区工作寄存器CLR RS1MOV A,SBUF XRL A,#SLAVE ;SLAVE为本从机地址JZ SSIO1,2019/6/4,78,RETURN: POP PSW ;不是呼叫本从机,恢复现 ; 场后返回POP A RETI SSIO1: CLR SM2 ;地址符合,与主机继续通信MOV SBUF,#SLAVE ;从机地址送回主机JNB RI,$ ;等待接收1帧完CLR RIJNB RB8,SSIO2 ;是命令帧,跳SSIO2SETB SM2 ;是复位,置SM2=1后返回SJMP RETURN,