51单片机按键控制数码管0~9_51单片机外部中断

       前面为大家介绍的点亮LED灯、数码管、按键只用到了51单片机的IO资源,我们要是仅仅用单片机点灯、操作数码管,那可真是大才小用了。这些都只是51单片机资源的冰山一角,51单片机还有好多的功能,我后面将为大家一一介绍。今天为大家介绍单片机一个重要的外设——中断。

中断


      没接触过单片机的朋友听到这个词肯定很陌生,大家对打断这个词应该不陌生吧,中断字面意思可以理解为中途被打断。大家可以思考一下,什么的中途被什么给打断了呢?想明白了这个问题就说明理解中断了。下面看看百度的解释:

      中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情 况的程序,处理完毕后又返回原被暂停的程序继续运行。

       百度的这个解释还是比较权威的,我们再通俗点理解就是计算机(单片机)在运行中途被某些意外打断了,处理完意外后又回到被打断的地方继续运行。


STC89C52RC单片机外部中断

    STC89C52RC单片机总共有6个中断,分别是:外部中断0(INT0)、定时器0中断、外部中断1(INT1)、定时器1中断、串口中断、定时器2中断、。

    今天我们主要介绍和使用外部中断。什么是外部中断呢?外部中断就是外部条件触发单片机的中断,单片机的只有IO和外部联系,所以单片机引脚的电平变化便会触发外部中断。我们看看51单片机可以触发外部中断的引脚:

db833a525611fbded4a0543ebc756aca.png

    可以看到外部中断的引脚是P3.2和P3.3, 当这两个引脚检测到电平变化(高电平变为低电平)时,便会触发中断。也许有人会问这不跟前面讲的按键实现人机互动一样吗,通过单片机检测IO引脚的电平状态来判断按键是否被按下。注意!中断和单片机扫描检测是有本质区别的,大家应该注意到我们前面写的程序全部在一个while里面,如下面这段代码。

 1

    这种代码结构在单片机里很常见,mian函数里面一个while,就是让单片机一直做while里面的事情,从while第一个大括号到最后一个大括号,反反复复,只要不停电便一直运行。看这段代码,如果代码执行到第6行时候按键按下了,单片机会立即检测到吗?肯定是检测不到的,只有当程序执行完第7、8、9行重新回到第4行运行到第5行时单片机才去判断KEY是否等于0,这时候要是没有松手肯定会检测到。但要是在执行第7、8、9、4行特别耗时松手了呢?是不是这次按键就无效了。假如这个按键外部是一个消防安全的紧急按钮,按下了单片机没有反应,闹着玩呢!火灾那么严重了消防警报没有响起来,消防人员也不知道,可能会造成严重的后果。这个例子可能有点夸张,但有助于大家理解按键扫描的不足,也就是按键的实时性不好。设计人员的想法肯定是按键按下就做出响应,但是仅仅靠一个while是肯定实现不了很高的实时性。这个问题肯定设计单片机的工程师也注意到了,于是给单片机增加了中断的功能。不光单片机有中断,电脑也有,鼠标、键盘其实也是电脑的一种中断。说了一大篇,再总结一下,中断发生后必须立即做出响应。接下来我们看看51单片机的中断怎么用,51单片机可不是P3.2和P3.3给个低电平就能跑到中断里面去的。

    我们再来看下51单片的外部中断结构:

638229c2ebf07661555cf6cf877ba86b.png

    图中的INT0和INT1连接引脚P3.2和P3.3,进去之后有一个开关可以推上去也可以拉下来,先不管上去下来是什么意思,反正要选一个。再过来是IE0,IE1,先不管是干啥的,要想外部中断反正得经过这个关卡。接着是EX0、EX1这个开关肯定需要打开。EA好像是一个多刀单掷的开关,它控制着所有中断的总开关,使用外部中断必须打开这个开关。后面的开关路线主要控制优先级的,优先级就是多个中断同时触发,优先执行优先级高的中断。只有把上面的这条中断线路给导通了,外部中断就可以触发了。单片机里面可没有看得见开关我们应该怎么去配置这些开关呢?为了控制这些开关工程师们设计出了一个叫寄存器的东西。感兴趣的同学可以上网查下,我们这里把寄存器先理解成为开关,寄存器里面写1就是打开开关,写0就是关闭开关,当然单片机也可以告诉我们哪个开关是打开的哪个开关是关闭的。



