51单片机的中断系统及编程(附案例)

2023-05-16

本文简单粗暴地阐述了中断的一些概念、中断源、中断寄存器各位的作用,并写出了编写一个中断函数的流程/要点。不在意细节时,可直接查看照搬“三、中断程序的编程”。

一、中断概念

中断定义(比喻):

​ A同学得知B同学今天会送一本书过来给他,但是不知道B什么时候来。所以A会一直做自己的事情,直到B发信息告诉他“我来了”才下楼拿书,而后又回去做自己的事情。

​ 如此便是中断的好处——可以让程序进行自己的工作,当有中断请求时再去执行中断服务程序,完成后继续自己的原工作。

中断的主要名词:

  1. 中断源:即何种事件可以引发中断。

  2. 中断请求:即告诉处理器,有一个中断事件出现了。

    • 发生中断后,微处理器要识别中断请求来自哪个中断源。
  3. 中断优先级:先执行哪个中断呢。

    • 同时出现多个中断请求时,处理器会按优先级从高到低依次执行中断服务程序。
  4. 中断响应:处理器接受中断至执行用户设置的程序的此段时间内发生的事情。

    • 先完成当前正在执行的指令,并保存下一条指令的地址(断点);
    • 暂停主程序的执行后,将程序执行的地址接入到中断入口地址;
    • 一般此时会在找中断入口地址的单元内写一条无条件转移指令(因为该地址仅8字节),使得程序跳转到中断服务程序中执行。
  5. 中断处理:执行中断服务程序。

  6. 中断嵌套:当前正在进行的中断服务程序,可以被更高优先级的中断请求打断。

  7. 中断返回:程序回到断点处,继续执行主程序。

二、51的中断系统

中断系统的结构:

在这里插入图片描述

中断源:

1)中断源种类:

​ 51的中断系统共有5个中断源

  • 外部中断0(INT0):由P3.2引脚输入的中断请求信号。
  • 外部中断1(INT1):由P3.3引脚输入的中断请求信号。
  • 定时器T0中断(T0):由定时器/计数器T0的定时、计数溢出产生的中断请求。
  • 定时器T1中断(T0):由定时器/计数器T1的定时、计数溢出产生的中断请求。
  • 串行口中断(ES):由串行数据发生完成(TI)或串行数据接收完成(RI)产生的中断请求。

2)中断地址入口:

​ 5个中断源有其固定的中断地址入口,编写中断服务程序时要附带对应的中断序号,以控制程序进行对应的中断响应。

中断源中断入口地址中断序号
外部中断00003H0
定时器T0000BH1
外部中断10013H2
定时器T1001BH3
串行口中断ES0023H4

中断的寄存器:

注:在<reg51.h>和<reg52.h>中,各寄存器对应的位已被定义,意味着无需宏定义便可直接进行“EA=1”之类的编程。

1)中断请求标志:

1.TCON寄存器

位:76543210
字节地址:88HTF1TR1TF0TR0IE1IT1IE0IT0

各标志位功能如下:

  1. TF0——定时器T0的溢出中断请求标志位。溢出时由硬件置1,即开始发送中断请求;单片机响应中断后,重新由硬件清0。
  2. TR0——定时器/计数器0的启动控制。功能详见定时器知识。
  3. IE0——外部中断0的中断请求标志位。触发中断时由硬件置1,即开始发送中断请求;单片机响应中断后,重新由硬件清0。
  4. IT0——外部中断0的触发方式选择位。令它为1,则对应引脚为下降沿触发中断;令它为0,则对应引脚为低电平触发方式。
  5. TF1、TR1,IE1、IT1则为定时器1、外部中断1的相关标志位,功能与上述相同。

2.SCON寄存器

位:76543210
字节地址:98HSMDSM1SM2RENTB8RB8T1R1

