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

news2024/12/26 0:22:34

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

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

中断服务函数是嵌入式系统中用于处理中断事件的函数,在原版的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 char

void Delay(unsigned int i)	
{	unsigned int j;
 	for(;i > 0;i--)		
		for(j=0;j<333;j++);        
}

void  main( )		
{					//开始设置中断允许控制寄存器,使用外部中断0
	EA=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.coloradmin.cn/o/1369963.html

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

相关文章

微信小程序canvas画布实现矩形元素自由缩放、移动功能

获取画布信息并绘制背景 .whml <canvas class="canvas" type="2d" id="myCanvas" bindtouchstart="get_rect_touch_position" bindtouchmove="move_or_scale" bind:tap="finish_edit_check"/> .wxss .c…

论文阅读 BERT GPT - transformer在NLP领域的延伸

文章目录 不会写的很详细&#xff0c;只是为了帮助我理解在CV领域transformer的拓展1 摘要1.1 BERT - 核心1.2 GPT - 核心 2 模型架构2.1 概览 3 区别3.1 finetune和prompt 3.2 transformer及训练总结 不会写的很详细&#xff0c;只是为了帮助我理解在CV领域transformer的拓展 …

Redis主从复制哨兵及集群

目录 一.主从复制 主从复制的工作原理如下&#xff1a; 主从复制的作用&#xff1a; 搭建Redis 主从复制 每台服务器配置&#xff1a; ​编辑进行编译安装&#xff1a; 定义systemd服务管理脚本&#xff1a; 开启服务&#xff0c;报错看下内容&#xff1a; 修改 Redis…

HCIA-Datacom题库(自己整理分类的)_15_VRP平台多选【9道题】

1.VRP操作平台存在哪些命令行视图? 用户视图 接口视图 协议视图 系统视图 2.以下哪些存储介质是华为路由器常用的存储介质 SDRAM NVRAM Flash Hard Disk SD Card 解析&#xff1a;Hard Disk是硬盘&#xff0c;一般网络设备没有。 3.VRP支持通过哪几种方式对路由器…

红队打靶练习:DERPNSTINK: 1

目录 信息收集 1、arp 2、netdiscover 3、nmap 4、nikto 5、whatweb 目录探测 1、gobuster 2、dirsearch WEB get flag1 robots.txt /php/phpmyadmin /temporary /weblog wordpress wpscan扫描 漏洞发现 提权 系统信息收集 mysql登录 john get flag2 s…

Java中的装箱和拆箱

自动装箱和拆箱问题是Java中一个老生常谈的问题了&#xff0c;今天我们就来一些看一下装箱和拆箱中的若干问题。本文先讲述装箱和拆箱最基本的东西&#xff0c;再来看一下面试笔试中经常遇到的与装箱、拆箱相关的问题。 一.什么是装箱&#xff1f;什么是拆箱&#xff1f; 我们…

Python画国旗

前言 今天&#xff0c;我们来用turtle库来绘制国旗 一、美国国旗 国旗的形状是长方形;国旗的长宽之比为19:10&#xff0c;美国国旗由红、白、蓝三色组成;画面格局由两部分组成&#xff0c;旗的左上方蓝底上排列着50颗白色的星&#xff0c;6颗一排与5颗一排相间排列&#xff…

使用Process Explorer和Dependency Walker排查程序启动时缺少ucrtbase.dll等运行时库以及报0xC000007B错误

目录 1、问题描述 2、分析软件问题的常用分析工具 3、使用Dependency Walker排查启动程序时报找不到ucrtbase.dll、vcruntime140.dll等运行时库的问题 3.1、使用Dependency Walker查看exe程序的库依赖关系&#xff0c;排查找不到ucrtbase.dll、vcruntime140.dll库问题 3.2…

指针的含义、表示、规范、存储、运用

指针的含义、表示、规范、存储、运用 指针的含义指针的表示指针的规范先声明再定义声明和定义一起表示错误表示 指针的存储理解一个变量的存储过程和原理理解一个指针的存储过程和原理理解多个指针的存储过程和原理 指针的运用 指针的含义 表示某个变量或数据所在的内存地址 注…

大模型笔记 【1】 大模型初探

以下是Andrej Karpathy一小时讲解chatgpt的笔记。 Andrej Karpathy做自动驾驶的人应该比较熟悉&#xff0c;他是李飞飞的学生。在openAI做了一年半的科学家之后&#xff0c;去了特斯拉。在Tesla AI day讲解tesla自动驾驶方案的就是他。 这里我的主要收获是两个 大模型是一个有…

12V 全桥驱动芯片GC9008——可替代TMI8118,应用于摄像机、消费类产品上

GC9008 是一款 12V 全桥驱动芯片&#xff0c;为提供高性价比的方案。它能提供 0.1A 的持续输出电流。可以工作在 4.5~15V 的电源电压上。 具有 PWM&#xff08;IN1/IN2&#xff09;输入接口,与行业标准器件兼容.是 SOP8封装&#xff0c;GC9008D是DIP封装芯片特点 ● H 桥电机驱…

关于burpsuite对app(移动端)进行抓包的配置

可以使用手机模拟器&#xff0c;我这里以自己手机&#xff08;物理机&#xff09;演示配置过程 如果是使用的模拟器那么肯定和电脑是在同一局域网 如果使用物理机&#xff0c;那么可以通过连接同一WiFi确保在同一局域网环境下 查看电脑内网ip&#xff1a;192.168.1.105 &am…

2023 年精选:ChatGPT 会取代开发者吗?

由于最近发布了ChatGPT&#xff0c;人工智能再次热闹起来&#xff0c;ChatGPT 是一种自然语言聊天机器人&#xff0c;人们用它来写电子邮件、诗歌、歌词和大学论文。早期采用者甚至用它来编写Python 代码&#xff0c;以及对 shellcode 进行逆向工程并用 C 重写。ChatGPT 给那些…

Docker实战09|使用AUFS包装busybox

前几篇文章中&#xff0c;重点讲解了如何实现构建容器&#xff0c;需要回顾的小伙伴可以看以下文章&#xff1a; 《Docker实战06&#xff5c;深入剖析Docker Run命令》《Docker实战07&#xff5c;Docker增加容器资源限制》《Docker实战08&#xff5c;Docker管道及环境变量识别…

1879_什么是丝印

Grey 全部学习内容汇总&#xff1a; GitHub - GreyZhang/g_hardware_basic: You should learn some hardware design knowledge in case hardware engineer would ask you to prove your software is right when their hardware design is wrong! 1873_什么是丝印 丝印这个词…

Android平板浏览器远程Ubuntu服务器使用code-server编程写代码

文章目录 1.ubuntu本地安装code-server2. 安装cpolar内网穿透3. 创建隧道映射本地端口4. 安卓平板测试访问5.固定域名公网地址6.结语 1.ubuntu本地安装code-server 准备一台虚拟机,Ubuntu或者centos都可以&#xff0c;这里以VMwhere ubuntu系统为例 下载code server服务,浏览器…

我在工作一年时怎么都看不懂的编程写法。今天手把手教给你

作为一名程序员&#xff0c;你一定遇到或亲自写过这样的代码。有人将它形象的形容为shi山&#xff0c;或者被戏称为“面向保就业编程”。 以下面这个代码为例&#xff0c;其中的问题也显而易见&#xff0c;当越来越多的条件判断时&#xff0c;代码会变得非常臃肿&#xff0c;难…

记录汇川:H5U与Fctory IO测试5

主程序&#xff1a; 子程序&#xff1a; IO映射 子程序&#xff1a; 自动程序 Fctory IO配置&#xff1a; 触摸屏如下&#xff1a; 实际动作如下&#xff1a; Fctory IO测试5

mybatis plus相同Id与xml配置错误时,mybatis plus解决逻辑

前言 处理做项目的问题&#xff0c;其中不乏奇奇怪怪的问题&#xff0c;其中mybatis plus的问题感觉有点隐蔽&#xff0c;有些是运行时出现&#xff0c;有些是运行到具体的逻辑触发&#xff0c;对于应用的状态监控提出了极大的挑战&#xff0c;应用的状态由健康检查接口提供&a…

VMware复制粘贴共享文件夹

win和虚拟机之间&#xff0c;无法复制粘贴&#xff0c;共享文件夹的解决方案。 安装VMware tools 1&#xff0c;先检查虚拟机设置部分。共享文件夹已启用。复制粘贴已启用。 2&#xff0c;安装tools.选择重新安装VMware tools. (此图片为安装过的截图) 成功后会显示如图。…