单片机-89C51部分:7、中断

飞书文档https://x509p6c8to.feishu.cn/wiki/A5gcwyL5giq1JOkkcsscn8eLnzf

一、中断的作用

中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的,中断功能的存在,很大程度上提高了单片机处理外部或内部事件的能力。它也是单片机最重要的功能之一,是我们学习单片机必须要掌握的。

为了能让大家更容易理解中断概念, 我们先来举一个生活事例:

你打开火,烧上一壶水。然后去洗衣服,在洗衣服的过程中,突然听到水壶发出水开的报警声,这时,你停止洗衣服动作,立即去关掉火,然后才回去继续洗衣服。
这个过程中实际上就发生了一次中断。对于单片机来讲,中断是指 CPU 在处理某一事件 A 时,发生了另一事件 B,请求 CPU 迅速去处理(中断发生);CPU 暂时停止当前的工作(中断响应), 转去处理事件 B(中断服务);待 CPU 将事件 B 处理完毕后,再回到原来事件 A 被中断的地方继续处理事件 A(中断返回),这一过程称为中断。

二、那中断是如何解决实际问题的呢?

回到按键章节,如果我们在while循环中,没有耗时的代码需要执行,这段代码是能够实时记录按键值的,但如果我们的程序设计复杂后,有耗时的任务需要处理,例如下方的Delay1ms(20000);延时20s,那在这20s内我们按下按键,芯片就无法读取到信号的变化了。

