历史上的今天
返回首页

历史上的今天

今天是:2025年02月04日(星期二)

2020年02月04日 | 51单片机的中断体系结构_中断的响应过程

2020-02-04 来源:elecfans

  51单片机的中断系统十分重要,分为外部中断和定时器中断。本文主要详解51单片机的中断体系结构以及中断的响应过程,具体的跟随小编一起来了解一下。


  51单片机的中断体系结构详解

  80C51的中断系统有5个中断源(8052有 6个) ,2个优先级,可实现二级中断嵌套 。MCS-51系列单片机中断系统的机构如下:

  51单片机的中断体系结构_中断的响应过程

  与中断系统相关的特殊寄存器:

  1)中断允许控制寄存器(IE)------ 控制各中断的开放和屏蔽

  2)中断优先级控制寄存器(IP)------设置各中断的优先级

  3)定时器/计数器控制寄存器(TCON)----定时器和外部中断的控制

  4)串行口控制寄存器(SCON)------串行中断的控制


  中断类型分为三类:

  1)T0、T1是2个定时器/计数器中断,由片内定时器提供;

  2)INT0、INT1是2个外部中断,由引脚P3.2和P3.2提供;

  3)RX、TX为串行口中断所用,由片内串口提供。

  51单片机的中断体系结构_中断的响应过程

  1、(P3.2)/(P3.3)可由IT0(TCON.0)/IT1(TCON.2)选择其为低电平有效还是下降沿有效。当CPU检测到P3.2/P3.3引脚上出现有效的中断信号时,中断标志IE0(TCON.1)/IE1(TCON.3)置1,向CPU申请中断。

  2、TF0(TCON.5)/TF1(TCON.7),片内定时/计数器T0/T1溢出中断请求标志。当定时/计数器T0/T1发生溢出时,置位TF0/TF1,并向CPU申请中断。

  3、RI(SCON.0)或TI(SCON.1),串行口中断请求标志。当串行口接收完一帧串行数据时置位RI或当串行口发送完一帧串行数据时置位TI,向CPU申请中断。

  1)定时器中断的使用(以定时器0为例)

  ……

  TMOD |= 0x01 | 0x04; //使用模式1,16位计数器,使用“|”符号可以在使用多个定时器时不受影响

  TH0=0xFF; //给定初值

  TL0=245; //从245计数到255

  EA=1; //总中断打开

  ET0=1; //定时器中断打开

  TR0=1; //定时器开关打开

  void Timer0_isr(void) interrupt 1 using 1 //中断服务程序

  {

  TH0=0xFF; //重新给定初值

  TL0=245;

  ……

  }

  2)外部中断的使用(以外部中断0为例)

  …………

  EA=1; //全局中断开

  EX0=1; //外部中断0开

  IT0=0; //电平触发

  void ISR_Key(void) interrupt 0 using 1 //中断服务程序

  {

  …………

  }

  中断的响应过程

  若某个中断源通过编程设置,处于被打开的状态,并满足中断响应的条件,而且①当前正在执行的那条指令已被执行完

  1、当前末响应同级或高级中断

  2、不是在操作IE,IP中断控制寄存器或执行REH指令则单片机响应此中断。


  在正常的情况下,从中断请求信号有效开始,到中断得到响应,通常需要3个机器周期到8个机器周期。中断得到响应后,自动清除中断请求标志(对串行I/O端口的中断标志,要用软件清除),将断点即程序计数器之值(PC)压入堆栈(以备恢复用);然后把相应的中断入口地址装入PC,使程序转入到相应的中断服务程序中去执行。


  各个中断源在程序存储器中的中断入口地址如下:

  中断源 入口地址

  INT0(外部中断0) 0003H

  TF0(TO中断) 000BH

  INT1(外部中断1) 0013H

  TFl(T1中断) 001BH

  RI/TI(串行口中断) 0023H

  由于各个中断入口地址相隔甚近,不便于存放各个较长的中断服务程序,故通常在中断入口地址开始的二三个单元中,安排一条转移类指令,以转入到安排在那儿的中断服务程序。以T1中断为例,其过程下如图四所示。


  由于5个中断源各有其中断请求标志0,TF0,IEl,TFl以及RI/TI,在中断源满足中断请求的条件下,各标志自动置1,以向CPU请求中断。如果某一中断源提出中断请求后,CPU不能立即响应,只要该中断请求标志不被软件人为清除,中断请求的状态就将一直保持,直到CPU响应了中断为止,对串行口中断而言,这一过程与其它4个中断的不同之处在于;即使CPU响应了中断,其中断标志RI/TI也不会自动清零,必须在中断服务程序中设置清除RI/TI的指令后,才会再一次地提出中断请求。


  CPU的现场保护和恢复必须由被响应的相应中断服务程序去完成,当执行RETI中断返回指令后,断点值自动从栈顶2字节弹出,并装入PC寄存器,使CPU继续执行被打断了的程序。


  下面给出一个应用定时器中断的实例。

  现要求编制一段程序,使P1.0端口线上输出周期为2ms的方波脉冲。设单片机晶振频率

  Fosc=6MHZ.

  1、方法:利用定时器T0作1ms定时,达到定时值后引起中断,在中断服务程序中,使P1.0的状态取一次反,并再次定时1ms。

  2、定时初值:机器周期MC=12/fosc=2us。所以定时lms所需的机器周期个数为500D,亦即0lF4H。设T0为工作方式1(16位方式),则定时初值是(01F4H)求补=FEOCH

  51单片机的中断体系结构_中断的响应过程

  51单片机的中断体系结构_中断的响应过程

  串行端口的控制寄存器:

  串行端口共有2个控制寄存器SCON和PCON,用以设置串行端口的工作方式、接收/发送的运行状态、接收/发送数据的特征、波特率的大小,以及作为运行的中断标志等。


  ①串行口控制寄存器SCON

  SCON的字节地址是98H,位地址(由低位到高位)分别是98H一9FH。SCON的格式如图五所示。

  51单片机的中断体系结构_中断的响应过程

  SMo,SMl:

  串行口工作方式控制位。

  00--方式0;01--方式1;

  10--方式2;11--方式3。

  SM2:

  仅用于方式2和方式3的多机通讯控制位

  发送机SM2=1(要求程控设置)。

  当为方式2或方式3时:

  接收机 SM2=1时,若RB8=1,可引起串行接收中断;若RB8=0,不

  引起串行接收中断。SM2=0时,若RB8=1,可引起串行接收中断;若

  RB8=0,亦可引起串行接收中断。

  REN:

  串行接收允许位。

  0--禁止接收;1--允许接收。

  TB8:

  在方式2,3中,TB8是发送机要发送的第9位数据。

  RB8:

  在方式2,3中,RB8是接收机接收到的第9位数据,该数据正好来自发

  送机的TB8。

  TI:

  发送中断标志位。发送前必须用软件清零,发送过程中TI保持零电平,

  发送完一帧数据后,由硬件自动置1。如要再发送,必须用软件再清零。

  RI:

  接收中断标志位。接收前,必须用软件清零,接收过程中RI保持零电平,接收完一帧数据后,由片内硬件自动置1。如要再接收,必须用软件再清零。


  电源控制寄存器PCON

  PCON的字节地址为87H,无位地址,PCON的格式如图六所示。需指出的是,对80C31单片机而言,PCON还有几位有效控制位。

  51单片机的中断体系结构_中断的响应过程

  SMOD:波特率加倍位。在计算串行方式1,2,3的波特率时;0---不加倍;1---加倍。