51单片机中断控制寄存器

中断允许寄存器IE

2eaaa7220a397799cd34762323d75b06.png

    我们来认识一下51单片机的第一个寄存器断允许寄存器IE,51单片机所有的内部资源都要通过配置寄存器来实现,所以大家一定要掌握如何通过单片机的数据手册去配置寄存器。上图表格中标红的是不是在上面的中断结构中看到过,哪个开关什么作用我们可以查看下方的寄存器位说明,再联系中断结构图大家可以很轻松的理解51单片机的外部中断控制逻辑。我们今天要用外部中断0,那么我们只需让EA=1,EX0=1即可。EA是51单片机的中断总开关,打开EA之后51单片机才具备中断功能。EX0只管外部中断0的开关,打开EX0外部中断功能才能使用。接下来我们讲讲另一个寄存器TCON,这个寄存器不是今天的主角,但外部中断需要用到它的四个位。

定时器/计数器中断控制寄存器TCON

e7ae03bac4b4e711a513f0215de1ea56.png

0e4900df85bc566071260162c0695408.png

这4个位给大家详细介绍下,因为IE0IE1IT0IT1功能是一样的,只不过一个是外部中断0一个是外部中断1,我们只看外部中断0。IE0是外部中断0的标志位,标志位意味着单片机要告诉我们这个位是打开还是关闭的,如果IE0这个位是1(打开的)说明外部中断已经触发,触发完成之后单片机会自己把IE0这个位给清0。说白了,这个位我们暂时可以不用操心,单片机就自动处理了。IT0 是外部中断0中断源类型选择位,就是选择外部中断0的触发方式,为0时是低电平触发,为1时是下降沿触发。我们今天给这个位写0,用低电平触发。低电平触发大家可能容易理解,下降沿可能有点难理解。下降沿就是从高电平变为低电平的一瞬间,如下图所示。

f5bdd3404e1db3a4b23e3864c0fd9fcf.png

这里简单给大家介绍下这两种触发方式有什么不同,前面我们了解到51单片机上电后引脚都是高电平,P3.2连接的是外部中断0,这时给P3.2一个低电平并保持一段时间,如果外部中断0配置的是低电平触发(IT0=0),那么中断便会一直触发,只有当P3.2为高电平时中断触发才会停止;当外部中断0配置为下降沿触发(IT0=1)时,中断则会触发一次,因为在这期间只出现了一个下降沿。后面有机会用到再举例说明。使用外部中断只需掌握这两个寄存器就足够了。

    前面说了这么多有些人可能就纳闷了,中断触发了该去哪执行呢?这里告诉大家,中断触发后去中断服务函数里面执行相应的代码。

359753a01b7e38e41d119a973d316525.png

    STC的官方手册已经提供中断服务函数和中断号了,我们今天用外部中断0,中断服务函数为Int0_Routine(void)这个函数名可以随便起,中断号为0,单片机找中断服务函数主要就是依据中断号找的,所以中断号一定不能写错。51单片机默认外部中断0的优先级最高,所以当外部中断0触发后单片机会无条件放下手中所有的事去执行外部中断0的服务函数。


51单片机外部中断实战

实战内容:模拟一个报警器,电路原理图如下所示,当按键S1和按键S2按下时蜂鸣器发出响声,当按键S3按下时蜂鸣器停止响声(必须使用外部中断)。