#include <reg52.h>sfr P4    = 0xe8;                   //for 89C5xRC/RD+ series and 90C5xRc/RD+, location at 0E8H
sbit INT2 = P4^3;
sbit INT3 = P4^2;sfr XICON = 0xc0;                   //for 89C5xRC/RD+ series and 90C5xRc/RD+, location at 0C0H
sbit PX3  = XICON^7;
sbit EX3  = XICON^6;
sbit IE3  = XICON^5;
sbit IT3  = XICON^4;
sbit PX2  = XICON^3;
sbit EX2  = XICON^2;
sbit IE2  = XICON^1;
sbit IT2  = XICON^0;sbit key1 = P4^3;
sbit led1 = P2^7;void delay_ms(unsigned int xms)   //@12MHz
{unsigned int i, j;for(i=xms;i>0;i--){for(j=124;j>0;j--){}}
}void main()
{while(1){//当按键按下时灯切换if(key1 == 0){led1= ~led1;delay_ms(1000);}delay_ms(20000);}               
}

这时候,我们就需要用中断的功能,帮我们实时记录。

三、51单片机的中断

STC89C5X 系列单片机提供了 8 个中断请求源,它们分别是:外部中断O(INT0)、外部中断 1(INT1)、外部中断 2(INT2)、外部中断 3(INT3)、定时器 0中断、定时器 1 中断、定时器 2 中断、串口(UART)中断。

外部中断:由外部引脚触发的中断

定时器中断:由定时器触发的中断

串口中断:通讯过程中发送或接收数据完毕触发的中断

外部中断

这个章节我们先来看下外部中断,也就是INT0、INT1、INT2、INT3。

下面这个框图很重要,它会给我们介绍,如果我们需要使用单片机的某个中断,需要配置哪些寄存器,我们通过框图、再结合寄存器表格和示例程序,就能知道怎么使用单片机中断。

中断寄存器

TCON.0/IT0:中断触发行为设置

IE0:外部中断0请求源,IE0=1外部中断向CPU请求中断,中断响应后,IE0=0

不需要手动设置,由CPU处理即可。

EX0:外部中断0允许寄存器

EA:总中断允许寄存器

中断初始化

void exti0_init(void)
{IT2=1;//触发方式:下降沿EX2=1;//打开 INT2 的中断允许EA=1;//打开总中断
}

中断服务程序(回调函数)

//在中断函数中 exti0 是函数名,可自定义,interrupt 是一个关键字,表示 51 单片机中断。
//后面的“0”是中断号
//外部中断 0 中断号为 0
//定时器中断0,中断号为1
//外部中断 1,则中断号为 2。
void exti0() interrupt 0 //外部中断 0 中断函数
{//执行所需的功能
}

外部中断代码:

#include <reg52.h>sfr P4    = 0xe8;                   //for 89C5xRC/RD+ series and 90C5xRc/RD+, location at 0E8H
sbit INT2 = P4^3;
sbit INT3 = P4^2;sfr XICON = 0xc0;                   //for 89C5xRC/RD+ series and 90C5xRc/RD+, location at 0C0H
sbit PX3  = XICON^7;
sbit EX3  = XICON^6;
sbit IE3  = XICON^5;
sbit IT3  = XICON^4;
sbit PX2  = XICON^3;
sbit EX2  = XICON^2;
sbit IE2  = XICON^1;
sbit IT2  = XICON^0;sbit key1 = P4^3;
sbit led1 = P2^7;void delay_ms(unsigned int xms)   //@12MHz
{unsigned int i, j;for(i=xms;i>0;i--){for(j=124;j>0;j--){}}
}void exit2() interrupt 6
{//当按键按下时灯切换if(key1 == 0){led1= ~led1;delay_ms(1000);}
}void main()
{IT2 = 1; //设置中断触发条件为下降沿EX2 = 1; //运行中断2经过EA = 1;  //使能中断while(1){delay_ms(20000);}               
}

要注意:

标准的单片机头文件reg52.h是没有P4,我们可以参考工具自行添加。

中断优先级

每一个中断的优先级别均可用软件设置。高优先级的中断请求可以打断低优先级的中断,反之,低优先级的中断请求不可以打断高优先级及同优先级的中断。当两个相同优先级的中断同时产生时,将由查询次序来决定系统先响应哪个中断。

默认情况下所有中断优先级被设置为最高优先级3,当系统开启了多个中断,根据具体的业务设置对应的优先级即可。例如系统开启了外部中断INT0和INT1,默认情况下INT0的优先级是比INT1要高的,假设系统触发了INT0,INT0在执行中断服务程序时,INT1将不会被及时响应。
主任务:洗衣服
INT0:女朋友来电
INT1: 厨房着火
如果不修改中断优先级,在INT0执行的时候,INT1将不会被响应。
所以我们需要降低INT0的优先级,设置PX0H=0 PX0=0,把优先级降到0,同时INT1的PX1H=1 PX1=1,这样就能保证在INT0执行的时候,INT1也能被及时响应。

IP XICON IPH 中断优先级控制寄存器

IP、IPH - PX0H PX0

0b0000 0001

0b0100 0000

0*8+1*4+0*2+0*1 = 4

0*8+0*4+0*2+0*1=0

0x40

注意:

IPH这个寄存器是不可位寻址的,
如要想让PX0H这位置一的话,直接 PX0H=1;这个写法是错误的,因为它不能位寻址。
只能 IPH= 0x01(0000 0001)

//STC单片机的中断优先级需要设置IP和IPH寄存器,IP寄存器可以位操作,IPH只能寄存器操作
//优先级也可以不设置,默认的中断优先级就是0,因为复位之后IPH和IP寄存器默认值就是0
PX0 = 1;
IPH =
0x01;

0x0116进制的表示

在Keil C51中数不能直接以二进制形式赋值,所以需要设置寄存器某一位为1,用10进制或16进制显示,这里涉及到进制转换:

一个寄存器8位,相当于一个字节。

十进制:十进制是我们平常使用的数字系统,包含0到9这10个数字。

二进制:二进制是一种数值表示方式,只包含0和1两个数字。常常这样表示:0b0000 0000

十六进制:十六进制是一种数值表示方式,包含0到9和A到F这16个数字,常常这样表示0x01

A可以理解为十进制的10,B=11,C=12,D=13,E=14,F=15

二进制

二进制转十六进制

十六进制

十进制

0b0000 0001

0*8+0*4+0*2+0*1=0

0*8+0*4+0*2+1*1=1

0x01

0×16¹+1×16⁰

0×16+1×1 = 1

1

0b0000 0100

0*8+0*4+0*2+0*1=0

0*8+1*4+0*2+0*1=4

0x04

0×16¹+4×16⁰

0×16+4×1 = 4

4

0b0001 0000

0*8+0*4+0*2+1*1=1

0*8+0*4+0*2+0*1=0

0x10

1×16¹+0×16⁰

1×16+0×1 = 16

16

0b0001 1111

0*8+0*4+0*2+1*1=1

1*8+1*4+1*2+1*1=15=f

0x1f

1×16¹+f×16⁰

f=15

1×16+15×1 = 31

31

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/77590.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

0805登录_注册_token_用户信息_退出-网络ajax请求2-react-仿低代码平台项目

文章目录 1 JWT1.1 JWT结构1.2 工作流程1.3 优点1.4 缺点1.5 安全实践1.6. 适用场景1.7 JWT与OAuth2**8. 示例代码&#xff08;Node.js&#xff09;** 2 用户mock和api3 注册4 登录5 token存储6 请求拦截器设置token6 获取用户信息7 退出登录结语 1 JWT JSON Web Token&#x…

大模型入门

一、模型入门路径 1. 学习预备知识 编程语言&#xff1a;熟练掌握Python编程语言&#xff0c;包括基本语法、数据结构&#xff08;列表、字典、元组等&#xff09;、面向对象编程、文件操作等。Python有丰富的机器学习和深度学习库&#xff0c;方便进行大模型的开发和实验。数…

把dll模块注入到游戏进程的方法_插APC注入

一、概述 APC是异步过程调用,系统创建线程的时候会为线程创建一个APC队列,当线程调用SleepEx,WaitSingleObjectEx等函数时,并把线程状态被设置为可提醒状态时,线程并不会睡眠,而是检查APC队列是否为空,如果不为空,转去执行APC队列中的每一项,因此给目标进程中的线程插…

git 如何清空当前分支的历史提交记录,仅保留最后一次提交

本方法基于新建 Git 孤立分支实现&#xff1a; 1. ​​首先检出待清理的分支 在 IDEA 右下角检查当前分支名称 或执行 git branch 确认。如果不在目标分支上&#xff0c;会显示 (HEAD detached at xxxxx)&#xff0c;这时需要先切换分支&#xff1a; git checkout 原分支名 2.…

【C++】Googletest应用

Googletest 1 配置 使用cmake配置&#xff1a; 具体文件后面上传补充 ./test.out --gtest_filterXXXTest.xxx 2 gdb 为了跟踪流程&#xff0c;可以使用gdb&#xff1b; gdb ./xxx.out gdb --args ./gtest --gtest_filterxxx.xxx设置运行参数 set args --gtest_filterxxx.…

JavaScript:从DOM概述到window对象的常见事件

一、BOM概述 1.BOM的概念 BOM&#xff08;Browser Object Model&#xff09;即浏览器对象模型&#xff0c;它提供了独立于内容而与浏览器窗口进行交互的对象&#xff0c;其核心对象是window 2.BOM的构成 BOM比DOM更大&#xff0c;它包含DOM window对象是浏览器的顶级对象&a…

qobject与event事件应用

int main(int argc, char *argv[]) {QApplication a(argc, argv);MyWidget mainWidget;mainWidget.setWindowTitle("QObject与事件处理示例");mainWidget.resize(200, 200);mainWidget.show();return a.exec(); }QApplication a(argc, argv);&#xff1a;创建 QAppli…

QTableView复选框居中

目录 方法一&#xff1a;QSS方法2:自定义复选框委托类一、构造函数 CheckBoxDelegate()二、paint() 方法三、editorEvent() 方法四、关键设计要点五、扩展应用场景六、代码示例&#xff08;补充&#xff09; 方法一&#xff1a;QSS QTableView::indicator {position: relative…

基于QT的仿QQ音乐播放器

一、项目介绍 该项目是基于QT开发的⾳乐播放软件&#xff0c;界面友好&#xff0c;功能丰富&#xff0c;主要功能如下&#xff1a; 窗口hand部分&#xff1a; 点击最小化按钮&#xff0c;窗口最小化 点击最大化按钮&#xff0c;窗口最大化 点击关闭按钮&#xff0c;程序退出 …

SQL知识点合集---第二弹

数据一 <select id"listPositionAuditCheckSample" resultType"net.nxe.cloud.content.server.entity.PositionAuditCheckSample"><trim prefixOverrides"union all"><if test"userSampleCount ! null and userSampleCount…

【QT】QT控制硬件

QT控制硬件 1.上位机程序开发2.具体例子控制led灯3. linux中的函数跟QT类里面的函数同名&#xff0c;发生冲突4.示例代码 1.上位机程序开发 QT做一个上位机程序&#xff0c;控制底层的硬件设备(下位机) 总结&#xff1a; 在构造函数里面去初始化&#xff0c;打开硬件驱动在析…

Flutter介绍、Flutter Windows Android 环境搭建 真机调试

目录 Flutter介绍 Windows 环境搭建 1.安装配置JDK 2.下载安装Android Studio 3.下载配置Flutter SDK ​4.运行Flutter doctor命令检测环境是否配置成功 ​5.打开Android Studio安装Flutter/Dart 插件 ​6.插件运行Flutter项目 ​编辑 Flutter Android真机调试 Flut…

Android Studio 中使用 SQLite 数据库开发完整指南(Kotlin版本)

文章目录 1. 项目准备1.1 创建新项目1.2 添加必要依赖 2. 数据库设计3. 实现数据库3.1 创建实体类 (Entity)3.2 创建数据访问对象 (DAO)3.3 创建数据库类 4. 创建 Repository5. 创建 ViewModel6. 实现 UI 层6.1 创建笔记列表 Activityactivity_notes_list.xmlNotesListActivity…

Vue基础(7)_计算属性

计算属性(computed) 一、使用方式&#xff1a; 1.定义计算属性&#xff1a; 在Vue组件中&#xff0c;通过在 computed 对象中定义计算属性名称及对应的计算函数来创建计算属性。计算函数会返回计算属性的值。 2.在模板中使用计算属性&#xff1a; 在Vue的模板中&#xff0c;您…

辛格迪客户案例 | 华道生物细胞治疗生产及追溯项目(CGTS)

01 华道&#xff08;上海&#xff09;生物医药有限公司&#xff1a;细胞治疗领域的创新先锋 华道&#xff08;上海&#xff09;生物医药有限公司&#xff08;以下简称“华道生物”&#xff09;是一家专注于细胞治疗技术研发与应用的创新型企业&#xff0c;尤其在CAR-T细胞免疫…

[26] cuda 应用之 nppi 实现图像格式转换

[26] cuda 应用之 nppi 实现图像格式转换 讲述 nppi 接口定义通过nppi实现 bayer 格式转rgb格式官网参考信息:http://gwmodel.whu.edu.cn/docs/CUDA/npp/group__image__color__debayer.html#details1. 接口定义 官网关于转换的原理是这么写的: Grayscale Color Filter Array …

2025“钉耙编程”中国大学生算法设计春季联赛(8)10031007

题目的意思很好理解找从最左边到最右边最短路&#xff08;BFS&#xff09; #include <bits/stdc.h> using namespace std; int a[510][510]; // 存储网格中每个位置是否有障碍&#xff08;1表示有障碍&#xff0c;0表示无障碍&#xff09; int v[510][510]; // 记录每…

【Linux】第十一章 管理网络

目录 1.TCP/IP网络模型 物理层&#xff08;Physical&#xff09; 数据链路层&#xff08;Date Link&#xff09; 网络层&#xff08;Internet&#xff09; 传输层&#xff08;Transport&#xff09; 应用层&#xff08;Application&#xff09; 2. 对于 IPv4 地址&#…

python_股票月数据趋势判断

目录 前置 代码 视频&月数据 前置 1 A股月数据趋势大致判断&#xff0c;做一个粗略的筛选 2 逻辑&#xff1a; 1&#xff09;取最近一次历史最高点 2&#xff09;以1&#xff09;中最高点为分界点&#xff0c;只看右侧数据&#xff0c;取最近一次最低点 3&#xf…

Python PyAutoGUI库【GUI 自动化库】深度解析与实战指南

一、核心工作原理 底层驱动机制&#xff1a; 通过操作系统原生API模拟输入使用ctypes库调用Windows API/Mac Cocoa/Xlib屏幕操作依赖Pillow库进行图像处理 事件模拟流程&#xff1a; #mermaid-svg-1CGDRNzFNEffhvSa {font-family:"trebuchet ms",verdana,arial,sans…