首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

关于51单片机外部中断响应

关于51单片机外部中断响应

外部中断方式最好设为下降沿方式,特别是中断引脚接按键的情况。

外部下降沿中断:SETB IT0。每个机器周期都由硬件对引脚自动采样,若连续在2个周期采样到电平从高到低,则认定有中断请求,IE0=1IE0会一直保持到该中断请求被CPU响应,响应前都不会自动清零,只有在响应后硬件才自动将IE0清零IE0=0
外部低电平中断:CLR IT0。当中断引脚为低电平时,并保持一个机器周期,硬件自动置IE0=1。如果在下一个周期采样到中断引脚为高电平时,硬件自动将IE00。中断标志位自动清0条件:下降沿中断只有CPU响应中断同时才会清0,否则一直保持。低电平中断:任何时候当外部中断引脚为低电平时,IE0=1;为高电平时,IE0=0,所以不需要响应中断才会清0,与引脚状态有关。注意:当EA=0时,中断引脚为低电平也不会将IE0自动置1,只有EA=1时才会自动置1
      
单片机设计中有两个CPU时,主CPU控制副CPU中断时应注意:主CPU发出中断信号的时候,副CPU能够及时接收到,也就是副CPU工作状态不允许在关中断CLR EA的程序中运行。只要副CPU不工作在关中断的程序中运行,主CPU发出的中断信号副CPU都能够及时响应中断。还有就是如果采用下降沿方式,主CPU发出的高低电平之间间隔时间只需一条NOP指令。所以应该尽可能考虑这个时差问题。有时候就是副CPU还没有运行完屏蔽中断的程序的时候,主CPU就发出了中断信号,造成副CPU无法中断或时好时坏。
键盘中断到今天为止终于可以告一段落了。
现在才知道,程序架构有了并不代表程序就容易完成,更多的时间在于调试,防真,再调试,如此循环。所以遇到问题要有耐心,信心,细心。做到这三点,不行也得行!!!!

科通芯城(www.cogobuy.com中国首个元器件采购自营电商

si-f�"fm������na;color:black'>的首地址。只需调用(*((void (*)(void))(rst)))(),即可将数组中的数据当作函数代码来运行,因为无论是数据还是代码都是以二进制存储的,本质上是相同的。
  方法二:

void Reset(void)

{   ( * ( void (*)( ) )0 ) ( );

}
  这段程序摘自《C缺陷与陷阱》,比方法一中的更为简洁。与方法一类似,它也是使用函数指针的强制类型转换运算将函数指针指向一个非函数的地址,但不同的是它直接指向程序起始地址0x0000,方法一先指向数组rst,再利用数组中的机器码使程序跳转到0x0000。它编译后的汇编只有一句LCALL  C_STARTUP(C:0000)
  方法三:

void Reset(void)

{  VoidFunc();   //请注意,函数VoidFunc()在程序中未定义

}
  上面的VoidFunc()函数虽然没有定义,但在Keil环境中编译时只是警告,并不报错。编译后的汇编码为LJMP  C_STARTUP(C:0000),同方法二极为相似,使程序跳转到0x0000开始执行,同样实现了软件复位的功能。这种做法最为简单,但不符合ANSI C标准中函数应先定义后调用的要求,在其它某些环境中可能无法编译通过,因此不推荐。
  总结
  我们知道,在MCS-51单片机的所有指令中,只有RETI指令能清除中断请求标志。因此只有方法一能在中断子程序中被调用,方法二和方法三都不能,否则系统复位后,中断请求标志仍在,可能造成系统刚复位就错误地进入了中断子程序。实际应用中应根据实际情况,选择合适的方法。

科通芯城(www.cogobuy.com中国首个电子元器件采购自营电商

返回列表