蓝桥杯-单片机组基础5——外部中断与LED的控制(附小蜜蜂课程代码)

蓝桥杯单片机组备赛指南请查看这篇文章:戳此跳转蓝桥杯备赛指南文章

本文章针对蓝桥杯-单片机组比赛开发板所写,代码可直接在比赛开发板上使用。

型号:国信天长4T开发板(绿板),芯片:IAP15F2K61S2

(使用国信天长蓝板也可以完美兼容,与绿板几乎无差别)


1.编程目的

        通过对外部中断的学习,了解外部中断的操作过程,并实现独自完成外部中断的编程,通过控制led灯光进行展示效果。

//设置按键S5进行中断操作,L1闪烁为主函数,自动运行,L8常按亮为中断执行程序。

2.外部中断原理

2.1 单片机的中断系统

        单片机的中断系统具有很大的用处,赛题中必定会用到。中断系统的响应流程如下:当有中断信号输入时,单片机停止当前的工作,转而去先执行中断服务函数要求的工作,等中断服务函数要求的工作全部做完,单片机又返回去继续执行先前的工作。

        比赛用单片机最多允许两层中断的嵌套。即在低级的中断服务函数执行过程中,收到了更高级的中断信号,而去先执行更高级的中断工作,执行完再返回继续执行低级的中断工作,低级的中断工作做完,再回到最原本的代码继续执行。

比赛用芯片IAP15F2K61S2 涉及的中断共有14个,这里介绍常用的5个:

中断号中断名中断名解释
0INT0外部中断0
1T0定时/计数器中断0
2INT1外部中断1
3T1定时/计数器1
4TI/RI串口中断
5T2定时/计数器中断2

        本文聚焦外部中断,只对外部中断0和外部中断1进行讲解,他们的中断号对应为0和2。比赛用开发板中还有INT2,INT3,INT4,共计5个外部中断信号源的介绍,将在专栏“蓝桥杯-单片机组进阶”中讲解。

        其余中断的操作请参考本专栏下的其他文章。

2.2 什么叫外部中断?

        我们对比赛用开发板的芯片进行观察,可以发现与INT0和INT1相关的两个引脚,分别是P3.2和P3.3 

        此时如果我们要使用外部中断0,那么可以对P3.2引脚输入低电平,通过观察独立按键的原理图可以得知,当按键S5被按下时,刚好会向单片机的P3.2引脚输入低电平,因此我们可以将按键S5作为一个中断的信号源。

        当按下S5时,P3.2引脚读取到低电平,单片机内部产生中断响应,暂停当前程序而优先执行中断服务程序,执行完中断服务程序后返回继续执行当前程序。编程时,我们不需要对单片机引脚P3.2读取到低电平、按键S5被按下等过程进行编程,因为中断的响应只需要通过对寄存器的设置,单片机自动识别中断信号并自动响应。我们只需要关注中断产生之后,我们要做什么(中断服务函数)。

2.3 设置外部中断用到的寄存器

两级中断允许控制:IE(interrupt enable)

EA-ET2ESET1EX1ET0EX0

IE中各位的功能如下:

EA—中断允许总开关控制位。EA=0,所有的中断请求被屏蔽。EA=1,所有的中断请求被开放。

ES—串行口中断允许位。ES=0,禁止串行口中断。ES=1,允许串行口中断。

ET1—定时器/计数器T1溢出中断允许位。ET1=0,禁止T1溢出中断。ET1=1,允许T1溢出中断。

EX1—外部中断1中断允许位。EX1=0,禁止外部中断1中断。EX1=1,允许外部中断1中断。

ET0—定时器/计数器T0的溢出中断允许位。ET0=0,禁止T0溢出中断。ET0=1,允许T0溢出中断。

EX0—外部中断0中断允许位。EX0=0,禁止外部中断0中断。EX0=1,允许外部中断0中断。

        该寄存器允许位寻址,在编程时,如果只用到一个外部中断0,则我们只需要设置总开关EA和外部中断0允许位EX0 。

两级优先级控制:IP(interrupt priority)

--PT2PSPT1PX1PT0PX0

中断优先级寄存器IP各位含义:

PS—串行口中断优先级控制位,1—高级;0—低级。

PT1—T1中断优先级控制位,1—高级;0—低级。

PX1—外部中断1中断优先级控制位,1—高级;0—低级。

PT0—T0中断优先级控制位,1—高级;0—低级。

