- 1、本文档共42页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* * * * * * * * * * * * * * * * * * * * * 5.4 中断响应及中断处理过程 5.4.2 中断处理 3.编写中断服务程序时的注意问题 ① 中断矢量入口之间只有8个字节,不足以存放ISR,通常在中断矢量地址单元处放一条无条件转移指令,使中断服务程序可灵活地安排在64KB ROM的任何空间。 ② 在中断服务程序中,应注意用软件保护现场,以免中断返回后丢失原来寄存器、累加器中的信息。 ③ 若要在执行当前中断程序时禁止更高优先级中断,可以先用软件关闭CPU中断或禁止某中断源中断,在中断返回前再开放中断。 ④ 在保护现场和恢复现场时,为了不使现场信息受到破坏或造成混乱,一般在此情况下,应关CPU中断,使CPU暂不响应新的中断请求。这样就要求在编写中断服务程序时,应注意在保护现场之前关中断,在保护现场之后若允许高优先级中断打断它,则应开中断。同样在恢复现场之前应关中断,恢复之后再开中断。 5.4.3 中断返回 在中断服务程序中,最后一条指令必须为中断返回指令RETI。CPU执行该指令时,一方面清除中断响应时所置位的“优先级生效”触发器,另一方面从当前栈顶弹出断点地址送入程序计数器PC,从而返回主程序。注意在中断服务程序中,PUSH和POP指令必须成对使用,否则,不能正确返回断点。 图5-11 中断服务子程序流程图 5.5 中断程序举例 5.5 中断程序举例 5.5.1 主程序 1.主程序的起始地址 89C51/S51系列单片机复位后,(PC)=0000H,而0003H~002BH分别为各中断源的入口地址。编程时应在0000H处写一条跳转指令(一般为长跳转指令),主程序是以跳转的目标地址作为起始地址开始编写,一般从0030H开始。 2.主程序的初始化内容 初始化:将用到的内部部件或扩展芯片进行初始工作状态设定。单片机复位后,特殊功能寄存器IE、IP内容均为00H,所以应对IE、IP进行初始化编程,以开放中断,允许某些中断源中断和设置中断优先级等。 0000H LJMP 00 30 0030H 主程序 图5-12 主程序地址安排 5.5 中断程序举例 5.5.2 中断服务程序 1.中断服务程序的起始地址 当CPU接收到中断请求信号并予以响应后,CPU把当前的PC内容压入堆栈进行保护,然后转入响应的中断服务程序入口处执行。 中断系统对五个中断源分别规定了各自的入口地址,但这些入口地址相距很近(8个字节)。如中断服务程序的指令代码少于8个字节,则可从规定的中断服务程序入口地址开始,直接编写中断服务程序;如中断服务程序的指令代码大于8个字节,则应采用与主程序相同的方法,在相应的入口处写一条跳转指令,并以跳转指令的目标地址作为中断服务程序的起始地址进行编程。以INT0为例,中断矢量地址为0003H,中断服务程序从0200H开始。 0003H LJMP 02 00 0200H 中断服 务程序 图5-13 中断服务程序地址安排 5.5 中断程序举例 5.5.2 中断服务程序 2.中断服务程序编写中的注意事项 ① 视需要确定是否保护现场。 ② 及时清除那些不能被硬件自动清除的中断请求标志,以免产生错误的中断。 ③ 中断服务程序中的压栈与弹栈指令必须成对使用,以确保中断服务程序的正确返回。 ④ 主程序和中断服务程序之间的参数传递,与主程序和子程序的参数传递方式相同。 注:与5.4节内容重复,加深印象。 5.5 中断程序举例 5.5.3 程序举例 例5-3:如图5-14所示,将P1口的P1.4~P1.7作为输入位,P1.0~P1.3作为输出位。要求利用89C51/S51将开关所设的数据读入单片机内,并依次通过P1.0~P1.3输出,驱动发光二极管,以检查P1.4~P1.7输入的电平情况(若输入为高电平则相应的LED亮)。现要求采用中断边沿触发方式,每中断一次,完成一次读/写操作。 图5-14 外部中断 电路 5.5 中断程序举例 5.5.3 程序举例 解:如图所示,采用外部中断0,中断申请从INT0输入,并采用了去抖动电路。 当P1.0~P1.3的任何一位输出0时,相应的发光二极管就会发光。当开关K来回拔动一次时,将产生一个下降沿信号,通过INT0发出中断请求。中断服务程序的矢量地址为0003H。 主程序如下: ORG 0000H LJMP MAIN;上电,转向主程序 ORG 0003H;外部中断0入口地址 LJMP INSER;转向中断服务程序 ORG 0030H ;主程序 MAIN: SETB EX0 ;允许外部中断0中断 SETB IT0 ;选择边沿触发方式 SETB EA
文档评论(0)