关于单片机中断详解

发布者:楼高峰最新更新时间:2015-05-25 来源: 51hei关键字:单片机  中断详解 手机看文章 扫描二维码
随时随地手机看文章
什么是中断?就是打断当前要做的事,转而去执行别的事情。比如小七我现在正在电脑前写帖子,突然老妈叫我帮她下楼拿点东西,于是我就收到了老妈给我的一个中断(可以叫做外部中断),当我去拿东西时,突然尿急(内部中断,尿袋快要撑爆了),这又是一个中断,!我们把引起中断的事件叫做中断源(如老妈给我的任务,以及我的尿意。。。外部引起的叫外部中断,内部引起的叫内部中断),产生中断后就要去处理它,这称为中断的响应。


    由于尿急这个内部中断的优先级比老妈给我的外部中断还要高,尿急了,我总得先去撒尿吧?所以我就先去执行撒尿这个语句(小七:怎么我觉得这个比喻很别扭呢?!)。当我撒完尿后(还是觉得很别扭。。。)我会返回来帮老妈拿东西(高优先级的中断处理完后返回执行优先级较低的中断),拿完东西了我再回到电脑前继续写帖子(全部中断处理完后继续接手中断前的工作)。这个就叫做中断的返回。这么通俗的比喻,大家对中断的概念应该都明白了吧,那么在单片机里面,中断有什么用呢?

    当单片机正在执行程序的时候,突然某个按键按下了(产生外部中断),单片机就必须得去处理那个按键(中断的响应),看看是发生了什么事,按键处理完后继续回来执行程序(中断的返回)。

    同样,单片机正在执行程序的时候,内部的定时器溢出(定时器后面会单独讲到),或者检测到单片机的电压低于正常值等等(单片机内部产生的中断叫内部中断),单片机就得去处理这些事情,然后再返回来。

在单片机里面,中断是有特殊的功能寄存器控制的,单片机里面一共有两个中断,一个是中断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  
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 组合键,你一按下这个组合键,无论系统在做什么,都会弹出任务管理器。[page]


    另外中断的处理函数是这样声明的


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的时候数码管也不能闪烁???
 


 
/*
实现目的:
让LED灯以1000ms(即1s)产生流水灯效果,并用定时器0让数码管以500ms从0~F闪烁
*/
#include
#include
#define uint unsigned int
#define uchar unsigned char
sbit d1=P2^1;
uchar weixuan=0x00;//位选全开
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};//段选
uchar temp,count,num;
void delay(uint z)
{
    uint x,y;
    for(x=z;x>0;x--)
{
for(y=0;y<113;y++)
{
}
}
}
void main()
{
count=0;
num=0;
P1=weixuan;
P0=table[num];
temp=0xfe;
P2=temp;
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
delay(1000);
temp=_crol_(temp,1);
P2=temp;
/*
if(count==10)
{
count=0;
num++;
if(num==16)
{
num=0;
}
P0=table[num];
} */
}
}
void time0() interrupt 1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
count++;
if(count==10)
{
count=0;
num++;
if(num==16)
{
num=0;
}
P0=table[num];
}  
}

 

 
/*
PS:我们不能把数码管500ms闪烁时间是否到达的语句写在主程序中,
若写在主程序中,有可能发生如下错误情况:当主程序在LED灯显示语句当中时,
此时恰好定时器0进入中断并且count刚好加到了10,当定时器0中断再次进入时,
主程序仍未退出LED流水灯的显示程序,那么此时count的值便变成了11,
这样的话,count==10这个点永远检测不到,因此数码管闪烁失去了控制


在调试代码当中发现delay(uint z)函数与中断是同时执行的。。。 
*/  

关键字:单片机  中断详解 引用地址:关于单片机中断详解

上一篇:关于单片机独立按键的详解
下一篇:unsigned char code table[]中的code的作用

推荐阅读最新更新时间:2024-03-16 14:03