beb03407cb0802c10a427dd3f6421b86.png

    分析:由电路图可知,S1连接的是外部中断0,所以我们可以用触发外部中断0实现报警,S2和S3就用普通的按键扫描实现报警和停止报警。蜂鸣器前面我们没有提到过,大家可以把它当作一个LED,给低电平就发出响声,高电平停止响声。通过电路图可以知道蜂鸣器连接的是P2.3,我们让P2.3=0蜂鸣器便会发出响声,P2.3=1,蜂鸣器便停止响声。

开始写代码

 1

    虽然代码有点长,我们逐步分析其实并不复杂。头文件不用说了,前面介绍过。接着是位声明,我们用到四个引脚。然后是四个子函数,第一个函数delay我们之前用过,是一个毫秒级的延时函数;第二个是外部中断0初始化函数,主要是作用是初始化控制中断的寄存器,也就是把控制中断相关的开关打开或者关闭。第三个函数是按键扫描函数,函数的原理我们前面讲过,两个按键分别控制蜂鸣器的打开和关闭。第四个函数模拟其他比较耗时的应用,主要为了体现按键扫描和外部中断的区别。接着就是主函数了,主函数和前面讲的结构查不多,都是mian里面一个while循环,让单片机反复在执行while里面的代码。说到这里,大家能不能联想到使用中断的另一个好处。这里先不告诉大家,后面给大家详细说明。这里要注意一点,初始化函数在运行过程中只需执行一次。所以我们把ExternalInt0Init函数放在了while外面。

    最后一个函数便是今天的主角了——外部中断0服务函数。当外部中断0触发后,单片机便会跳转到这个函数中去打开蜂鸣器,执行完成后则跳回主函数。这里要注意下,中断服务函数和其他函数是有区别的,中断服务函数后面的interrupt 0一定要加上,因为加上之后相当于是告诉单片机,我就是外部中断0的中断服务函数。如果不加当外部中断0触发后,单片机就不知道去哪执行中断服务函数。interrupt是51单片机的关键字,后面的数字是中断号,外部中断0的中断号就是0外部中断1的中断号为2。想知道其他中断号可以查看51单片机的数据手册。代码分析完了,有问题大家可以进群讨论551867309,当然本节代码我也会上传至群文件。

    编译……下载……观察现象

    首先我按下的是S2,大家可以看到,短按蜂鸣器没有打开,只有长按蜂鸣器才能打开,按下S3关闭蜂鸣器也一样。这是因为单片机在处理比较耗时的事情,等处理完成后才去检查按键有没有按下。按下S1蜂鸣器立即会打开,因为S1按下触发了外部中断0,单片机会在第一时间去处理外部中断,这就是使用中断和不使用中断的区别。


总结

    通过这篇文章给大家介绍了什么是中断,单片机的高级玩法都离不开中断,所以中断必须掌握。同时也介绍了51单片机的外部中断0的应用以及如何通过查看数据手册去操作51单片机的寄存器。后面涉及到51单片机的外设我们都需要和寄存器打交道,寄存器就是我们和单片机对话的枢纽,我们可以把数据通过寄存器发送给单片机,同时单片机也可以将内部数据通过寄存器告诉我们,这样我们就可以用单片机做好多事情了。后面还有好多好玩的实验,坚持下去就能成功。

06a35d8e9c4b6023b5d5d6eee3423931.gif

喜欢就关注我们哦

b7841d144dc315811d78f3c1a1938dc7.pnge49be1134c5ff4fe486e1a46a80f86ba.png

501648f247365ff789ff6bfad11f44bd.png

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

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

相关文章

IIS7开启gZip动态压缩

1.安装动态压缩模块: 安装过程可能的报错:This application has requested the Runtime to terminate it in an unusual way. 解决办法>> 报错:错误: 尝试安装 动态内容压缩 失败,错误代码为 0x8007000E。 存储空间不足&am…

mysql查询不重复记录数_mysql查询不重复的行内容,不重复的记录数.count,distinct

