【C语言】关于单片机中断详解
什么是中断?就是打断当前要做的事,转而去执行别的事情。比如小七我现在正在电脑前写帖子,突然老妈叫我帮她下楼拿点东西,于是我就收到了老妈给我的一个中断(可以叫做外部中断),当我去拿东西时,突然尿急(内部中断,尿袋快要撑爆了),这又是一个中断,!我们把引起中断的事件叫做中断源(如老妈给我的任务,以及我的尿意。。。外部引起的叫外部中断,内部引起的叫内部中断),产生中断后就要去处理它,这称为中断的响应。
由于尿急这个内部中断的优先级比老妈给我的外部中断还要高,尿急了,我总得先去撒尿吧?所以我就先去执行撒尿这个语句(小七:怎么我觉得这个比喻很别扭呢?!)。当我撒完尿后(还是觉得很别扭。。。)我会返回来帮老妈拿东西(高优先级的中断处理完后返回执行优先级较低的中断),拿完东西了我再回到电脑前继续写帖子(全部中断处理完后继续接手中断前的工作)。这个就叫做中断的返回。这么通俗的比喻,大家对中断的概念应该都明白了吧,那么在单片机里面,中断有什么用呢?
当单片机正在执行程序的时候,突然某个按键按下了(产生外部中断),单片机就必须得去处理那个按键(中断的响应),看看是发生了什么事,按键处理完后继续回来执行程序(中断的返回)。
同样,单片机正在执行程序的时候,内部的定时器溢出(定时器后面会单独讲到),或者检测到单片机的电压低于正常值等等(单片机内部产生的中断叫内部中断),单片机就得去处理这些事情,然后再返回来。
在单片机里面,中断是有特殊的功能寄存器控制的,单片机里面一共有两个中断,一个是中断0,一个是中断1 ,和两个定时器T0,T1,定时器就是你打开它后,它会自动数数,当数到你给它限定的值时,它就会溢出,产生中断让CPU处理(就像一个桶,你打开水龙头后,水越来越多,当达到你需要的水位时,就会产生中断叫你去处理它)。这些我们先不深入了解他是什么东西,我们只需知道中断是用下面这几个关键词控制的就行了:
IT0 声明外部中断0的类型,IT0=1是边沿触发,0是电平触发
边沿触发就是当检测到外部电平发生变化,即由低变高,或者由高变低时,就会产生一个中断
电平触发就是检测到高电平或者低电平时,产生中断
IE0 外部边沿触发产生中断后,它的值会变1,当CPU响应后,会自动变为0
IT1 和IT0一样的含义
IE1 和IT0一样的含义
EX0 外部中断0控制器,EX0=1是允许外部中断,0是禁止外部中断,也就是不理会外部中断
ET0 这个是定时器中断控制器,ET1=1是允许定时器产生中断,0是禁止
EX1,ET1的含义跟上面的都一样。
EA 总中断控制器,1是允许有中断产生,0是禁止所有中断,就算天打雷劈也不理会
另外,还有一个中断优先级的控制器,就是控制是去帮妈妈拿东西的优先级高还是去撒尿的优先级高。
PX0 外部中断0的优先级控制,假如内外都产生了中断,1就是优先处理外部中断,0就是优先处理内部中断
PT0 定时器0优先级控制器,1就是优先相应定时器0
PT1 定时器1优先级控制器,1就是优先相应定时器1
另外还有串口的RI,TI,PS等我们先不学习了,不然大伙该乱了
(众人:其实我们早已凌乱了。。。一头雾水!)
还有个概念,就是中断请求的撤销,也就是说,产生中断后,会产生一个中断请求,为1,当CPU处理完中断后,必须清除这个请求,不然CPU又会认为这个中断没有处理又跑去处理它……
对于两个定时器产生的中断,当CPU响应后,会自动清除TF0,TF1这两个定制器中断请求,处理完后就跳出来,回到原来的地方继续执行。
对于外部中断INT0,INT1,如果中断类型是边沿触发,单片机会自动清除中断请求IE0,IE1
若是电平触发,如果有一个电平,使中断产生后,这个电平仍然还保持着,那么这个电平还会触发中断,这样CPU就死在中断的石榴裙下出不来了。。。
(众人:说了那么多,没例子你说个J8)
例子来啦!用外部中断来控制一个LED的亮灭。对了,外部中断并不是单片机的每个引脚都能产生,标有INT0或INT1的才行,我们看看11F02E的引脚图
中断的引脚是INT0:P3^2和 INT1:P3^3,我们用边沿触发(由高电平变成低电平时,就会触发)的中断方式来控制LED,
当我们没按下按键的时候,由于上拉电阻(不懂的问百度姐姐哦~)的原因,P3^2是高电平,当我们按下按键后,P3^2的电平就会变低,这个从高变低的过程就会产生一个中断(边沿触发),CPU会第一时间来相应这个中断,看看是谁看帖不回贴,看完帖子不评分,然后根据小七写的中断处理程序去处理他!
O(∩_∩)O 。
程序怎么写呢?
#include <reg52.h>
sbit led=P1^7; //定义LED
void zhongduan() interrupt 0 using 1 //声明中断处理函数,由于是外部中断,所以 interrupt X 里X的值是 0
{
led=!led; //CPU响应中断后会跑来这里执行(让led的状态取反)
}
void main() //主函数,程序执行的起点
{
EA=1; //允许CPU响应所有中断
IT0=1; //设外部中断0的响应模式为边沿触发
EX0=1; //允许中断0产生中断
while(1); //CPU不断在这里死循环,中断产生后放下工作去响应中断,处理完后然后再返回来继续死循环
}
按下按键,CPU会跑去中断处理函数执行,执行完中断处理后返回原处继续执行
(众人:这个中断跟我们前面学习的按键有什么区别么?)
当然有区别啦!虽然都是控制LED,但是按键是当CPU执行到按键检测如 if(key==0) 语句后,才去改变LED的状态,如果没有执行到,那么即使你按下按键单片机也不会响应的,也就是CPU主动去问按键有没有被按下。而中断呢,就是无论CPU在干嘛,只要触发中断后,CPU就会放下手中的活,第一时间赶回来处理,也就是按键被按下后主动告诉CPU。。。就像windows 系统的 ctrl+alt+del 组合键,你一按下这个组合键,无论系统在做什么,都会弹出任务管理器。
另外中断的处理函数是这样声明的
void abc() interrupt X using n
{
处理语句;
}
我们看到,只是普通的函数 加上了 interrupt X using Y 了而已,X 的取值是有规定的:
如果是外部中断0的中断处理函数,则X为0 即void abc() interrupt 0 using n
若是定时器0的中断处理函数,则 X 为1
若是外部中断1的中断处理函数,则 X 为2
若是定时器1的中断处理函数,则 X 为3
若是串口中断的中断处理函数,则 X 为4
n 是中断号,取值范围为 0 - 31
关于中断的学习,也到此告一段落了,当然还有一些问题没解决.......
Q1: 为什么count==40的时候数码管也不能闪烁???
在调试代码当中发现delay(uint z)函数与中断是同时执行的。。。
【C语言】关于单片机中断详解的更多相关文章
- [转]C语言字节对齐问题详解
C语言字节对齐问题详解 转载:https://www.cnblogs.com/clover-toeic/p/3853132.html 引言 考虑下面的结构体定义: typedef struct{ ch ...
- C语言解决约瑟夫问题详解的代码
将开发过程中比较重要的一些内容做个收藏,下面的内容是关于C语言解决约瑟夫问题详解的内容,希望能对码农有帮助. #pragma once #include<vector> class PRO ...
- Linux C 语言之 Hello World 详解
目录 Linux C 语言之 Hello World 详解 第一个 C 语言程序 程序运行原理 编译,链接 运行时 链接库 编译器优化 Hello World 打印原理 stdout, stdin 和 ...
- R语言服务器程序 Rserve详解
R语言服务器程序 Rserve详解 R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大. R语言作为统计学一门语言,一直在小众领域闪耀着光芒.直到 ...
- Linux 中断详解 【转】
转自:http://blog.csdn.net/tiangwan2011/article/details/7891818 原文地址 http://www.yesky.com/20010813/1921 ...
- 【C语言】printf函数详解
C语言printf函数详解 一.相关基础知识 请求printf()打印变量的指令取决于变量的类型,例如打印整数用%d符号,打印字符用%c符号,这些符号称为转换说明(conversion specifi ...
- Java语言Socket接口用法详解
Socket接口用法详解 在Java中,基于TCP协议实现网络通信的类有两个,在客户端的Socket类和在服务器端的ServerSocket类,ServerSocket类的功能是建立一个Serve ...
- C语言001--hello world编译详解
1.编写hello.c程序,并编译运行 book@100ask:~/linux/c01$ cat hello.c -n 1 #include <stdio.h> 2 3 int main( ...
- C语言字节对齐问题详解
引言 考虑下面的结构体定义: typedef struct{ char c1; short s; char c2; int i; }T_FOO; 假设这个结构体的成员在内存中是紧凑排列的,且c1的起始 ...
随机推荐
- TensorFlow 2.0 快速入门指南 | iBooker·ApacheCN
原文:TensorFlow 2.0 Quick Start Guide 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 不要担心自己的形象,只关心如何实现目标.--<原则>,生活 ...
- vivo直播应用技术实践与探索
一.概述 2019年vivo直播平台立项,初期与优秀的顶部直播平台进行联运直播开发,进行市场,产品和技术的初步探索:再到后来为了丰富直播的内容和形式,开始自己独立探索:之后,我们结合vivo现阶段的直 ...
- Python绘图工具turtle库的使用
#PythonDraw.py import turtle #引入了一个绘图库(海归库) turtle.setup(650,350,200,200) #设置一个窗体 turtle.penup() #将画 ...
- linux中vim编辑器三种模式及常用命令的使用
Linux命令经常使用才会烂熟于心 命令行模式: 移动光标: 向下左右箭头可以移动光标: 将光标移动到行尾:$; 将光标移动到行头:^: 将光标移动到页尾:shift+g; 将光标移动到页头:1+sh ...
- NSDate分类,把系统返回的时间与现在进行比较---秀清
// // NSDate+Joe.h // WeiBo // // Created by 张秀清 on 15/9/17. // Copyright (c) 2015年 张秀清. All rights ...
- 关于String不可变的一些理解
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11683720.html 一直对String不可变感到疑问, 不知为何说String是不可变的, ...
- 利用LNMP实现wordpress站点搭建
一.部署MySQL 1.1 二进制安装mysql5.6 # 准备用户,依赖包,二进制程序 [root@nginx ~]# yum install -y libaio perl-Data-Dumper ...
- Java中Integer 和 int的区别
基本概念的区分: 1.Integer 是 int 的包装类,int 则是 java 的一种基本数据类型 2.Integer 变量必须实例化后才能使用,而int变量不需要 3.Integer 实际是对象 ...
- Java多态、向上转型、向下转型知识分享(讲解全面)
多态(方法的多态.对象的多态) 方法的多态 重写的多态(重要):子类继承父类,因此子类拥有父类属性和方法,如果子类重写父类方法,那么父类调用该方法的时候就会检查子类是否重写该方法,子类重写了就调用子类 ...
- 在win10上安装face_recognition(人脸识别)
github上有个项目face_recognition,是用于人脸识别的 主要是window上安装这个项目会繁琐些,linux上据项目文档上介绍是妥妥的. 项目地址: https://github. ...