PX0—外部中断0中断优先级控制位,1—高级;0—低级。

各中断源的中断优先级关系的基本规则:

(1)低优先级可被高优先级中断,高优先级不能被低优先级中断。

(2)任何一种中断(不管是高级还是低级)一旦得到响应,不会再被它的同级中断源所中断。如果某一中断源被设置为高优先级中断,在执行该中断源的中断服务程序时,则不能被任何其他的中断源的中断请求所中断。

        当不对其进行设置时,则按照默认优先级执行。如果我们只用到外部中断0的话,则不需要对其进行设置。默认优先级与中断号顺序相同。

特殊功能寄存器:TCON(timer controller)

TF1TR1TF0TR0IE1IT1IE0IT0

TCON寄存器中与中断系统有关各标志位功能如下:

TF1—定时器/计数器T1的溢出中断请求标志位。当启动T1计数后,T1从初值开始加1计数,当最高位产生溢出时,硬件 置TF1为“1”,向CPU申请中断,响应TF1中断时,TF1标志硬件自动清“0”,TF1也可由软件清“0”。

TF0—定时器/计数器T0溢出中断请求标志位,与TF1类似。

IE1—外部中断请求1中断请求标志位。

IE0—外部中断请求0中断请求标志位,与IE1类似。

IT1—选择外中断请求1为跳沿触发还是电平触发方式。0--电平触发方式,加到INT0*脚上的外中断请求输入信号为低电平有效,并把IE1置“1”。转向中断服务程序时,则由硬件自动把IE1清“0”。1--跳沿触发方式,加到INT1*脚上的外中断请求输入信号从高到低的负跳变有效,并把IE1置“1”。转向中断服务程序时,则由硬件自动把IE1清“0”。

IT0—选择外中断请求0为跳沿触发方式还是电平触发方式,与IT1类似。

  该寄存器允许位寻址,在编程时,如果只用到一个外部中断0,则我们只需要设置IT0从而确定外部中断0的触发方式 。

3.中断在编程中的函数

3.1 外部中断初始化函数

        功能是在主函数运行时,将需要用到的中断功能进行设置,使得响应的中断正常运行。例如:

        在该函数中,通过设置IT0使得外部中断0为边沿触发,设置EX0和EA使得外部中断0正常开启。

3.2 外部中断服务函数

        功能是在单片机响应中断后,去执行我们需要他执行的功能。注意,该函数内部不要设置返回值,通过不要写判断或循环等语句,可以通过设置全局标志的方式实现数据传递。例如:

        在该段程序中,我们定义了一个全局变量state_INT0,用于在中断响应后对该变量置一,从而可以在程序中通过对该变量进行查询,获知中断是否产生。编程时,需要注意中断服务函数后面需要加上关键字:interrupt X。X为该中断的中断号,外部中断0为0

4.代码参考

        代码效果://设置按键S5进行中断操作,L1闪烁为主函数,L8常按亮为中断执行程序

//设置按键S5进行中断操作,L1闪烁为主函数,L8常按亮为中断执行程序#include < REG52.h >
#include < INTRINS.h >sbit S5 = P3^2;
sbit L1 = P0^0;
sbit L2 = P0^1;void select_HC173 ( unsigned char channal )
{switch ( channal ){case 4:P2 = ( P2 & 0x1f ) | 0x80 ;break;case 5:P2 = ( P2 & 0x1f ) | 0xa0 ;break;		case 6:P2 = ( P2 & 0x1f ) | 0xc0 ;break;		case 7:P2 = ( P2 & 0x1f ) | 0xe0 ;break;		}
}void Delay2ms ()
{unsigned char i,j;_nop_ ();_nop_ ();i=22;j=128;do {while ( --j );}while ( --i );
}void clean_shake ( unsigned char t )
{while ( t-- ){Delay2ms ();}
}//========================================
void Init_INT0 ()
{IT0 = 1;EX0 = 1;EA = 1;
}unsigned char state_INT0 = 0;
void Service_INT0 () interrupt 0
{state_INT0 = 1;
}void LED_INT0 ()
{if ( state_INT0 == 1 ){L2 = 0;clean_shake ( 600000 );L2 = 1;clean_shake ( 600000 );}state_INT0 = 0;}//=========================================void LED_L1_running ()
{select_HC173 ( 4 );L1 = 0;clean_shake ( 20 );L1 = 1;clean_shake ( 20 );
}void main ()
{Init_INT0 ();while ( 1 ){LED_L1_running ();LED_INT0 ();}
}

