第10讲 51单片机中断系统_第1页
第10讲 51单片机中断系统_第2页
第10讲 51单片机中断系统_第3页
第10讲 51单片机中断系统_第4页
第10讲 51单片机中断系统_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第十讲51单片机中断系统一、单片机中断系统1.中断的定义

所谓中断,是指CPU正在处理某些事务的时候,外部又发生了某一事件,请求CPU及时处理。于是,CPU暂时中断当前的工作,转而处理所发生的事件。处理完毕,再回到原来被中断的地方,继续原来的工作。这样的过程,称为中断。中断示意图中断方式流程图中断嵌套流程图①中断源②中断申请③开放中断④保护现场⑤中断服务⑥恢复现场⑦中断返回2.中断涉及的几个环节(单片机最多只能实现二级嵌套)手机手机铃声响了提醒你去接你准备去接电话一开始你正在电脑上看视频在电脑上暂停我的这个视频你开始接电话挂断电话回来继续看我的视频3.AT89S52单片机的中断源S52系列有6个中断源(比S51多一个T2)

⑴2个外部中断请求:INT0,INT1

⑵3个片内定时器/计数器T0、T1和T2中断请求:TF0,TF1,(TF2)

⑶1个串行口中断请求:TI/RI1.定时器控制寄存器TCON(88H)TF1TR1TF0TR0IE1IT1IE0IT0TCONTF0/TF1:定时器0/定时器1溢出中断申请标志位:=0:定时器未溢出;=1:定时器溢出申请中断,进中断后自动清零。TR0/TR1:定时器运行启停控制位:=0:定时器停止运行;=1:定时器启动运行。是管理定时器工作的SFR(其中低4位管外部中断,高4位管定时器/计数器中断)二、与中断相关的特殊功能寄存器IE0/IE1:外部中断申请标志位:=0:没有外部中断申请;=1:有外部中断申请。IT0/IT1:外部中断请求的触发方式选择位:=0:在INT0/INT1端申请中断的信号低电平触发;=1:在INT0/INT1端申请中断的信号负跳变触发.TF1TR1TF0TR0IE1IT1IE0IT0TCON

EA—ET2ESET1EX1ET0EX0IE2.中断允许寄存器IE(0A8H)EX0/EX1/ET1/ET0/ES位:分别是INT0/1,Timer0/1,串行口的中断允许控制位:=0时禁止中断;=1时允许中断。ET2:T2中断允许控制位(仅52系列有)=0时禁止中断;=1时允许中断。EA:总的中断允许控制位(总开关):=0时禁止全部中断;=1时允许中断。——PT2PSPT1

PX1

PT0PX0IPPX0/PX1:INT0/1优先级控制位:=0时属低优先级;=1时属高优先级。PT0/PT1/PT2:T0/1/2中断优先级控制位:=0时属低优先级;=1时属高优先级。PS1:串行口中断优先级控制位:=0时属低优先级;=1时属高优先级。3.中断优先级控制寄存器IP(0B8H)【例】PX1=1;外中断INT1被设置成高优先级PT0=0;定时器T0被设置成低优先级总线方式IP=0x04;//IP=00000100将PX1设为1PT0设为0;对同时发生多个中断申请时:☞不同优先级的中断同时申请(很难遇到)——先高后低☞相同优先级的中断同时申请(很难遇到)——按序执行☞正处理低优先级中断又接到高级别中断——高打断低☞正处理高优先级中断又接到低级别中断——高不理低4.中断优先级处理原则三、中断系统硬件结构四、单片机的中断矢量与优先级中断矢量:单片机的6个中断源分别对应有各自的中断服务程序入口地址——中断矢量000BHTF0定时/计数器0(T0)002BHTF2定时/计数器2(T2)0023HRI/TI串行口接收/发送001BHTF1定时/计数器1(T1)0013HIE1外部中断1(INT1)0003HIE0外部中断0(INT0)中断优先级中断矢量申请标志中断源最高优先级最低优先级五、外部中断(INT0,INT1)申请过程1.实验开发板中的外部中断接口电路K1:外部中断1的按键,接P3.2线K2:外部中断2的按键,接P3.3线2.外部中断的申请过程⑴在CPU已经开放了外部中断允许的前提下;⑵在INT0/INT1引脚输入一个负脉冲或低电平;⑶TCON寄存器中的IE0/IE1标志位自动变“1”,⑷检测到IE0/IE1变“1”后,将产生指令:执行中断服务程序;⑸并将IE0/IE1标志位自动清“0”,以备下次申请。1.interruptm修饰符interruptmC51中断函数必须通过它进行修饰。在C51程序设计中,当函数定义时用了interruptm修饰符,系统编译时把对应函数转化为中断函数,自动加上程序头段和尾段,并按51系统中断的处理方式自动把它安排在程序存储器中的相应位置。