推荐阅读

史海拾趣

Aborn Electronics Inc公司的发展小趣事

随着电子行业的快速发展,Aborn Electronics意识到只有不断创新才能在竞争中保持领先。公司加大了对研发的投入,引进了一批高素质的研发人才,并在多个技术领域取得了重要突破。其中,一项关于高效能电源管理技术的创新成果,不仅提高了产品的能效比,还为公司带来了可观的经济效益。这一技术的成功应用,进一步提升了Aborn Electronics在行业内的影响力。

长江微电(cjiang)公司的发展小趣事

为了进一步扩大市场份额和品牌影响力,长江微电积极寻求与业内知名分销商的合作。基于对世强先进O2O技术分销模式的信赖与认可,长江微电与世强先进(深圳)科技股份有限公司签署了授权代理协议。双方将携手合作,共同为用户提供车规级电感、车规级耦合电感等全线产品。这一合作不仅丰富了世强硬创平台电子元器件产品的品类及信息,也为长江微电的市场拓展提供了有力支持。

Agere System(LSI Logic)公司的发展小趣事

为了进一步扩大市场份额和品牌影响力,长江微电积极寻求与业内知名分销商的合作。基于对世强先进O2O技术分销模式的信赖与认可,长江微电与世强先进(深圳)科技股份有限公司签署了授权代理协议。双方将携手合作,共同为用户提供车规级电感、车规级耦合电感等全线产品。这一合作不仅丰富了世强硬创平台电子元器件产品的品类及信息,也为长江微电的市场拓展提供了有力支持。

Chiplus Semiconductor Corp公司的发展小趣事

Chiplus自成立以来,始终致力于技术创新和产品研发。公司团队不断深入研究SRAM和LED驱动IC的设计与开发,成功推出了多款高速度、低功率的产品。这些产品以其卓越的性能和稳定性,赢得了全球客户的广泛认可。同时,Chiplus还积极投入研发资源,探索新的应用领域,不断拓展产品线,为客户提供更多元化的解决方案。

