单片机c51中断 — 中断嵌套实例IE0的置位和撤销

news2024/11/25 0:39:01

项目文件

文件

关于项目的内容知识点可以见专栏单片机原理及应用 的第五章,中断

 


根据下原理图,编程验证二级外部中断嵌套效果。其中K0定为低优先级中断源,K1为高优先级中断源。此外,利用发光二极管D1验证外部中断请求标志IE0在脉冲触发中断时候的硬件置位与撤销过程
在这里插入图片描述
 


  1. 先实现LED0:3只数码管可分别进行字符19的循环计数显示,其中主函数采用无限计数显示,KO和K1的中断函数则采用单圈计数显示。
  2. 由于K0的自然优先级(接INTO引脚)高于K1(接INT1引脚),故需要将K1的中断级别设为高优先级,即PX1=1,PX0=0
  3. 高级中断运行时,若有低级中断请求,则D1点亮;高级中断结束后,低级中断才能运行。
  4. 由于IEO 的撤销过程发生在 K0 响应中断的瞬间,故在 KO中断函数里将IEO值送 P3.0输出可验证这一过程。
    而IEO 的置位信息较难捕捉,可以利用“低级中断请求虽不能中止高级中断响应过程,但可保留中断请求信息”的原理进行,即在K1中断函数里设置输出IEO语句

一步一步写
先定义好字模和D1和延时函数

#include "reg51.h"
char led_mod[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,	  //led字模
				  0x7f,0x6f}; //显示字模	  
sbit D1=P3^0;  //原理图D1接P3_0
void delay(unsigned int time){//延时
	unsigned char j=255;	   
	for(;time>0;time--)
		for(;j>0;j--);
} 

先写主函数:

void main(){
	unsigned char i;
	TCON = 0x05;			  //脉冲触发方式

0x05是0000 0101 ——对应TCON寄存器的位
在这里插入图片描述
这样IT1和IT0为1,脉冲触发

上面说的

K0接INT0引脚,K1接INT1引脚,K1高级中断,优先级要设置高,即
PX1=1 ,PX0=0;

PX0=0;PX1=1;			  //INT1优先

然后继续

D1=1;P1=P2=0x40;		  //输出初值

D1=1 刚开始时候这样电平,D1灯是灭的,等于初始化

在这里插入图片描述

P1=P2=0x40;

这里用的 晶体管竟然还是共阴极的动态数码管

在这里插入图片描述
由他们各自连接的端口控制

0x40=0100 0000
这样就是P1和P2等于0 100 0000
显示是 -
对应LED1 2
LED0开始端口P0为高电压

在这里插入图片描述

继续写:

	IE=0x85;				  //开中断

这里是IE寄存器 为1000 0101
在这里插入图片描述
EA=1;EX1=1;EX0=1;
总中断允许;INT1中断允许;INT0允许

继续写:

while(1){
	    for(i=0;i<=9;i++){    //字符0-9无限循环
		   P0=led_mod[i];
		   delay(35000);	
		}
	     
	}
}

主函数中的循环, P0=led_mod[i]; led_mode是共阴极数码管0~9
所以LED0从0到9无限循环

主函数代码:

void main(){
	unsigned char i;
	TCON = 0x05;			  //脉冲触发方式
 	PX0=0;PX1=1;			  //INT1优先
	D1=1;P1=P2=0x40;		  //输出初值
	IE=0x85;				  //开中断
	while(1){
	    for(i=0;i<=9;i++){    //字符0-9无限循环
		   P0=led_mod[i];
		   delay(35000);	
		}
	     
	}
}

下面写中断函数

key0() interrupt 0 {	      //K0中断函数
	unsigned char i;
	D1=!IE0;					  //IE0状态输出 
	for(i=0;i<=9;i++){    	  //字符0-9循环1圈
		P2=led_mod[i];
		delay(35000);	
	}P2=0x40; 				  //结束符“-” 
}  