各标志位功能如下:

  1. TI——串行口发送完成中断请求标志位。串行口发送数据后,TI位被硬件置1;单片机响应串行口中断后,必须在服务程序中将TI手动清0。
  2. RI——串行口接收完成中断请求标志位。串行口接收数据后,TI位被硬件置1;单片机响应串行口中断后,必须在服务程序中将TI手动清0。

2)中断控制:

1.中断允许寄存器IE

位:76543210
字节地址:A8HEA--ESET1EX1ET0EX0

各位的功能如下:

  1. EA——总中断允许控制位。用来开启或屏蔽所有的中断请求,令它为1,则开放中断请求,可以响应中断;令它为0,则屏蔽所有中断请求。
  2. ES——串行口中断允许控制位。为1时开放串行口中断请求,为0时屏蔽。
  3. ET1——定时器/计数器T1中断允许控制位。为1时开放TI的中断请求,为0时屏蔽。
  4. EX1——外部中断1中断允许控制位。为1时开放外部中断1的中断请求,为0时屏蔽。
  5. ET0、EX0则为T0、外部中断0的中断允许控制位。功能与上述相同。

2.中断优先级寄存器IR

位:76543210
字节地址:B8H---PSPT1PX1PT0PX0

各位的功能如下:

  1. PS——串行口中断优先级控制位。
  2. PT1——TI中断优先级控制位。
  3. PX1——外部中断1中断优先级控制位。
  4. PT0、PX0则为T0、外部中断0的中断优先级控制位。功能与上述相同。

中断响应的条件:

  • 中断源发出有效的中断请求,相应的中断请求标志位被置1;
  • 中断允许寄存器IE中的EA=1;
  • 相应中断源的中断请求被开放,即IE中相应位被置1。

三、中断系统的编程

中断初始化:

使用中断前,必须打开中断。

EA=1;	//打开总中断,必备。
ET0=1;	//根据中断源打开相应的中断允许位,必备。

TR0=1//如果使用定时器,则记得打开定时器
EX0=1;	//如果检测外部中断,则记得选择中断触发方式

中断优先级的设置:

非必需,需要则设置寄存器IP。

中断服务程序:

void name() interrupt 1
{
    中断服务程序
}

// name是自定义的中断名字;
// interrupt必须有,表明此为中断服务程序;
// 1是中断序号,必须有。(51中有0~4号中断源)

四、应用实例

下面是使用中断控制LCD显示按键操作次数的源码,其中有关于LCD的函数、定义已被忽略。

▲重点在全局变量的应用、服务程序的编写、中断初始化函数

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char

sbit LCD=……			//LCD的有关定义
sbit key=P3^2;		//按键S4

uint num=0;		//记录按下的次数

/*函数功能:粗略延时*/
void delay(uint ms){
	uint i=0,j=0;
	for(;i<=ms;i++){
		for(;j<=110;j++);
	}
}

/*函数功能:LCD写入指令*/
void write_com(uchar command)/*函数功能:LCD写入数据*/
void write_datas(uchar datas)/*函数功能:初始化LCD*/
void init()/*函数功能:中断初始化-下降沿触发*/
void interr(){
	 EA=1;		//开总中断
	 EX0=1;		//开外部中断0
	 IT0=1;		//设定外部中断0为下降沿触发
}

void main()
{
	init();
	interr();
	while(1){
		write_com(0x80);	//将数值的显示位置固定在此
		delay(5);
		write_datas(num);		//显示按键操作次数
		delay(5);
	}
}

