51单片机里面有5个中断源:

  • 两个外部中断
  • 两个定时器中断
  • 一个串口中断

中断类型

中断源名称类型号默认优先级
外部中断00最高
定时/计数器T01第2
外部中断12第3
定时/计数器T13第4
串口中断4第5

IE寄存器

中断控制寄存器

位序D7D6D5D4D3D2D1D0
位名EAESET1EX1ET0EX0
  • EA位:全局中断允许控制位,EA = 0时,禁止所有中断
  • ES位:串口接收中断使能
  • EX位:外部中断允许位,EX = 0时,禁止外部中断
  • ET位:定时/计数允许位,ET = 0时,禁止定时/计数器中断

IP寄存器

中断优先级寄存器

TCON寄存器

主要用于控制定时/计数器、中断的启动与停止、标示定时器的溢出和中断的情况。

位序D7D6D5D4D3D2D1D0
位名TF1TR1TF0TR0IE1IT1IE0IT0

TF位

定时/计数器溢出中断位,这个位一般不需要人为操作。当定时/计数器溢出时,硬件自动将这个位置1,并向CPU发出中断指令,CPU进入中断服务程序的时候,自动清除该位。

TR位

定时/计数器使能位。

  • 0:停止计数
  • 1:启动计数

IE位

外部中断请求标志位,这个位一般不需要人为操作。当外部中断无中断请求时,IE=0;当外部中断有中断请求时,IE=1.在CPU响应该中断后,由硬件自动将IE清零

IT位

外部中断的触发方式。 0:低电平触发 1:下降沿触发

定时/计数器

51单片机中有两个定时/计数器T1和T0,有以下相关寄存器:

  • TH:高8位定时/计数器。有TH1和TH0两个
  • TL:低8位定时/计数器。有TL1和TL0两个
  • TMOD:工作方式选择寄存器
  • TCON:控制寄存器

TMOD寄存器

用于配置定时器的工作模式,作用如下:

  1. 设置定时器是软件启动还是硬件启动
  2. 设置T0、T1的工作方式
  3. 设置T0或T1是用做计数器还是定时器 位定义如下(高4位为T1,低4位为T0):
位序D7D6D5D4D3D2D1D0
位名GATE$C/ \overline T$M1M0GATE$C/ \overline T$M1M0

注意 如果只使用T1,建议TMOD低4位都置0

GATE

门控位。用于选择定时/计数器的启动方式。 定时/计数器的启动方式有两种,位设置如下:

  • 0:软启动,通过配置TCON寄存器中的TR位直接启动
  • 1:硬启动,通过外部中断启动。 注意:
  • 硬启动之前,也需要配置TCON寄存器中的TR位。
  • 外部中断引脚为INT0(P3.2)和INT1(P3.3)
  • 外部中断启动条件为置“1”

$C/ \overline T$

功能选择位。用于选择定时/计数器的脉冲源。 脉冲源有两种,位设置如下:

  • 0:内部脉冲,单片机内部提供一个12分频的时钟脉冲
  • 1:外部脉冲

M1、M0

定时/计数器工作方式选择位,含义如下表:

M1M0工作方式功能说明
00方式013位
01方式116位
10方式28位自动重载
11方式3T0分为两个8位;T1停止计数

工作方式

TMOD寄存器可以设置定时/计数器的工作方式。工作方式有4种:

  • 方式0:13位
  • 方式1:16位
  • 方式2:8位自动重载
  • 方式3:T0分为两个8位;T1停止计数

方式0

定时/计数器为13位定时/计数方式,它由TL的低5位和TH的全部8位构成13位的计数器,此时TL的高3位为无效位:

THTL
D12D11D10D9D8D7D6D5***D4D3D3D1D0

当定时/计数器开始工作时,每经过一个机器周期就往TL里加1,当TL溢出的时候TH加1,直到TH溢出引发中断,然后停止定时或者计数。 如果想要重新定时或者计数,需要手动重置TH和TL寄存器。 13位最大计数次数为8192次,下表是晶振与计数时间的关系:

晶振单个周期时间总时间
12MHz1μs8192μs
11.0592约1.085μs约8888.89μs

假设需要定时的时间长度为t(μs),晶振频率为f(MHz),定时器初始值count计算公式如下:

$$ count=2^{13}- \frac {tf}{12} $$

由于TL寄存器高三位未被使用,所以要将count拆开低五位到TL,剩下的位放到TH:

$$ \begin{cases}TH=count >> 5 \\ TL=count \& 0x1F \end{cases} $$

方式1

定时/计数器为16位定时/计数方式,原理和工作方式一致:

THTL
D15D14D13D12D11D10D9D8D7D6D5D4D3D3D1D0

当定时/计数器开始工作时,每经过一个机器周期就往TL里加1,当TL溢出的时候TH加1,直到TH溢出引发中断,然后停止定时或者计数。 如果想要重新定时或者计数,需要手动重置TH和TL寄存器。 16位最大计数次数为65536次,下表是晶振与计数时间的关系:

晶振单个周期时间总时间
12MHz1μs65536μs
11.0592约1.085μs约60397.98μs

假设需要定时的时间长度为t(μs),晶振频率为f(MHz),定时器初始值count计算公式如下:

$$ count=2^{16}- \frac {tf}{12} $$

由于TL寄存器高三位未被使用,所以要将count拆开低五位到TL,剩下的位放到TH:

$$ \begin{cases}TH=count >> 8 \\ TL=count\&0xFF\end{cases} $$