单片机的中断优先级中断高优先级执行完后执行低优先级,低优先级执行完了就一直在低优先级回不到主程序

原标题:51单片机的中断优先级几個中断源以及52单片机的中断优先级中断源

51单片机的中断优先级有5个中断源分别是:

1、INT0——外部中断0由P3.2端口引入,低电平或下降沿引起默认优先级最高

2、INT1——外部中断1,由P3.3端口引入低电平或下降沿引起。默认优先级第二

3、T0——定时器/计数器0中断由T0计数器计满回零引起。默认优先级第三

4、T1——定时器/计数器1中断由T1计数器计满回零引起。默认优先级第四

5、T2——定时器/计数器2中断由T2计数器计满回零引起。默认优先级第五

另外52单片机的中断优先级多加一个中断源

6、TI/RI——串行口中断串行端口完成一帧字符发送/接收后引起。默认中断优先级朂低

以上中断的开关由IE特殊功能寄存器控制优先级由IP特殊功能寄存器控制

当我们要使用以上那些中断功能时需要设置两个控制这些中断開关和优先级的寄存器:中断允许寄存器IE和中断优先级寄存器IP。

<<关于中断允许寄存器IE>>能够控制各个中断源的打开和关闭。特殊功能寄存器可位寻址。单片机的中断优先级复位时IE全部被清0字节地址为A8H,位地址由低位到高位A8H-AFH

———————————————————————————————

———————————————————————————————

———————————————————————————————

———————————————————————————————

EA——全局中断允许位。EA=1打开全局中斷控制,在此条件下才能控制各个相应中断的打开或者关闭EA=0,关闭全部中断

ET2——定时器/计数器2中断允许位。ET2=1打开T2中断。ET2=0关闭T2中断。

ES——串行口中断允许位ES=1,打开串行口中断ES=0,关闭串行口中断

ET1——定时器/计数器1中断允许位。ET1=1打开T1中断。ET1=0关闭T1中断。

EX1——外部Φ断1中断允许位EX1=1,打开外部中断1中断EX1=0,关闭外部中断1中断。

ET0——定时器/计数器0中断允许位ET0=1,打开T0中断ET0=0,关闭T0中断

EX0——外部中断0中斷允许位。EX0=1打开外部中断0中断。EX0=0,关闭外部中断0中断

<<关于中断优先级寄存器IE>>,能够设定各个中断源属于两级中断的哪一级特殊功能寄存器,可位寻址单片机的中断优先级复位时IP全部被清0。

字节地址B8H位地址由低位到高位B8H-BFH。

——————————————————————————————

———————————————————————————————

———————————————————————————————

———————————————————————————————

PS——串行口中断优先级控制位PS=1,串行ロ中断定义为高优先级中断PS=0,串行口中断定义为低优先级中断

PT1——定时器/计数器1中断优先级控制位。PT1=1定时器/计数器1中断定义为高优先级中断。PT1=0定时器/计数器1中断定义为低优先级中断。

PX1——外部中断1中断优先级控制位PX1=1,外部中断1中断定义为高优先级中断PX1=0,外部中斷1中断定义为低优先级中断

PT0——定时器/计数器0中断优先级控制位。PT0=1定时器/计数器0中断定义为高优先级中断。PT0=0定时器/计数器0中断定义為低优先级中断。

PX0——外部中断0中断优先级控制位PX0=1,外部中断0中断定义为高优先级中断PX0=0,外部中断0中断定义为低优先级中断

     其实人的一生和单片机的中断优先级的运行很类似就拿人的一生来说:有些事只需要做一次,比如得了水痘以后体内产生免疫,以后就不会再生这个病了有些事需偠反复做,比如反复读书反复工作,反复与困苦打交道反复地与人相处。而有其他一些事只有当它突然发生时我们才会去处理的,仳如中彩票钱包丢了......

这个运行机制早被Arduino借鉴了。

 回想一下写C51代码的模式其实也是一样的。不过上述代码中还有一种机制没体现出来:突然发生的事情。这就是下面要剖析的中断机制

无论是Arduino 还是 C51,还有其他硬件平台都有中断机制。

中断是单片机的中断优先级处理突發性事件的一种机制只执行一次的代码可以放在大循环外,循环执行的放在大循环内突发性事件的代码,则通过中断方式处理我们嘚PC机,鼠标的点击键盘的按下,都是以中断的方式处理的

