单片机基础:什么是中断系统、中断系统如何用(附中断系统应用实例)

2023-05-16

中断系统

      • 1.前言
      • 2.什么是中断
      • 3.什么是中断系统
      • 4.中断的流程
      • 5.中断的优先级控制
      • 6.中断源
        • 外部中断
      • 7.与中断有关的特殊功能寄存器
        • 7.1.定时/计数器控制寄存器 `TCON`
        • 7.2.串行口控制寄存器 `SCON`
        • 7.3.中断允许控制寄存器 `IE`
        • 7.4.中断优先级控制寄存器 `IP`
      • 8.中断系统在实际编程中的应用
        • 8.1.实例一:中断的初始化
        • 8.2.实例二:利用中断控制LED闪烁形式
        • 8.3.实例三:多级中断控制LED不形式闪烁

1.前言

记录对51单片机中断、定时/计数器的重要知识点以及难点理解,并且举例中断在实际编程中的应用,从而加深对单片机中断、定时/计数器的理解,熟练的使用中断。

2.什么是中断

中断就是计算机在执行某一程序的过程中,由计算机系统内部或外部的某种原因而必须终止当前程序的运行先去执行相应的处理程序,然后再返回继续执行原程序

3.什么是中断系统

实现中断功能的软、硬件系统统称为中断系统。

4.中断的流程

在这里插入图片描述
即:中断请求中断响应中断处理中断返回

5.中断的优先级控制

通常情况下,一个程序中可能会有多个中断,优先级越高的中断优先执行。如果在一个中断的服务过程中,有一个优先级更高的中断插入,则当前中断暂停,前往执行优先级更高的中断。当优先级高的中断执行完毕后再返回继续执行低优先级的中断。

6.中断源

MCS-51共有五个中断源

  1. 外部中断INT0INT1
  2. 定时/计数器T0T1的溢出中断
  3. 串行口的发送和接受中断(只占用一个中断源)
中断源功能
INT0外部中断0请求,由INT0引脚(P3.2)输入。低电平/负跳变有效,中断请求标志为IE0
INT1外部中断1请求,由INT1引脚(P3.3)输入。低电平/负跳变有效,中断请求标志为IE1
T0定时/计数器0溢出中断请求,中断标志位为TF0
T1定时/计数器1溢出中断请求,中断标志位为TF1
RXD/TXD串行口中断请求,中断请求标志位TIRI

外部中断

从单片机外部引脚INT0INT1输入中断请求信号的中断。
外部中断的触发方式有两种电平触发IT0 =0跳变触发(边沿)IT0 = 1,可以通过定时/计数器控制寄存器TCON编程选择。

7.与中断有关的特殊功能寄存器

与中断有关的特殊功能寄存器一共有4个。

  1. 定时/计数器控制寄存器(TCON)、
  2. 串行口控制寄存器(SCON)、
  3. 中断允许控制寄存器(IE)、
  4. 中断优先级控制寄存器(IP)

7.1.定时/计数器控制寄存器 TCON

作用

  1. 控制定时/计数器T0T1的溢出中断
  2. 控制外部中断的触发方式.由IT0IT1控制
  3. 锁存外部中断请求标志位
位地址位定义功能
88HIT0选择外部中断0的中断触发方式。由软件控制。IT0=0为电平触发方式IT0=1为下降沿触发方式
89HIE0选择外部中断1的中断触发方式。功能与IT0相似
8AH

7.2.串行口控制寄存器 SCON

串行口的接收发送数据中断请求标志位(RITI)

位定义功能
TI串行口发送中断请求标志位。CPU每发送一帧数据,硬件置位1(TI=1),但是中断被响应时,需要在中断服务程序中通过软件对TI清零
RI串行口接受中断请求标志位。每接收一帧数据,硬件置位1(TI=1),但是中断被响应时,一样需要在中断服务程序中通过软件对TI清零

串行口中断不能由硬件自动清除中断请求标志位,需要用户通过软件进行控制清零。

7.3.中断允许控制寄存器 IE

IE是控制中断的开关,通过对IE的清0和置1操作来控制中断的屏蔽和开放。

中断允许控制寄存器IE对中断的开放与屏蔽实现两级控制,存在一个总的中断控制位EA

位定义功能
EA总中断允许控制位。当EA=0时,不允许任何中断请求。
ES串行口中断控制位。当ES=0时,不允许串行口中断;当EA=1ES=1时,允许串行口中断。
ET1定时/计数器1中断允许控制位。当ET1=0时,屏蔽T1的溢出中断;当EA=1且ET1=1时,允许T1溢出中断
ET0定时/计数器0中断允许控制位。功能与ET1相同。
EX1外部中断1的中断允许控制位。当EX1=0时,屏蔽外部中断1的中断请求;当EA=1EX1=1时,允许外部中断1的中断请求
EX0外部中断0的中断允许控制位。功能与EX1相同

