单片机原理及应用:中断服务函数

承接上文,今天我们来学习一下中断服务函数,对中断不了解的朋友可以回顾一下笔者之前的文章

中断系统结构与控制寄存器

中断服务函数是嵌入式系统中用于处理中断事件的函数,在原版的C语言中并不存在。当发生中断事件时,系统将会跳转到相应的中断服务函数来处理该事件。

中断服务函数的调用过程可以参照一般的函数调用,但两者之间也是有区别的:
  • 一般函数的调用在程序中是事先安排好的,何时调用中断服务函数事先却无法确定,因为中断的发生是由外部因素决定的,程序中无法事先安排调用语句,因此调用中断服务函数的过程是由硬件自动完成的。换而言之,我们并不需要像之前点亮LED或数码管那样在主程序里补充一条LED_ function()来调用封装函数,中断服务函数在控制寄存器允许的情况下会自动执行。
  • 中断函数具有特殊关键字interrupt,这也导致中断函数的定义方法也与普通函数不同。

定义语法如下:函数类型 函数名 (形式参数)[interrupt n] [using m]

函数类型多为void,就笔者目前所学而言,中断函数不需要返回值;函数名自拟,其后的形式参数为空;关键字interrupt表示中断,其后的n对应中断源的编号,5个中断源编号根据优先级从小到大排序,如下表所示
中断编号中断源
0外部中断0
1定时/计数器0溢出中断
2外部中断1
3定时/计数器1溢出中断
4串行口中断

m对应寄存器组号,取值范围是0~3,我们也可以不指定执行中断服务的寄存器组号,由编译器自动分配。

下面我用中断函数来尝试改变LED的点亮状态。

#include <reg51.h>
#include<intrins.h>
#define uchar  unsigned charvoid Delay(unsigned int i)	
{	unsigned int j;for(;i > 0;i--)		for(j=0;j<333;j++);        
}void  main( )		
{					//开始设置中断允许控制寄存器,使用外部中断0EA=1;			//开启总中断允许EX0=1;			//允许外部中断0中断//IE=0x81;      //可以用字节赋值IE代替上述位赋值//开始设置定时/计数器控制寄存器中的触发方式IT0=1;			//选择外部中断0为跳沿触发方式while(1)			 { uchar temp,i;temp=0xfe;for(i=0;i<8;i++)  //主函数为库函数流水灯{P1=temp;Delay(400);temp=_crol_(temp,1);}
}		
}
//在允许外部中断0中断的情况下,P3.2引脚上检测到低电平,执行外部中断0服务函数 	
void int0( )  interrupt 0  	//外部中断0的中断服务函数,定义时省略了using
{	uchar  m;EX0=0;			//禁止下一次外部中断0中断信号的输入,防止打断本次中断,可以省略for(m=0;m<2;m++)	//LED闪烁{P1=0x0f;	Delay(400) ;		P1=0xf0;		Delay(400); 		}EX0=1;			//执行完毕后,打开外部中断0中断,等待下一次中断请求
}

大家可以看到在仿真软件中有一枚按键与P3.2引脚相连,当按下按键时,引脚便会检测到低电平,执行中断服务函数。

由于引脚只要检测到低电平便会触发中断,因此中断按键无法消抖。 

此外,我们在设计单片机时,通常希望触发中断函数时程序执行得越快越好,如报警装置应尽量及时让人们注意到异常状态,因此我们可以简化中断服务函数,将执行主体置于主函数中,中断函数只起到一个修改状态值,以便主函数在检测到该值时及时切换执行程序。

#include <reg51.h>
#include<intrins.h>
#define uchar  unsigned char
uchar flag1=0;				 //加入中断标志
void Delay(unsigned int i)	
{	unsigned int j;for(;i > 0;i--)		for(j=0;j<333;j++);        
}void  main( )		
{							IE=0x81;     					IT0=1;			while(1)			 
{    uchar temp,i,m;temp=0xfe;if(flag1==0)	      //常态下标志位为0,执行主函数{for(i=0;i<8;i++)  //主函数为库函数流水灯{P1=temp;Delay(400);temp=_crol_(temp,1);} }if(flag1==1)			//触发中断后更改标志位{for(m=0;m<2;m++)	//中断函数LED闪烁{P1=0x0f;	Delay(400) ;		P1=0xf0;		Delay(400); 		} flag1=0;			//还原标志位,继续执行主函数}
}		
}void int0( )  interrupt 0  	//中断服务函数化简
{flag1=1;					//只有一个标志位赋值语句
}

