普中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 详细功能说明

1.6.4.2 工作模式详解

2 硬件电路

3 示例代码

4 总结


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 为例:

中断源中断号向量地址说明触发方式
外部中断 000x0003来自 P3.2 引脚的低电平或下降沿信号IT0 位控制
定时器/计数器 010x000B定时器 0 计数回零溢出TF0 置 1
外部中断 120x0013来自 P3.3 引脚的低电平或下降沿信号IT1 位控制
定时器/计数器 130x001B定时器 1 计数回零溢出TF1 置 1
串行口中断40x0023串行通信完成一帧数据发送或接收RI 或 TI 置 1
  • 中断源:引起中断的事件来源。

  • 中断向量地址:当某个中断发生时,CPU 会自动跳转到这个固定的地址去执行代码。通常我们在这里放一条跳转指令,跳到我们写的中断服务函数。

  • 中断号:在 C 语言中,我们用中断号来告诉编译器这个函数是为哪个中断服务的。

1.6 与中断相关的寄存器

1.6.1 TCON - 定时器/计数器控制寄存器(可位寻址)
符号说明
7TF1定时器 1 溢出标志。中断响应后自动清零(也可软件清零)。
6TR1定时器 1 运行控制位。1启动,0停止。
5TF0定时器 0 溢出标志。中断响应后自动清零。
4TR0定时器 0 运行控制位。1启动,0停止。
3IE1外部中断 1 请求标志。中断响应后自动清零。
2IT1外部中断 1 触发方式控制。1=下降沿触发,0=低电平触发。
1IE0外部中断 0 请求标志。中断响应后自动清零。
0IT0外部中断 0 触发方式控制。1=下降沿触发,0=低电平触发。

重点IT0 和 IT1 是用来设置外部中断触发方式的。

1.6.2 IE - 中断允许寄存器(可位寻址)

这是中断的“总开关”和“分开关”控制器。

符号说明
7EA中断总开关1=打开总中断,0=关闭所有中断。
6-保留
5ET2定时器 2 中断允许(在 52 子系列中)。
4ES串行口中断允许。1=允许,0=禁止。
3ET1定时器 1 中断允许。1=允许,0=禁止。
2EX1外部中断 1 允许。1=允许,0=禁止。
1ET0定时器 0 中断允许。1=允许,0=禁止。
0EX0外部中断 0 允许1=允许,0=禁止。

使用中断前,必须 EA = 1,并且打开对应的分开关。

1.6.3 IP - 中断优先级寄存器(可位寻址)

如果多个中断同时发生,优先级高的先被响应。C51 有两个优先级:高和低

符号说明
7-保留
6-保留
5-保留
4PS串行口中断优先级控制。1=高优先级,0=低优先级。
3PT1定时器 1 中断优先级控制。1=高优先级,0=低优先级。
2PX1外部中断 1 优先级控制。1=高优先级,0=低优先级。
1PT0定时器 0 中断优先级控制。1=高优先级,0=低优先级。
0PX0外部中断 0 优先级控制。1=高优先级,0=低优先级。

同级优先级顺序:如果几个中断设为同一优先级,则按自然优先级顺序响应:
外部中断0 > 定时器0 > 外部中断1 > 定时器1 > 串行口中断

1.6.4 TMOD寄存器(不可位寻址)

TMOD 是一个 8 位寄存器,高4位控制 Timer1,低4位控制 Timer0。

TMOD不可位寻址(必须对整个寄存器进行读写操作)

76543210
定时器Timer1Timer0
功能GATEC/TM1M0GATEC/TM1M0
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 硬件电路

3 示例代码

#include <reg51.h>

#define uchar unsigned char	   //宏定义uchar替代unsigned char 
#define uint unsigned int	   //宏定义uint替代unsigned int

sbit LED1 = P2^0;	//定义LED1针脚
sbit LED2 = P2^1;	//定义LED2针脚

uchar T0_Count = 0; // 定时器中断次数计数器

// 函数声明
void Init_T0(void);
void Init_INT0(void);

void main()
{
    Init_INT0(); // 初始化外部中断0
    Init_T0();   // 初始化定时器0
    LED1 = 0;	 // LED1熄灭
    LED2 = 0;  	 // LED2熄灭

    while(1)
    {
        // 主程序可以执行其他不相关的任务
        // 中断会在后台自动处理按键和定时
    }
}

/***** 初始化外部中断0 *****/
void Init_INT0(void)
{
    IT0 = 1; // 下降沿触发
    EX0 = 1; // 允许外部中断0
    EA  = 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 = 15536
    TMOD |= 0x01;   // 设置定时器0为工作方式1 (M1=0, M0=1)
    TH0 = (65536 - 50000) / 256; // 设置定时初值高8位
    TL0 = (65536 - 50000) % 256; // 设置定时初值低8位

    ET0 = 1;        // 允许定时器0中断
    TR0 = 1;        // 启动定时器0
    EA  = 1;        // 开总中断 (已在Init_INT0中打开,这里再强调一下)
}

/***** 定时器0中断服务函数 *****/
void T0_ISR() interrupt 1
{
    // 进入中断后需要重装初值
    TH0 = (65536 - 50000) / 256;
    TL0 = (65536 - 50000) % 256;

    T0_Count++;       // 中断次数加1

    if(T0_Count == 20) // 50ms * 20 = 1000ms = 1s
    {
        T0_Count = 0;  // 计数器清零
        LED2 = !LED2;  // 1秒到,LED2状态取反
    }
}

4 总结

寄存器

主要功能

是否位寻址

TMOD

设置定时器工作模式

TCON

控制定时器启动/停止,标志溢出

THx/TLx

存储定时器计数值

IE

控制定时器中断使能

IP

设置定时器中断优先级

关键要点:

  1. 使用定时器前必须正确配置 TMOD

  2. 启动定时器需要设置 TRx = 1

  3. 使用中断需要开启 EA 和 ETx

  4. 模式1需要手动重装初值,模式2自动重装

  5. 定时器配置要注意不影响另一个定时器的设置

掌握这些寄存器是使用 C51 单片机定时器的关键!

撒花~~~

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值