当前位置: 首页 > news >正文

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

中断源中断号向量地址说明触发方式
外部中断 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 示例代码

#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

设置定时器中断优先级

关键要点:

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

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

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

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

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

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

撒花~~~

http://www.dtcms.com/a/589095.html

相关文章:

  • 二十六、STM32的ADC(DMA+ADC)
  • 网站开发的著作权和版权网站品牌推广
  • 【Docker】docker compose
  • 4.1.8 【2022 统考真题】
  • 深圳网站设计官网番禺人才网上
  • Tailwind CSS的Flex布局
  • 深入解析 LeetCode 1:两数之和
  • 重庆网站制作福州嘉兴网络科技有限公司
  • OpenCV(二十二):图像的翻转与旋转
  • 权限维持:操作系统后门技术分析与防护
  • 网闸与防火墙:构建纵深防御的“门卫”与“断桥”
  • 室内设计找工作网站wordpress app源码
  • 河北seo网站优化公司光辉网站建设
  • android 网络访问拦截器使用后的bug处理
  • mysql视图和存储过程
  • VRRP的补充
  • 天津 交友 网站建设自建网站做外贸谷歌推广
  • Young GC 的触发时机
  • 专业做网站照片免费咨询法律律师电话号码
  • GAN vs. VAE:生成对抗网络 vs. 变分自编码机
  • Docker打包步骤
  • 【数据集+源码】基于yolov11+streamlit的玉米叶片病虫害检测系统
  • VP8 是什么?
  • Rust底层编程:安全与性能的完美平衡
  • 如何删除自己建的网站无忧网站建设公司
  • HTTP-大文件传输处理
  • [linux仓库]线程同步与生产者消费者模型[线程·陆]
  • 【算法】day17 多维动态规划
  • 网站建设费算什么费用山东青岛网站建设seo优化
  • 【复习】计网每日一题1109---iBGP、AS