外部中断

中断:
1.(P3.2)可由IT0(TCON.0)选择其为低电平有效还是下降沿有效。当CPU检测到P3.2引脚上出现有效的中断信号时,中断标志IE0(TCON.1)置1,向CPU申请中断
2.(P3.3)可由IT1(TCON.2)选择其为低电平有效还是下降沿有效。当CPU检测到P3.3引脚上出现有效的中断信号时,中断标志IE1(TCON.3)置1,向CPU申请中断
3.TF0(TCON.5),片内定时/计数器T0溢出中断请求标志。当定时/计数器T0发生溢出时,置位TF0,并向CPU申请中断
4.TF1(TCON.7),片内定时/计数器T1溢出中断请求标志。当定时/计数器T1发生溢出时,置位TF1,并向CPU申请中断
5.RI(SCON.0)或TI(SCON.1),串行口中断请求标志。当串行口接收完一帧串行数据时置位RI或当串行口发送完一帧串行数据时置位TI,向CPU申请中断。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
6.CPU同时接收到几个中断时,首先响应优先级别最高的中断请求。正在进行的中断过程不能被新的同级或低优先级的中断请求所中断。正在进行的低优先级中断服务,能被高优先级中断请求所中断
为了实现上述后两条原则,中断系统内部设有两个用户不能寻址的优先级状态触发器。其中一个置1,表示正在响应高优先级的中断,它将阻断后来所有的中断请求;另一个置1,表示正在响应低优先级中断,它将阻断后来所有的低优先级中断请求
7.中断响应条件
中断源有中断请求;
此中断源的中断允许位为1;
CPU开中断(即EA=1)。
以上三条同时满足时,CPU才有可能响应中断
8.以外部中断0为例:
主程序中需要有以下代码:
EA=1;//打开总中断开关
EX0=1;//打开外部中断0
IT0=0/1;//设置外部中断的触发方式
中断服务函数:
void int0() interrupt 0
{
do anything that you want
}
9.中断中有两个很重要的寄存器:TCON 和 IE


int_0举例程序:K3每点击一次LED状态发生一次反转

#include <reg52.h>

sbit K3 = P3^2;
sbit LED0 = P2^0;

typedef unsigned char uint8_t;

void int0_init(void)
{
	IT0 = 1; //配置下降沿触发中断,先配置中断的触发条件,然后再打开中断,最后开启CPU中断允许
	EX0 = 1; //打开外部中断0
	EA = 1; //CPU中断允许,总允许,允许CPU在运行的时候被中断打断
}

void delay(uint8_t i)
{
	while (i--);
}

void int0_isr(void) interrupt 0
{
	delay(1000);
	if (0 == K3)
	{
		LED0 = ~LED0;
	}
}

int main(void)
{
	int0_init();
	while (1);
	return 0;
}

int0 和 int1同时工作的代码:

#include <reg52.h>

sbit K3 = P3^2;
sbit LED0 = P2^0;

sbit K4 = P3^3;
sbit LED1 = P2^1;

typedef unsigned char uint8_t;

void int0_init(void)
{
	IT0 = 1; //配置下降沿触发中断,先配置中断的触发条件,然后再打开中断,最后开启CPU中断允许
	EX0 = 1; //打开外部中断0
}

void ini1_init(void)
{
	IT1 = 1;
	EX1 = 1;
	EA = 1; //CPU中断允许,总允许,允许CPU在运行的时候被中断打断
}

void delay(uint8_t i)
{
	while (i--);
}

void int0_isr(void) interrupt 0
{
	delay(1000);
	if (0 == K3)
	{
		LED0 = ~LED0;
	}
}

void int1_isr(void) interrupt 2
{
	delay(1000);
	if (0 == K4)
	{
		LED1 = ~LED1;
	}
}

int main(void) 
{
	int0_init();
	ini1_init();
	while (1);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值