STC8G1K08A外部中断的使用(原理+代码+完整工程)

一、中断系统

单片机的裸板程序,都是在main()函数中按顺序执行.若此时有些紧急的事情需要马上处理,就需要暂停当前工作,转去处理事件.
等事件处理好后,再返回原来的地方继续执行.
在单片机中,有个专门处理这样的实时性要求高的方式: 中断系统.

例如: 每天的事务就是吃饭,然后洗澡,最后睡觉.
在这里插入图片描述
若在吃饭时,突然有个电话过来.(你也不止到电话什么时候来,但来了就要及时接听,不接听就错过了). 这时候,你就要放下手头的工作,接听电话.
等电话接听完成后,再返回到原来的工作(吃饭).
在这里插入图片描述

二、外部中断的原理

2.1 STC8的中断系统

STC8G1K08A的中断类型主要分为:

  • 外部中断: INT0,INT1,INT2,INT4,INT4 (主要是响应电平变化,常用于按键处理)
  • 定时器中断: Timer0,Timer1 (主要响应定时器溢出)
  • 数模转换中断: ADC(数模转换完成时出现)
  • 其他中断

这里是STC8的中断结构图,我们只需看懂其中一路中断,其余部分即可触类旁通.
左边是中断请求,中间是中断允许控制,右边是中断优先级控制.

  • 中断请求: 用于配置中断的触发方法(就是什么时候中断出现)
  • 中断允许控制: 用于配置中断是否允许被处理(就是处理中断还是直接无视它)
  • 中断优先级控制: 每个中断设置一个优先级,当多个中断同时出现时,按照优先级顺序依次处理

通过写寄存器的方式,我们就能完成中断的初始化配置.
然后再中断相应函数中,进行中断的处理.

在这里插入图片描述

2.2 外部中断例子: 单按键

硬件连接
例如: 我们的开发板,按键连接到P3.2/INT0引脚.
当按键按下时,引脚的电平是低; 按键松开(没按下)时,引脚的电平是高.
在这里插入图片描述

所以,我们需要INT0作为中断源,然后相应下降沿的中断,那就这样配置:

  • 设置IT0 =1,让其接收下降沿信号
  • 设置EX0 = 1, EA = 1, 使得中断信号被允许
  • 设置PX0= 0,PX1 = 1,使其优先级为最低

在这里插入图片描述

2.3 中断相应函数

最后在中断相应函数中,响应中断(进行事件处理).

//中断函数的格式
void void 函数名() interrupt 中断号
{
    //执行的语句
}

中断号可以根据中断的源进行查找,这里我们使用的是INT0,所以中断号是0.
在这里插入图片描述

三、关键代码

#include "stc8.h"
#include "intrins.h"

sbit    LED     =   P5^5;  //LED所在引脚

//INT0中断响应函数
void INT0_Isr() interrupt 0
{
    LED = !LED;        
}

void main()
{
    P3M0 = 0x00;
    P3M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;

	IPH &= (~PX0H); //PX0H,Px0 = 0,0 优先级为0级 (最低级)
	PX0  = 0;

	IT0 = 1;  //使能INT0下降沿中断
	
    EX0 = 1;  //使能INT0中断
	EA = 1;		//使能中断总开关(放在最后,配置好其它功能,最后才开启)

    while (1);
}

完整的代码,请见开头.

四、实验现象

按下按键,触发中断,LED状态改变;
再次按下按键,LED状态再次改变.
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值