void key_num() interrupt 0
{
	delay(100);		//延时消抖
	if(key==0){
		if(num==4) num=0;	 /*注:先if再++,则按下超过4次*/
		num++;				 /*		后,会复位为1		 */	
	}	
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

51单片机的中断系统及编程(附案例) 的相关文章

  • sem_wait sem_post信号量操作进本函数

    sem wait sem post 信号量的数据类型为结构sem t xff0c 它本质上是一个长整型的数 函数sem init xff08 xff09 用来初始化一个信号量 它的原型为 xff1a extern int sem init
  • Windows下重启Linux子系统(WSL)

    Linux子系统 xff08 WSL xff09 是基于 LxssManager 服务运行的 重启WSL的话只需要将 LxssManager 重启即可 命令重启 以管理员权限运行cmd命令即可 停止LxssManager服务 net sto
  • Mac安装dmg程序提示无可装载的文件系统

    安装dmg程序是提示 无可装在的文件系统 1 查看SIP状态 在终端中输入csrutil status xff0c 就可以看到是 enabled 还是 disabled 2 关闭SIP 重启MAC xff0c 按住commond 43 R直
  • windows恶意软件删除工具 MRT.EXE

    MRT 是微软自Windows7开始就自带的一款绿色的恶意软件删除工具 具体路径为C WINDOWS system32 MRT exe 默认已经在系统环境变量中 所以我们直接 win 43 R 输入 mrt 即可运行 操作也极其简单 xff
  • BitLocker正在等待激活,怎样可以关闭?

    问题 xff1a 装完win10系统后有时候会显示 BitLocker正在等待激活 一直有个黄色的小锁图标看着有些头疼 xff0c 怎样才能取消启用Bitlocker呢 xff0c 也没有关闭的按钮 处理方法 控制面板 在 Bitlocke
  • PROXMOX 开源虚拟服务器系统安装及配置

    前言 说到学习Linux xff0c 在适应图形化界面后 xff0c 我们逐渐可以通过一些shell命令来操作Linux系统 xff0c 此时何曾不想多尝试几个不同的Linux系统 xff0c 但是每每安装配置虚拟机又很麻烦 xff0c 如
  • Deepin 深度操作系统安装教程

    简介 深度操作系统 deepin 是一个致力于为全球用户提供美观易用 安全稳定服务的Linux发行版 xff0c 同时也一直是排名最高的来自中国团队研发的Linux发行版 xff0c 下面我们开始从下载镜像到安装系统一步步进行讲解 系统下载
  • 香橙派 OrangPi PC 安装Lakka游戏系统及使用指南

    香橙派 Orange Pi PC Orange Pi PC 采用了全志四核A7高性能处理器Allwinner H3 xff0c 集成以太网 DC电源输入 视频 音频输出等接口 xff0c 支持HDMI AVOUT视频输出等功能 尽管体积很小
  • 我把华为云的Ubuntu 18.04升级到了Ubuntu 22.04

    华为云建站有些年头了 xff0c 当时装的是ubuntu18 04 xff0c 停止维护更新日期是2023年4月 xff0c 只剩半年时间就该停服了 xff0c 这么看来是时候升级以下系统版本了 xff0c 不然升级版本都可能会有问题 由于
  • Ubuntu Budgie 22.04 设置中文语言并安装拼音输入法

    之前将ubuntu server 22 04 安装了 Budgie Desktop 桌面环境 xff0c 系统语言是英文的 xff0c 如果要作为桌面使用还有些不适应 xff0c 我们要如何将系统语言切换为中文并支持中文输入呢 xff1f
  • OpenKylin常用软件安装

    由于OpenKylin仍处于测试阶段 xff0c 应用商店软件并不全 xff0c 所以很多软件的安装非常麻烦 xff0c 以下列出了一些常用软件的安装方法 需要的童鞋可以直接复制命令后进行安装 xff0c 安装软件需要使用root权限 xf
  • 利用sourceinsight宏(Quicker.em)提高编码效率和质量

    利用sourceinsight宏 Quicker em 提高编码效率和质量 Marco是sourceinsight软件一个强大的功能 xff0c 用户可以通过编写宏来实现自定义功能 这里有个比较流行的宏文件quicker em xff0c
  • Git Clone 报错 `SSL certificate problem: unable to get local issuer certificate`

    如果您在尝试克隆Git存储库时得到 SSL certificate problem unable to get local issuer certificate 的错误 这意味着Git无法验证远程存储库的SSL证书 如果SSL证书是自签名的
  • 树莓派从源码构建安装Git最新版

    1 查看Git版本 首先我们通过SSH客户端连接树莓派 在树莓派中通过查看 Git 版本信息 xff0c 我们只能看到最高版本显示为 2 30 2 xff0c 并且通过apt安装也无法将Git更新到最新版 git version sudo
  • linux安装部署免费confluence wiki

    Centos7安装部署免费confluence wiki 知识库 详细操作步骤 前言 xff1a confluence是团队协作软件 xff0c 改变团队工作方式 xff0c 作为现代化办公不可缺少的工具 wiki所需的安装包 xff1a
  • 对printf源码的分析

    对printf源码的分析 一 printf的源码如下 span class token macro property span class token directive keyword include span span class to
  • iPhone开发:可拉伸的图片

    还记得在Windows下用MFC或WTL写用户界面程序的时候 xff0c 为了给可改变大小的对话框加上背景图案 xff0c 需要对设计师提供的图片进行裁剪 把图片切成九块 xff0c 其中四个角是不拉伸的 xff0c 四条棱边可以在一个方向
  • 解决在KDE桌面环境WebStorm不能输入中文问题

    由于jetbrains官方包的问题 xff0c Fcitx5输入法文字候选托盘暂时不能更改 xff0c 如有最新解决办法 xff0c 可查看ArchWiki官方 xff0c 或者查看jetbrains官方 排查错误 cat etc loca
  • NAS如何使用SnapShot快照功能?

    Snapshot是基于Btrfs文件系统产生的快速备份和还原数据的第三方应用 xff0c 利用Snapshot为数据提供保护 xff0c 以防止因意外删除 应用程序崩溃 数据损毁和病毒所造成的数据丢失 1 TOS应用中心 xff0c 找到S
  • 备份电脑不求人,"时间机器"轻松备份你的Mac

    相比Windows 自带的系统还原功能 xff0c Mac有内置的Time Machine功能 xff0c 可以方便我们进行整机备份 xff0c 在关键时刻成为你重要数据的一颗 后悔药 xff01 Time Machine xff08 时间

随机推荐

  • NESTJS 服务化架构设计和项目搭建

    创建项目很简单 xff0c nest cli一键创建 xff0c 关键是如何基于nestjs现有能力进行架构设计 架构设计 项目背景 项目涉及的底层数据全部来自于公司的一个公共服务 jsf xff0c 该公共服务可对接口进行发布和订阅 xf
  • 视频转码 ffmpeg hevc to h264

    通过ffmpeg将hevc编码的MP4视频转码为h264编码 fmpeg i inputfile map 0 c a copy c s copy c v libx264 output mp4 顺带旋转角度也调整为0 参考 xff1a htt
  • linux下查看进程的状态 /proc/[pid]/status

    查看进程的状态 xff1a 1 查看进程的pid xff0c 以java为例 xff1a ps ef grep java 2 查看进程状态 xff1a cat proc pid status 关键字 linux root 64 localh
  • paho.mqtt.cpp交叉编译

    开发板 rk3288 43 lubuntu 16 04 主机 Ubuntu16 04 编译之前可能要安装一些软件 xff0c 可参考paho mqtt cpp文档 xff1a https github com eclipse paho mq
  • mosquitto-1.6.10 交叉编译

    openssl 1 0 2l tar gz mosquitto 1 6 10 tar gz 由于mosquitto 1 6 10版本较新 xff0c 需要选择openssl 1 0 2及较新版本 1 openssl span class t
  • C/C++ 简单debug宏函数

    span class token comment debug h span span class token macro property span class token directive hash span span class to
  • ubuntu 18.04 LTS 安装Qt qtcreator 、example

    https www cnblogs com SendBoringBackToNoWhere p 15050359 html sudo apt install qtcreator qt5 default qtbase5 examples qt
  • ubuntu 文件系统自动挂载U盘后是只读文件问题

    安装 ntfs 3g exfat fuse xff0c 之后重新挂载 apt get install ntfs 3g exfat fuse 重新挂载
  • mt7688 OpenWrt 编译

    一 OpenWrt源码下载 虚拟机 xff1a Ubuntu 16 04 LTS sudo apt install git subversion curl wget gawk git clone https git openwrt org
  • mysql trigger 使用以及与 sqlite3 trigger 比较

    一 触发事件的表与触发更新的表使用同一个表 使用情景 xff0c 表里的某行数据发生update时自动更新修改时间 updated sqlite3 3 40 0 MariaDB 10 10 2 对应 MySQL 8 1 sqlite3 up
  • 1.Linux中超频及cpufreq相关汇总

    1 蛤蟆笔记UNIX高级编程 cpufreq相关汇总 其中一些内容摘自网络 xff0c 此处蛤蟆根据自己阅读习惯和理解进行了一些汇总整理 随着 energyefficient computing 和 performance per watt
  • 双尺度与多尺度图像细节提升 python matlab

    双尺度图像分解细节提升 一副图像经过大尺度的均值滤波 公式10 后得到大尺度的基础层Bn xff0c 然后用原图减去大尺度基础层 公式11 可以得到一副小尺度的细节层Dn xff0c 然后加上原图In xff0c 图像细节得到提升 xff0
  • WSL关闭与windows的互交互(解决PATH等环境变量问题

    如果在windows和wsl中都安装了nodejs 那么由于wsl的互交互特性 npm的运行就会不太正常 以下是禁用互交互的步骤 在WSL的终端中输入 span class token keyword echo span span clas
  • 数据结构——树

    1 树的相关定义 xff08 1 xff09 树 xff1a 包含n xff08 n gt 0 xff09 个节点的有穷集合 xff0c 其中每个元素称为节点 xff08 node xff09 xff1b 有一个特定的节点被称为根节点或树根
  • Qt QImage图片透明设置(Thinkvd开发日志)

    开发Thinkvd中的player 设置透明度用的是sdl来实现的 xff0c 转换中的水印用的是png 如何设置水印的透明度 xff0c 实际上要求把图片转换成带alpha的32位即可 实现代码 xff1a 8 void ImageCom
  • 关于 win10 系统安装Geomagic Wrap 2017导致一直蓝屏重启解决方案

    学校进行专业实训 xff0c 开了一门3D打印的课程 老师要求下载Geomagic Wrap 2017 xff0c 但是凡是win10系统安装的人都出现了不同程度的蓝屏 xff0c 我的电脑更是一直蓝屏重启 xff0c 网上找了很多方法 x
  • 八数码问题完全版-是否可解判断及求解

    八数码问题 有一个3 3的棋盘 xff0c 其中有0 8 9个数字 xff0c 0表示空格 xff0c 其他的数字可以和0交换位置 求由初始状态 1 2 3 4 5 6 7 8 0 到达目标状态步数最少的解 其典型算法是广度优先搜索 xff
  • windows10-conda cmd使用时错误:‘conda‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件

    在 windows10 上装完 conda 之后 xff0c 打开 cmd 想看看 conda 的版本 xff0c 结果找不到 xff0c 于是走上了解决之路 xff0c 并做个简单的记录 错误截图 问题原因 系统 path 环境没有进行设
  • Linux下安装Qt 6

    在Linux平台下 xff0c 安装Qt xff0c 与Windows基本一致 xff0c 都是Qt在线图形化安装界面 xff0c 但是有一点不同 xff0c 需要前期环境准备 安装必需环境 Linux 的 Qt 安装程序假定主机操作系统提
  • 51单片机的中断系统及编程(附案例)

    本文简单粗暴地阐述了中断的一些概念 中断源 中断寄存器各位的作用 xff0c 并写出了编写一个中断函数的流程 要点 不在意细节时 xff0c 可直接查看照搬 三 中断程序的编程 一 中断概念 中断定义 xff08 比喻 xff09 xff1