不过这样做也存在缺点,中断函数虽然更改了标志位数值,但是两个if函数是平行关系,也就是说只有主函数执行完一次代码块后才能切换为中断服务函数,我在视频中也演示了这两种方法的区别。

外部中断控制LED点亮模式改变

感谢大家,之后会为大家演示多种中断方式的嵌套应用。

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

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

相关文章

(vue)el-cascader级联选择器实现单/多选最后一级并回显

(vue)el-cascader实现多选最后一级并回显 <el-form-item label"选择算法模型&#xff1a;"><el-cascaderv-model"formInline.algorithmId":options"modelOptions":props"{ value: id, label: name, multiple: true, emitPath: fal…

计算机网络—— 概述

概述 1.1 因特网概述 网络、互联网和因特网 网络由若干结点和连接这些结点的链路组成多个网络还可以通过路由器互联起来&#xff0c;这样就构成了一个覆盖范围更大的网络&#xff0c;即互联网&#xff08;或互连网&#xff09;。因特网&#xff08;Internet&#xff09;是世…

C语言入门教程,C语言学习教程(第一部分:编程基础 )一

C语言是一门面向过程的编译型语言&#xff0c;它的运行速度极快&#xff0c;仅次于汇编语言。C语言是计算机产业的核心语言&#xff0c;操作系统、硬件驱动、关键组件、数据库等都离不开C语言&#xff1b;不学习C语言&#xff0c;就不能了解计算机底层。 这套「C语言入门教程」…

ORACLE索引失效和sql优化

全部都是在开发中碰到的真实问题&#xff0c;后续会一直更新本条帖子&#xff1a; 场景一&#xff1a; 使用了函数&#xff0c;导致索引失效 交易日期过滤数据时使用了to_date写法&#xff0c;导致日期字段查询未走索引 将控制台输出的sql 粘贴到plsql 按F5打开解释计划执行窗口…

可碧教你C++——哈希

在文章的开始&#xff0c;先祝大家牢大年快乐 哈希的简介 unordered系列 在C11里&#xff0c;加入了两个新的container——unordered_set和unordered_map。 其使用方式与map和set类似&#xff0c;但是其底层实现则与其完全不同。set和map的底层数据结构为红黑树&#xff0c;…

Umbraco:从产品介绍到实战应用

一、产品介绍 Umbraco是一个开源的内容管理系统&#xff08;CMS&#xff09;&#xff0c;以其灵活性和可扩展性而闻名。Umbraco允许开发人员根据需要定制系统&#xff0c;同时为非技术人员提供了一个直观的界面来管理网站内容。Umbraco诞生于丹麦&#xff0c;经过多年的发展&a…

2023年阿里云云栖大会:前沿技术发布与未来展望

在2023年的阿里云云栖大会上&#xff0c;我见证了云计算和人工智能领域的又一历史性时刻。这次大会不仅是对未来科技趋势的一次深入探索&#xff0c;更是阿里云技术实力和创新能力的集中展示。 首先&#xff0c;千亿级参数规模的大模型通义千问2.0的发布&#xff0c;无疑将人工…

Flask修改Response Headers中的Server值

Headers中的Server会暴露出Python版本&#xff0c;导致的结果就是方便被渗透快速定位Python版本后找到对应版本的漏洞&#xff0c;因此导致网络安全问题 伪方法&#xff1a; 像这个马上就暴露出Python版本&#xff0c;如何解决这个网络上有说直接用response.headers.remove(Ser…

Mysql : command not found

1.Mysql : command not found 安装成功的mysql&#xff0c;并且服务已经启动&#xff0c;查看进行是可以看到的&#xff0c;但是使用命令登录操作&#xff0c;却抛出错误&#xff1a;command not found。 2.解决方案 2.1 查看/usr/bin目录下是否有mysql服务连接 ls /usr/bin…

