目录
(1)TCON(Timer Control)定时器控制寄存器(这个名字感觉不太合理,这也控制了外部中断):
(2)IE(Interrrupt Enable)中断允许寄存器:
(3)IP(Interrupt Priority)中断优先级寄存器:(暂时先学习单个中断不需要了解)
一、什么是中断?
当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;
}