key0() interrupt 0 { //K0中断函数
定义中断服务函数
这里的0是中断号
在这里插入图片描述
这样才能对应是哪个中断

	unsigned char i;
	D1=!IE0;					  //IE0状态输出 
	for(i=0;i<=9;i++){    	  //字符0-9循环1圈
		P2=led_mod[i];
		delay(35000);	
	}P2=0x40; 				  //结束符“-” 

D1=!IE0; D1初始值为1,D1对应着INT0的中断请求标志IE0的非
这里为啥取非?

因为D1对应的灯D1端口为0时候亮
所以IE0=1中断开始,D1亮可以作为一个判断v

然后单圈灯

for(i=0;i<=9;i++){    	  //字符0-9循环1圈
		P2=led_mod[i];
		delay(35000);	
	}P2=0x40; 				  //结束符“-” 

就亮了循环一圈

‼️‼️ 总体看:
按下K0后
在这里插入图片描述
INT0端口变为低电压,传给INT0非为低电压
这里要看IE0是哪种模式(脉冲还是电平)
image-20220411212730641
TCON = 0x05; //脉冲触发方式
所以为1变0为负跳变脉冲所以为1变0为负跳变脉冲
在这里插入图片描述
IE0置1,中断开始

中断服务函数

流程图:
在这里插入图片描述

如果错误请指出,大致总结下

K1也是这样,但是K1是优先级为高在这个例子中

因为项目总代码:

#include "reg51.h"
char led_mod[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,	  //led字模
				  0x7f,0x6f}; //显示字模	  
sbit D1=P3^0;
void delay(unsigned int time){//延时
	unsigned char j=255;	   
	for(;time>0;time--)
		for(;j>0;j--);
} 
key0() interrupt 0 {	      //K0中断函数
	unsigned char i;
	D1=!IE0;					  //IE0状态输出 
	for(i=0;i<=9;i++){    	  //字符0-9循环1圈
		P2=led_mod[i];
		delay(35000);	
	}P2=0x40; 				  //结束符“-” 
}  

key1() interrupt 2 {          //K1中断函数
	unsigned char i;
	for(i=0;i<=9;i++){    	  //字符0-9循环1圈
		D1=!IE0;				  //IE0状态输出
		P1=led_mod[i];
		delay(35000);	
	}P1=0x40; 				  //结束符“-” 
}

void main(){
	unsigned char i;
	TCON = 0x05;			  //脉冲触发方式
 	PX0=0;PX1=1;			  //INT1优先
	D1=1;P1=P2=0x40;		  //输出初值
	IE=0x85;				  //开中断
	while(1){
	    for(i=0;i<=9;i++){    //字符0-9无限循环
		   P0=led_mod[i];
		   delay(35000);	
		}
	     
	}
}

现象:

LED0无限循环

按下K0,INT0中断开始,进入中断函数key0,len1循环一圈
按下K1,INT1中断开始,进入中断函数key1,len2循环一圈

因为K1的定义的中断优先级高,所以如果K0中断运行的时候
点击K1,K1中断优先,等K1结束才能到K0中断

最终,中断时候中断函数下面的LED0的循环亮暂时没到中止

观察D1的信息
D1开始为1.灭的

中断函数中定义D1=!IE0
IE0是INT0的中断标志,当INT0中断运行时候
IE0=1
所以D1=0; 亮
在K1中断中也有这个
但是它是在for内部
D1一直在变

 


结果:
在这里插入图片描述

视频:

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

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

相关文章

Minio(minio-20221029062133.0.0.x86_64.rpm) Linux 环境安装

Minio Linux 环境安装 资源下载 镜像下载地址&#xff1a;http://dltest.minio.org.cn/server/minio/release/linux-amd64/archive/ 资源包下载地址&#xff08;与献文匹配&#xff09;&#xff1a;https://download.csdn.net/download/scdncby/87769604 安装 上传rpm安装…

React+Antd+Vite+TypeScript 项目实战教程

本教程属于react入门教程&#xff0c;课程围绕如何搭建一个项目框架展开&#xff0c;会带你快速了解react、redux、redux-devtool、react-router-dom、axiox这些常见技术的使用方式&#xff0c;教程最后会附上项目源码。 一、创建项目 在搭建项目时&#xff0c;我们通常会使用…

day38_JDBC

今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、数据库连接池 二、反射 三、封装DBUtil 零、 复习昨日 SQL注入 预处理语句 String sql "select * from user where id ?"; PreparedStat…

Spring Boot访问数据库

SpringBoot访问数据库时&#xff0c;我们可以使用以下三种&#xff0c;JdbcTemplate、Spring Boot Data Jpa、mybatis。 JdbcTemplate是Spring自己提供的&#xff0c;但是其操作不方便&#xff0c;甚至有些繁琐&#xff0c;在实际应用中也是很少会使用&#xff0c;所以这里就不…

使用MobaXterm在Windows系统远程Ubuntu系统

使用场景 通常大部分办公软件都安装在Windows系统上&#xff0c;使用Windows系统办公更便捷&#xff0c;并且大多办公软件在Ubuntu系统上不兼容&#xff0c;即使进行处理&#xff0c;使用体验也不好&#xff0c;下面针对在同一局域网使用Windows远程Ubnuntu进行ssh、VNC和打开…

Nature -- 空间表观组学与转录组学联合分析,揭示基因表达的精准调控

为充分理解组织中单细胞的基因表达调控&#xff0c;需要在单细胞水平以空间分辨率的方式集成不同分子信息的不同层面&#xff0c;包括表观基因组和转录组数据。虽然单细胞多组学方法可以捕捉来自不同分子层的信息&#xff0c;但是空间组学方法到目前为止主要局限于一层分子。张…

MATLAB的无人机遥感数据预处理与农林植被性状估算实践

在新一轮互联网信息技术大发展的现今&#xff0c;无人机、大数据、人工智能、物联网等新兴技术在各行各业都处于大爆发的前夜。为了将人工智能方法引入农业生产领域。首先在种植、养护等生产作业环节&#xff0c;逐步摆脱人力依赖&#xff1b;在施肥灌溉环节构建智慧节能系统&a…

ASP.NET core WebApi Cors跨域解决

前言 我用了最新版的Asp.net webapi &#xff0c;在csdn上面搜跨域如何解决的时候&#xff0c;发现csdn上面对于.NET技术讨论不是很多。没办法&#xff0c;只能面向官方文档和GitHub编程了。 项目类型确认 NuGet包引入 前面两个已经放弃维护了&#xff0c;我们就不用了。用最…

使用Actor-Critic的DDPG强化学习算法控制双关节机械臂

在本文中&#xff0c;我们将介绍在 Reacher 环境中训练智能代理控制双关节机械臂&#xff0c;这是一种使用 Unity ML-Agents 工具包开发的基于 Unity 的模拟程序。 我们的目标是高精度的到达目标位置&#xff0c;所以这里我们可以使用专为连续状态和动作空间设计的最先进的Deep…

【uni-app】errMsg : navigateTo:fail can not navigateTo a tabbar page报错解决方案

文章目录 前言一、报错二、解决方案更改api 总结 前言 大家好&#xff0c;今天在进行uni-app项目开发时&#xff0c;在进行页面跳转的时候报了一个错误&#xff0c;一开始觉得只是个小报错就没有仔细看这个报错&#xff0c;直接就到页面检查看是不是跳转没写好&#xff0c;但是…

Spring IOC:详解【依赖注入数值问题 依赖注入方式】

编译软件&#xff1a;IntelliJ IDEA 2019.2.4 x64 操作系统&#xff1a;win10 x64 位 家庭版 Maven版本&#xff1a;apache-maven-3.6.3 Mybatis版本&#xff1a;3.5.6 spring版本&#xff1a;5.3.1 文章目录 Spring系列专栏文章目录一、Spring依赖注入数值问题1.1 字面量数值问…

计算机网络 | 广播与组播

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

Jetpack之livedata原理分析

1.LiveData是什么&#xff1f; 只有在生命周期处于started和resumed时。livedata才会更新观察者 2.Livedata的各种使用方式 1.更新数据 class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceSta…

Python数据分析实战【十四】:python的三种排序方法:sort、sorted、sort_values案例学习【文末源码地址】

文章目录 一、List.sort()排序案例一&#xff1a;按照列表中的元素进行排序案例二&#xff1a;按照销售额数据进行排列 二、sorted()排序案例一&#xff1a;sorted()对列表进行排序案例二&#xff1a;sorted()对字典进行排序案例三&#xff1a;sorted()对列表中的字典元素排序 …

【AI大模型】国产AI技术再创新高,讯飞星火认知大模型中文能力已经超越ChatGPT?

文章目录 前言SparkDesk讯飞星火认知大模型简介语言理解知识问答逻辑推理数学题解答代码理解与编写亲自体验写在最后 前言 5月6日&#xff0c;讯飞星火认知大模型成果发布会在安徽合肥举行。科大讯飞董事长刘庆峰、研究院院长刘聪发布讯飞星火认知大模型&#xff0c;现场实测大…

(一)ArcGIS空间数据的转换与处理——投影变换

ArcGIS空间数据的转换与处理——投影变换 原始数据往往由于在数据结构、数据组织、数据表达等方面与用户需求不一致而要进行转换与处理。本节主要介绍 ArGIS 中数据的投影变换内容。 目录 ArcGIS空间数据的转换与处理——投影变换 1.概述2.定义投影3.投影变换3.1栅格数据的投…

Python数据分析实战【十四】:Python的三种排序方法:sort()、sorted()和sort_values()【文末源码地址】

文章目录 一、List.sort()排序案例一&#xff1a;按照列表中的元素进行排序案例二&#xff1a;按照销售额数据进行排列 二、sorted()排序案例一&#xff1a;sorted()对列表进行排序案例二&#xff1a;sorted()对字典进行排序案例三&#xff1a;sorted()对列表中的字典元素排序 …

计算机网络 | 基于TCP的C/S模型代码实现

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

QT QGraphicsView 提升到 QChartView报错 解决方案

QT QGraphicsView 提升到 QChartView报错 解决方案 本文主要描述, 使用QT提供的QChartView来绘制图表,提升QGraphicsView控件继承QChartView后,然后将QGraphicsView提升到我们自己写的类,怎么才能确保提升后编译不报错. [问题描述] 使用QGraphicsView显示图表的时候,我们需要将…

基于Leaflet的乡镇行政区划在WebGIS中的可视化工具实践

前言 在构建WebGIS的应用系统中&#xff0c;通常会遇到以下的建设需求。功能点如下&#xff1a; 实现影像地图的展示&#xff0c;可以放大、缩小和浏览地图。地图的拖拽范围需要控制在合理的经纬度范围内。在影像地图侧边实现某乡镇级行政区的信息展示&#xff0c;包括名称&…