51单片机的中断

时间:2025-03-21 07:01:26

文章目录

  • 第六章 单片机的中断系统
    • 6.1 中断系统简介
    • 6.2 中断系统的控制
      • 1. 定时器/计数器控制寄存器TCON
      • 2. 中断允许寄存器IE
      • 3. 中断优先级寄存器IP
    • 6.3 中断系统的编程
      • 1. 中断函数
      • 2. 编程的具体流程

第六章 单片机的中断系统

6.1 中断系统简介

当cpu在执行某一程序过程中,在突发事件的请求下,cpu中断当前正在执行的程序,自动转去执行为处理该事件而预先编写的程序服务;当服务程序执行完后,cpu继续执行原来的程序。这一过程称为中断。

8051单片机提供5个中断源,包括两个外部中断源 I N T 0 ‾ \overline{INT0} INT0 I N T 1 ‾ \overline{INT1} INT1 ,两个定时器/计数器中断源T0和T1,以及一个串口中断源。

中断的自然优先级

中断函数编号 中断名称 中断标志位 中断使能位 中断向量地址 默认优先级
0 外部中断0 IE0 EX0 03H 1(最高)
1 定时器T0中断 TF0 ET0 0BH 2
2 外部中断1 IE1 EX1 13H 3
3 定时器T1中断 TF1 ET1 1BH 4
4 UART中断(串口) T1/R1 ES 23H 5

6.2 中断系统的控制

1. 定时器/计数器控制寄存器TCON

字节地址为88H,可以位寻址。

位序号 D7 D6 D5 D4 D3 D2 D1 D0
位符号 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
位地址 8FH 8EH 8DH 8CH 8BH 8AH 89H 88H
  • TF1: 定时器1溢出标志位,当定时器1计满溢出时,由硬件将TF1置1,并申请中断;进入中断服务程序后,由硬件自动清零。

  • TR1: 定时器1运行控制位: TR=1表示启动定时器,需要配合GATEINT1

    • GATE=1,且INT1为高电平时,TR1置1启动定时器。
    • GATE=0时,TR1置1启动定时器1。
  • TF0: 定时器0溢出标志位,功能和用法同TF1.

  • TR0: 定时器0运行控制位,功能和用法同TR1.

  • IE1: 外部中断1请求标志位.

    • IT1=0时,为电平触发方式,每个机器周期的S5P2采样INT1引脚,若INT1脚为高电平,则置1;否则IE1清0.

    • IT1=0时,为跳变沿触发方式,当第一个机器周期采样到INT1为低电平时,将IE1置1,表示外部中断1正在向CPU请求中断.当CPU响应,转向中断服务程序时,IE1由硬件清零.

  • IT1: 外部中断1触发方式选择位.

    • IT1=0时,为电平触发方式,引脚INT1上的低电平有效.
    • IT1=1时,为跳变沿触发方式,引脚INT1上的电平从高到低的负跳变有效.
  • IE0: 外部中断0请求标志位,功能和用法同IE1.

  • IT0: 外部中断0触发方式选择位,功能和用法同IT1.

2. 中断允许寄存器IE

按位寻址,地址:A8H。

B7 B6 B5 B4 B3 B2 B1 B0
EA - ET2 ES ET1 EX1 ET0 EX0
  • EA (IE.7): EA=0时,所有中断禁止(即不产生中断)
    EA=1时,各中断的产生由个别的允许位决定

  • -(IE.6) :保留

  • ET2(IE.5):定时2溢出中断充许(8052用)

  • ES (IE.4):串行口中断充许(ES=1充许,ES=0禁止)

  • ET1(IE.3):定时1中断充许

  • EX1(IE.2):外中断INT1中断充许

  • ET0(IE.1):定时器0中断充许

  • EX0(IE.0):外部中断INT0的中断允许

3. 中断优先级寄存器IP

中断控制位
位序 D7 D6 D5 D4 D3 D2 D1 D0
位序号 - - - PS PT1 PX1 PT0 PX0

高电平为高优先级。

PS:串行口中断优先

PS=1,设置串行口中断为高优先级。

PS=0,设置串行口中断为低优先级。

PT1:定时器/计数器1中断优先

PX1:外中断INT1中断优先

PT0:定时器0中断优先

PX0:外部中断INT0的中断优先

6.3 中断系统的编程

1. 中断函数

定义如下:

void 函数名(void) interrupt n using m
{
    中断函数内容
}

修饰符interrupt表示该中断服务程序所对应的中断源的中断号

修饰符using m用于指定本函数内部使用的寄存器工作组,该修饰符可省略,让编译器分配。

注意

  1. 中断函数不带任何参数。

  2. 中断函数没有返回值。

  3. 中断函数必须由中断源触发而自动调用,不得直接调用,因此也不用提前声明。

  4. 中断函数要精简,避免因执行时间过长影响其他中断的响应。

2. 编程的具体流程

(1) 外部中断,例如INT1

  1. 设置IT1选择触发方式。

  2. 开启总中断允许EA = 1。

  3. 开启外部中断1允许EX1 = 1。

(2) 定时器/计数器中断, 例定时器T0

  1. 确定计数初值, TH0, TH1初始化

  2. 确定定时器工作方式, TMOD初始化

  3. 开放定时器,EA=1,ET0=1

  4. 启动T0工作,TR0=1

  5. 若不是工作方式2,则每次中断必须重新装载计数初值。