单片机C51外部中断程序问题

单片机C51外部中断程序问题,第1张

外部中断0设置为低电平触发,去掉while循环后一直按下按键实际代码为

delay()

P1=0xfe

delay()

EX0=0

P1=_crol_(P1,1)

delay()

EX0=1

P1=0X00

一直重复.

之前的代码进入中断后会一直循环,并不会退出中断。正确做法中断应该改为:

void

tx0()

interrupt

0

using

0

{

unsigned

char

i

delay()

P1=0xfe

delay()

EX0=0

while(1)

{

P1=_crol_(P1,1)

delay()

if(P3&0x04)

//判断是否松开中断0的按键

{

break

}

}

EX0=1

P1=0X00

}

将按键接到P3.2(INT0)或P3.3(INT1)

main(){

 EA=1 //EA总中断控制,EA=0关,EA=1开

 EX0=1//INT0中断控制。0关1开,按键接P3.2用这个

 EX1=1//INT1中断控制。0关1开,按键接P3.3用这个

  //默认情况下,直接使EX0=1或EX1=1来打开中断,INT0、INT1中断是电平触发的

 while(1){

    //主程序写这里 

 }

}

/** 外部中断0服务程序,按下接P3.2的开关k=0下面程序被执行 **/

int0()interrupt 0

{

  //程序代码写这里面 

}

 /** 外部中断1服务程序,按下接P3.3的开关k=0下面程序被执行 **/

int1()interrupt 2

  //程序代码写这里面 

}

注意,上面的中断程序,如果执行完后,按键k还没有放开,则中断程序会再次被执行。为了防止这种情况发生,有以下几种处理办法以:

(1)可以在中断程序中进行判断,只有放开了按钮k=1了中断函数才返回。

(2)可以在进入中断后关闭中断,让EX0或EX1=0。然后在主程序中,需要的时候再开起。

51单片机的外部中断有两种触发方式可选:电平触发和边沿触发。选择电平触发时,单片机在每个机器周期检查中断源口线,检测到低电平,即置位中断请求标志,向CPU请求中断。选择边沿触发方式时,单片机在上一个机器周期检测到中断源口线为高电平,下一个机器周期检测到低电平,即置位中断标志,请求中断。

这个原理很好理解。但应用时需要特别注意的几点:

1) 电平触发方式时,中断标志寄存器不锁存中断请求信号。也就是说,单片机把每个机器周期的S5P2采样到的外部中断源口线的电平逻辑直接赋值到中断标志寄存器。标志寄存器对于请求信号来说是透明的。这样当中断请求被阻塞而没有得到及时响应时,将被丢失。换句话说,要使电平触发的中断被CPU响应并执行,必须保证外部中断源口线的低电平维持到中断被执行为止。因此当CPU正在执行同级中断或更高级中断期间,产生的外部中断源(产生低电平)如果在该中断执行完毕之前撤销(变为高电平)了,那么将得不到响应,就如同没发生一样。同样,当CPU在执行不可被中断的指令(如RETI)时,产生的电平触发中断如果时间太短,也得不到执行。

2) 边沿触发方式时,中断标志寄存器锁存了中断请求。中断口线上一个从高到低的跳变将记录在标志寄存器中,直到CPU响应并转向该中断服务程序时,由硬件自动清除。因此当CPU正在执行同级中断(甚至是外部中断本身)或高级中断时,产生的外部中断(负跳变)同样将被记录在中断标志寄存器中。在该中断退出后,将被响应执行。如果你不希望这样,必须在中断退出之前,手工清除外部中断标志。

3) 中断标志可以手工清除。一个中断如果在没有得到响应之前就已经被手工清除,则该中断将被CPU忽略。就如同没有发生一样。

4) 选择电平触发还是边沿触发方式,TCON 控制寄存器

设置。应从系统使用外部中断的目的上去考虑,而不是如许多资料上说的根据中断源信号的特性来取舍。比如,有的书上说(《Keil C51使用技巧及实战》),就有类似的观点。


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

原文地址: http://outofmemory.cn/yw/11091526.html

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

发表评论

登录后才能评论

评论列表(0条)

保存