若某个中断源被允许,出来IE对应位置1外,还需要总中断控制位EA置1。

实例:若允许片内两个定时/计数器中断,禁止其他中断源的中断请求,尝试编写出设置IE的响应指令

#include <reg51.h>

EX0 = 0; // 禁止外部中断0
EX1 = 0; // 禁止外部中断1
ES = 0;  // 禁止串行口中断
ET0 = 1; // 允许定时/计数器0中断
ET1 = 1; // 允许定时/计数器1中断
EA = 1;  // 总中断控制器打开

7.4.中断优先级控制寄存器 IP

位定义功能
PS串行口中断优先级控制位。PS=1,串行口中断为高优先级;PS=0,为低优先级。
PT1定时/计数器1中断优先级控制位。当PT1=0时,T1溢出中断为低优先级;当PT1=1时,T1溢出中断为高优先级。
PT0定时/计数器0中断优先级控制位。当PT0=0时,T0溢出中断为低优先级;当PT0=1时,T0溢出中断为高优先级。
PX1外部中断1的中断优先级控制位。当PX1=0时,外部中断1为低优先级;当PX1=1时,外部中断1为高优先级。
PX0外部中断0的中断优先级控制位。当PX0=0时,外部中断0为低优先级;当PX0=1时,外部中断0为高优先级。

同级内第二优先级的次序
外部中断0 > T0溢出中断 > 外部中断1 > T1溢出中断 > 串行口中断

8.中断系统在实际编程中的应用

8.1.实例一:中断的初始化

#include <reg51.h>

void init() // 中断的初始化函数
{
    EA = 1; // 总中断控制位
    ES = 1; // 串行口中断允许
    EX0 = 1; // 外部中断0允许
    EX1 = 1; // 外部中断1允许
    ET0 = 1; // 定时/计数器0中断允许
    ET1 = 1; // 定时/计数器1中断允许
    IT0 = 1; // 选择外部中断0的触发方式
    IT1 = 1; // 选择外部中断1的触发方式
}

例1:假设允许外部中断0和1中断,并设定外部中断0为高级中断,外部中断1为低级中断,外部中断0为下降沿触发方式,外部中断1为电平触发方式。试写出该程序的中断初始化程序。

#include <reg51.h>

void init() // 
{
    EA = 1; 打开中断控制
    EX0 = 1; 允许外部中断0
    EX1 = 1; 允许外部中断1
    IT0 = 1; 外部中断1采取边沿触发方式
    IT1 = 0; 外部中断0采取电平触发方式
    PX0 = 1; 外部中断0为高优先级
    PX1 = 0; 外部中断1为低优先级
}

8.2.实例二:利用中断控制LED闪烁形式

要求

用80C51单片机控制8个LED灯,在外部中断0输入引脚(P3.2)接一个开关K1。要求将外部中断0设置为下降沿触发,程序启动是8个LED以跑马灯的形式交替闪烁。每按一次开关K1,使引脚接地,产生一个下降沿触发的外部中断请求。在中断服务程序中,8个LED高四位和低四位交替闪烁5次,然后中断返回,8个LED继续以跑马灯形式闪烁。

采用Protues+Keil仿真

元器件

  • 单片机:80C51 *1
  • 开关按钮:Button *1
  • 电阻:MINRES470K *1
  • LED:LED-BLUE *8

仿真图

在这里插入图片描述
代码

#include<reg52.h>

unsigned char code table[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x00,0xff};	// 控制P2端口的状态

unsigned char i,j,k,num;

void delay()			 // 延时函数
{
	for(i = 0;i<100;i++)
	{
		for(j=0;j<200;j++)
		;
	}
}

void init()		   // 中断的初始化
{
	EA = 1;	   // 打开总中断控制
	EX0 = 1;   // 允许外部中断0
	IT0 = 1;   // 外部中断为下降沿触发方式
}


void main()	   
{
	init();
	while(1)
	{
		for(num =0;num<10;num++)
		{
			P2 = table[num];
			delay();
		}
	}
}

void int0() interrupt 0			   // 中断服务程序
{
	for(k = 0;k<5;k++){
		P2 = 0xf0;
		delay();
		P2=0x0f;
		delay();
	}
}

8.3.实例三:多级中断控制LED不形式闪烁

