51 单片机中断控制寄存器 TCON
在 51 单片机中,中断控制寄存器 TCON
(Timer/Counter Control Register,定时器 / 计数器控制寄存器)主要用于控制定时器 / 计数器的启动、停止以及外部中断的触发方式等。它既可以按字节寻址,也可以按位寻址,其字节地址为 88H。下面详细介绍 TCON
寄存器的各个位。
TCON 寄存器的位分布
位序号 | 位名称 | 功能描述 |
---|---|---|
D7 | TF1 | 定时器 / 计数器 1 溢出标志位 |
D6 | TR1 | 定时器 / 计数器 1 运行控制位 |
D5 | TF0 | 定时器 / 计数器 0 溢出标志位 |
D4 | TR0 | 定时器 / 计数器 0 运行控制位 |
D3 | IE1 | 外部中断 1 请求标志位 |
D2 | IT1 | 外部中断 1 触发方式控制位 |
D1 | IE0 | 外部中断 0 请求标志位 |
D0 | IT0 | 外部中断 0 触发方式控制位 |
各位功能详细解释
定时器 / 计数器相关位
- TF1(D7):定时器 / 计数器 1 溢出标志位。当定时器 / 计数器 1 产生溢出时,硬件会自动将
TF1
置为 1。如果中断允许,会触发定时器 / 计数器 1 的中断。在中断服务程序中,需要软件将TF1
清 0;如果不使用中断方式,也可以通过查询TF1
的状态来判断定时器 / 计数器 1 是否溢出。 - TR1(D6):定时器 / 计数器 1 运行控制位。当
TR1 = 1
时,启动定时器 / 计数器 1;当TR1 = 0
时,停止定时器 / 计数器 1。可以通过软件对TR1
进行置位或清零操作来控制定时器 / 计数器 1 的启动和停止。 - TF0(D5):定时器 / 计数器 0 溢出标志位。功能与
TF1
类似,当定时器 / 计数器 0 产生溢出时,硬件将TF0
置为 1。若使用中断方式,在中断服务程序中需软件清 0;若采用查询方式,则通过查询TF0
状态判断溢出情况。 - TR0(D4):定时器 / 计数器 0 运行控制位。当
TR0 = 1
时,启动定时器 / 计数器 0;当TR0 = 0
时,停止定时器 / 计数器 0。可通过软件控制TR0
来启停定时器 / 计数器 0。
外部中断相关位
- IE1(D3):外部中断 1 请求标志位。当外部中断 1(INT1,P3.3 引脚)有中断请求时,硬件会将
IE1
置为 1。若中断允许,CPU 响应中断后,硬件会自动将IE1
清 0(对于下降沿触发方式)。 - IT1(D2):外部中断 1 触发方式控制位。当
IT1 = 0
时,外部中断 1 为低电平触发方式,即只要 P3.3 引脚为低电平,就会触发中断;当IT1 = 1
时,外部中断 1 为下降沿触发方式,只有当 P3.3 引脚的电平从高电平变为低电平时,才会触发中断。 - IE0(D1):外部中断 0 请求标志位。功能与
IE1
类似,当外部中断 0(INT0,P3.2 引脚)有中断请求时,硬件将IE0
置为 1。CPU 响应中断后,硬件会自动将IE0
清 0(对于下降沿触发方式)。 - IT0(D0):外部中断 0 触发方式控制位。当
IT0 = 0
时,外部中断 0 为低电平触发方式;当IT0 = 1
时,外部中断 0 为下降沿触发方式。
示例代码
以下是一个简单的示例代码,展示了如何使用 TCON
寄存器配置外部中断 0 为下降沿触发方式:
#include <reg51.h>
// 定义一个 LED 引脚
sbit LED = P1^0;
// 外部中断 0 的中断服务函数
void External0_ISR() interrupt 0 {
LED = ~LED; // 翻转 LED 的状态
}
void main() {
IT0 = 1; // 设置外部中断 0 为下降沿触发方式
IE0 = 0; // 清外部中断 0 请求标志位(可省略,初始值一般为 0)
EX0 = 1; // 使能外部中断 0
EA = 1; // 全局中断使能
while(1) {
// 主循环可以执行其他任务
}
}
在这个示例中,通过 IT0 = 1;
将外部中断 0 设置为下降沿触发方式。当 P3.2 引脚出现下降沿信号时,会触发外部中断 0,进而执行外部中断 0 的中断服务函数 External0_ISR()
,在该函数中会翻转 P1.0 引脚连接的 LED 的状态。同时,EA = 1;
开启全局中断使能,EX0 = 1;
使能外部中断 0。