在该修饰符中,m的取值为0~31,对应的中断情况如下:0——外部中断01——定时/计数器T02——外部中断13——定时/计数器T14——串行口中断5——定时/计数器T2其它值预留。六、C51中断函数的编写C51编译器从绝对地址8m+3处产生一个中断向量,其中m为中断号,也即interrupt后面的数字。该向量包含一个到中断函数入口地址的绝对跳转。3.中断函数注意如下:(1)中断函数不能进行参数传递,如果中断函数中包含任何参数声明都将导致编译出错。(2)中断函数没有返回值,如果企图定义一个返回值将得不到正确的结果,建议在定义中断函数时将其定义为void类型,以明确说明没有返回值。2.usingn修饰符修饰符usingn用于指定本函数内部使用的工作寄存器组,其中n的取值为0~3,表示寄存器组号。可以省略省略后系统自动选择七、C51编程举例本节通过几个例程介绍有关中断应用的程序的编写。1.单一外中断的应用【例】在51单片机的P1口上接有8只LED。在外部中断0输入引脚P3.2(INT0*)引脚接有一只按钮开关K1。程序要求将外部中断0设置为负跳沿触发。在程序启动时,P1口上的8只LED亮。按一次按钮开关K1,使引脚接地,产生一个负跳沿触发的外中断0中断请求,在中断服务程序中,让低4位的LED和高4位的LED交替闪烁。具体电路如下图所示。1819控制8只LED交替闪烁的电路参考程序如下:#include<reg51.h>voidDelay(unsignedinti) /*延时函数Delay(),i为形式参数,不能赋初值*/{ unsignedintj;for(;i>0;i--) for(j=0;j<333;j++) /*晶振为12MHz,j的选择与晶振频率有关*/{;} /*空函数*/}voidmain() /*主函数*/{ EA=1; /*总中断允许*/EX0=1; /*允许外部中断0中断*/IT0=1; /*选择外部中断0为跳沿触发方式*/{P1=0;} /*P1口的8只LED全亮*/20While(1) /*循环*/}voidint0()interrupt0using0 /*外中断0的中断服务函数*/{ EX0=0; /*禁止外部中断0中断*/P1=0x0f; /*低4位LED灭,高4位LED亮*/Delay(800); /*延时800ms*/P1=0xf0; /*高4位LED灭,低4位LED亮*/Delay(800); /*延时800ms*/EX0=1; /*中断返回前,打开外部中断0中断*/}本例程包含了两个部分,一是中断系统初始化部分,另一是中断处理服务函数部分。212.两个外中断的应用当多个中断源时,只需增加相应的中断服务函数即可。例5-3是处理两个外中断请求的例子【例】如下图所示,在51单片机的P1口上接有8只LED。在外部中断0输入引脚P3.2(INT0*)引脚接有一只按钮开关K1。在外部中断1输入引脚P3.3(INT1*)引脚接有一只按钮开关K2。程序要求K1和K2都未按下时,P1口的8只LED呈流水灯显示,仅K1(P3.2)按下时,左右4只LED交替闪烁。仅按下K2(P3.3),P1口的8只LED全部闪亮。两个外中断的优先级相同。2223两个外中断控制8只LED显示的电路参考程序如下。#include<reg51.h>voidDelay(unsignedinti) /*延时函数Delay(),i为形式参数,不能赋初值*/{ unsignedintj;for(;i>0;i--) for(j=0;j<125;j++) {;} /*空函数*/}voidmain() /*主函数*/{unsignedcharplay[9]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};/*定义了流水灯的显示数据*/unsignedchara;for(;;) { for(a=0;a<9;a++) { { Delay(500) /*延时*/P1=play[a]; /*将已经定义的流水灯显示数据送到P1口*/} EA=1; /*总中断允许*/ EX0=1; /*允许外部中断0中断*/ EX1=1 /*允许外部中断1中断*/ IT0=1; /*选择外部中断0为跳沿触发方式*/ IT1=1; /*选择外部中断1为跳沿触发方式*/ IP=0; /*两个外部中断均为低优先级*/}}25voidint0_isr(void)interrupt0using0/*外中断0的中断服务函数*/{ for(;;) P1=0x0f; /*低4位LED灭,高4位LED亮*/ Delay(500); /*延时*/ P1=0xf0; /*高4位LED灭,低4位LED亮*/ Delay(500); /*延时*/}voidint1_isr(void)interrupt2using1 /*外中断1的中断服务函数*/{ for(;;) { P1=0xff; /*全灭*/ Delay(500); /*延时*/ P1=0; /*全亮*/ Delay(500);} /*延时*/}26八、中断控制实例分析实例1:用外部中断0来改变P1口LED灯的亮灭实例2:用LED数码管显示计数器对INT0的计数值(1位数码管显示)实例3:用LED数码管显示计数器对INT1的计数值(2位数码管显示)【例】编写一个用于统计外中断0的中断次数的中断服务程序intx;voidint0()interrupt0using1{x++;}九、中断嵌套中断嵌套只能发生在单片机正在执行一个低优先级中断服务程序的时候,此时又有一个高优先级中断产生,就会产生高优先级中断打断低优先级中断服务程序,去执行高优先级中断服务程序。高优先级中断服务程序完成后,再继续执行低优先级中断服务程序。【例5-4】电路如图5-10所示,设计一个中断嵌套程序。要求K1和K2都未按下时,P1口的8只LED呈流水灯显示,当K1按下再松开时,产生一个低优先级的外中断0请求(跳沿触发),进入外中断0中断服务程序,左右4只LED交替闪烁。此时按下K2再松开时,产生一个高优先级的外中断1请求29(跳沿触发),进入外中断1中断服务程序,P1口的8只LED全部闪烁。当显示一段时间后,再从外中断1返回继续执行外中断0中断服务程序,即P1口控制8只LED左右4只LED交替闪烁。。设置外中断1为高优先级,外中断0为低优先级。3031两个外中断嵌套控制8只LED显示的电路参考程序如下。#include<reg51.h>unsignedcharplay[9]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};/*定义流水灯的显示数据*/voidDelay(unsignedinti) /*延时函数Delay()*/{unsignedintj;for(;i>0;i--) for(j=0;j<125;j++) {;} /*空函数*/}32voidmain() /*主函数*/{unsignedchara;EA=1; /*总中断允许*/ EX0=1; /*允许外部中断0中断*/ EX1=1 /*允许外部中断1中断*/ IT0=1; /*选择外部中断0为跳沿触发方式*/ IT1=1; /*选择外部中断1为跳沿触发方式*PX0=0; /*外部中断0为低优先级*/PX1=1; /*外部中断1为高优先级*/for(;;) { for(a=0;a<9;a++) {Delay(500) /*延时*/P1=play

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论