1panel中的sftpgo webadmin 更新修改docker容器文件的配置教程

本篇文章主要讲解1panel中的sftpgo webadmin 更新修改docker容器文件的配置教程&#xff0c;适合sftpgo webadmin和1panel系统用户配置时使用。 作者&#xff1a;任聪聪 rccblogs.com 日期&#xff1a;2024年1月8日 sftpgo是无法直接直接更改容器内部的网站目录的&#xff0c;但…

Python进阶之元类

Python进阶之元类 目录 什么是元类&#xff1f; 元类的调用流程 根据类自定义元类 __new__方法以及参数 ----------cls ----------name ----------bases ----------attrs __call__方法 生成对象的完整代码 什么是元类&#xff1f; 在python面向对象中&#xff0c;我们知道所有…

AI大语言模型会带来了新一波人工智能浪潮?

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮&#xff0c;可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…

自动化测试最佳实践:有效利用 ForEach 循环技巧

在 自动化测试 场景中&#xff0c;当需要对数组内的所有元素分别执行特定操作时&#xff0c;我们通常会采用 ForEach 循环 来实现这一过程。例如一个常见的场景&#xff1a;请求一个获取宠物列表的接口&#xff0c;返回了 n 个宠物的 id &#xff0c;然后根据这些宠物 id 逐一查…

mongodb学习篇

目录 前言基本概念数据库-database集合-collection文档-document 部署mongodblinux安装mongodbdocker安装mongodb MongoDB Shell (mongosh)命令行工具mongodb可视化-mongodb-compass、mongo-expressmongodb配置文件mongodb库、集合、文档库基本操作集合基本操作文档的增删改查C…

世微AP3464 车充专用芯片 4-30V输入 ADJ可调/2.4A输出降压驱动芯片

AP3464 是一款支持宽电压输入的同步降压 电源管理芯片&#xff0c;输入电压 4-30V 范围内可实现 2.4A 的连续电流输出。通过调节 FB 端口的分压 电阻&#xff0c;设定输出 1.8V 到 28V 的稳定电压。 AP3464 具有的恒压/恒流(CC/CV)特性。 AP3464 采用电流模式的环路控制原理&am…

获取小红书笔记详情API调用说明(含请求示例参数说明)

前言 小红书&#xff0c;是一个引领全球时尚潮流的社交电商平台。在这里&#xff0c;你可以发现世界各地的优质好物&#xff0c;从美妆护肤、穿搭时尚&#xff0c;到家居生活、旅行美食&#xff0c;一切应有尽有。同时&#xff0c;这里也是一个分享生活点滴的平台&#xff0c;…

sonarqube配置本地扫描代码

一、本地maven设置setting文件&#xff1a; 1&#xff09;添加pluginGroup <pluginGroups><pluginGroup>org.sonarsource.scanner.maven</pluginGroup></pluginGroups> 2&#xff09;添加profile&#xff1a; <profile><id>sonar</i…

有趣的前端知识(二)

推荐阅读 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;一&#xff09; 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;二&#xff09; 文章目录 推荐阅读HTML元素元素属性头部元素列表元素区块元素表单元素 颜色字符实体 HTML元素 …

知识点整理[(GraphGeo)RELATED WORK]

2 RELATED WORK 2.1 IP Geolocation 问题一:IP定位预测方法之一:Data mining-based methods 回答: 依赖于在公开的资源中挖掘位置线索来对目标IP(target IP)进行地理定位。其中一些数据分析了来自与IP相关的数据库,如WHOIS数据库和DNS的数据。 (1)例如,Moore等…

neo4j图数据库的简单操作记录

知识图谱文件导出 首先停止运行sudo neo4j stop然后导出数据库 导出格式为&#xff1a; 具体命令如下sudo neo4j-admin database dump --to-path/home/ neo4j最后重启sudo neo4j start知识图谱外观修改 在网页点击节点&#xff0c;选中一个表情后点击&#xff0c;可修改其颜…