要求:在例2的基础上,在外部中断1输入引脚(P3.3)接一只按钮开关K2。当按下K1时,外部中断0下降沿触发方式触发,进入外部中断0服务程序,上下4个灯交替闪烁;此时按下K2,外部中断1下降沿触发方式触发,进入外部中断1服务程序,8个灯交替闪烁。当外部中断1响应完毕后,返回继续响应外部中断0,直到外部中断0响应完毕,返回执行主程序。
首先我们分析一波中断初始化函数

  1. 两个外部中断0和1。外部中断0的服务程序为上下4灯交替闪烁,外部中断1的服务程序为8灯闪烁。即EA = 1; EX0 = 1; EX1 = 1;

  2. 优先级:外部中断1 > 外部中断0 即PX1 = 1; PX0 = 0;

  3. 触发方式:都为下降沿触发。即IT0 = 1; IT1 = 1;

这样我们的中断初始化程序基本完成

void init()
{
    EA = 1;
    EX0 = 1; EX1 = 1;
    PX0 = 0; PX1 = 1;
    IT0 = 1; IT1 = 1;
}

其次我们再捯饬一下主程序

void main()	   
{
	init();
	while(1)
	{
		for(num =0;num<10;num++)
		{
			P2 = table[num];
			delay();
		}
	}
}

另外我们再搞一下外部中断0的服务程序

void int0() interrupt 0
{
	for(k = 0;k<5;k++)
    {
		P2 = 0xf0;
		delay();
		P2=0x0f;
		delay();
	}
}

最后我们再他喵的弄一下外部中断1的服务程序


void int1() interrupt 2			  // 外部中断1服务程序
{
	for(l = 0;l < 5; l++)
	{
		P2 = 0x00;
		delay();
		P2 = 0xff;
		delay();
	}
}

完整代码

#include<reg52.h>

unsigned char code table[] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f, 0x00, 0xff};	// 控制P2端口的状态

unsigned char i, j, k, l, num;

void delay()			 // 延时函数
{
	for(i = 0; i < 200; i++)
	{
		for(j = 0; j < 200; j++)
		;
	}
}

void init()		   // 中断的初始化
{
	EA = 1;
    EX0 = 1; EX1 = 1;
    PX0 = 0; PX1 = 1;
    IT0 = 1; IT1 = 1;
}

void main()	   
{
	init();
	while(1)
	{
		for(num = 0; num < 10; num++)
		{
			P2 = table[num];
			delay();
		}
	}
}

void int0() interrupt 0			   // 外部中断0中断服务程序
{
	EX0 = 0;
	for(k = 0; k < 5; k++)
	{
		P2 = 0xf0;
		delay();
		P2 = 0x0f;
		delay();
		EX0 = 1;
	}
}

void int1() interrupt 2			  // 外部中断1服务程序
{
	for(l = 0;l < 5; l++)
	{
		P2 = 0x00;
		delay();
		P2 = 0xff;
		delay();
	}
}

仿真图

在这里插入图片描述
文章来源:中断系统

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单片机基础:什么是中断系统、中断系统如何用(附中断系统应用实例) 的相关文章

