CPU在执行的过程中,一般来说都是在执行主程序(main函数里面的代码)。如果希望处理其他的功能,可以通过查询的方式进行,判断是否需要处理或者通过中断的方式,进入中断服务函数程序里面执行。
前者是在主程序中判断条件是否成立,如果成立则执行其他功能,否则不执行;后者是CPU在执行过程中,判断是否有中断标志位,响应中断进入中断服务函数,执行相关功能。
MCS-51 单片机中,有两个外部中断(INT0与INT1),中断有两种方式低电平触发与负跳变(下降沿)触发。
下面通过讲INT0说明外部中断,INT1同理。
原理图:
P0连接8个LED,INT0引脚连接一个按钮连接到地。
在中断系统中,INT0设计的寄存器中有IE、IP、TCON,在C51规定特殊寄存器的地址为8的倍数均可以位寻址。IE寄存器地址为:0xA8;IP寄存器地址为0xB8;TCON寄存器地址为0x88;因此它们可以被位寻址。
以下是它们的位定义。
/* TCON */
sbit TF1 = TCON^7;
sbit TR1 = TCON^6;
sbit TF0 = TCON^5;
sbit TR0 = TCON^4;
sbit IE1 = TCON^3;
sbit IT1 = TCON^2;
sbit IE0 = TCON^1;
sbit IT0 = TCON^0;
/* IE */
sbit EA = IE^7;
sbit ET2 = IE^5; //8052 only
sbit ES = IE^4;
sbit ET1 = IE^3;
sbit EX1 = IE^2;
sbit ET0 = IE^1;
sbit EX0 = IE^0;
/* IP */
sbit PT2 = IP^5;
sbit PS = IP^4;
sbit PT1 = IP^3;
sbit PX1 = IP^2;
sbit PT0 = IP^1;
sbit PX0 = IP^0;
如果需要使用外部中断,需要满足以下条件
1)中断中允许设置(置1)EA = 1;
2)中断源允许设置(置1)Ex0 = 1;
3)中断触发方式设置(置1或置0) IT0 =1 或者 IT0 = 0;
4)中断服务函数
代码实现
#include "reg52.h"
#include "stdio.h"
void main(){
IT0 = 1;
EA = 1;
EX0 = 1;
while(1){};
}
void irq0(void) interrupt 0
{
P0=~P0;
}
注:由于IT0 =1;设置中断触发方式为负跳变(下降沿),CPU相应中断后清除中断标志位。而由于IT0 =0;设置中断触发方式为低电平触发,CPU相应中断后不会清除中断标志位。
在上面的中断服务功能中表现,按一下LED灯亮,再按一次LED灯灭;
如果将IT0设置为0,则按下时LED会闪烁。因为中断标志位没有清除,不断进入中断服务函数。
如果需要设置外部中断1,负跳变触发。只需要改上面代码的三条语句即可。
IT0 = 1; ---- > IT1 = 1;
EX0 = 1; ---- > EX1 = 1;
void irq0(void) interrupt 0 -- > 修改终端号,将0 修改为2;
void irq0(void) interrupt 2 ---- >函数名irq0,可根据需要修改或不改
全部0条评论
快来发表一下你的评论吧 !