请问大家一个单片机C语言编程的问题,就是好像中断有问题(红外遥控),那个if语句不是按着顺序执行的

请问大家一个单片机C语言编程的问题,就是好像中断有问题(红外遥控),那个if语句不是按着顺序执行的,第1张

红外遥控你按一下会产生有很多个16个中断,总时间大概是108ms左右。假设你在执行过程的时候,正好有一个中断进来,然后中断结束后出来继续执行DelayUs(400)这个函数,如果再这个函数还没有执行结束的时候又进来了一个中断,i又加了1,等于是当执行完这个while(1)循环一次的时候可能中断已经产生2次或者几次了。所以到i的值就不是按照顺序显示了。因为可能I等于某个数的时候没有经历显示函数。

除非你把端口输出写在中断函数里面。主函数里while(1)函数里执行空函数就好了。

外部中断的一般都是采用延时程序,而且延时程序一般是利用定时器做10~15ms的延时去抖,来实现的,而且时间不是特别精确,单片机书上和有关资料上应该都有我写一个参考一下:

void DelayMS(unsigned char a)

{int i

for(a>0a--)

for(i=110i>0i--)

}延时约为a毫秒,不过不够准确,可以通过keil软件或者汇编来确立更精确的延时时间!

在中断执行前先做判断:用if语句看看引脚的电平,如果没有跳变,那么再延时判断,如果还没有跳变那么再延时,如此重复;

等到电平跳变了,延时看看是不是电平收其他非 *** 作性因素引起的,比如说电源抖动,延时之后再判断如果的确是跳变了,可以进行中断后的 *** 作了!

中断的允许和禁止就是中断的开放和关闭,中断允许就是开放中断,中断的禁止就是关闭中断。从以上说明我们可看出,MCS-51的中断允许是通过两级控制的,以EA位作为总中断控制位,以各中断控制位为分控制位。当总中断位为禁止状态时,不管分控制位是允许或禁止整个中断都是禁止的。只有当EA=1(允许)时,才能由各分控制位设置各自的中断允许与禁止。MCS-51单片机复位后,IE=00H,因此中断处于禁止状态。

值得一提的是:单片机中断响应后不会自动关闭中断,因此在转入中断服务程序后,应由软件指令禁止中断。

中断优先级控制寄存器 (IP)

MCS-51的中断优先级控制比较简单,只设置了高、低两个级别的有限级,各中断源的优先级别由优先寄存器(IP)进行控制。

·PX0——外中断0(INT0)优先级控制位。

·PT0——定时中断0(T0)优先级控制位。

·PX1——外中断1(INT1)优先级控制位。

·PT1——定时中断1(T1)优先级控制位。

·PS ——串行中断(ES)优先级控制位。

控制位=0,优先级为低。控制位=1,优先级为高。

中断优先级是为了中断嵌套服务的,控制原则为:

(1) 低优先级中断不能打断高优先级的中断服务,而高优先级的中断服务可以打断低优先级的中断服务。

(2) 同级的中断已经响应,其他中断将被禁止。

(3) 如果同级的多个中断源同时出现,CPU将按查询次序确定哪个中断被响应,次序为:外中断0→定时中断0→外中断1→定时中断1→串行中断。

中断控制寄存器的状态设置

在应用中,我们可以通过相应的控制寄存器来使用中断系统,因此从使用的角度上看,这些控制寄存器是面向用户的。这些控制寄存器既可以进行字节寻址,也可以进行位寻址,也就是对位状态的寻址既可以使用字节 *** 作指令也可以使用位 *** 作指令,例如:

MOVIE,#81H

如使用位 *** 作指令,也可写为:

SETBEA

SETBEX0

对于一般的外中断程序,我们可以这样安排:

ORG0000H主程序入口

START: AJMP MAIN

ORG0003H外中断程序入口

AJMP INT00

MAIN: MOVIE,#81H 允许总中断和外中断

……主程序

……

……

INT00: ……外中断服务程序

……

RETI中断返回


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11617750.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存