芯朋微电子(chipown)公司的发展小趣事

芯朋微电子成立于2005年,初期由一群来自中国华晶电子集团的专家组成。公司创立之初,就专注于电源管理芯片的研发。经过数年的技术积累,2008年,芯朋微电子成功研发出“700V单片MOS集成AC-DC电源芯片”系列,这一突破打破了进口芯片的垄断,赢得了国内家电品牌厂商的认可,为公司在家电领域的快速发展奠定了基础。

CHIMEI(奇美)公司的发展小趣事

奇美公司自成立以来,始终坚持品质至上的原则。公司注重产品质量和性能的提升,通过引进先进的生产设备和工艺技术,不断提升产品的品质和竞争力。同时,奇美还建立了完善的质量管理体系,从原材料采购到产品出厂,每一个环节都严格把控,确保产品的品质达到客户的要求。这种对品质的执着追求,使得奇美的产品在市场上赢得了良好的口碑。

问答坊 | AI 解惑

bios设置HWI问题,请求各位前辈给指导一下!刚学DSP痛苦啊

我用dsp/bios设置的HWI 选择的是HWI_INT5,选择External_Pin_5作为interrupt soure function为:UART_isr Use Dispatcher选为true 设置完并保存,编译后发现错误 不是说在bios中添加硬件中断,系统会自动识别吗? 为什么会出现下面错误: un ...…

查看全部问答>

搞定这5个RC振荡电路让你的模拟设计顺畅很多

采用RC振荡的方法非常多,如文氏桥振荡等。这里介绍几种笔者常用的方法: 1.最简单的振荡器 最简单的振荡器 这种振荡器特点是:T≈(1.4~2.3)R*C 电源波动将使频率不稳定,适合小于100KHz的低频振荡情况。 2.加补偿电阻的振荡 加补偿电阻 ...…

查看全部问答>

关于flash擦除的问题

1、原先用spansion的norflash s29GL032操作一切正常,先改为ST的M29W320的flash,在用jtag烧写uboot时,一直擦除不成功,我用的是片擦除,系统时钟为125M,指令如下 //16bit erase         *(volatile UINT16 *)(AM_START_AD ...…

查看全部问答>

大家点个思路,有关基于S3C2440和WinCE如何使用串口及SD卡的问题

大家好,谢谢大家这么些天来一直很热心的回答我的问题,十分感谢! 现在我想实现这样的功能: 外面通过串口将数据传给S3C2440,这里S3C2440跑的是WinCE操作系统,在WinCE上应用程序将数据接收处理并将其存入SD卡,并画出数据拟合成的曲线。 这里 ...…

查看全部问答>

wince下如何进行驱动调试,一定要用串口么??如果程序修改的话还要重新编译内核?

1.现在刚准备做wince的,我现在有些不明白如何进行调试,每次定制内核要用到几十分钟,我在调试硬件驱动的时候,为了考虑稳定性需要不断得进行修改代码,每次修改代码之后都要重新编译内核,太耗时了,请问有没有什么简单得方法呢??模拟调试是不行的,我的 ...…

查看全部问答>

ST新库3.4.0中stm32f10x.h里面为啥又把bool型定义去掉了?

                                 写库的人到底怎么想的,去掉类型定义,原来的程序会不兼容,有脑子吗?我已经出离愤怒了,版主告诉我他们怎么想的 ...…

查看全部问答>

哥哥姐姐们帮我打开schdoc并转成.sch文件吧

哥哥姐姐们帮我打开schdoc并转成.sch文件吧谢谢啊。。在线等啊,谢谢啊…

查看全部问答>

FM4学习笔记一:安装

安装已经老声音长谈了,但我觉得有再说明一下的必要。因为好的开始是成功的一半,好多都是安装不好。对以后的学习造成了很大损失。甚至不愿再涉及该种芯片。   首选安装IAR V6.10 ,这个再光盘里。有所不同的是,这个是日系的,首先第一项是 ...…

查看全部问答>

EMC磁珠到底是什么特性?(上)

转自丁国勇的EMC博客刚才偶然看了本刊的两篇有关磁珠的专家博文,这两篇博文都是讲磁珠的。其中一篇是讲磁珠与电感的区别,另一篇讲磁珠其实就是一电阻特性。其实这样的说法都是不准确的。磁珠(Ferrite bead)的等效电路是一个DCR电阻串联一个电感 ...…

查看全部问答>

做的流水灯程序,要求从右到做两次就停下来,可是不行?

#include #include #define uint unsigned int #define uchar unsigned char uchar temp,b; void delay(uint z); void main() {              temp=0xfe;       &nbs ...…

查看全部问答>