外部中断
中断的概念:CPU在执行主程序的时候,中断源发送请求。CPU响应中断源,去执行中断源的程序。中断源往往含有优先级,优先级高的中断源可以向优先级低的中断源发送有效的中断请求。
STC12C5A60S2系列单片机通常有两个外部中断源。
外部中断常用到的寄存器是TCON(定时计数器控制寄存器)的低四位
寄存器名称 | 地址 | 位 | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
---|---|---|---|---|---|---|---|---|---|---|
TCON | 88H | 位名 | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
IE1 | 外部中断(INT1)中断请求标志位 |
---|---|
0 | 中断事件未发生 |
1 | 产生了中断事件,可向CPU申请中断 |
IT1 | 外部中断源1触发方式控制位 |
---|---|
0 | 低电平触发方式。当INT1=0时,IE1被硬件自动置1 |
1 | 下降沿触发方式。当INT1电平由1到0跳变时,中断请求标志位被硬件自动的置一 |
上述是外部中断1的两个寄存器位的作用。TCON低两位的外部中断0的意义与外部中断1的意义相同,这里不再赘述。
要使一个中断源能够被CPU识别并按照中断的方式执行,就要求传递线上的几个开关都是闭合的。通过下面的图可以很好的理解中断源与CPU之间的请求传输。
所以我们可以得到要外部中断0的服务程序能够执行必须满足三个条件:
- CPU开放总中断,即EA=1;
- 允许外部中断0申请中断,即EX0=1;
- 必须由中断事件发生,即中断标志位IE0=1;当INT0低电平或者由下降沿的时候IE0就会被自动置1;
应用示例
主函数执行数码管每隔约1s加1的任务,当按下P32引脚的按键时,蜂鸣器鸣一声,P36引脚对应的是蜂鸣器,当P36=1时,蜂鸣器发生,S2按键按下,电平为低,松开时为高。(P32同时也是外部中断0的接口)
#include <reg51.h>
#include "shumaguan.h" // 要用到里面的数码管显示函数,在此文件中,直接调用不再多写。
sbit beep=P3^6;
sbit key=P3^2;
#define BEEPON beep=0
#define BEEPOFF beep=1
#define RDKEY key
void delay1s(void)
{
//cpu延时1s,这里的代码可以在STC烧录助手里来看,或者根据系统时钟来计算。代码略。
}
void delay100ms(void)
{
//cpu延时1s,这里的代码可以在STC烧录助手里来看,或者根据系统时钟来计算。代码略。
}
void delay10ms(void)
{
//cpu延时1s,这里的代码可以在STC烧录助手里来看,或者根据系统时钟来计算。代码略。
}
void main()
{
unsigned char i;
IT0=1;//设置为下降沿触发
EX0=1;//允许外部中断0的申请
EA=1;
while(1)
{
ShowInt(i);
i++;
delay1s();
}
}
//外部中断0的终端服务程序。CPU被动被打断
//中断法--外部中断0请求标志位的IE0由硬件自动清零,无需软件操作。
void EX0_ISR() interrupt 0
{
delay10ms();//消抖
if(RDKEY==0)
{
BEEPON;
delay100ms();
BEEPOFF;
}
}