普中51单片机学习笔记-中断
目录
1 写在前面
1.1 何为中断
1.2 中断优先级
1.3 单级中断和多级中断
1.4 中断的作用
1.5 C51中断系统结构
1.6 与中断相关的计时器
1.6.1 TCON - 定时器/计数器控制寄存器(可位寻址)
1.6.2 IE - 中断允许寄存器(可位寻址)
1.6.3 IP - 中断优先级寄存器(可位寻址)
1.6.4 TMOD寄存器(不可位寻址)
1.6.4.1 详细功能说明
对于 Timer1(高4位:位7-4)
对于 Timer0(低4位:位3-0)
1.6.4.2 工作模式详解
2 示例代码
3 总结
1 写在前面
1.1 何为中断
CPU 暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中
断的地方,继续原来的工作,这样的过程称为中断。
实现这种功能的部件称为中断系统,请示 CPU 中断的请求源称为中断源。
1.2 中断优先级
微型机的中断系统一般允许多个中断源,当几个中断源同时向 CPU 请求中断,要求为它服务的时候,这就存在CPU 优先响应哪一个中断源请求的问题。通常根据中断源的轻重缓急排队,优先处理最紧急事件的中断请求源,即规定每一个中断源有一个优先级别。CPU 总是先响应优先级别最高的中断请求。
1.3 单级中断和多级中断
当 CPU 正在处理一个中断源请求的时候(执行相应的中断服务程序),发生了另外一个优先级比它还高的中断源请求。如果 CPU 能够暂停对原来中断源的服务程序,转而去处理优先级更高的中断请求源,处理完以后,再回到原低级中断服务程序,这样的过程称为中断嵌套。这样的中断系统称为多级中断系统,没有中断嵌套功能的中断系统称为单级中断系统。
1.4 中断的作用
中断技术不仅解决了快速主机与慢速 I/O设备的数据传送问题,而且还具有如下优点:
①分时操作。CPU 可以分时为多个 I/O 设备服务,提高了计算机的利用率;
②实时响应。CPU 能够及时处理应用系统的随机事件,系统的实时性大大增强;
③可靠性高。CPU 具有处理设备故障及掉电等突发性事件能力,从而使系统可靠性提高。
1.5 C51中断系统结构
C51 单片机通常有 5 个中断源,增强型的有更多。我们以标准的 8051 为例:
| 中断源 | 中断号 | 向量地址 | 说明 | 触发方式 |
|---|---|---|---|---|
| 外部中断 0 | 0 | 0x0003 | 来自 P3.2 引脚的低电平或下降沿信号 | IT0 位控制 |
| 定时器/计数器 0 | 1 | 0x000B | 定时器 0 计数回零溢出 | TF0 置 1 |
| 外部中断 1 | 2 | 0x0013 | 来自 P3.3 引脚的低电平或下降沿信号 | IT1 位控制 |
| 定时器/计数器 1 | 3 | 0x001B | 定时器 1 计数回零溢出 | TF1 置 1 |
| 串行口中断 | 4 | 0x0023 | 串行通信完成一帧数据发送或接收 | RI 或 TI 置 1 |
-
中断源:引起中断的事件来源。
-
中断向量地址:当某个中断发生时,CPU 会自动跳转到这个固定的地址去执行代码。通常我们在这里放一条跳转指令,跳到我们写的中断服务函数。
-
中断号:在 C 语言中,我们用中断号来告诉编译器这个函数是为哪个中断服务的。
1.6 与中断相关的计时器
1.6.1 TCON - 定时器/计数器控制寄存器(可位寻址)
| 位 | 符号 | 说明 |
|---|---|---|
| 7 | TF1 | 定时器 1 溢出标志。中断响应后自动清零(也可软件清零)。 |
| 6 | TR1 | 定时器 1 运行控制位。1启动,0停止。 |
| 5 | TF0 | 定时器 0 溢出标志。中断响应后自动清零。 |
| 4 | TR0 | 定时器 0 运行控制位。1启动,0停止。 |
| 3 | IE1 | 外部中断 1 请求标志。中断响应后自动清零。 |
| 2 | IT1 | 外部中断 1 触发方式控制。1=下降沿触发,0=低电平触发。 |
| 1 | IE0 | 外部中断 0 请求标志。中断响应后自动清零。 |
| 0 | IT0 | 外部中断 0 触发方式控制。1=下降沿触发,0=低电平触发。 |
重点:IT0 和 IT1 是用来设置外部中断触发方式的。
1.6.2 IE - 中断允许寄存器(可位寻址)
这是中断的“总开关”和“分开关”控制器。
| 位 | 符号 | 说明 |
|---|---|---|
| 7 | EA | 中断总开关。1=打开总中断,0=关闭所有中断。 |
| 6 | - | 保留 |
| 5 | ET2 | 定时器 2 中断允许(在 52 子系列中)。 |
| 4 | ES | 串行口中断允许。1=允许,0=禁止。 |
| 3 | ET1 | 定时器 1 中断允许。1=允许,0=禁止。 |
| 2 | EX1 | 外部中断 1 允许。1=允许,0=禁止。 |
| 1 | ET0 | 定时器 0 中断允许。1=允许,0=禁止。 |
| 0 | EX0 | 外部中断 0 允许。1=允许,0=禁止。 |
使用中断前,必须 EA = 1,并且打开对应的分开关。
1.6.3 IP - 中断优先级寄存器(可位寻址)
如果多个中断同时发生,优先级高的先被响应。C51 有两个优先级:高和低。
| 位 | 符号 | 说明 |
|---|---|---|
| 7 | - | 保留 |
| 6 | - | 保留 |
| 5 | - | 保留 |
| 4 | PS | 串行口中断优先级控制。1=高优先级,0=低优先级。 |
| 3 | PT1 | 定时器 1 中断优先级控制。1=高优先级,0=低优先级。 |
| 2 | PX1 | 外部中断 1 优先级控制。1=高优先级,0=低优先级。 |
| 1 | PT0 | 定时器 0 中断优先级控制。1=高优先级,0=低优先级。 |
| 0 | PX0 | 外部中断 0 优先级控制。1=高优先级,0=低优先级。 |
同级优先级顺序:如果几个中断设为同一优先级,则按自然优先级顺序响应:
外部中断0 > 定时器0 > 外部中断1 > 定时器1 > 串行口中断
1.6.4 TMOD寄存器(不可位寻址)
TMOD 是一个 8 位寄存器,高4位控制 Timer1,低4位控制 Timer0。
TMOD不可位寻址(必须对整个寄存器进行读写操作)
| 位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|
| 定时器 | Timer1 | Timer0 | ||||||
| 功能 | GATE | C/T | M1 | M0 | GATE | C/T | M1 | M0 |
1.6.4.1 详细功能说明
对于 Timer1(高4位:位7-4)
位7:GATE1 - 门控位
功能:控制定时器1的启动方式
-
0:定时器1仅由
TR1(TCON.6)控制启动/停止 -
1:定时器1由
TR1和 外部中断引脚INT1(P3.3)共同控制-
只有当
TR1=1且INT1=1(高电平)时,定时器1才启动
-
位6:C/T1 - 定时器/计数器选择位
功能:选择定时器1的工作方式
-
0:定时器模式 - 对内部系统时钟脉冲计数
-
1:计数器模式 - 对来自 T1(P3.5)引脚的外部脉冲计数
位5:M11 和 位4:M01 - 模式选择位
功能:选择定时器1的工作模式
| M1 | M0 | 模式 | 功能说明 |
|---|---|---|---|
| 0 | 0 | 模式0 | 13位定时器/计数器(TL1低5位 + TH1 8位) |
| 0 | 1 | 模式1 | 16位定时器/计数器(TL1 8位 + TH1 8位) |
| 1 | 0 | 模式2 | 8位自动重装定时器/计数器 |
| 1 | 1 | 模式3 | 停止计数(Timer1在模式3下停止工作) |
对于 Timer0(低4位:位3-0)
位3:GATE0 - 门控位
功能:控制定时器0的启动方式
-
0:定时器0仅由
TR0(TCON.4)控制启动/停止 -
1:定时器0由
TR0和 外部中断引脚INT0(P3.2)共同控制-
只有当
TR0=1且INT0=1(高电平)时,定时器0才启动
-
位2:C/T0 - 定时器/计数器选择位
功能:选择定时器0的工作方式
-
0:定时器模式 - 对内部系统时钟脉冲计数
-
1:计数器模式 - 对来自 T0(P3.4)引脚的外部脉冲计数
位1:M10 和 位0:M00 - 模式选择位
功能:选择定时器0的工作模式
| M1 | M0 | 模式 | 功能说明 |
|---|---|---|---|
| 0 | 0 | 模式0 | 13位定时器/计数器(TL0低5位 + TH0 8位) |
| 0 | 1 | 模式1 | 16位定时器/计数器(TL0 8位 + TH0 8位) |
| 1 | 0 | 模式2 | 8位自动重装定时器/计数器 |
| 1 | 1 | 模式3 | Timer0分成两个独立的8位定时器 |
1.6.4.2 工作模式详解
模式0:13位定时器/计数器
-
结构:TLx 的低5位 + THx 的8位 = 13位计数器
-
最大计数值:2¹³ = 8192
-
特点:兼容8048定时器,现在较少使用
模式1:16位定时器/计数器(最常用)
-
结构:TLx(8位) + THx(8位) = 16位计数器
-
最大计数值:2¹⁶ = 65536
-
特点:需要手动重装初值,适用于需要较长定时的场合
模式2:8位自动重装定时器
-
结构:TLx 计数,THx 存储重装值
-
最大计数值:2⁸ = 256
-
特点:自动重装,TLx 溢出后自动从 THx 重装初值,适用于精确的波特率发生器
模式3:特殊模式
-
仅 Timer0 有效,Timer1 在模式3下停止计数
-
Timer0 被分成两个独立的8位定时器:
-
TL0:作为8位定时器/计数器,使用 Timer0 的控制位
-
TH0:作为8位定时器,使用 Timer1 的控制位(TR1、TF1)
-
2 示例代码
#include <reg51.h>#define uchar unsigned char //宏定义uchar替代unsigned char
#define uint unsigned int //宏定义uint替代unsigned intsbit LED1 = P1^0; //定义LED1针脚
sbit LED2 = P1^1; //定义LED2针脚uchar T0_Count = 0; // 定时器中断次数计数器// 函数声明
void Init_T0(void);
void Init_INT0(void);void main()
{Init_INT0(); // 初始化外部中断0Init_T0(); // 初始化定时器0LED1 = 0; // LED1熄灭LED2 = 0; // LED2熄灭while(1){// 主程序可以执行其他不相关的任务// 中断会在后台自动处理按键和定时}
}/***** 初始化外部中断0 *****/
void Init_INT0(void)
{IT0 = 1; // 下降沿触发EX0 = 1; // 允许外部中断0EA = 1; // 开总中断
}/***** 外部中断0服务函数 *****/
void INT0_ISR() interrupt 0
{LED1 = !LED1; // 按键按下,LED1状态取反
}/***** 初始化定时器0,设置为50ms *****/
void Init_T0(void)
{// 对于 12MHz 晶振,机器周期为 1us// 方式1是16位定时器,最大计数值65536// 50ms = 50000us,需要计数50000次// 因此初值 = 65536 - 50000 = 15536TMOD |= 0x01; // 设置定时器0为工作方式1 (M1=0, M0=1)TH0 = (65536 - 50000) / 256; // 设置定时初值高8位TL0 = (65536 - 50000) % 256; // 设置定时初值低8位ET0 = 1; // 允许定时器0中断TR0 = 1; // 启动定时器0EA = 1; // 开总中断 (已在Init_INT0中打开,这里再强调一下)
}/***** 定时器0中断服务函数 *****/
void T0_ISR() interrupt 1
{// 进入中断后需要重装初值TH0 = (65536 - 50000) / 256;TL0 = (65536 - 50000) % 256;T0_Count++; // 中断次数加1if(T0_Count == 20) // 50ms * 20 = 1000ms = 1s{T0_Count = 0; // 计数器清零LED2 = !LED2; // 1秒到,LED2状态取反}
}
3 总结
| 寄存器 | 主要功能 | 是否位寻址 |
|---|---|---|
| TMOD | 设置定时器工作模式 | 否 |
| TCON | 控制定时器启动/停止,标志溢出 | 是 |
| THx/TLx | 存储定时器计数值 | 是 |
| IE | 控制定时器中断使能 | 是 |
| IP | 设置定时器中断优先级 | 是 |
关键要点:
-
使用定时器前必须正确配置 TMOD
-
启动定时器需要设置 TRx = 1
-
使用中断需要开启 EA 和 ETx
-
模式1需要手动重装初值,模式2自动重装
-
定时器配置要注意不影响另一个定时器的设置
掌握这些寄存器是使用 C51 单片机定时器的关键!
撒花~~~
