中断

中断就是某种原因,使得主程序先执行其他程序。

pk40

中断的允许控制位

IE D7 D6 D5 D4 D3 D2 D1 D0
A8H EA ET2 ES ET1 EX1 ET0 EX0

EA :中断的总控制位。EA=0 屏蔽所有中断请求,EA=1,开放中断

ET2 :定时器/计数器T2的溢出中断允许位 1开启,0屏蔽

ES :串行口中断的允许位 1开启,0屏蔽

ET1 :定时器/计数器T1的溢出中断允许位 1开启,0屏蔽

EX1 :外部中断INT1的中断允许位。 1开启,0屏蔽

ET0 :定时器/计数器T0的溢出中断允许位 1开启,0屏蔽

EX0 :外部中断INT0的中断允许位。 1开启,0屏蔽

优先权控制

IP D7 D6 D5 D4 D3 D2 D1 D0
B8H PT2 PS PT1 PX1 PT0 PX0

PT2 :定时/计数器T2的中断优先权控制位。 52系列才有 1高优先级,0低优先级

PS :串行口中断优先级控制位 1高优先级,0低优先级

PT1 :定时器/计数器T1的中断优先权控制位 1高优先级,0低优先级

PX1 :外部中断INT1的中断优先权控制位 1高优先级,0低优先级

PT0 :定时器/计数器T0的中断优先权控制位 1高优先级,0低优先级

PX0 :外部中断INT0的中断优先权控制位 1高优先级,0低优先级

默认顺序

​ 中断源 优先级顺序

外部中断0 高

定时计数器T0中断 |

外部中断0 |

定时计数器T1中断 |

串行口中断 |

定时计数器T2中断(52的) 低

各中断服务程序入口编号 interrupt [number]

​ 中断源 入口编号

外部中断0(P3.2) 0

定时计数器0 1

外部中断0(P3.3) 2

定时计数器1 3

串行口中断 4

定时/计数器 的方式寄存器 TCON

TCON D7 D6 D5 D4 D3 D2 D1 D0
88H TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

TF 定时/计数器溢出位,超出上限值就会置1,若进入中断自动清0 定时/计数器范围(0—-2几位定时-1)

TR 设置定时计数器是否启动

IE 外部中断请求标志位

IT 外部中断的触发方式位 ==0 电平触发 ==1边缘触发

$$
外部中断\ \ \ \ \ \ \overline{\text{INT0}}\ \ 和 \ \ \overline{\text{INT1}}
$$
​ 加了上划线,则代表为 低电平触发 或者 下降沿触发

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include"reg51.h"
sbit ex=P3^2;
char s[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
int num=0;
void initex() //外部中断0
{
IT0=1; //下降沿触发
EX0=1; //外部中断INT0的中断允许位开启
EA=1; //开启中断总控制位
ex=1; //设置外部中断P3.2口下降沿触发,开始要高电位
}

void display()
{
P2=s[num];
if(num==10)
{
num=0;
}
}

void main()
{
initex(); //外部中断初始化
while(1)
{
display();
}
}