有这么一个表 记录了id, p_id, p_name , p_content , p_time 1 343 aaa aaaaaa 2012-09-01 2 344 bbb bbbbbb 2012-09-02 3 321 ccc cccccccc 2012-09-03 4 343 aaa aaaaaa 2012-09-04 想查询不重复的行的内容,并且输出 p_sum ( 产品p_id出现重复的次数) sele有这么一个表记录了…

使用Java中的FileChannel和ByteBuffer在文件中读取/写入文件

过去,我讨论过RandomAccessFile以及如何将其用于在Java中进行更快的IO,在本Java NIO教程中,我们将了解如何通过使用FileChannel和ByteBuffer来使用读/写数据。 Channel提供了一种从文件读取数据的替代方法,它提供了比InputStream…

mysql 导入百万级数据 几种 java_Java 修行第034天--执行计划及其使用--Oracle数据导入导出--第三章MySQL使用...

执行计划中牢记几句话:-- 尽量避免是*代替所有列,编写查询语句时使用具体列名代替*,可以防止全表扫描-- 尽可能少的使用like关键字进行模糊查询-- 建立适当的索引可以提高查询效率十三. 执行计划--通过PL/SQL Developer查看查询的1 执行计划是一条查询语句在Oracle中的执行过程…

摄像头分辨率怎么调整_亿联CAM50 - 智能话机专属高清摄像头

亿联CAM50是通过USB连接的高清视频摄像机,适用于亿联桌面高端智能话机(SIP-T58V和SIP-T58A),致力于提供一流的个人视频通信体验,优化视频协作。CAM50高清摄像机即插即用,无需额外安装驱动软件,也…

ios系统python编译器_MacBook如何安装Python编译器-百度经验

编程是一门需要动手实践的技能,由于Python的性能,许多人都将其作为学习编程的入门语言。而要想学好Python,首先要在电脑上安装Python,并安装一个可以解释Python的文本编辑器。在此以在MacBook上安装Sublime Text为例。 工具/原料 …

jvm需要多长时间进行转义分析? 可能比您想象的要长。

这篇文章着眼于转义分析,特别是jvm在运行的程序中执行转义分析需要多长时间。 我做了一些观察,但目前还没有全部解释。 作为介绍,让我们绕道看看jvm -Xcomp中一个鲜为人知且使用更少的标志(这将是一件好事)。 该标志…

Java补漏(一)

第一章前言 在学长的建议下,为了弥补之前学Java漏下的或者不是非常清楚的知识点,买了本蛮好的教科书-《Java学习笔记(JDK6)》,正式又一次学习。为了记下一些让我恍然大悟的知识。写了本文档。…

spring environment_程序员:Spring项目中简单几步实现多个动态数据源切换

每一个请求与其他的用户是面对不同的数据库,这就需要用到动态数据源切换,来满足不同数据库、不同数据表(不同数据源)的灵活调用。动态数据源切换满足mysql、oracle等主流数据库进行动态数据源切换。使用方法在 WEB-INF 目录下建立 lib 目录,并…

算法笔记_163:算法提高 最大乘积(Java)

目录 1 问题描述 2 解决方案 1 问题描述 问题描述对于n个数&#xff0c;从中取出m个数&#xff0c;如何取使得这m个数的乘积最大呢&#xff1f;输入格式第一行一个数表示数据组数每组输入数据共2行&#xff1a;第1行给出总共的数字的个数n和要取的数的个数m&#xff0c;1<n&…

ServletRequest startAsync()的用途有限

前段时间我遇到了Servlet 3.0中AsyncContext.start&#xff08;…&#xff09;的目的是什么&#xff1f; 题。 引用上述方法的Javadoc &#xff1a; 使容器调度线程&#xff08;可能从托管线程池中&#xff09;运行指定的Runnable 。 提醒大家&#xff0c; AsyncContext是Servl…

