单片机的中断标志位是有啥作用?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单片机的中断标志位是有啥作用?相关的知识,希望对你有一定的参考价值。

有一个程序是给单片机一个每1毫秒的周期性中断,然后在中断中对中断标志位进行清零。但是我有一个疑问,中断标志位在这里有什么作用?为什么要对中断标志位清零?1毫秒的周期性中断是不是从中断标志位清零开始计时的?要是中断程序没有执行完,下一毫秒中断有来了,程序该怎么执行呢?

四个问号分为四点一一解答:
1、一般来说单片机的中断发生有两个条件,一是中断标志位置位,二是中断允许,如果这两个条件都满足则进入中断,因为正常情况下中断一直是允许的,那么只能通过标志位来区分是否有中断挂起,
2、如果进入中断不清除标志位,那么这一中断服务程序结束后由于标志位还是置位的并且中断是允许的,那么还会再次进入该中断,就会发生一直在执行中断程序的情况
3、周期性中断是由定时器辅助完成的,只要定时时间到,硬件就会自动置位标志位,这时中断发生,定时器还在运行,与中断处理是并行的没有冲突,因此周期性的中断不是从中断标志位清零开始的。
4、如果中断程序没有执行完并且一下个中断又来了,那么硬件还是会自动置位标志位的,如果在这之前已经清零标志位那么中断结束后会再进入一次该中断,如果这时还没有清除中断标志位,则第二个1毫秒中断无效。
参考技术A 有一个程序是给单片机一个每1毫秒的周期性中断,

--是定时器,产生的中断吧?

然后在中断中对中断标志位进行清零。

--中断标志,清零,不用你关心。
--通常都是进入中断就自动清零。

要是中断程序没有执行完,下一毫秒中断有来了,程序该怎么执行呢?

--你的中断程序,就不应该编写这么长。追问

是定时器中断。
中断标志清零,我必须要关心,因为我要写程序对他清零,由于不了解这个中断标志位,所以我不懂是在中断程序的一开始就清零还是在中断程序的末尾清零。
至于中断程序,我也知道不应该太长,但是我是想明白太长了,下个中断来了,单片机是怎么执行的。

追答

中断标志清零,我必须要关心,
--你不必关心这个。
--51单片机,进入定时中断程序后,标志就自动清零。

因为我要写程序对他清零,
--画蛇添足。

至于中断程序,我也知道不应该太长,但是我是想明白太长了,
下个中断来了,单片机是怎么执行的。

--将继续执行你的很长的中断程序。
--不理会新产生的中断申请。

追问

的确有些单片机是可以自动清零中断标志位的,但是我这么问,肯定是我用的这款单片机的PIT中断标致位是必须要手动清零的。当然可能我的提问没有说清楚吧。还是谢谢你的回答。

追答

51单片机,有五个中断源。
有四个会自动清除。
只有串口中断,不会自动清除标志位。
因为,串口中断有两个入口:接收中断和发送中断。
需要用软件判断是什么中断后,再清除。

另外,52系列的,T2 中断,不自动清除标志。

追问

嗯,是的。谢谢了。51的确如此。我现在用的这个单片机是基于M4内核的K60单片机,他是需要手动清零的。

追答

采纳答案说:
《1、一般来说单片机的中断发生有两个条件,
一是中断标志位置位,
二是中断允许,
如果这两个条件都满足则进入中断,...》
----
有不足。
如果当前,正在执行高优先级的、或同优先级的中断程序,
就不会响应新的中断申请。

------------------

采纳答案还说:
《4、如果中断程序没有执行完并且一下个中断又来了,那么硬件还是会自动置位标志位的,》
----
什么是下一个中断又来了呀?
是在中断来了之后,硬件才会自动置位标志位的吗?

概念明显错误。

应该说:
这个中断程序没有执行完时,也可能会有硬件将标志位置位,这仅仅代表来了新的申请。

------------------

采纳答案还说:
《如果在这之前已经清零标志位那么中断结束后会再进入一次该中断》
这是完全错误的说法。

------------------

采纳答案还说:
《如果这时还没有清除中断标志位,则第二个1毫秒中断无效。》
越来越错。

采纳答案,从头到尾,几乎就没有对的地方。
骗子太多了。

单片机怎么清中断标志位

希望给出具体的语句,谢谢
51单片机

参考技术A 不知道你说的单片机是什么系列的.
下面是51单片机的汇编和C语言清除中断的语句。

汇编:
CLR IE0 ;清除外部中断INT0请求标志
CLR IE1 ;清除外部中断INT1请求标志
CLR TF0 ;清除定时器T0中断请求标志
CLR TF1 ;清除定时器T1中断请求标志
CLR RI ;串行通讯接收中断请求标志
CLR TI ;串行通讯发送中断请求标志

C语言:
IE0=0; //清除外部中断INT0请求标志
IE1=0; //清除外部中断INT1请求标志
TF0=0; //清除定时器T0中断请求标志
TF1=0; //清除定时器T1中断请求标志
RI=0; //串行通讯接收中断请求标志
TI=0; //串行通讯发送中断请求标志本回答被提问者采纳
参考技术B 有两种方法:
1、采用中断的方法,此方法是机器自己完成的(除去

串行口中断);
举例:
org 00h
sjmp main
org 0bh
sjmp t_0
org 30h
main:mov sp,#60h
mov ie,#82h
mov tmod,#01h
mov th0,#0b1h
mov tl0,#0e0h
setb tr0
sjmp $
t_0: mov tmod,#01h
mov th0,#0b1h
cpl p2.1
reti
end

2、采用查询的方法,此方需要人工加以相应的指令完

成;
org 00h
sjmp main
org 30h
main:mov sp,#60h
mov ie,#82h
mov tmod,#01h
mov th0,#0b1h
mov tl0,#0e0h
setb tr0
loop:jnb tr0,loop
clr tr0
mov th0,#0b1h
mov tl0,#0e0h
cpl p2.1
sjmp loop
end
参考技术C 还是很简单的 对中断寄存器操作就可以了 参考技术D 这个你只是找本书看看都有的.....不过不知道你的单干片机是51的还是AVR的/.....

以上是关于单片机的中断标志位是有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章

MCS-51系列单片机的有几个中断源?各中断标志是如何产生的?如何清除各中断标志?

请教一个关于51单片机外部中断的问题

外部中断标志位清除不了

单片机串口通信,发送数据感觉不对,请大佬帮看看?

嵌入式单片机,外部中断,中断标志位介绍

51单片机学习——中断