蓝桥杯模块学习7——外部中断(深夜学习——单片机)

目录

一、什么是中断?

二、为什么一定要中断?

三、中断相关概念:

四、STC15系列51单片机外部中断硬件分析:

1、结构图:

2、结合寄存器分析:

(1)TCON(Timer Control)定时器控制寄存器(这个名字感觉不太合理,这也控制了外部中断):

(2)IE(Interrrupt Enable)中断允许寄存器:

(3)IP(Interrupt Priority)中断优先级寄存器:(暂时先学习单个中断不需要了解)

 五、中断服务函数的格式:

1、格式:

2、中断号: 

​编辑

 六、外部中断实验:

1、代码思路:

2、参考代码:

(1)宏定义:

(2)主函数:


一、什么是中断?

        当CPU在在执行程序时,由于系统中出现某种急需处理情况,CPU转而执行程序的过程。

二、为什么一定要中断?

        以点外卖为例,我一直在打游戏,不可能说隔几分钟就去看看外卖有没有来,而如果有手机,我们就只需要等电话响去拿外卖就行。手机就像一个中断系统,可以打断你打游戏的行为。

        推广到中断来说,就是CPU正常执行主函数,但是突然被某种硬件电路组成的中断系统打断,强迫去一个特定的地方工作(中断服务函数),当中断被取消后,中断就放开CPU回去原来主函数的位置继续执行下一段代码。

三、中断相关概念:

        如果打游戏是在执行主程序,那么电话就是中断源,电话铃声响了就是中断请求,保存游戏存档就是现场保护,接电话就是中断响应,而如果在打电话过程中,门铃响了就是更高级的中断请求,去把门打开就是中断嵌套,打完电话回来打游戏就是中断返回,重新打开原来的存档就是现场恢复。

四、STC15系列51单片机外部中断硬件分析:

1、结构图:

2、结合寄存器分析:

(1)TCON(Timer Control)定时器控制寄存器(这个名字感觉不太合理,这也控制了外部中断):

        (A)IE0、IE1:外部中断标志位,由硬件自动置“1”“0”,我们不用管。

        (B)IT0、IT1:外部中断中断源类型选择位:置“0”,上升沿和下降沿均可触发;置“1”,只有下降沿可触发。

(2)IE(Interrrupt Enable)中断允许寄存器:

         (A)EX0、EX1:外部中断0、1允许位,“1”为允许

         (B)EA:总中断允许位,"1"为允许,相当于总闸

(3)IP(Interrupt Priority)中断优先级寄存器:(暂时先学习单个中断不需要了解)

 五、中断服务函数的格式:

1、格式:

2、中断号: 

 六、外部中断实验:

        实现功能:首先将J5跳帽接到2、3脚,使得电路变成独立按键电路,而P32和P33可复用做外部中断输入口,现在要求L1不断闪烁,而P32复用成外部中断输入口,当S5按下L1闪烁停止,L8亮一段时间后熄灭,该功能用两种方式实现:

1、直接在中断服务函数中延时

2、利用标志位在外部延时

1、代码思路:

        首先配置并打开外部中断,然后在主函数中让L1不断闪烁,在中断服务函数中让L8亮,同时延时一段时间,或将标志位置“1”,在外部延时。

2、参考代码:

(1)宏定义:

#ifndef _PUBLIC_H
#define _PUBLIC_H

#include "STC15F2K60S2.H" 

#define u8 unsigned char
#define u16 unsigned int

void Delay_1ms(u16 num);
void Close_All(void);
void Delay_10us(u16 num);
#endif
#include "Public.h"
// 延时函数(最小约1ms@12MHz)
void Delay_1ms(u16 num)
{
  unsigned int i;
  while(num--)
    for(i=0; i<628; i++);
}


/*
	输入变量:无
	输出变量:无
	功能:关闭蜂鸣器和继电器
*/
void Close_All(void)
{
	//关闭蜂鸣器和继电器
	P0 = 0x00;
	P2 = (P2 & 0x1f) | 0xA0;
	P2 &= 0x1f;
	//关闭LED灯
	P0 = 0xff;
	P2 = (P2 & 0x1F) | 0x80;
	P2 &= 0x1f;	
}

void Delay_10us(u16 num)
{
  u16 i;
  while(num--)
    for(i=0; i<3; i++);
}

(2)主函数:

// 使用程序前,将J13调整为IO模式(2-3脚短接)
#include "Public.h"

u8 sign;
void LED_ON(u8 L_X);
void L1_Flash();
void E_Interrpt_0_Init();
// 主函数
void main(void)
{
	Close_All();	
	E_Interrpt_0_Init();
  while(1)
  { 
		if(sign)
		{
			Delay_1ms(2000);
			LED_ON(0xff);
			sign = 0;
		}
		else
			L1_Flash();
  }
}


void L1_Flash()
{
	//L1闪烁
	LED_ON(~0x01);
	Delay_1ms(500);
	LED_ON(0xff);
	Delay_1ms(500);
}

/*
	输入变量:P0口的对应的16进制数
	输出变量:无
	功能:选择相应的锁存器后,通过P0口控制LED灯亮
*/
void LED_ON(u8 L_X)
{
	P0 = L_X;
	P2 = (P2 & 0x1f) | 0x80;
	P2 &= 0x1f;
}

/*
	输入变量:无
	输出变量:无
	功能:初始化外部中断0
*/
void E_Interrpt_0_Init()
{
	//下降沿触发
	IT0 = 1;
	//开启中断
	EX0 = 1;
	EA = 1;
}

void E_Interrpt_0() interrupt 0
{
	LED_ON(~(0x01<<7));
//	//内部延时
//	Delay_1ms(2000);
//	LED_ON(0xff);
	//外部延时
	sign=1;
	
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值