python3.7下载tensorflow_【AI初体验】在anaconda中python3.7版本安装Tensorflow 与 Keras来玩玩...

哈啰&#xff0c;大家好&#xff0c; 单纯分享自己摸索学习AI的过程&#xff0c; 在自己的文章【Python 超入门】(1) 心原一马从零开始带你学程序中&#xff0c; 记录了安装撰写python的工具-anaconda 的方法&#xff0c; 当时安装的版本是python3.7版&#xff0c; 但是据说目前…

古巴平台上的通用过滤器–类固醇上的excel过滤器

正如我上次承诺的那样&#xff0c;我计划浏览该平台的某些功能&#xff0c;这些功能我认为非常有价值。 所以我将在这里做一些系列。 从明显的用户界面&#xff0c;过滤&#xff0c;安全性到一些高级功能&#xff08;如Web Portal&#xff0c;可扩展性&#xff0c;审核&#xf…

基准测试:Java 8 Lambda和流如何使您的代码慢5倍

与长期的实现相比&#xff0c;Java 8 lambda和流的性能如何&#xff1f; Lambda表达式和流在Java 8中受到了热烈的欢迎。这些是迄今为止很激动人心的功能&#xff0c;很长一段时间以来&#xff0c;它们就已经应用到Java中了。 新的语言功能使我们可以在代码中采用更具功能性的…

ssm框架逻辑删除mysql_MybatisPlus--CRUD接口及主键增长策略、自动填充、乐观锁更新数据...

目录一、insert1、插入操作2、主键策略二、update1、根据Id更新操作2、自动填充3、乐观锁三、select1、根据id查询记录2、通过多个id批量查询3、简单的条件查询4、分页四、delete1、根据id删除记录2、批量删除3、简单的条件查询删除4、逻辑删除一、insert1、插入操作RunWith(Sp…

python对英语的要求_学python需要英语基础吗

在很多人的眼里&#xff0c;学习编程需要英语基础&#xff0c;因为程序代码全是英文字母&#xff0c;如果没有英语基础可能很难学懂编程。程序代码是英文确实没有错&#xff0c;但是也不是必须得懂英语&#xff0c;因为计算机程序有自己语言&#xff0c;并不是我们生活中的英语…

python找不到csv文件_Python如何读取csv文件

逗号分隔值&#xff08;Comma-Separated Values&#xff0c;CSV&#xff0c;有时也称为字符分隔值&#xff0c;因为分隔字符也可以不是逗号&#xff09;&#xff0c;其文件以纯文本形式存储表格数据&#xff08;数字和文本&#xff09;。纯文本意味着该文件是一个字符序列&…

python cv2模块imshow_Python-OpenCV:cv2.imread(),cv2.imshow(),cv2.imwrite()

一、需要工具本机使用python 2.7.10下调试代码均通过&#xff0c;一下学习需要有一定的代码阅读能力&#xff0c;一下学习只介绍函数方法&#xff1a;Python 作为一种高效简洁的直译式语言非常适合我们用来解决日常工作的问题。而且它简单易学&#xff0c;初学者几个小时就可以…

2016年将是Java终于拥有窗口函数的那一年!

你没听错。 到目前为止&#xff0c;出色的窗口功能是SQL独有的功能。 即使是复杂的函数式编程语言似乎也缺少这种漂亮的功能&#xff08;如果我记错了&#xff0c;请纠正我&#xff0c;Haskell伙计们&#xff09;。 我们撰写了许多有关窗口函数的博客文章&#xff0c;并在诸如…

android 仿京东地址选择_Android 开发:仿美团地址选择

最近做了这个功能&#xff0c;分享一下&#xff0c;用的是百度地图api&#xff0c;和美团外卖的地址选择界面差不多&#xff0c;也就是可以搜索或者滑动地图展示地址列表给用户选择&#xff0c;看下效果图先。文章重点展示地图并定位到“我”的位置 滑动地图获取周边poi(逆地理…