51 中断系统 外部中断0 外部中断1
51单片机的中断系统结构中断允许控制CPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制的。EX0(IE.0),外部中断0允许位;ET0(IE.1),定时/计数器T0中断允许位;EX1(IE.2),外部中断0允许位;ET1(IE.3),定时/计数器T1中断允许位;ES(IE.4),串行口中断允许位;EA (IE.7), CPU中断允...
51单片机的中断系统结构
中断允许控制
CPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制的。
EX0(IE.0),外部中断0允许位;
ET0(IE.1),定时/计数器T0中断允许位;
EX1(IE.2),外部中断0允许位;
ET1(IE.3),定时/计数器T1中断允许位;
ES(IE.4),串行口中断允许位;
EA (IE.7), CPU中断允许(总允许)位。
中断请求标志
1、TCON的中断标志
IT0(TCON.0),外部中断0触发方式控制位。
当IT0=0时,为电平触发方式。
当IT0=1时,为边沿触发方式(下降沿有效)。
IE0(TCON.1),外部中断0中断请求标志位。
IT1(TCON.2),外部中断1触发方式控制位。
IE1(TCON.3),外部中断1中断请求标志位。
TF0(TCON.5),定时/计数器T0溢出中断请求标志位。
TF1(TCON.7),定时/计数器T1溢出中断请求标志位。
中断源
中断响应条件
中断源有中断请求;
n此中断源的中断允许位为1;
CPU开中断(即EA=1)。
以上三条同时满足时,CPU才有可能响应中断。
#include "reg51.h"
#include "intrins.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit k1=P3^3;
sbit led=P2^0;
void delay(u16 i)
{
while (i--);
}
//外部中断0条件
void Int0Init()
{
IT0 = 1; //设置外部中断的触发方式为下降沿触发。
EX0 = 1; //开启外部中断0
EA = 1; //中断总开关
}
//外部中断1条件
void Int1Init()
{
IT1 = 1; //设置外部中断1的触发方式为下降沿触发。
EX1 = 1; //开启外部中断1
EA = 1; //中断总开关
}
void main()
{
Int1Init();
while(1);
}
void Int0() interrupt 0
{
delay(1000);
if(k1 == 0)
{
led= ~led;
}
}
void Int1() interrupt 2
{
delay(1000);
if(k1 == 0)
{
led= ~led;
}
}
proteus 8 电路原理图,k3接p32,k4接p33。p32默认高电平,按下k3后,电平拉低,产生下降沿,触发中断0。同样k4按下,触发为中断1。
#include "reg51.h"
#include "intrins.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit k3=P3^2;
sbit k4=P3^3;
sbit led=P2^0;
void delay(u16 i)
{
while (i--);
}
//外部中断0条件
void Int0Init()
{
IT0 = 1; //设置外部中断的触发方式为下降沿触发。
EX0 = 1; //开启外部中断0
EA = 1; //中断总开关
}
//外部中断1条件
void Int1Init()
{
IT1 = 1; //设置外部中断1的触发方式为下降沿触发。
EX1 = 1; //开启外部中断1
EA = 1; //中断总开关
}
void main()
{
Int0Init();
while(1);
}
void Int0() interrupt 0
{
delay(1000);
if(k3 == 0)
{
led= ~led;
}
}
void Int1() interrupt 2
{
delay(1000);
if(k4 == 0)
{
led= ~led;
}
}
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)