单片机系列指令快速记忆法
简介: 大家都知道,汇编语言指令由操作码、操作数两部分组成。MCS-51使用汇编语言指令,它共有44个操作码助记符,33种功能,其操作数有#data、direct、Rn、@Ri等。这里先介绍指令助记符及其相关符号的记忆方法 一、助记符号的记忆方法 1.表格列举法 把44个指令助记符按功能分为五类,每类列表记忆。此处从略,请读者自己总结。 2.英文还原法单片机的操作码助记符是该指令功能的英文缩写,将缩写还原成英语原文,再对照汉语有助于理解其助记符含义,从而加强记忆。 例如: 增量 INC-Incremect 减量 DNC-Decrement 短转移 SJMP-Short jump 长转移 LJMP-Long ju
[单片机]
单片机学习的四个阶段
单片机学习的四个阶段 经常有单片机爱好者问我们,如何学习单片机?学习单片机的步骤是什么? 我们初略总结了一下,单片机学习的过程基本上可分四个阶段: 第一阶段    是先浏览教科书里的硬件部分,大至了解单片机的硬件结构。如 ROM、RAM、地址、I/O口等,以及看一些厂家的MCU资料(Data Sheet),来加强MCU所提供各项资源的印象。 第二阶段    就是了解二进位数字、十六进位数和软件方面的内容。尽管有很多 高级语言可用于单片机的编程,但我觉得初学还是以汇编语言为好,更有利于和硬件结合,掌握硬件结构。知道汇编语言、机器语言、 指令、 程序等概念后,就从MOV指令开始,学习汇编语言和编程,在此如51的MCU汇
[单片机]
DSP与单片机通讯方式解析方案
1 引 言 随着计算机系统、通讯设备的迅猛发展,不间断电源UPS(uninterruptible power supply)的应用范围越来越广。银行、证券、通信基站等等对于UPS的需求量也是与日俱增。本文主要介绍200KVAUPS中的DSP 与单片机的两种串行通讯方式,实验证明:两种通讯方式均可以使DSP和单片机顺利通讯,并且使得算法控制和监控顺利实现,均是行之有效的DSP与单片机的通讯方式。 目前,高速数字信号处理器(DSP,digital signal processor) 已经广泛应用于工业控制,电机控制,航天宇航控制等诸多复杂控制系统中。在电力电子领域,由于各种开关功率器件开关频率越来越高,开关损耗越来越小,所
[嵌入式]
DSP与<font color='red'>单片机</font>通讯方式解析方案
单片机简易8键电子琴程序
简易8键电子琴的原理图: 单片机源程序如下: /******************************************************************* ******************************************************************** ********* 51简易电子琴程序 ***************** ******************************************************************** ********* ****************/ #inc
[单片机]
<font color='red'>单片机</font>简易8键电子琴程序
利用MCU的内部振荡器为电源增加智能控制,
传统上,开关电源(SMPS)是用一个基本的模拟控制环路来实现的,但数字信号控制器(DSC)技术的最新发展使得采用全数字控制机制的设计变得非常实用和经济,但是,预计全数字控制技术将最初应用在高端产品中,因为在高端产品中,该技术得好处非常明显和直接。 然而,许多模拟电源应用也能从即使最小、最便宜的微控制器(MCU)所提供的可配置能力和智能中获得很多好处,实际上,在电源中最少可能有4个独立的数字控制阶段,它们是开/关控制,比例控制配置、控制数字反馈或全数字控制,其中开关控制阶段具有一些令人瞩目的优势。 通过使传统开关电源MOSFET驱动器输出无效的开关输入翻转,脉宽调制(PWM)技术可被用来控制电源的工作时间,即缓慢地从0%到100%增加
[电源管理]
基于MCU实现蓝牙与PC机之间HCI层传输
摘要:分析了蓝牙HCI层的主要功能,并简述了蓝牙HCI层数据传输的单片机控制方案。HCI指令从RS232串口通过单片机的UART输入,经校验后发送至蓝牙模块,蓝牙模块返回的HCI事件在单片机内进行分组打包后发送至PC机。 关键词:蓝牙协议HCI 单片机 UART蓝牙模块 蓝牙是正在兴起的短距离无线通信技术,工作在2.4GHz ISM频段。蓝牙技术可在各种移动设备、计算机外设等数字设备间实现廉价的无线连接,灵活便捷地实现设备间的数据交换。本文介绍利用双串口单片机在PC机与蓝牙模块间实现蓝牙HCI层数据传输。 1 系统的硬件组成 采用爱立信生产的ROK 101 007蓝牙模块,使用51增强型单片机W77E58,用MAX3222
[单片机]
国产的MCU供应商中微半导计划科创板IPO
5月14日,中信证券发布关于中微半导体(深圳)股份有限公司(简称“中微半导”)首次公开发行股票并在科创板上市辅导工作总结报告。 据披露,中信证券为中微半导首次公开发行股票并上市的辅导机构,于2020年10月22日向中国证券监督管理委员会深圳监管局报送了辅导备案登记材料并获得受理。截至2021年5月11日,中信证券已完成对中微半导的上市辅导工作,并向中国证券监督管理委员会深圳监管局报送了《中信证券股份有限公司关于中微半导体(深圳)股份有限公司首次公开发行股票并在科创板上市辅导工作总结报告》。 中信证券认为:经过辅导,中微半导已符合发行上市的各项规定,已达到了辅导工作的预期效果。 官网显示,中微半导体(深圳)股份有限公司成立于2001
[手机便携]
51单片机-交通灯-红绿灯
1. 视频 bilibili视频地址: https://www.bilibili.com/video/av91934816 51单片机-交通灯-红绿灯 2. 文件 文件下载地址: https://download.csdn.net/download/weixin_43130546/12194351 3. 说明 绿灯亮10秒;黄灯亮5秒;红灯亮10秒 4. 代码 #include reg52.h sbit DULA = P2^6; sbit WELA = P2^7; unsigned char code DUTable = { 0x3F,0x06,0x5B,0x4F, 0x66,0x6D,0x7
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved