基于C51的中断控制

🐋 前言:中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的。单片机中断(Interrupt)是硬件驱动事件,它使得CPU暂停执行当前的主程序,转而去执行一个中断服务子程序。如果单片机没有中断系统,单片机的大量时间可能会浪费在是否有服务请求发生的定时查询操作上。采用中断技术完全消除了单片机在查询方式 中的等待现象,大大地提高了单片机的工作效率和实时性。


🐬 目录:


一、中断请求

中断系统是单片机中一个重要功能。我们要能够熟练地掌握应用中断,首先需要对相关概念有深入且准确的理解,即必须对以下问题有深刻的认识。

🐪 1.1 什么是中断?
❄️ 当中央处理器CPU正在执行主程序的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方继续原来的工作,这样的过程称为中断

❄️ 对于单片机来讲,中断是指 CPU 在处理某一事件 A 时,发生了另一事件 B, 请求 CPU 迅速去处理(中断发生);CPU 暂时停止当前的工作(中断响应), 转去 处理事件 B(中断服务);待 CPU 将事件 B 处理完毕后,再回到原来事件 A 被 中断的地方继续处理事件 A(中断返回),这一过程称为中断。

❄️ 为了能让大家更容易理解中断概念, 我们先来举一个生活事例: 你打开火, 烧上一壶水。然后去洗衣服,在洗衣服的过程中,突然听到水壶发出水开的报警 声,这时,你停止洗衣服动作,立即去关掉火,然后将开水灌入暖水瓶中,灌完 开水后,你又回去继续洗衣服。这个过程中实际上就发生了一次中断。
在这里插入图片描述

🐪 1.2 什么是中断系统?
单片机在执行程序时其程序流程图如下:
在这里插入图片描述
如上图,当外部发生中断事件(中断源)请求CPU处理,CPU暂停运行当前运行程序A,转而去运行该处理该事件的中断服务程序B,对该事件处理完毕后,再回到原来被中断的地方(断点)继续运行原来的程序A。实现上述中断功能的部件称为中断系统。

🐝 1.2.1 有哪些中断源会引起单片机的中断请求?
STC89C5X系列单片机提供了至少5 个中断请求源,它们分别是:外部中断 0( INT0 ‾ \overline{\text{INT0}} INT0)、外部中断 1( INT1 ‾ \overline{\text{INT1}} INT1)、定时/计数器0(T0) 、定时/计数器 1(T1) 、定时器 2 中断、串口(UART)中断。

🐝 1.2.2 上述中断源怎样触发中断请求?【重要】

在这里插入图片描述
回顾GPIO口P3引脚,P3的每一个引脚除了作为基本输入输出引脚,还会有第二功能。可以看到P3.2和P3.3可作为中断的事件源,它们的某些状态会导致中断请求的发生。

中断源符号名称中断引起原因中断号中断向量地址
INT0 ‾ \overline{\text{INT0}} INT0外部中断0P3.2引脚低电平或下降沿信号00003H
INT1 ‾ \overline{\text{INT1}} INT1外部中断1P3.3引脚低电平或下降沿信号20013H
T0定时器0中断定时/计数器0计数回0溢出1000B
T1定时器1中断定时/计数器1计数回0溢出3001B
T1/R1串行口中断串行通信完成一帧数据发送或接收引起中断40023H

开中断情况下(特殊寄存器某位为1),当P3.2所连接的物理器件状态发生变化,导致读取到P3.2引脚为低电平(例如按键)或下降沿信号,则向CPU发送中断号为0的中断请求,若CPU响应该中断,则跳转地址0x0003(或许有不同,详细地址参看单片机参考手册)处执行其中断服务函数。其他中断请求可按照上表自行推断。

🐝 1.2.3 用户怎样控制中断系统
中断功能是否开启、设置启用哪个中断、中断的触发方式、当多个中断请求发生,CPU响应中断的顺序都是由单片机内部的一些特殊功能寄存器来决定的。用户通过对相应寄存器位进行设置,就能操作中断系统。
单片机特殊寄存器数据如下(后文会有详细操作,此处只例举常用的两个寄存器):
在这里插入图片描述

🌙 中断允许控制寄存器IE
CPU 对中断系统所有中断以及某个中断源的开放和屏蔽是由 中断允许寄存器 IE 控制的,IE寄存器中具体位代表功能如下:

76543210
字节地址:A8HEA-ET2ESET1EX1ET0EX0IE

EX0(IE.0) ,外部中断 0 允许位。EX0=1,允许中断;EX0=0,禁止中断;
ET0(IE.1) ,定时/计数器 T0 中断允许位;ET0=1,允许T0中断;ET0=0,禁止T0中断;
EX1(IE.2) ,外部中断 0 允许位;EX1=1,允许外部中断1中断;EX1=0,禁止外部中断1中断;
ET1(IE.3) ,定时/计数器 T1 中断允许位;ET1=1,允许T1中断;ET1=0,禁止T1中断;
ES(IE.4) ,串行口中断允许位;ES=1,允许串行口1中断;ES=0,禁止串行口1中断;
ET2(IE.5),定时/计数器T2的溢出中断允许位;ET2=1,允许T2中断;ET2=0,禁止T2中断;
EA (IE.7) , CPU 中断允许(总允许)位;EA=1,CPU开放中断,EA=0,CPU屏蔽所有的中断申请。EA的作用是使中断允许形成两级控制。即各中断源首先受EA控制,其次还受各中断源自己的中断允许控制位控制。

🌙 中断请求控制寄存器TCON
TCON为定时器/计数器T0、T1的控制寄存器,同时也锁存T0、T1溢出中断源和外部请求中断源等。

76543210
字节地址:88HTF1TR1TF0TR0IE1IT1IE0IT0TCON

IT0(TCON.0),外部中断 0 触发方式控制位。IT0=0, INT0 ‾ \overline{\text{INT0}} INT0/P3.2引脚上的低电平可触发外部中断0.IT0=1,外部中断0为下降沿触发方式。
IE0(TCON.1),外部中断 0 中断请求标志位( INT0 ‾ \overline{\text{INT0}} INT0/P3.2)。IE0=1外部中断0向CPU请求中断,当CPU响应外部中断时,由硬件清零IE0(边沿触发方式)。
IT1(TCON.2),外部中断 1 触发方式控制位。IT1=0, INT1 ‾ \overline{\text{INT1}} INT1 /P3.3引脚上的低电平信号可触发外部中断1.IT1=1,外部中断1为下降沿触发方式。
IE1(TCON.3),外部中断 1 中断请求标志位。 ( INT1 ‾ \overline{\text{INT1}} INT1/P3.3).IE1=1,外部中断向CPU请求中断,当CPU响应该中断时硬件清零IE1。
TR0(TCON.4), 定时器0的运行控制位。
TF0(TCON.5),定时/计数器 T0 溢出中断请求标志位。 T0被允许计数以后,从初值开始加1计数。当产生溢出时,由硬件置"1"TF0,向CPU请求中断,一直保持CPU响应该中断时,才由硬件清零。
TR1(TCON.6),定时器1的运行控制位
TF1(TCON.7),定时/计数器 T1 溢出中断请求标志位。T1被允许计数以后,从初值开始加1计数。当产生溢出时由硬件置"1"TF1,向CPU请求中断,一直保持到CPU响应中断时,才由硬件清"0".

二、中断响应

CPU响应中断的三个条件为:
⛅️ 中断源有中断请求
⛅️ 此中断的中断允许位为1
⛅️ CPU开中断(即EA = 1)

当满足以上三个条件,中断系统将会运行,做出中断处理操作

二、中断处理

🍁 基于C51实现外部中断处理(待完成)
🍁 基于C51实现定时/计数器中断处理(待完成)
🍁 基于C51实现串口中断处理(待完成)


感谢观看,如对内容有疑惑或补充,欢迎留言讨论,共同进步!!!

在这里插入图片描述

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是基于 C51 单片机的串口中断控制 LED 的代码: ```c #include <reg52.h> // 定义 LED 灯连接的 IO 口 sbit LED = P1^0; // 定义串口接收到的字符变量 unsigned char ch; void main() { // 定义串口参数 TMOD = 0x20; // 定时器1工作在方式2(8位自动重装载) TH1 = 0xfd; // 波特率为9600,定时器1初值为0xfd SCON = 0x50; // 串口工作在模式1(8位数据,可变波特率) TR1 = 1; // 启动定时器1 // 开启总中断和串口中断 EA = 1; ES = 1; while(1) { // 循环等待串口接收到数据 } } // 串口中断服务函数 void serial() interrupt 4 { if(RI) { // 接收到数据 ch = SBUF; RI = 0; // 根据接收到的字符控制 LED 灯 if(ch == '1') { LED = 1; } else if(ch == '0') { LED = 0; } // 发送接收到的数据 SBUF = ch; while(!TI); // 等待发送完成 TI = 0; } } ``` 在这个代码中,我们通过串口中断来接收数据,并根据接收到的字符控制 LED 灯。当接收到字符 `1` 时,LED 灯亮起;当接收到字符 `0` 时,LED 灯熄灭。同时,我们也会将接收到的数据再次通过串口发送出去。 需要注意的是,在使用串口之前,需要先设置好串口的参数,包括波特率、数据位数、停止位等等。在这个代码中,我们使用了9600波特率,8位数据,无校验位,1位停止位的参数设置。 另外,在使用串口时,需要开启串口中断和总中断。在这个代码中,我们在 `main` 函数中开启了总中断和串口中断。当串口接收到数据时,会触发串口中断服务函数 `serial`。在 `serial` 函数中,我们通过判断 `RI` 的值来确定是否接收到了数据,并根据接收到的数据控制 LED 灯的状态。同时,我们也会将接收到的数据再次通过串口发送出去。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值