作者:零食专卖店 | 来源:互联网 | 2023-10-11 17:36
如何实时检测随机事情的发生?通常有查询和中断两种方法。因为无论事件是否发生,都必须去查询,所以使用查询的方式会很浪费资源。而中断是当事情发生时,如果允许中断发生,则打断正在执行的程
如何实时检测随机事情的发生?
通常有查询和中断两种方法。因为无论事件是否发生,都必须去查询,所以使用查询的方式会很浪费资源。而中断是当事情发生时,如果允许中断发生,则打断正在执行的程序,因此中断能快速响应。
中断系统结构
STC89C52具有6个中断源,可实现两级中断嵌套。
符号 | 名称 | 触发条件 | 说明 |
---|
INT0 | 外部中断0 | 低电平或下降沿触发 | P3.2口 |
INT1 | 外部中断1 | 低电平或下降沿触发 | P3.3口 |
T0 | 定时器/计数器0中断 | 计数器0溢出回0引起 | 中断请求标志:TF0 |
T1 | 定时器/计数器1中断 | 计数器1溢出回0引起 | 中断请求标志:TF1 |
T2 | 定时器/计数器2中断 | 计数器2溢出回0引起 | 中断请求标志:TF2 ;捕捉中断 |
TI/RI | 串行口中断 | 发送/接收完一个串行数据 | 标志位:TI、RI |
中断请求标志寄存器
6个中断请求标志分别锁存在TCON 、SCON和T2CON中;
TCON寄存器
名称 | 说明 |
---|
IT0 | 当IT0=0时,外部中断0为电平触发方式;IT0=1时,为边沿触发方式(下降沿有效)。 |
IE0 | 当外部中断0 触发时,置1;转入中断服务程序时,由硬件清0 |
IT1 | 当IT1=0时,外部中断1为电平触发方式;IT1=1时,为边沿触发方式(下降沿有效)。 |
IE1 | 当外部中断1 触发时,置1;转入中断服务程序时,由硬件清0 |
TF0 | 定时器/计数器T0的溢出中断时,由硬件使TF0置“1” ;转入中断服务程序时,由硬件清0 |
TF1 | 定时器/计数器T1的溢出中断时,由硬件使TF1置“1” ;转入中断服务程序时,由硬件清0 |
TR0 | 定时器/计数器T0的控制运行位; |
TR1 | 定时器/计数器T1的控制运行位; |
中断允许寄存器IE
- EA=0时,所有的中断请求被屏蔽;
- EA=1时,允许中断,相当于总开关打开;
- ET2=0,禁止定时器/计数器T2溢出中断。
- ET2=1,允许定时器/计数器T2溢出中断。
- ES=0,禁止串行口中断。
- ES=1,允许串行口中断。
- ET1=0,禁止定时器/计数器T1溢出中断。
- ET1=1,允许定时器/计数器T1溢出中断。
- EX1=0,禁止外部中断1中断。
- EX1=1,允许外部中断1中断。
- ET0=0,禁止定时器/计数器T0溢出中断。
- ET0=1,允许定时器/计数器T0溢出中断。
- EX0=0,禁止外部中断0中断。
- EX0=1,允许外部中断0中断。
总结:在EA=1时,某位设置为1,则允许该中断发生。
中断优先级寄存器IP
- PT2—定时器T2中断优先级控制位
- PS—串行口中断优先级控制位
- PT1—定时器T1中断优先级控制位
- PX1—外部中断1中断优先级控制位
- PT0—定时器T0中断优先级控制位
- PX0—外部中断0中断优先级控制位
1:高优先级; 0:低优先级
- 低优先级可被高优先级中断,高优先级不能被低优先级中断
- 任何一种中断一旦得到响应,不会再被它的同级中断源所中断
- 在同时收到几个同优先级的中断请求时,哪一个中断请求能优先得到响应,取决于内部的查询顺序。同级中,外部中断0的优先级最高
如何配置外部中断
1.设置TCON,确定触发方式,电平触发or下降沿
2. IE寄存器中的中断总允许位EA=1,并配置IE确定中断源
3. 设置中断优先级寄存器IP,可以没有这步
4. 编写中断服务子程序,处理中断请求
外部中断0服务函数
void INT0()interrupt 0 using 1
{
xxx
}
名称 | 说明 |
---|
interrupt 0 | 外部中断0 |
interrupt 1 | 定时器中断0 |
interrupt 2 | 外部中断1 |
interrupt 3 | 定时器中断1 |
interrupt 4 | 串行口中断 |
interrupt 5 | 定时器中断2 |
using 0 是第0组寄存器;
using 1 是第1组寄存器;
using 2 是第2组寄存器;
using 3 是第3组寄存器;
这个的作用不太明白,但是一般情况下不需要考虑这个,也不需要写上
外部中断0程序
- 程序现象:按键控制LED灯状态取反
- 程序说明:LED连接在P2^0;按键连接在P3.2口且按键按下为低电平;
#include
sbit Led0=P2^0;
sbit Key=P3^2;
typedef unsigned int u16;
void delay(unsigned int del) //10ms * del
{
unsigned int i,j;
for(i=0; i for(j=0; j<1827; j++)
;
}
void main()
{
IT0=0; //TCON,P3.2口低电平触发方式,也可以为下降沿
EA=1; //IE,开启总开关
EX0=1; //IE,允许外部中断0中断
while(1); //避免退出程序,循环等待
}
void int0 () interrupt 0 //中断服务函数
{
delay(13); //消抖一般10~20ms
if(Key==0)
{
Led0=~Led0; // LED状态取反
while(Key!=0); //按键松手检测
}
}