随机推荐

  • 数据处理时踩坑总结【持续更新版】

    DataFrame的iterrows迭代中无法直接修改源数据 在iterrows中 xff0c 尝试使用index和row对DataFrame类型的变量直接进行更改 xff0c 但是输出时发现值没有改变 这是因为使用row 列名 修改的值是
  • 单片机串口通讯产生乱码

    64 有关串口通讯乱码 今天做了一个51单片机的proteus仿真实验 xff0c 用到串口通信 xff0c 但是无论怎么调试都是输出乱码 一般产生乱码都是因为波特率不对 xff0c 可能你所用的晶振 以及定时器T1产生的波特率 xff0c
  • Ubuntu双系统安装(一次安装成功)

    Ubuntu双系统安装主要有关键地两步 xff1a 一 制作启动硬盘 二 为Ubuntu分配磁盘空间 第二点是安装过程中非常重要的一步 制作启动硬盘 xff1a 1 下载Ubuntu LTS xff0c 可以去官网下载 2 下载UltraI
  • linux环境下,一步步教你命令行搭建自己的git服务器和客户端

    前言 xff1a 先说下我的git服务器环境 xff0c git服务端的搭建我用的是阿里的ubantu云服务器 xff0c 毕竟云服务器上可以在任何联网的电脑上访问嘛 xff0c 方便 局域网也可以 xff0c svn和git这两种最常用的
  • Windows中的WSL(子系统)开机启动配置

    常规做法 通常在Linux中开机启动可以通过 1 编辑 etc rc loacl 2 在 etc init d 下添加启动脚本 3 配置systemd 但这几种方式在子系统中无法使用 xff0c 我们可以通过Windows 间接的启动子系统
  • STM32串口控制LED灯的亮灭

    STM32中的串口控制LED灯的亮灭 xff0c 分为两种方式 xff0c 一种是直接发送数字0和1来控制灯的亮灭 xff0c 另一种是通过发送字符串来控制 我所使用的开发板主控芯片是STM32F401RET6 xff0c 主频84MHz
  • Windows使用快捷键

    Windows电脑快捷键汇总 Windows电脑快捷键汇总1 win快捷键 xff1a 2 Ctr快捷键 xff08 文本编辑使用较多 xff09 3 ALT快捷键4 shift快捷键5 FN快捷键6 常规快捷键7 指法练习 Windows
  • 基于Centos7搭建Samba服务

    准备两台安装好centos7的虚拟机 服务器端172 16 1 11 24 客户端172 16 1 12 24 root 64 server yum install samba samba client y 服务器端安装软件包 xff08
  • 【BUG】【Raspberry】解决最新版树莓派远程连接蓝/黑屏不显示问题

    文章目录 一 bug如图二 解决办法三 参考四 请教问题 一 bug如图 远程连接登陆后全蓝色 xff0c 没有树莓派桌面 二 解决办法 1 执行下面代码 xff0c 删除两个文件目录 注意 xff1a pi 替换为自己的用户名 xff01
  • 【教程】【记录】树莓派Raspberry+motion+摄像头实现拍照、录像、实时视频功能

    刚接触树莓派 xff0c 还请多多指教 目录 一 准备工作二 操作步骤1 进入设置打开摄像机模块2 拍照3 录像4 实时监控 三 总结补充文章 xff1a 一 准备工作 1 树莓派4B 2 树莓派摄像头500W像素 xff08 淘宝十几块钱
  • linux查看日志命令

    常用的几种linux查看日志的命令 一 tail n 是显示行号 xff1b 相当于nl命令 xff1b 例子如下 xff1a tail 100f localhost yyyy MM dd log 实时监控100行日志 tail n 10
  • 用c++ 的可变模板参数递归来表达 著名的斐波那契数列

    span class token macro property span class token directive keyword include span span class token string lt iostream gt s
  • debian squid透明代理简单配置

    实验环境 主机用途IP客户端10 10 100 11网关10 10 100 12 xff0c 192 168 65 160网站192 168 65 161 客户端配置 配置网关 route add default gw 10 10 100
  • Matlab中的抽象函数的求值

    Matlab中的抽象函数的求值 采用匿名函数 y 61 64 x x 2 43 2 x 8 建立匿名函数y y 4 返回当x 61 4时 xff0c y的结果 上面的命令在命令窗口可以实现 xff0c 但是在M文件中没有实现 使用matla
  • 白嫖5T空间Onedrive并搭建下载站

    更好的阅读体验欢迎访问博客白嫖5T空间Onedrive并搭建下载站 前言 白嫖一个微软E5账号不仅能自己使用office全家桶 xff0c 还能造福25个小伙伴 xff0c 何乐而不为 xff1f 这里借助onedirve的API和onei
  • 阿里云Linux(Debian) + Tomcat搭建网站

    工具 xff1a Linux 我买的是阿里云的主机Linux Debian64位的 Tomcat Java Web服务器 putty 连接远程主机的客户端 WinSCP 远程主机的可视化界面 xff0c 方便操作文件 jdk1 8 需要配置
  • 动态链接库(DLL)开发基础

    本周我的博客涉及到动态链接库的基础开发 我在刚开始学习动态链接库的开发 在网上找DLL开发基础知识教程时发现网上的资料还是太杂 xff0c 对初学者不太友好 xff0c 于是我就着手写了这篇博客 xff0c 本篇博客知识有DLL简介 DLL
  • Mybatis:使用Mybatis执行SQL多出“limit?“,原来这样就可以解决!!!

    问题展示说明 业务需要只展示分组排序后的前15条 xff0c 数据写了如下sql xff1a 启动项目访问接口后 xff0c 报如下错误 xff1a 解决办法 参考了一下MyBatis官网和其他博客发现需要清理一下之前设置过的Page缓存
  • .NET编程——利用C#实现远程桌面连接(WinForm)

    通过学习利用利用C 实现登录功能后 xff0c 本文将通过Visual Studio 2019运行实现远程桌面连接 目录 引言 前期准备 连接固定计算机 连接指定计算机 可能遇到的问题 引言 实现远程桌面有一个大前提是不可忽略的 xff0c
  • 单片机基础:什么是中断系统、中断系统如何用(附中断系统应用实例)

    中断系统 1 前言2 什么是中断3 什么是中断系统4 中断的流程5 中断的优先级控制6 中断源外部中断 7 与中断有关的特殊功能寄存器7 1 定时 计数器控制寄存器 96 TCON 96 7 2 串行口控制寄存器 96 SCON 96 7