5.编程思路的小点点

       中断的操作主要是涉及两个步骤:

1.对中断进行正确的初始化,并在主函数中运行初始化函数;

2.正确利用中断服务函数,要注意加上中断号,且其内部尽量减少程序语句。并且通过适当的方式将“中断产生”这个事件传递出来,从而进行执行。对于直接在中断服务函数中写入需要执行的程序,以及在中断服务中设置一个标志变量两种不同的方式,他们的对比如下:

        第一种方式:在中断服务函数中接入程序体,比较简洁。容易出现一个问题:中断前的代码和中断瞬间的代码同时执行,如主函数是L1闪烁,中断是L8灯闪烁,如果中断发生时L1正好亮了,那么L1会一直亮直到中断函数L8闪烁结束。

        第二种方式:在中断服务函数中修改标志变量的值,在外部函数中判断标志变量的值来决定是否执行中断程序。这种方式会将主函数与中断的运行函数拆成两个函数,就会在收到中断后等主函数结束当前阶段再进入中断状态,避免L1和L8同时亮的情况。注意标志变量要定义全局变量,中断服务函数主体尽可能减少操作量。

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

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

相关文章

Excel常用公式总结非常实用

16个最实用的Excel万能公式 1、多条件判断 IF(And(条件1,条件2..条件N),条件成立返回值) IF(or(条件1,条件2..条件N),条件成立返回值) 2、多条件查找 Lookup(1,0/((条件1*条件2*...条件N)),返回值区域&#xff09; 3、多条件求和 Sumifs(值区域,判断区域1,条件1,判断区域2,条…

1_SQL

文章目录 前端复习SQL数据库的分类关系型数据库非关系型数据库&#xff08;NoSQL&#xff09; 数据库的构成软件架构MySQL内部数据组织方式 SQL语言登录数据库数据库操作查看库创建库删除库修改库 数据库中表的操作选择数据库创建表删除表查看表修改表 数据库中数据的操作添加数…

GO—函数

Go 语言支持普通函数、匿名函数和闭包&#xff0c;从设计上对函数进行了优化和改进&#xff0c;让函数使用起来更加方便。 Go 语言的函数属于“一等公民”&#xff08;first-class&#xff09;&#xff0c;也就是说&#xff1a; 函数本身可以作为值进行传递。支持匿名函数和闭…

Android 混淆是啥玩意儿?

什么是混淆 Android混淆&#xff0c;是伴随着Android系统的流行而产生的一种Android APP保护技术&#xff0c;用于保护APP不被破解和逆向分析。简单的说&#xff0c;就是将原本正常的项目文件&#xff0c;对其类、方法、字段&#xff0c;重新命名a,b,c…之类的字母&#xff0c…

假如有n个台阶,一次只能上1个台阶或2个台阶,请问走到第n个台阶有几种走法?

说明如下:假如有 3个台阶&#xff0c;那么总计就有3种走法:第一种为每次上1个台阶&#xff0c;上3次;第二种为先上2个台阶&#xff0c;再上1个台阶;第三种为先上1个台阶&#xff0c;再上2个台阶。 解决方法&#xff1a;递归 代码展示&#xff1a; #include <stdio.h> …

SD NAND:为车载显示器注入智能与安全的心脏

SD NAND 在车载显示器的应用 在车载显示器上&#xff0c;SD NAND&#xff08;Secure Digital NAND&#xff09;可以有多种应用&#xff0c;其中一些可能包括&#xff1a; 导航数据存储&#xff1a; SD NAND 可以用于存储地图数据、导航软件以及车载系统的相关信息。这有助于提…

【Vue3】插槽使用和animate使用

插槽使用 插槽slot匿名插槽具名插槽插槽作用域简写 动态插槽transition动画组件自定义过渡class类名如何使用animate动画库组件动画生命周期appear transition- group过渡列表transition- group平面过渡代码展示 gsap动画库 状态过渡 插槽slot 插槽就是子组件中提供给父组件使…

备战蓝桥杯---状态压缩DP进阶题1

我们来看一看一道比较难的问题&#xff08;十分十分的巧妙&#xff09;&#xff1a; 显然我们应该一行一行放&#xff0c;又竖的会对下一行产生影响&#xff0c;我们令横着放为0&#xff0c;竖着放的上方为1. 对于下一行&#xff0c;前一行放1的下面为0&#xff0c;但是会出现…

Python 实现Excel自动化办公(中)

在上一篇文章的基础上进行一些特殊的处理&#xff0c;这里的特殊处理主要是涉及到了日期格式数据的处理&#xff08;上一篇文章大家估计也看到了日期数据的处理是不对的&#xff09;以及常用的聚合数据统计处理&#xff0c;可以有效的实现你的常用统计要求。代码如下&#xff1…

Python爬虫——Urllib库-2

编解码 问题引入 例如&#xff1a; https://www.baidu.com/s?wd章若楠 https://www.baidu.com/s?wd%E7%AB%A0%E8%8B%A5%E6%A5%A0 第二部分的一串乱码就是章若楠 如果这里是写的章若楠就会 产生这样的错误 所以我们就可以使用get请求方式的quote方法了 get请求方式的q…

YOLOv9:使用可编程梯度信息学习您想学习的内容

摘要 arxiv.org/pdf/2402.13616.pdf 当今的深度学习方法侧重于如何设计最合适的目标函数,以便模型的预测结果能最接近于实际结果。同时,还必须设计一个适当的架构,以便于获取足够的预测信息。现有的方法忽略了一个事实,即当输入数据经历层层特征提取和空间变换时,会损失…

(学习日记)2024.02.29:UCOSIII第二节

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

BUGKU 本地管理员

打开环境&#xff0c;先F12查看看到一串代码。Base64解码一下&#xff0c;得到的应该是密码&#xff0c;然后输入admin | test123试一下 使用BP抓包&#xff0c;修改XFF&#xff0c;得到flag

社区分享|中华保险基于MeterSphere开展接口自动化测试

中华联合保险集团股份有限公司&#xff08;以下简称为“中华保险”&#xff09;始创于1986年&#xff0c;是全国唯一一家以“中华”冠名的国有控股保险公司。截至2022年12月底&#xff0c;中华保险总资产为1006.06亿元&#xff0c;在全国拥有超过2900个营业网点&#xff0c;员工…

破解SQL Server迷局,彻底解决“管道的另一端无任何进程错误233”

问题描述&#xff1a;在使用 SQL Server 2014的时候&#xff0c;想用 SQL Server 身份方式登录 SQL Servcer Manager&#xff0c;结果报错&#xff1a; 此错误消息&#xff1a;表示SQL Server未侦听共享内存或命名管道协议。 问题原因&#xff1a;此问题的原因有多种可能 管道…

SpringBoot整合JdbcTemplate

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 循序渐进学SpringBoot ✨特色专栏: MySQL学习 🥭本文内容:SpringBoot整合JdbcTemplate 📚个人知识库: Leo知识库,欢迎大家访问 目录 …

openGauss学习笔记-232 openGauss性能调优-系统调优-资源负载管理-资源管理准备-资源规划

文章目录 openGauss学习笔记-232 openGauss性能调优-系统调优-资源负载管理-资源管理准备-资源规划 openGauss学习笔记-232 openGauss性能调优-系统调优-资源负载管理-资源管理准备-资源规划 完成资源负载管理功能配置前&#xff0c;需要先根据业务模型完成租户资源的规划。业…

fastjson反序列化漏洞

fastjson反序列化漏洞 文章目录 fastjson反序列化漏洞1.漏洞原理2.探测方式2.1 查看回显2.2 LDAP/RMI服务测试 3.LDAP/RMI服务搭建要求4.漏洞复现4.1 fastjson <1.2.47 反序列化导致任意命令执行漏洞4.1.1 环境准备4.1.2 复现过程 4.2 fastjson <1.2.24 反序列化导致任意…

simple-pytest 框架使用指南

simple-pytest 框架使用指南 一、框架介绍简介框架理念&#xff1a;框架地址 二、实现功能三、目录结构四、依赖库五、启动方式六、使用教程1、快速开始1.1、创建用例&#xff1a;1.2、生成py文件1.3、运行脚本1.3.1 单个脚本运行1.3.2 全部运行 1.4 报告查看 2、功能介绍2.1、…

vue2 开发记录

el-select 如何修改选择项的样式/el-select-dropdown__item 文字上下显示 测试代码 <div stylemargin-left: 100px><!-- 测试代码--><el-select filterablesizemini><div classxxx-el-select><el-optionv-foritem in [{key:1,des:2,…