单片机-08中断系统与外部中断应用

 参考文献:【新提醒】【蓝桥杯单片机07】彻底理解51单片机的中断系统 - - 21ic电子技术开发论坛

中断定义:

你正在追电视剧《神雕侠侣》,正看得入迷的时候,电话响了,你暂停电视剧,去接电话,在接电话的过程中,门铃又响了,你暂时放下电话,去把门打开。如果追电视剧是在执行主程序,那么电话就是中断源,电话铃响了就是中断请求,暂停电视就是现场保护,接电话就是中断响应,门铃响了是更高一级的中断请求,去把门打开,那就是中断嵌套。开完门回来接着聊电话,那是中断返回,接完电话把电视剧暂停打开就是现场恢复
    内核与外设之间的主要交互方式有两种:轮询中断。轮询的方式貌似公平,但实际工作效率很低,且不能及时响应紧急事件;中断系统使得内核具备了应对突发事件的能力
    中断有个特点,就是你不知道中断什么时候发生。因此,每个中断都需要有一个中断入口地址,也成为中断向量。这样,不管中断在什么时候发生,它都有一个确定的程序执行起始点。中断响应之后,执行的那段程序,我们称作中断服务函数,也就是这个函数专门是为该中断服务的。

中断相关寄存器:

中断相关的寄存器有4个,每个寄存器都是可以位寻址的,这该编程带来了方便。    其中2个为控制寄存器:IE寄存器IP寄存器
    


    另外2个为中断请求标志:TCON寄存器SCON寄存器
    

一般情况下,中断的处理函数有两个,其一为中断初始化函数,其二为中断服务函数。初始化函数就是一个普通的函数,而中断服务函数却有特殊的格式要求:
    <1> 中断函数没有返回值,也不能带参数。
    <2> 函数名后面要跟一个关键字interrupt,说明这是一个中断服务函数。
    <3> 在关键字interrupt后面要跟上中断号,说明这个中断服务函数是为那个中断服务的。   

    中断服务函数的格式为:
    void  函数名()  interrupt  中断号
    {  ----函数体----  }
    我们要利用定时器0来进行间隔定时,中断程序架构我们C语言可以这样写:
    

题目:

电路图:

蓝桥杯单片机仿真原理图:蓝桥杯单片机仿真原理图.pdsprj-讲义文档类资源-CSDN文库 

代码:

#include<reg52.h>

//译码器定义
sbit HC138_C =P2^7;
sbit HC138_B =P2^6;
sbit HC138_A =P2^5;
//LED定义
sbit L1 =P0^0;
sbit L8 =P0^7;
//只用到了控制LED(Y4)的锁存器
void SwitchHC138(unsigned char channel)
{
	switch(channel)
	{
		case 4:
			HC138_C= 1;
			HC138_B= 0;
			HC138_A= 0;
		break;
		case 5:
			HC138_C= 1;
			HC138_B= 0;
			HC138_A= 1;
		break;
	}
	
}
void DelayL(unsigned int t)
{
	while(t--);
	while(t--);
}
//L1闪烁函数
void Working()
{
	SwitchHC138(4);
	L1 = 0; //点亮
	DelayL(60000);
	DelayL(60000);
	L1 =1; //熄灭
	DelayL(60000);
	DelayL(60000);
}
// ==========================
//中断初始化
void Init_INT0()
{
	IT0 = 1;
	EX0=1;
	EA=1;
}
//中断服务函数(方法一:在按下按键L8点亮,同时L1也会出现点亮的情况)
//void Service1_INT0() interrupt 0
//{
//	L8 = 0;
//	DelayL(60000);
//	DelayL(60000);
//	L8 = 1;
//	DelayL(60000);
//	DelayL(60000);
//	
//}
// ==========================
//中断服务函数(方法二:使用标志量进行点亮L8,该方法是在Working函数执行完成后在执行Light函数)
unsigned char flag =0;
void Service2_INT0() interrupt 0
{
	flag = 1;
}

void Light()
{
	if(flag == 1)
	{
		L8 = 0;
		DelayL(60000);
		DelayL(60000);
		L8 = 1;
		DelayL(60000);
		DelayL(60000);
	}
	flag =0;
	
	
}
// ==========================
void Init()
{
	SwitchHC138(5);
	P0 = 0x00;
	DelayL(100);
	SwitchHC138(4);
	P0 = 0xff;
}
void main()
{
	Init();
	Init_INT0();
	while(1)
	{
		Working();
		Light();
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
外部中断是STM32单片机中的一种事件触发机制,它可以让外部设备向单片机发送一个中断信号,从而使单片机在正常执行的过程中立即转移到中断服务程序中执行相应的代码。中断可以用于实现实时性要求较高的功能,例如按键检测、传感器数据采集等。 在STM32单片机中配置外部中断需要经过以下几个步骤: 1. 设置中断系统的优先级分组。这是一个系统级的设置,可以通过寄存器配置来实现。该设置决定了不同中断源之间的优先级关系。 2. 配置外部中断引脚。首先需要将对应的GPIO口配置为输入模式,然后将外部中断引脚与GPIO口连接起来。具体的配置过程包括设置引脚模式、引脚速度、上下拉电阻等。 3. 配置外部中断触发方式。根据具体的需求,可以选择边沿触发或电平触发。边沿触发可以进一步分为上升沿触发、下降沿触发和双边沿触发。 4. 编写中断服务程序。中断服务程序是在中断发生时执行的代码段,用于处理中断事件。在中断服务程序中可以编写相应的逻辑,例如读取按键状态、处理传感器数据等。 5. 配置中断优先级和使能中断。通过中断控制器的设置,可以决定中断的优先级和是否允许中断。优先级高的中断会在多个中断同时发生时优先得到处理。 6. 清除中断挂起位。在中断服务程序中,需要手动清除中断挂起位,表示该中断已经被处理。 总的来说,配置外部中断需要进行引脚配置、触发方式设置、中断服务程序编写和中断优先级设置等步骤。这样,当外部中断事件发生时,单片机会立即转移到中断服务程序中执行相应的代码,从而实现相应的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [STM32单片机--外部中断详解](https://blog.csdn.net/WYFDMW/article/details/107847097)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [【STM32】HAL库-睡眠模式-外部中断唤醒demo](https://download.csdn.net/download/qq_45607873/85319880)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LCH南安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值