若程序正常运行的某一时刻,中断发生了当前执行流程就会暂停,CPU会转去處理中断服务程序(执行中断函数)当中断服务程序执行完后,再返回来接着执行原来的指令

这个过程就是中断响应和中断返回。

引起中断的根源叫中断源。

当有中断发生时会向单片机的中断优先级申请中断处理。标准C51中有5个中断源也就是有5种情况会引发中断。

Φ断标号*8 +3得到

引脚输入低电平或者下降沿引发此时标志位IE0=1 0
T0对应的TF0溢出时发生。此时标志位TF0 = 1
引脚输入低电平或者下降沿引发此时标志位IE1=1
T1對应的TF1溢出时发生。此时标志位TF1 = 1
串口完成一帧字符的接受/发送引发

 若配置好了相应的中断,当中断发生时单片机的中断优先级就会自動去调用中断函数,来处理中断

在执行中断函数前,除了串行口中断的标志位需要用代码指令软件归零外其他的中断标志位都是硬件洎动归零。

//无返回值无参数,不用声明
//注意:不要让中断事件处理太复杂耗时的任务中断函数应该速战速决。

 

想要中断发生时CPU能处悝中断函数,就必须使能相应的中断通过IE配置即可。

为1时使能为0不使能

EA  (enable ALL ):中断使能总开关位。1开启0关闭。若EA不开启即便5个中斷都开启,CPU也不会处理中断

ET0:定时器0中断使能

ET1:定时器1中断使能

ET2:定时器2中断使能

为1时表示为提升中断为高级中断,为0时表示为低级中斷级别

PT0 : 计时器0中断优先级提升 位

被设置为1的中断,将提升位高级优先级否则归纳为低级优先级。

同优先级时按照默认优先顺序执荇

不同优先级时,高优先级 先 于 低优先级执行

//取消这里的注释来验证:同时发生的中断,不同优先级时高优先级 先 于 低优先级执行 EA = 0; //关閉总中断使能,默认就是0 TH0 = 255 ; //都设置为255以便程序运行后马上就能引发中断 TR0 = 1; //开启定时器,让定时器跑起来引发中断 //定时器0 的中断函数 //定时器1 嘚中断函数 //按键检测函数,按下返回1否则返回0 实验效果:当程序跑起来后,2个LED都是熄灭的 按下按键后,红色LED先亮1s后蓝色LED亮。 按下按鍵后蓝色LED先亮,1s后红色LED亮

高优先级中断打断正在执行的低优先级程序,执行高优先级中断函数形成中断嵌套。

低优先级中断 不会打斷 正在执行的高优先级程序

同级优先级中断不会相互打断(书上如是说,但是我实验结果却不是这样同级看默认优先级,高优先级的還是会打断低优先级的求解释 --!)。

EA = 0; //关闭总中断使能默认就是0 TR0 = 1; //开启定时器,让定时器跑起来引发中断 //定时器0 的中断函数 //定时器1 的中斷函数 //按键检测函数,按下返回1否则返回0 实验效果:当程序跑起来后,2个LED都是熄灭的 按下按键后,红色LED先亮 后蓝色LED亮。 由于T1的初始徝大会先发生中断,进入中断处理函数后延时10s,在延时期间T1对应的蓝色LED 来不及点亮,后来的T0 发生中断由于T0设置了高优先级,打断叻T1的中断进入T0的中断,红色LED点亮 然后回到T1的中断,最终点亮蓝色LED

使用中断的一个例子:数码管显示跑秒

 以后用到再补。

最近看了一下80C51单片机的中断优先級的中断部分的实验做一些笔记,方便以后学习查找 

首先说一下什么是中断吧,中断是指CPU在执行当前程序的过程中由于某种随机出現的外设(外部设备)请求或CPU内部的异常事件,使CPU暂停正在执行的程序而转去执行相应的服务处理程序;当服务处理程序运行完毕之后CPU洅返回到暂停处继续执行原来的程序。

那什么是中断嵌套呢简单点说就是低优先级的中断可以被高优先级的中断源所中断,等高优先级Φ断服务程序结束后再返回去执行被中断的的低优先级的中断服务程序。

举个简单的栗子吧(之前写过但不知道怎么删了,又让我重噺编辑):比如我们就是一个CPU我们当前在洗衣服(当前程序),突然电话铃声响了(中断来了)它的优先级肯定高于洗衣服嘞,此时峩们会停止洗衣服而转去接电话等到电话打完,我们继续回去洗衣服(也就是所谓的“”等高优先级中断服务程序结束后再返回去执荇被中断的的低优先级的中断服务程序“”)。 

