51单片机里面有5个中断源:
- 两个外部中断
- 两个定时器中断
- 一个串口中断
中断类型
中断源名称 | 类型号 | 默认优先级 |
---|---|---|
外部中断0 | 0 | 最高 |
定时/计数器T0 | 1 | 第2 |
外部中断1 | 2 | 第3 |
定时/计数器T1 | 3 | 第4 |
串口中断 | 4 | 第5 |
IE寄存器
中断控制寄存器
位序 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|
位名 | EA | – | – | ES | ET1 | EX1 | ET0 | EX0 |
- EA位:全局中断允许控制位,EA = 0时,禁止所有中断
- ES位:串口接收中断使能
- EX位:外部中断允许位,EX = 0时,禁止外部中断
- ET位:定时/计数允许位,ET = 0时,禁止定时/计数器中断
IP寄存器
中断优先级寄存器
TCON寄存器
主要用于控制定时/计数器、中断的启动与停止、标示定时器的溢出和中断的情况。
位序 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|
位名 | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
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寄存器
用于配置定时器的工作模式,作用如下:
- 设置定时器是软件启动还是硬件启动
- 设置T0、T1的工作方式
- 设置T0或T1是用做计数器还是定时器
位定义如下(高4位为T1,低4位为T0):
位序 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|
位名 | GATE | C/ \overline T | M1 | M0 | GATE | C/ \overline T | M1 | M0 |
注意
如果只使用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
定时/计数器工作方式选择位,含义如下表:
M1 | M0 | 工作方式 | 功能说明 |
---|---|---|---|
0 | 0 | 方式0 | 13位 |
0 | 1 | 方式1 | 16位 |
1 | 0 | 方式2 | 8位自动重载 |
1 | 1 | 方式3 | T0分为两个8位;T1停止计数 |
工作方式
TMOD寄存器可以设置定时/计数器的工作方式。工作方式有4种:
- 方式0:13位
- 方式1:16位
- 方式2:8位自动重载
- 方式3:T0分为两个8位;T1停止计数
方式0
定时/计数器为13位定时/计数方式,它由TL的低5位和TH的全部8位构成13位的计数器,此时TL的高3位为无效位:
TH | TL | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
D12 | D11 | D10 | D9 | D8 | D7 | D6 | D5 | * | * | * | D4 | D3 | D3 | D1 | D0 |
当定时/计数器开始工作时,每经过一个机器周期就往TL里加1,当TL溢出的时候TH加1,直到TH溢出引发中断,然后停止定时或者计数。
如果想要重新定时或者计数,需要手动重置TH和TL寄存器。
13位最大计数次数为8192次,下表是晶振与计数时间的关系:
晶振 | 单个周期时间 | 总时间 |
---|---|---|
12MHz | 1μs | 8192μ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位定时/计数方式,原理和工作方式一致:
TH | TL | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
D15 | D14 | D13 | D12 | D11 | D10 | D9 | D8 | D7 | D6 | D5 | D4 | D3 | D3 | D1 | D0 |
当定时/计数器开始工作时,每经过一个机器周期就往TL里加1,当TL溢出的时候TH加1,直到TH溢出引发中断,然后停止定时或者计数。
如果想要重新定时或者计数,需要手动重置TH和TL寄存器。
16位最大计数次数为65536次,下表是晶振与计数时间的关系:
晶振 | 单个周期时间 | 总时间 |
---|---|---|
12MHz | 1μs | 65536μ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}