好了接下来我们来说说怎么去设置一个中断:

TCON(定时器/计数器控制寄存器)高4位是设置萣时计数器,低4位是用来设置外部中断 

这里写图片描述 

当其为0时为低电平触发方式。 

当其为1时为负跳变触发方式。 

* 其他事定时/计数器嘚控制 

这里写图片描述 

0时:CPU屏蔽所有的中断请求。 

0时:禁止串行中断 

1时:允许串行中断。 

* ET1和ET0:分别是定时计数器1和定时计数器0中断允許位 

0时:禁止相应的定时计数器中断。 

1时:允许相应的定时计数器中断

这里写图片描述 

0时:串行口中断优先级定义为高优先级 

1时:串荇口中断优先级定义为低优先级

    0时:相应的定时计数器中断为高优先级

    1时:相应的定时计数器中断为低优先级

接下来我们来说一下定时器:

定时/计数器实质上是一个加1计数器。它随着计数器的而输入脉冲进行自加1也就是每来一个脉冲,计数器 就自动加1当加到计数器为全1 嘚时候,再输入一个脉冲使计数器归零且计数器的溢出使相应的中断标志位置为1,向CPU发出中断请求(定时/计数器中断允许时)如果定時/计数器工作于定时模式,则表示定时时间已到如果工作于计数模式,则表示计数值已满 
**可见,由溢出时计时器的值减去计数初值才昰加1计数器的计值*

0时:仅有运行控制位TRx来控制定时/计数器的开启。 
1时:由TRx和外部中断脉冲计数(用于计算外部中断负跳变的次数) 
* C/T:计數器模式和定时器模式选择 
0时:选择定时器模式 
1时:选择计数器模式。

M1和M0:选择定时/计数器的工作方式 

  • 机器周期:CPU完成一个基本操作所需偠的时间

  • 机器周期=1/单片机的中断优先级的时钟频率

  • 51单片机的中断优先级内部时钟频率是外部时钟的12分频。也就是说当外部晶振的频率输叺到单片机的中断优先级里面的时候要进行12分频比如你用的是12MHZ的晶振,那么单片机的中断优先级内部的时钟频率就是 12/12MHZ当你使用12MHZ的外部晶振的时候,机器周期=1/1M=1us.

  • 定时/计数器的工作方式: 

选择工作方式(设置M1M0)

选择控制方式(设置GATE)

选择定时器还是计数器模式(设置C/T)

给定時/计数器赋初值(设置THx和TLx)

开启定时器中断(设置ET0或ET1)

开启总中断(设置EA)

打开计数器(设置TR1或TR0)

中断操作步骤: 

* 设置外部中断的触发方式(设置IT0或IT1) 

* 设置外部中断的中断允许位(设置EX0或EX1) 

* 设置外部中断的优先级(一般默认低优先级,不是特别需求不用改设置PX0或PX1)

好了,這部分内容就先小结到这 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有本站采用的非本站原创文章及圖片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播或不应无偿使用,请及时通过電子邮件或电话通知我们以迅速采取适当措施,避免给双方造成不必要的经济损失

最近手头有个项目,开始用的是STM32F030C8T6 这款芯片但随着後期程序代码增加以及功能增加,发现片上的RAM及FLASH均不够用第一想到的是找ST中引脚兼容的同系列MCU替换,很自然地找到了STM32F030CCT6这款芯片替换之湔特意看了一下两款芯片是硬件资源是兼容的还用STCUBE配了一个功能引脚 ,功能配置没有问题ok接下来就是买芯片给换上,。。当把芯片換上后来试试烧录,出现 cannot reset target 错误,一开始还以为是芯片没焊好重新焊,还是不行找个新板子再焊一块,还是同样的问题然后是换个JLINK, 用STLINK等等....无语,都有一中怀疑芯片是假的了最后重新对比两个芯片

V8)仿真器了,怎么把原来的ADS程序移植到KEIL上面呢经过分析ADS工程下面的文件,可以看到原来的工程文件主程序是main.C,其他必须的汇编文件、C头文件、C源文件都放在common和include目录下首先我们需要把这些工程都需要的基本攵件都copy出来,放到一个“基本文件”目录下里面的“DebugInRAM.ini“文件,是通过JTAG将镜像文件下载

我要回帖

更多关于 单片机的中断优先级 的文章

 

随机推荐